コンパイラの書き方を学ぶ[終了]


699

優先言語:C / C ++、Java、Ruby。

単に教育目的で独自のコンパイラを作成する方法について、役立つ本/チュートリアルを探しています。私はC / C ++、Java、Rubyに最も精通しているので、これら3つのうちの1つを含むリソースを好みますが、適切なリソースであればどれでもかまいません。


ずっとANTLR。以下に提案するすべてのリソースは、私にはやり過ぎのように見えます。ANTLRは常にコンパイラデザイナーの親友です。A
A_Var 2010

コンパイルのアイデアが一般的にどのように機能するかを学ぶことに主眼が置かれている場合、SICPをチェックすると、Scheme(リスト)に基づくコンピュータープログラムの構造化解釈を省略できますが、一般的な原則がわかります。 mitpress.mit.edu/sicp。この本は、会社で働き、これらの作品の編集と解釈を生計のために行うベテランから推薦されました!
Nishant 2011

恥知らずなプラグイン:同様の質問に対する私の答え
9000

私は自分のブログでコンパイラーの作成に関する記事を書きました。orangejuiceliberationfront.com / how-to-write- a-compiler 非常に基本的なものと始めたばかりに焦点を当てています。より多くのコンパイラ/ codegen / parser /言語設計関連の記事がそこにあります。
uliwitness 2014年

回答:


1084

リソースの大きなリスト:

伝説:

  • ¶PDFファイルへのリンク
  • $印刷された本へのリンク

22
私はLet's Build a Compiler[ compilers.iecc.com/crenshaw/]シリーズを読みましたが、これは本当にすばらしい記事であり、良い出発点です。
TheVillageIdiot 2010年

5
言及する価値のあるものは、Courseraのコンパイラコースです。それは素晴らしいビデオを持っており、Javaのような言語/シンプルなコンパイラを作成する手順を説明します。Courseraコンパイラリンク
QuantumKarl

1
私はこの答えを維持したい、私はここに、このリファレンスを投稿することを決めたので、可能な限りオリジナルのようであることに掲示:tutorialspoint.com/compiler_design/index.htm私はこのサイトについて言っています何が、それは実際にコードを書くには関与しないということですコンパイラを作成しますが、コンパイラをフェーズとステージに分解します。任意の言語とアルファベットの表記法を表すため、特定の言語パラダイムを使用せずに、ロジックとアルゴリズムの設計アプローチを説明します。これは簡単に読むことができますが、各部分に必要なものの概念を提供します。
Francis Cugler 2016

70

これはかなり漠然とした質問だと思います。関係するトピックの深さのためだけに。ただし、コンパイラは2つの部分に分解できます。上半分と下半分。通常、上半分はソース言語を取得して中間表現に変換し、下半分はプラットフォーム固有のコード生成を処理します。

それでも、このトピック(少なくともコンパイラクラスで使用したもの)にアプローチする簡単な方法の1つのアイデアは、上記の2つの部分でコンパイラを構築することです。具体的には、上半分を作成するだけで、プロセス全体の良いアイデアが得られます。

上半分を実行するだけで、字句解析プログラムとパーサーを作成して、「コード」(前述の中間表現)を生成できます。そのため、ソースプログラムを取得して別の表現に変換し、必要に応じて最適化を行います。これがコンパイラの中心です。下半分はその中間表現を使用して、特定のアーキテクチャでプログラムを実行するために必要なバイトを生成します。たとえば、下半分は中間表現を取り、PE実行可能ファイルを生成します。

このトピックに関して私が特に役に立ったと思った本は、コンパイラの原則とテクニック(または表紙のかわいいドラゴンによるドラゴンブック)でした。それはいくつかの素晴らしい理論を持っており、本当にアクセス可能な方法で文脈自由文法を間違いなくカバーしています。また、字句アナライザーとパーサーを構築するには、おそらく* nixツールのlexとyaccを使用します。そして、おもしろくないことに、「lex and yacc呼ばれる本は、ドラゴンブックがこの部分のために中断したところを取り上げました。


