web-dev-qa-db-ja.com

小さな言語用の簡単なコンパイラはありますか

単純な言語をコンパイルする単純なコンパイラを探しています。それについての論文を書き、コンパイラがどのように機能するかを学ぶために必要です。単純な言語だけの洗練されたものを探しているのではありません(単純な場合、小さなコードを意味します。たとえば、gccは大きすぎます)。どんな助けでも大歓迎です。

38
Ayoub M.

コードを見たいと思ったら、住井英二郎の MinCaml コンパイラにとても感動しました。

  • たった2000行の長さです。

  • それはかなり興味深いソース言語をコンパイルします。

  • それは実際のマシンコードを生成しますが、このnamby-pambyCやLLVMのものはありません:-)

  • コンパイルされたコードの速度は、gccおよびネイティブOCamlコンパイラと競合します。

  • コンパイラは教育用に設計されています。

私は非常に感銘を受けたと言いましたか?

48
Norman Ramsey

TinyScheme または jonesforth をお勧めします。

8
Johan Kotlinski

ジャック・クレンショー博士実用的な数値解法について幅広く書いてきた彼は、長い間コンパイラーを恐れていました。彼はついに怖がることにうんざりし、彼が主題について自分自身を教えていたときに学んだことに基づいて、コンパイラー構築に関するマルチパートチュートリアルを書きました。

詳細については、 "コンパイラを構築しましょう" を参照してください。完全ではないことに注意してください。彼はそれを終える前にSteamを使い果たしましたが、そこには簡単に消化できる情報がたくさんあります。

6
John R. Strohm

約1000行のコード。SchemeをLLVMアセンブラーまたはCにコンパイルします。 これはコンパイラーに関する論文に最適だと思います。もっと深く知りたいのなら、私は本をお勧めします "SICP"

PL/0用の単純なコンパイラー(Pascalのような小さなサブセット-パラメーターなし、整数データのみ)を見てください。 Pascalで記述されたソースは、わずか約500行のコードであり、簡単に追跡できます。これはあなたが見る必要があるすべてかもしれません。

ただし、もう少し先に進みたい場合は、それに慣れたら、Pascal-Sのソースを確認してください。これはPascalのより大きなサブセット用のコンパイラですが、パラメータの受け渡し、追加のデータ型、配列とレコード(構造)など、いくつかの追加の概念が含まれています。それでも、コードは約2000行であり、PL/0をマスターすれば簡単に理解できます。

ここでソースを見つけることができます:

http://standardpascal.org/source.html

4
Sammy

あなたが使うことができるものはたくさんあります、あなたが最も簡単に見つけるものはあなたの経験に依存します。

まず、言語に関して:

  1. 最も単純なのはおもちゃの言語で、たとえば算術式をコンパイルします。
  2. 次はアセンブラです-これも実際には翻訳するだけですが、解析とオペコードへの変換の基本を示しています
  3. 次はおそらく、純粋なアセンブラに非常に近いCのようなもの、または純粋な理論に非常に近いLISPのようなものです。

次に、コンパイラを選択します。

アセンブラから始めることができます-アセンブラをマシンコードに変換します。これはコンパイラを作成する最初のステップでした 6502 または8080のような、どちらも非常に単純なチップをお勧めします。 アセンブラの開発キット のようなものがうまくいくかもしれません(例が付属しています)

多くの人(私を含む)は、コンパイラを書くのに最も簡単な言語は機能的であると主張するでしょう-今日では、おそらくHaskell、Scheme、またはCommonLISPを意味します。それがいかに簡単であるかの例 このブログ投稿 。彼は、算術式を数行でコンパイルするだけのコンパイラを作成しています。これはあなたにとって十分に最小限かもしれません。

アカデミックレベルでコンパイラを作成するためのほとんどすべての紹介は、例として最小限の言語から始まります Dragon Book http://en.wikipedia.org/wiki/Dragon_Book_%28computer_science%29 は常に推奨されます、しかし、他にも良いものがあります。

大学ではCを使用しました。これはCに似ていますが、コンパイラを作成するのがさらに簡単です。たくさんのリソース: http://www.cminusminus.org/qc--.html

