優先言語:C / C ++、Java、Ruby。
単に教育目的で独自のコンパイラを作成する方法について、役立つ本/チュートリアルを探しています。私はC / C ++、Java、Rubyに最も精通しているので、これら3つのうちの1つを含むリソースを好みますが、適切なリソースであればどれでもかまいません。
優先言語:C / C ++、Java、Ruby。
単に教育目的で独自のコンパイラを作成する方法について、役立つ本/チュートリアルを探しています。私はC / C ++、Java、Rubyに最も精通しているので、これら3つのうちの1つを含むリソースを好みますが、適切なリソースであればどれでもかまいません。
回答:
伝説:
Let's Build a Compiler
[ compilers.iecc.com/crenshaw/]シリーズを読みましたが、これは本当にすばらしい記事であり、良い出発点です。
これはかなり漠然とした質問だと思います。関係するトピックの深さのためだけに。ただし、コンパイラは2つの部分に分解できます。上半分と下半分。通常、上半分はソース言語を取得して中間表現に変換し、下半分はプラットフォーム固有のコード生成を処理します。
それでも、このトピック(少なくともコンパイラクラスで使用したもの)にアプローチする簡単な方法の1つのアイデアは、上記の2つの部分でコンパイラを構築することです。具体的には、上半分を作成するだけで、プロセス全体の良いアイデアが得られます。
上半分を実行するだけで、字句解析プログラムとパーサーを作成して、「コード」(前述の中間表現)を生成できます。そのため、ソースプログラムを取得して別の表現に変換し、必要に応じて最適化を行います。これがコンパイラの中心です。下半分はその中間表現を使用して、特定のアーキテクチャでプログラムを実行するために必要なバイトを生成します。たとえば、下半分は中間表現を取り、PE実行可能ファイルを生成します。
このトピックに関して私が特に役に立ったと思った本は、コンパイラの原則とテクニック(または表紙のかわいいドラゴンによるドラゴンブック)でした。それはいくつかの素晴らしい理論を持っており、本当にアクセス可能な方法で文脈自由文法を間違いなくカバーしています。また、字句アナライザーとパーサーを構築するには、おそらく* nixツールのlexとyaccを使用します。そして、おもしろくないことに、「lex and yacc」と呼ばれる本は、ドラゴンブックがこの部分のために中断したところを取り上げました。
MLでのモダンコンパイラの実装は、テキストを作成するのに最適な初歩的なコンパイラだと思います。ありますJavaバージョンとCバージョンは、お使いの言語の背景与えられ、よりアクセスかもしれないそのどちらも、あまりにも。この本には、多くの有用な基本的な資料(スキャンと解析、セマンティック分析、アクティベーションレコード、命令の選択、RISCとx86のネイティブコード生成)とさまざまな「高度な」トピック(オブジェクト指向と関数型言語のコンパイル、ポリモーフィズム、ガベージコレクション、最適化と単一の静的割り当てフォーム)比較的小さなスペース(約500ページ)。
ドラゴンブックよりもモダンコンパイラーの実装の方が好きです。モダンコンパイラーの実装では、調査対象が少なくなるためです。代わりに、本格的なまともなコンパイラーを作成するために必要なすべてのトピックが網羅されています。この本を読み終えると、必要に応じて、研究論文に直接取り組み、より深く掘り下げることができます。
Niklaus WirthのCompiler Constructionには深刻な問題があることを告白しなければなりません。PDF形式でオンラインで入手できます。ワースのプログラミングの美学は単純に美しいと思いますが、彼のスタイルは最小限に過ぎないという人もいます(たとえば、ワースは再帰降下パーサーを好みますが、ほとんどのCSコースはパーサージェネレーターツールに重点を置いています。ワースの言語設計はかなり保守的です。)コンパイラー構築は非常に簡潔な蒸留です。ワースの基本的なアイデアの一部なので、彼のスタイルが好きかどうかにかかわらず、この本を読むことを強くお勧めします。
私はドラゴンブックのリファレンスに同意します。IMO、それはコンパイラー構築の決定的なガイドです。ただし、筋金入りの理論に備えましょう。
理論が軽い本が必要な場合は、ゲームスクリプティングマスタリーの方が適しているかもしれません。あなたがコンパイラ理論の完全な初心者であれば、それはより穏やかな紹介を提供します。これは、より実用的な構文解析方法(LLまたはLR構文解析について説明せずに非予測的再帰降下を選択すること)については説明していません。さらに、マシンコードにコンパイルする代わりに、ユーザーが作成したVMで実行されるはずのバイトコードにコンパイルされます。
特にAmazonで安く買えるなら、それはまあまあの読みです。コンパイラの簡単な紹介だけが必要な場合は、ゲームスクリプティングマスタリーは悪い方法ではありません。あなたがハードコアの前に行きたいなら、あなたはドラゴンブック以外の何物でも解決するべきではありません。
「Let's Build a Compiler」は素晴らしいですが、少し時代遅れです。(私はそれが少しでも有効でなくなると言っているわけではありません。)
またはSLANGを確認してください。これは「Let's Build a Compiler」に似ていますが、特に初心者にとってははるかに優れたリソースです。これには、コンパイラーを教えるための7つのステップのアプローチを取るPDFチュートリアルが付属しています。quoraリンクを追加すると、C ++、Java、JSのSLANGのさまざまなすべてのポートへのリンクが追加されます。また、もともとはC#と.NETプラットフォームを使用して記述されたpythonとjavaのインタープリターです。
すべてを自分で構築するのではなく、強力でより高レベルのツールを使用したい場合は、このコースのプロジェクトとリーディングを読むことはかなり良いオプションです。これは、JavaパーサーエンジンANTLRの作者による言語コースです。Pragmatic Programmersからコースの本をPDFとして入手できます。
このコースでは、構文解析、型と型チェック、ポリモーフィズム、シンボルテーブル、コード生成など、他の場所で見られる標準のコンパイラコンパイラについて説明します。カバーされていないのは、最適化だけです。最終的なプロジェクトは、Cのサブセットをコンパイルするプログラムです。ANTLRやLLVMなどのツールを使用しているため、1日でコンパイラ全体を作成することは可能です(私はこれの存在証明を持っていますが、24時間程度を意味します)。それは、現代のツールを使用した実用的なエンジニアリングに重く、理論的には少し軽いです。
ちなみに、LLVMは単に素晴らしいです。通常はコンパイルしてアセンブリになる可能性のある多くの状況では、代わりにLLVMの中間表現にコンパイルする方がはるかに良いでしょう。それはより高いレベルのクロスプラットフォームであり、LLVMはそこから最適化されたアセンブリを生成するのに非常に優れています。
一般に、コンパイラのチュートリアルは5分ではありません。これは複雑なトピックであり、コンパイラの記述には数か月かかる場合があるためです。自分で検索する必要があります。
PythonとRubyは通常解釈されます。おそらくあなたも通訳から始めたいでしょう。それは一般的に簡単です。
最初のステップは、プログラミング言語の文法である正式な言語記述を書くことです。次に、文法に従ってコンパイルまたは解釈するソースコードを、コンピューターが理解して操作できるソースコードの内部形式である抽象構文ツリーに変換する必要があります。この手順は通常、解析と呼ばれ、ソースコードを解析するソフトウェアはパーサーと呼ばれます。多くの場合、パーサーは、正式な文法をソースまたはマシンコードに変換するパーサージェネレーターによって生成されます。解析の数学的でない説明については、解析テクニック-実践ガイドをお勧めします。ウィキペディアには、自分に適したパーサージェネレーターを選択できるパーサージェネレーターの比較があります。選択したパーサージェネレーターに応じて、
あなたの言語用のパーサーを書くことは本当に難しいかもしれませんが、これはあなたの文法に依存します。(C ++とは異なり)文法をシンプルに保つことをお勧めします。この良い例がLISPです。
2番目のステップでは、抽象構文ツリーがツリー構造から線形中間表現に変換されます。このLuaのバイトコードの良い例として、よく引用されます。しかし、中間表現は本当にあなたの言語に依存します。
インタープリターを作成している場合は、中間表現を解釈するだけで済みます。ジャストインタイムでコンパイルすることもできます。ジャストインタイムコンパイルにはLLVMとlibjitをお勧めします。言語を使用できるようにするには、いくつかの入出力関数とおそらく小さな標準ライブラリを含める必要があります。
言語をコンパイルする場合は、さらに複雑になります。異なるコンピューターアーキテクチャ用のバックエンドを記述し、それらのバックエンドの中間表現からマシンコードを生成する必要があります。このタスクにはLLVMをお勧めします。
このトピックに関する本は数冊ありますが、一般的な使用にはお勧めできません。それらのほとんどは、あまりにも学術的または実用的です。「21日間でコンパイラの記述を自分で教える」ということはないため、このトピック全体を十分に理解するには、何冊かの本を購入する必要があります。インターネットで検索すると、オンラインの本や講義ノートに出会うことがあります。コンパイラの本を借りられる大学図書館があるかもしれません。
また、プロジェクトを本格的にする場合は、理論的なコンピュータサイエンスとグラフ理論の背景知識をお勧めします。コンピュータサイエンスの学位も役立ちます。
以下の本を見てください。著者はANTLRの作成者です。
まだ提案されていないが非常に重要な1冊の本は、ジョンレバインによる「リンカーとローダー」です。外部アセンブラを使用していない場合は、最終的なプログラムにリンクできるオブジェクトファイルを出力する方法が必要です。外部アセンブラーを使用している場合でも、再配置と、プログラムをロードするプロセス全体が機能するツールを作成する方法を理解する必要があるでしょう。この本は、Win32やLinuxを含むさまざまなシステムのこのプロセスに関するランダムな知識の多くを集めています。
Dragon Bookは間違いなく「ビルドコンパイラ」の本ですが、言語が現在の世代の言語ほど複雑でない場合は、Design Patternsの Interpreterパターンを確認することをお勧めします。
この本の例は、正規表現のような言語を設計し、よく考え抜かれていますが、彼らが本で言うように、プロセスを通して考えるのは良いですが、実際には小さな言語でのみ効果的です。ただし、このパターンで小さな言語のインタープリターを作成する方が、yaccやlexなどのさまざまな種類のパーサーすべてについて学習する必要があるよりもはるかに高速です...
私はドラゴンの本を読むのが難しすぎて、実際にコンパイラーを書くのに実際には必要とされない言語理論にあまりに集中しすぎていることに気づきました。
驚くほど高速でシンプルなOberonコンパイラーProject Oberonの完全なソースを含むOberonブックを追加します。
プログラミングにかなり慣れていない7年ほど前にこの質問をしたことを覚えています。
私が尋ねたとき私は非常に注意深く、そして驚くべきことに、あなたがここに来ているほど多くの批判を受けませんでした。しかし、彼らは私に「ドラゴンブック」の方向を示しました。これは、私の意見では、コンパイラーを書くために知っておく必要があるすべてを説明する本当に素晴らしい本です(もちろん、1つまたは2つの言語を習得する必要があります。あなたが知っている言語、幸福者。)。
そして、はい、多くの人々はその本を読むのはおかしいと言って、あなたはそれから何も学ばないでしょう、しかし私はそれに対して完全に同意しません。
多くの人々はまた、コンパイラを書くのは愚かで無意味だと言っています。コンパイラの開発が役立つ理由はいくつかあります。
私はすぐに自分のコンパイラを作成しませんでしたが、尋ねたところ、どこから始めればよいかわかりました。そして今、多くの異なる言語を学び、ドラゴンブックを読んだ後、書くことはそれほど問題ではありません。(私はコンピューター・エンジニアリングのatmも勉強していますが、プログラミングについて私が知っていることのほとんどは独学です。)
結論として、ドラゴンブックは素晴らしい「チュートリアル」です。ただし、コンパイラを作成する前に、ある程度の時間をかけて言語を習得してください。ただし、今後10年ほどでコンパイラの第一人者になるとは思わないでください。
この本は、パーサー/インタープリターの書き方を学びたい場合にも役立ちます。
「...コンパイラを作ってみましょう...」
私は、@ 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を
私は同じ概念を調査していて、ジョエル・ポーバーによるこの有望な記事を見つけました、
.NET Framework用の言語コンパイラを作成する-これがどこに行ったのかわからない
.NET Framework用の言語コンパイラを作成する-元のドキュメントのPDFコピー
彼はコンパイラーの高水準の概念について議論し、.Netフレームワーク用の独自の言語を発明し続けています。.Net Frameworkを目的としていますが、多くの概念を再現できるはずです。記事の内容:
他のトピックもありますが、正解です。
それは、C#で書かれた、初心者向けです(Javaではありません)。
HTH
骨格
コンパイラーを作成する簡単な方法は、bisonとflex(または類似の)を使用して、ツリー(AST)を構築し、Cでコードを生成することです。Cコードの生成が最も重要なステップです。Cコードを生成することにより、Cコンパイラを備えたすべてのプラットフォームで言語が自動的に動作します。
Cコードの生成は、HTMLを生成するのと同じくらい簡単です(印刷または同等のものを使用するだけです)。これは、CパーサーまたはHTMLパーサーを作成するよりもはるかに簡単です。
パーブランチハンセンプレンティスホール作「パソコンのプログラミング」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プラットフォームに移植するのは簡単です。
この本は、コンパイラの設計と実装を簡単に見せます。筆者が品質、信頼性、およびテストに関わる方法が特に好きです。コンパイラーとインタープリターは、より複雑な言語やコンパイラープロジェクトの基礎として簡単に使用できます。
Darius Baconの「ichbins」をチェックする必要があります。これは、Cをターゲットとする小さなLisp方言用のコンパイラーで、6ページ強のコードです。ほとんどのおもちゃのコンパイラーよりも優れている点は、コンパイラーがその言語で記述されるほど言語が完全であることです。(tarballには、物事をブートストラップするためのインタープリターも含まれています。)
Ur-Schemeの Webページでコンパイラーを書くことを学ぶのに役立つと感じたことについては、他にもたくさんあります。
FraserとHanson のLCCコンパイラ(wikipedia)(プロジェクトホームページ)(github.com/drh/lcc)は、彼らの著書「A Retargetable C Compiler:Design and Implementation」で説明されています。それは非常に読みやすく、コード生成に至るまで、コンパイラ全体を説明します。
申し訳ありませんがスペイン語ですが、これはアルゼンチンの「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 1995Compiladores。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.htmlYacc:まだ別のコンパイラコンパイラ。
スティーブン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。
本ではありませんが、コンパイラー(およびメタコンパイラー)について詳しく知りたい場合は、テクニカルペーパーと非常に楽しい学習経験...このWebサイトでは、自分自身と他の言語をコンパイルできる完全に自己完結型のコンパイラーシステムの構築について説明しています。
これはすべて、驚くほど小さな10ページのテクニカルペーパーに基づいています。
Val Schorre META II:構文指向のコンパイラ記述言語
正直に言うと1964。1970年にコンパイラーを構築する方法を学びました。コンパイラーがどのようにしてそれ自体を再生成できるかをついに試してみると、驚くべき瞬間があります。
私は大学時代のウェブサイトの作者を知っていますが、ウェブサイトとは何の関係もありません。
Crenshawチュートリアルも気に入りました。コンパイラーが、ある入力を読み取り、いくつかの出力を書き込む別のプログラムであることは明らかです。
それを読んで。
必要に応じて作業しますが、次に、より大きくてより完全なコンパイラーが実際にどのように記述されているかに関する別のリファレンスを参照してください。
また、On Trusting Trustを読んで、このドメインで実行できる明白でないことについての手がかりを取得してください。
(手続き型コンパイラではなく)関数型言語のコンパイラを作成することに興味がある場合は、Simon Peyton-JonesとDavid Lesterの「関数型言語の実装:チュートリアル」が優れたガイドです。
関数型評価がどのように機能するかについての概念的な基本は、「コア」と呼ばれるシンプルで強力な関数型言語の例によってガイドされます。さらに、コア言語コンパイラの各部分は、ミランダ(Haskellに非常によく似た純粋な関数型言語)のコード例で説明されています。
いくつかの異なるタイプのコンパイラーが説明されていますが、Coreのいわゆるテンプレートコンパイラーだけに従う場合でも、関数型プログラミングの特徴をよく理解できます。
Apache Software FoundationのBCELを使用できます。このツールを使用すると、アセンブラのようなコードを生成できますが、これはBCEL APIを備えたJavaです。中間言語コード(この場合はバイトコード)を生成する方法を学ぶことができます。
次の関数を使用して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();
}
ここには良い答えがたくさんあるので、リストにもう1つ追加するだけだと思いました。
10年以上前にProject Oberonと呼ばれる本を入手しました。この本には、コンパイラーに関する非常によく書かれたテキストが含まれています。本は、出典と説明が非常に実践的で読みやすいという意味で本当に際立っています。完全なテキスト(2005年版)がPDFで提供されているため、今すぐダウンロードできます。コンパイラについては、第12章で説明します。
http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf
Niklaus Wirth、JürgGutknecht
(その扱いはコンパイラに関する彼の本ほど広範囲ではありません)
コンパイラに関する本を何冊か読んだことがあり、ドラゴンの本を2番目に読むことができます。この本に費やした時間は非常に価値があります。
これまでのところリストに含まれていないのはこの本です。
コンパイラーデザインの基礎(Torben Mogensen) (コペンハーゲン大学コンピューターサイエンス学部より)
また、コンパイラーについて学ぶことに興味があり、今後数年でその業界に参入する予定です。この本は、私の知る限り、コンパイラの学習を始めるのに理想的な理論書です。コピーして複製し、きれいに、そして注意深く書いて、コードなしで平易な英語であなたにそれを提供することは無料ですが、それでも、指示や図などを介してメカニズムを提示します。