55

MLでのモダンコンパイラの実装は、テキストを作成するのに最適な初歩的なコンパイラだと思います。ありますJavaバージョンCバージョンは、お使いの言語の背景与えられ、よりアクセスかもしれないそのどちらも、あまりにも。この本には、多くの有用な基本的な資料(スキャンと解析、セマンティック分析、アクティベーションレコード、命令の選択、RISCとx86のネイティブコード生成)とさまざまな「高度な」トピック(オブジェクト指向と関数型言語のコンパイル、ポリモーフィズム、ガベージコレクション、最適化と単一の静的割り当てフォーム)比較的小さなスペース(約500ページ)。

ドラゴンブックよりもモダンコンパイラーの実装の方が好きです。モダンコンパイラーの実装では、調査対象が少なくなるためです。代わりに、本格的なまともなコンパイラーを作成するために必要なすべてのトピックが網羅されています。この本を読み終えると、必要に応じて、研究論文に直接取り組み、より深く掘り下げることができます。

Niklaus WirthのCompiler Constructionには深刻な問題があることを告白しなければなりませんPDF形式でオンライン入手できます。ワースのプログラミングの美学は単純に美しいと思いますが、彼のスタイルは最小限に過ぎないという人もいます(たとえば、ワースは再帰降下パーサーを好みますが、ほとんどのCSコースはパーサージェネレーターツールに重点を置いています。ワースの言語設計はかなり保守的です。)コンパイラー構築は非常に簡潔な蒸留です。ワースの基本的なアイデアの一部なので、彼のスタイルが好きかどうかにかかわらず、この本を読むことを強くお勧めします。



「モダンコンパイラの実装」のCバージョンを使用しないことを強くお勧めます。これは、Cのために低レベルの詳細が損なわれているためです。本は完全に乱雑です。Java 1stはオブジェクト指向のデザインが貧弱であるため、あまり良くありません。Java2nd edはもはやTiger言語ではありません。だから私はMLを強くお勧めします。それを理解するためにMLに堪能である必要はありません。MLは間違いなくこの仕事に適しています。
16

44

私はドラゴンブックのリファレンスに同意します。IMO、それはコンパイラー構築の決定的なガイドです。ただし、筋金入りの理論に備えましょう。

理論が軽い本が必要な場合は、ゲームスクリプティングマスタリーの方が適しているかもしれません。あなたがコンパイラ理論の完全な初心者であれば、それはより穏やかな紹介を提供します。これは、より実用的な構文解析方法(LLまたはLR構文解析について説明せずに非予測的再帰降下を選択すること)については説明していません。さらに、マシンコードにコンパイルする代わりに、ユーザーが作成したVMで実行されるはずのバイトコードにコンパイルされます。

特にAmazonで安く買えるなら、それはまあまあの読みです。コンパイラの簡単な紹介だけが必要な場合は、ゲームスクリプティングマスタリーは悪い方法ではありません。あなたがハードコアの前に行きたいなら、あなたはドラゴンブック以外の何物でも解決するべきではありません。


1
ゲームスクリプティングマスタリーは、学習可能な優れたリソースです。これを完了すると、スクリプト可能な2Dアドベンチャーゲームをプレイできるようになります。これにより、すべてのエクササイズが特定の目的に焦点を合わせ、読者のモチベーションを維持します。
Dour High Arch

1
Dragonは、文法ベースの構文解析に少し重点を置いています。パーサージェネレーターを使用してC ++のようにまったく不可能であるものを解析しようとしているのではなく、たとえば手作りのLL文法を使用できる場合、文法変換および証明以外のより高いパーセンテージのコンパイラーフィールドを扱うものを探したいかもしれません
Marco van de Voort

27

「Let's Build a Compiler」は素晴らしいですが、少し時代遅れです。(私はそれが少しでも有効でなくなると言っているわけではありません。)