コンパイラが必要で、Javaのような言語を知っている場合は、 JavaCC のような言語をお勧めします。ここで、言語は文法を使用して指定されます。 ここにたくさんの例の文法があります -始めるにはCのような単純なものを選んでください。

4
Nick Fortescue

コンパイラの設計に関する本を読む必要があります。それはあなたが知りたい理論といくつかの適切に単純な例を持っているべきです。

私は「ドラゴンブック」をお勧めします:コンパイラ設計の原則、AhoとUllmanによる。読んでから何年も経ちますので、どんな例があるのか​​正確には思い出せませんが、とても良い文章です。

3
comingstorm

LISP(スキームなど)は、最も単純な実際の言語です。 この本 (紙のバージョン ここではLul )を使用してPerlでプリミティブSchemeインタープリターを構築する方法を見ることができます。構文解析、型チェックは、インタープリターとコンパイラーで似ています。次に、 コンパイラの設計に関するよりハードコアな本ルルの枯れ木 としても入手可能)があります。

3
wazoox

私の以前のIT学校では、C++でコンパイラーを開発する必要がありましたが、ゼロからではありませんでした。手順や学習曲線などがありました。

TIGERコンパイラの概念 および プロジェクトの割り当て

すべてのドキュメントが利用可能ですが、コード自体は利用できないため、すべて自分で行う必要があります。

理解可能で使用可能な情報がたくさんあるので、コンパイラーのコーディングを学ぶための良いスタートになるかもしれません。

3
Maxime ARNSTAMM

Google CSD Pascal 。 70年代には画期的なものでした。多分それはあなたが望む以上のものですが、それは当時多くの「マイクロ」チップに簡単に移植されました。

3
Mike Dunlavey

BjarneStroustrupの陽気な本「TheC++ programminglanguage」の電卓の例を見ることができます。

より高度なものが必要な場合は、boost :: spiritのソースコードをお読みください。

1

ANTLR3.xコンパイラの作成に関するビデオチュートリアルを開始しました-チェックアウト

http://javadude.com/articles/antlr3xtut

もうすぐ追加します! -スコット

1

シンプルの見方次第です。利用可能なさまざまなBrainFuckコンパイラの1つを見ることができます。これは非常に単純な言語であり、コンパイラーは非常に小さいです。しかし、これが「実際の」コンパイラの動作についてどの程度わかるかはわかりません。

小さなCコンパイラを見るのはどうですか? Cはあまりコンパイルされていないので、コンパイラーの構築についての洞察が得られると思います。

1

これはたった300行の通常のコードであり、単純なユニバーサル言語を実装しています リンクテキスト 、あなたが探していたもののようなものですか?

1
nhpy

この本を試すこともできます: コンピューティングシステムの要素

マイクロプロセッサの設計からコンパイラを使用した言語までをカバーすることを目的とした本ですが、関連する章に焦点を当てることができます。

第10章:構文解析は、コンパイラのフロントエンド部分のみに焦点を当てる場合に実行できるものです。ただし、第9章は、コンパイラーが実装される高級言語の設計を説明しているため、前提条件である必要があります。この高級言語は実際には単純なOO Javaのような言語であるため、コンパイラーは実際にはVMにコンパイルされます。

そのすべての最良の部分は、実際に指示に従い、選択した任意の言語でフロントエンド部分を実装できることです。これにより、理解が深まると思います。コンパイラ理論と組み合わせると、かなりうまくゲル化します。

そして、あなたは本の私のレビューを見つけることができます ここ

1

Brainfucked は、非常に単純な言語のコンパイラです Brainfuck

0
Thomas

私が知っている最小の実用的なコンパイラはMetaIIです これは40行の自己記述を持ち、いくつかの興味深い計算を明らかに隠す特別なランタイムシステムを使用してそれ自体をコンパイルできます(ただし、ここにリストされているコンパイラのほとんどはMetaIIのランタイムシステムよりも確かに大きい、ある種のランタイムシステムを想定します。メタはかなり見事に強化されていますが、これを基盤として実際のコンパイラを構築しました。

それをさらに小さくするための作業が行われています。 この方向に基づいた実用的なコンパイラはないと思います。

これらについて論文を書く価値があります。

0
Ira Baxter