またはSLANGを確認してください。これは「Let's Build a Compiler」に似ていますが、特に初心者にとってははるかに優れたリソースです。これには、コンパイラーを教えるための7つのステップのアプローチを取るPDFチュートリアルが付属しています。quoraリンクを追加すると、C ++、Java、JSのSLANGのさまざまなすべてのポートへのリンクが追加されます。また、もともとはC#と.NETプラットフォームを使用して記述されたpythonとjavaのインタープリターです。


5
このシリーズは少し古くなっていますが、それでもまだ役に立ちます。ただし、私の最大の不満は、任意のタイプの解析ツリーを構築するのではなく、アセンブリ言語に直接出力しようとするという事実です。これは、(最初​​の記事で述べられていることとは異なり)記述にはあまり役に立たないことを意味します通訳者。
a_m0d

23

すべてを自分で構築するのではなく、強力でより高レベルのツールを使用したい場合は、このコースのプロジェクトとリーディングを読むことはかなり良いオプションです。これは、JavaパーサーエンジンANTLRの作者による言語コースです。Pragmatic Programmersからコースの本をPDFとして入手できます。

このコースでは、構文解析、型と型チェック、ポリモーフィズム、シンボルテーブル、コード生成など、他の場所で見られる標準のコンパイラコンパイラについて説明します。カバーされていないのは、最適化だけです。最終的なプロジェクトは、Cのサブセットコンパイルするプログラムです。ANTLRやLLVMなどのツールを使用しているため、1日でコンパイラ全体を作成することは可能です(私はこれの存在証明を持っていますが、24時間程度を意味します)。それは、現代のツールを使用した実用的なエンジニアリングに重く、理論的には少し軽いです。

ちなみに、LLVMは単に素晴らしいです。通常はコンパイルしてアセンブリになる可能性のある多くの状況では、代わりにLLVMの中間表現にコンパイルする方がはるかに良いでしょう。それはより高いレベルのクロスプラットフォームであり、LLVMはそこから最適化されたアセンブリを生成するのに非常に優れています。


最初のリンクは死んでいます。
Lynn

20

時間がない場合は、Niklaus Wirthの「コンパイラ構築」(Addison-Wesley1996年)をお勧めします。 1日で読むことができる小さな小さなブックレットですが、基本(レクサー、再帰降下パーサーの実装方法を含む)、独自のスタックベースの仮想マシン)。その後、詳細を知りたい場合は、他のコメンターが示唆しているように、ドラゴンブックを回避する方法はありません。


時間がない場合は、コンパイラーを作成しないでください。
インゴ

17

Lex / Yacc(またはFlex / Bison、それらを呼び出したいものは何でも)を調べることをお勧めします。Flexは語彙アナライザーであり、言語のセマンティックコンポーネント(「トークン」)を解析および識別します。Bisonは、各トークンが解析されたときに何が起こるかを定義するために使用されます。これは、Cコードに出力したり、Cにコンパイルしたり、動的に命令を実行したりするコンパイラーの場合もありますが、これに限定されません。

このFAQが役立つはずです。このチュートリアルは非常に便利に見えます。


17

一般に、コンパイラのチュートリアルは5分ではありません。これは複雑なトピックであり、コンパイラの記述には数か月かかる場合があるためです。自分で検索する必要があります。

PythonとRubyは通常解釈されます。おそらくあなたも通訳から始めたいでしょう。それは一般的に簡単です。

最初のステップは、プログラミング言語の文法である正式な言語記述を書くことです。次に、文法に従ってコンパイルまたは解釈するソースコードを、コンピューターが理解して操作できるソースコードの内部形式である抽象構文ツリーに変換する必要があります。この手順は通常、解析と呼ばれ、ソースコードを解析するソフトウェアはパーサーと呼ばれます。多くの場合、パーサーは、正式な文法をソースまたはマシンコードに変換するパーサージェネレーターによって生成されます。解析の数学的でない説明については、解析テクニック-実践ガイドをお勧めします。ウィキペディアには、自分に適したパーサージェネレーターを選択できるパーサージェネレーターの比較があります。選択したパーサージェネレーターに応じて、

あなたの言語用のパーサーを書くことは本当に難しいかもしれませんが、これはあなたの文法に依存します。(C ++とは異なり)文法をシンプルに保つことをお勧めします。この良い例がLISPです。

2番目のステップでは、抽象構文ツリーがツリー構造から線形中間表現に変換されます。このLuaのバイトコードの良い例として、よく引用されます。しかし、中間表現は本当にあなたの言語に依存します。

インタープリターを作成している場合は、中間表現を解釈するだけで済みます。ジャストインタイムでコンパイルすることもできます。ジャストインタイムコンパイルにはLLVMとlibjitをお勧めします。言語を使用できるようにするには、いくつかの入出力関数とおそらく小さな標準ライブラリを含める必要があります。

言語をコンパイルする場合は、さらに複雑になります。異なるコンピューターアーキテクチャ用のバックエンドを記述し、それらのバックエンドの中間表現からマシンコードを生成する必要があります。このタスクにはLLVMをお勧めします。

このトピックに関する本は数冊ありますが、一般的な使用にはお勧めできません。それらのほとんどは、あまりにも学術的または実用的です。「21日間でコンパイラの記述を自分で教える」ということはないため、このトピック全体を十分に理解するには、何冊かの本を購入する必要があります。インターネットで検索すると、オンラインの本や講義ノートに出会うことがあります。コンパイラの本を借りられる大学図書館があるかもしれません。

また、プロジェクトを本格的にする場合は、理論的なコンピュータサイエンスとグラフ理論の背景知識をお勧めします。コンピュータサイエンスの学位も役立ちます。


++そういうことをすべて知っているのはいいことですし、それは大きな仕事になる可能性がありますが、専門家からは、物事を大事にしないようにする方法も学びました。物事を知ることは良いことであり、ほとんどの場合、それらを使わないときを知ることはさらに良いことです。
Mike Dunlavey、2009


11

まだ提案されていないが非常に重要な1冊の本は、ジョンレバインによる「リンカーとローダー」です。外部アセンブラを使用していない場合は、最終的なプログラムにリンクできるオブジェクトファイルを出力する方法が必要です。外部アセンブラーを使用している場合でも、再配置と、プログラムをロードするプロセス全体が機能するツールを作成する方法を理解する必要があるでしょう。この本は、Win32やLinuxを含むさまざまなシステムのこのプロセスに関するランダムな知識の多くを集めています。


10

Dragon Bookは間違いなく「ビルドコンパイラ」の本ですが、言語が現在の世代の言語ほど複雑でない場合は、Design Patternsの Interpreterパターンを確認することをお勧めします。

この本の例は、正規表現のような言語を設計し、よく考え抜かれていますが、彼らが本で言うように、プロセスを通して考えるのは良いですが、実際には小さな言語でのみ効果的です。ただし、このパターンで小さな言語のインタープリターを作成する方が、yaccやlexなどのさまざまな種類のパーサーすべてについて学習する必要があるよりもはるかに高速です...


10

LLVMを使用する場合は、http//llvm.org/docs/tutorial/を確認してください。LLVMのフレームワークを使用してゼロからコンパイラーを作成する方法を説明します。また、主題についての知識があるとは限りません。

チュートリアルでは、独自のパーサーやレクサーなどを作成することをお勧めしていますが、アイデアを得たらバイソンとフレックスを調べることをお勧めします。彼らは人生をとても簡単にします。


しかし、Visual Studioをセットアップするためのドキュメントの記述は
不適切で

10

私はドラゴンの本を読むのが難しすぎて、実際にコンパイラーを書くのに実際には必要とされない言語理論にあまりに集中しすぎていることに気づきました。

驚くほど高速でシンプルなOberonコンパイラーProject Oberonの完全なソースを含むOberonブックを追加します。

代替テキスト


10

プログラミングにかなり慣れていない7年ほど前にこの質問をしたことを覚えています。

私が尋ねたとき私は非常に注意深く、そして驚くべきことに、あなたがここに来ているほど多くの批判を受けませんでした。しかし、彼らは私に「ドラゴンブック」の方向を示しました。これは、私の意見では、コンパイラーを書くために知っておく必要があるすべてを説明する本当に素晴らしい本です(もちろん、1つまたは2つの言語を習得する必要があります。あなたが知っている言語、幸福者。)。

そして、はい、多くの人々はその本を読むのはおかしいと言って、あなたはそれから何も学ばないでしょう、しかし私はそれに対して完全に同意しません。

多くの人々はまた、コンパイラを書くのは愚かで無意味だと言っています。コンパイラの開発が役立つ理由はいくつかあります。

  • 楽しいから。
  • それは教育的であり、コンパイラの書き方を学ぶとき、他のアプリケーションを書くときに役立つコンピュータサイエンスや他のテクニックについて多くを学ぶでしょう。
  • 誰もコンパイラを書かなければ、既存の言語はそれ以上良くなりません。

私はすぐに自分のコンパイラを作成しませんでしたが、尋ねたところ、どこから始めればよいかわかりました。そして今、多くの異なる言語を学び、ドラゴンブックを読んだ後、書くことはそれほど問題ではありません。(私はコンピューター・エンジニアリングのatmも勉強していますが、プログラミングについて私が知っていることのほとんどは独学です。)

結論として、ドラゴンブックは素晴らしい「チュートリアル」です。ただし、コンパイラを作成する前に、ある程度の時間をかけて言語を習得してください。ただし、今後10年ほどでコンパイラの第一人者になるとは思わないでください。

この本は、パーサー/インタープリターの書き方を学びたい場合にも役立ちます。


9

「...コンパイラを作ってみましょう...」

私は、@ sasbによってhttp://compilers.iecc.com/crenshaw/を2番目に作成します。今のところ本を買うのを忘れてください。

どうして?ツールと言語。

必要な言語はPascalで、私が正しく覚えていればTurbo-Pascalに基づいています。それはちょうどので、あなたがに行くとどうなるhttp://www.freepascal.org/とPascalコンパイラをダウンロードし、すべての例では、ページから直接仕事〜http://www.freepascal.org/download.var無料についてbeautの事Pascalは、あなたが気にすることができるほとんどすべてのプロセッサまたはOSを使用できることです。

あなたがレッスンをマスターしたら、次に、より高度な試みるドラゴンブックhttp://en.wikipedia.org/wiki/Dragon_bookを


9

私は同じ概念を調査していて、ジョエル・ポーバーによるこの有望な記事を見つけました、

.NET Framework用の言語コンパイラを作成する-これがどこに行ったのかわからない

.NET Framework用の言語コンパイラを作成する-元のドキュメントのPDFコピー

彼はコンパイラーの高水準の概念について議論し、.Netフレームワーク用の独自の言語を発明し続けています。.Net Frameworkを目的としていますが、多くの概念を再現できるはずです。記事の内容:

  1. ランゲージの定義
  2. スキャナー
  3. パーサー(主に興味のあるビット)
  4. .Net Frameworkをターゲットにする
  5. コードジェネレーター

他のトピックもありますが、正解です。

それは、C#で書かれた、初心者向けです(Javaではありません)。

HTH

骨格


「Javaではない」とはどういう意味ですか?
Hejazzman 2009

ハハ、申し訳ありませんが、私はそれが.Netのために書かれたものを意味しました。どちらもスタイリッシュなJITです。:)
dbones

8

コンパイラーを作成する簡単な方法は、bisonとflex(または類似の)を使用して、ツリー(AST)を構築し、Cでコードを生成することです。Cコードの生成が最も重要なステップです。Cコードを生成することにより、Cコンパイラを備えたすべてのプラットフォームで言語が自動的に動作します。

Cコードの生成は、HTMLを生成するのと同じくらい簡単です(印刷または同等のものを使用するだけです)。これは、CパーサーまたはHTMLパーサーを作成するよりもはるかに簡単です。


8

comp.compilers FAQから:

パーブランチハンセンプレンティスホール作「パソコンのプログラミング」1982 ISBN 0-13-730283-5

この残念なタイトルの本は、Edisonと呼ばれるPascalのような言語を使用して、マイクロ用のシングルユーザープログラミング環境の設計と作成について説明しています。著者は、Edisonコンパイラとシンプルなサポートオペレーティングシステムの段階的な実装に関するすべてのソースコードと説明を提示します。完全なソースをIBM PC用に注文することもできます)。

この本の最も興味深い点は、1)完全な自己完結型、自己維持型、有用なコンパイラおよびオペレーティングシステムを作成する方法を示す能力、および2)言語設計と仕様の問題およびトレードに関する興味深いディスカッションです。第2章のオフ。

Perbrnch Hansen Prentice-Hall 1985によるIS "Brinch Hansen on Pascal Compilers" ISBN 0-13-083098-4

もう1つは理論上の簡単な、もう1つは実用的なプラグマティックスです。著者は、Pascal-(Pascal "マイナス")、ブール型と整数型(ただし文字、実数、部分範囲、列挙型はなし)のPascalサブセットのコンパイラとpコードインタープリタの設計、実装、および完全なソースコードを提示します。 、定数と変数の定義、配列とレコードのタイプ(ただし、パック、バリアント、セット、ポインター、無名、名前変更、またはファイルタイプは除く)、式、代入ステートメント、値と変数パラメーターを含むネストされたプロシージャ定義、ifステートメント、whileステートメント、および開始-終了ブロック(ただし、関数定義、手続き型パラメーター、gotoステートメントとラベル、caseステートメント、repeateステートメント、forステートメント、withステートメントはありません)。

コンパイラーとインタープリターはPascal *(Pascal "star")で書かれています。これは、ソフトウェア開発システムを作成するためのEdisonスタイルの機能で拡張されたPascalサブセットです。IBM PC用のPascal *コンパイラーは著者によって販売されていますが、本のPascalコンパイラーを任意の便利なPascalプラットフォームに移植するのは簡単です。

この本は、コンパイラの設計と実装を簡単に見せます。筆者が品質、信頼性、およびテストに関わる方法が特に好きです。コンパイラーとインタープリターは、より複雑な言語やコンパイラープロジェクトの基礎として簡単に使用できます。


8

Darius Baconの「ichbins」をチェックする必要があります。これは、Cをターゲットとする小さなLisp方言用のコンパイラーで、6ページ強のコードです。ほとんどのおもちゃのコンパイラーよりも優れている点は、コンパイラーがその言語で記述されるほど言語が完全であることです。(tarballには、物事をブートストラップするためのインタープリターも含まれています。)

Ur-Schemeの Webページでコンパイラーを書くことを学ぶのに役立つと感じたことについては、他にもたくさんあります。


8
  1. これは広大なテーマです。この点を過小評価しないでください。そして、それを過小評価しないように私のポイントを過小評価しないでください。
  2. ドラゴンブックは、検索を開始するのに(?)の場所だと聞きました。:)最終的にはあなたの人生になります。
  3. 独自のプログラミング言語を構築することは絶対に良い練習です!ただし、最終的には実際の目的で使用されることはありません。これに対する例外はほとんどなく、非常に遠いです。

4
ドラゴンの本を読んでいない場合。お勧めしません。実際、コンパイラを実装したことがありますか?

ええ、その名前が示すように、ドラゴンブックはモンスターです。非常に詳細ですが、それでも非常に優れたリソースです。初心者にはお勧めしませんが...
Zachary Murray、

2
@ニール:あなたは私をググったことがありませんよね?笑。blog.280z28.orgしかし、いいえ、その本は読んだことがありません。
サムハーウェル

私は現在それ(ドラゴンの本)を読んでいますが、同時にLex / Yaccも読んでいます。個人的に。
Simeon Pilgrim

1
公平を期すために、私は「私が聞いた...」という言葉を前に付けました。:)#1と#3は、私が知ることは非常に重要であると私が思うポイントですが、あまり言及されていません。
サム・ハーウェル


7

Pythonには、Pythonで記述されたPythonコンパイラがバンドルされています。ソースコードを見ることができ、解析、抽象構文ツリー、コードの発行など、すべてのフェーズが含まれています。ハックしてください。


7

申し訳ありませんがスペイン語ですが、これはアルゼンチンの「Compiladores eIntérpretes」(コンパイラと通訳)というコースの参考文献です。

コースは正式な言語理論からコンパイラの構築までで、これらは少なくとも単純なコンパイラを構築するために必要なトピックです。

  • C.
    Allen I. Holub

    Prentice-Hallのコンパイラデザイン。1990年。

  • Compiladores。TeoríayConstrucción。
    SanchísLlorca、FJ、GalánPascual、C。社説Paraninfo。1988。

  • コンパイラの構築。
    Niklaus Wirth

    Addison-Wesley。1996。

  • Lenguajes、GramáticasyAutómatas。Un enfoquepráctico。
    ペドロイサシビニュエラ、パロママルティネスフェルナンデス、ダニエルボラホミラン。Addison-Wesley Iberoamericana(スペイン)。1997年

  • コンパイラ設計の芸術。理論と実践。
    トーマス・ピットマン、ジェームズ・ピーターズ。

    プレンティスホール。1992年。

  • オブジェクト指向コンパイラの構築。
    ジム・ホームズ。
    Prentice Hall、Englewood Cliffs、NJ 1995

  • Compiladores。Conceptos Fundamentales。
    B.トイフェル、S。シュミット、T。トイフェル。

    Addison-Wesley Iberoamericana。1995年。

  • オートマトン理論、言語、および計算の概要。

    ジョン・E・ホップクロフト。ジェフレフ・ウルマン。
    Addison-Wesley。1979年。

  • 形式言語の紹介。
    GyörgyE.Révész。

    Mc Graw Hill。1983。

  • 解析テクニック。実用的なガイド。
    ディック・グルーン、セリエル・ジェイコブス。
    Impreso por los autores。1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc:まだ別のコンパイラコンパイラ。
    スティーブンC.ジョンソン
    コンピューティングサイエンステクニカルレポートNº32、1975。ベル研究所。
    ニュージャージー州マレーヒル。

  • Lex:字句解析ジェネレーター。
    MEレスク、E。シュミット。Computing Science Technical ReportNº39、1975。BellLaboratories。ニュージャージー州マレーヒル。

  • lex&yacc。
    ジョンR.レバイン、トニーメイソン、ダグブラウン。
    O'Reilly&Associates。1995年。

  • 計算理論の要素。
    ハリー・R・ルイス、クリストス・H・パパディミトリウ。SegundaEdición。プレンティスホール。1998年

  • Un Algoritmo Eficiente para laConstruccióndel Grafo de Dependencia de Control。
    サルバドールV.カヴァディーニ。
    Trabajo Final de Grado para obtener elTítulode Ingeniero enComputación。
    Facultad deMatemáticaAplicada。UCSE 2001。


6

本ではありませんが、コンパイラー(およびメタコンパイラー)について詳しく知りたい場合は、テクニカルペーパーと非常に楽しい学習経験...このWebサイトでは、自分自身と他の言語をコンパイルできる完全に自己完結型のコンパイラーシステムの構築について説明しています。

チュートリアル:メタコンパイラーパート1

これはすべて、驚くほど小さな10ページのテクニカルペーパーに基づいています。

Val Schorre META II:構文指向のコンパイラ記述言語

正直に言うと1964。1970年にコンパイラーを構築する方法を学びました。コンパイラーがどのようにしてそれ自体を再生成できるかをついに試してみると、驚くべき瞬間があります。

私は大学時代のウェブサイトの作者を知っていますが、ウェブサイトとは何の関係もありません。


他の人が言うように、大きな議論ですが、寿司は学士号の最後の仕事だと思います。数学やコンピューターサイエンスなどの概念の多くを知る必要があります。
ingconti 14年

これらのトピックがわからない場合は、真剣なコンパイラを構築しようとすべきではありません。ただし、2〜3年のコンピュータサイエンス教育(プログラミング、データ構造、アセンブリ言語)をお持ちの場合は、MetaIIペーパーが役立ちます。
Ira Baxter

5

Crenshawチュートリアルも気に入りました。コンパイラーが、ある入力を読み取り、いくつかの出力を書き込む別のプログラムであることは明らかです。

それを読んで。

必要に応じて作業しますが、次に、より大きくてより完全なコンパイラーが実際にどのように記述されているかに関する別のリファレンスを参照してください。

また、On Trusting Trustを読んで、このドメインで実行できる明白でないことについての手がかりを取得してください。


5

(手続き型コンパイラではなく)関数型言語のコンパイラを作成することに興味がある場合は、Simon Peyton-JonesとDavid Lesterの「関数型言語の実装:チュートリアル」が優れたガイドです。

関数型評価がどのように機能するかについての概念的な基本は、「コア」と呼ばれるシンプルで強力な関数型言語の例によってガイドされます。さらに、コア言語コンパイラの各部分は、ミランダ(Haskellに非常によく似た純粋な関数型言語)のコード例で説明されています。

いくつかの異なるタイプのコンパイラーが説明されていますが、Coreのいわゆるテンプレートコンパイラーだけに従う場合でも、関数型プログラミングの特徴をよく理解できます。


5

Apache Software FoundationのBCELを使用できます。このツールを使用すると、アセンブラのようなコードを生成できますが、これはBCEL APIを備えたJavaです。中間言語コード(この場合はバイトコード)を生成する方法を学ぶことができます。

簡単な例

  1. 次の関数を使用してJavaクラスを作成します。

    public String maxAsString(int a, int b) {
        if (a > b) {
            return Integer.valueOf(a).toString();
        } else if (a < b) {
            return Integer.valueOf(b).toString();
        } else {
            return "equals";
        }
    }
    

このクラスでBCELifierを実行します

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

クラス全体の結果をコンソールで確認できます(バイトコードMyClass.javaの作成方法)。関数のコードは次のとおりです。

private void createMethod_1() {
  InstructionList il = new InstructionList();
  MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);

  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
  il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
    BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
  il.append(if_icmple_2);
  il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
  il.append(InstructionFactory.createLoad(Type.INT, 2));
    BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
  il.append(if_icmpge_15);
  il.append(InstructionFactory.createLoad(Type.INT, 2));
  il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
  il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
  il.append(InstructionFactory.createReturn(Type.OBJECT));
  if_icmple_2.setTarget(ih_13);
  if_icmpge_15.setTarget(ih_26);
  method.setMaxStack();
  method.setMaxLocals();
  _cg.addMethod(method.getMethod());
  il.dispose();
}

5

ここには良い答えがたくさんあるので、リストにもう1つ追加するだけだと思いました。

10年以上前にProject Oberonと呼ばれる本を入手しました。この本には、コンパイラーに関する非常によく書かれたテキストが含まれています。本は、出典と説明が非常に実践的で読みやすいという意味で本当に際立っています。完全なテキスト(2005年版)がPDFで提供されているため、今すぐダウンロードできます。コンパイラについては、第12章で説明します。

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

Niklaus Wirth、JürgGutknecht

(その扱いはコンパイラに関する彼の本ほど広範囲ではありません)

コンパイラに関する本を何冊か読んだことがあり、ドラゴンの本を2番目に読むことができます。この本に費やした時間は非常に価値があります。


4

これまでのところリストに含まれていないのはこの本です。

コンパイラーデザインの基礎(Torben Mogensen) (コペンハーゲン大学コンピューターサイエンス学部より)

また、コンパイラーについて学ぶことに興味があり、今後数年でその業界に参入する予定です。この本は、私の知る限り、コンパイラの学習を始めるのに理想的な理論書です。コピーして複製し、きれいに、そして注意深く書いて、コードなしで平易な英語であなたにそれを提供することは無料ですが、それでも、指示や図などを介してメカニズムを提示します。


おかげでリストに追加されました:)
Anton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.