推奨言語: C/C++、Java、および Ruby。
単に教育目的で独自のコンパイラを作成する方法についての役立つ本/チュートリアルを探しています。私は C/C++、Java、Ruby に最も精通しているので、これら 3 つのうちの 1 つを含むリソースを好みますが、優れたリソースであれば何でも構いません。
推奨言語: C/C++、Java、および Ruby。
単に教育目的で独自のコンパイラを作成する方法についての役立つ本/チュートリアルを探しています。私は C/C++、Java、Ruby に最も精通しているので、これら 3 つのうちの 1 つを含むリソースを好みますが、優れたリソースであれば何でも構いません。
伝説:
これはかなり漠然とした質問だと思います。関連するトピックの深さのためだけです。ただし、コンパイラは 2 つの別個の部分に分解できます。上半分と下半分。一般に、上半分はソース言語を取得して中間表現に変換し、下半分はプラットフォーム固有のコード生成を処理します。
それにもかかわらず、このトピックにアプローチする簡単な方法の 1 つのアイデア (少なくともコンパイラ クラスで使用したもの) は、上記の 2 つの部分でコンパイラを構築することです。具体的には、上半分を作成するだけで、プロセス全体をよく理解できます。
上半分を実行するだけで、語彙アナライザーとパーサーを作成する経験を積むことができ、いくつかの「コード」(前述の中間表現) の生成に進むことができます。そのため、ソース プログラムを取得して別の表現に変換し、(必要に応じて) コンパイラの心臓部である最適化を行います。次に、下半分はその中間表現を取得し、特定のアーキテクチャでプログラムを実行するために必要なバイトを生成します。たとえば、下半分は中間表現を使用して PE 実行可能ファイルを生成します。
Compilers Principles and Techniques (または、表紙のかわいいドラゴンのため、Dragon Book) は、このトピックに関する本で特に役に立ちました。それはいくつかの素晴らしい理論を持っており、本当にアクセスしやすい方法で文脈自由文法を確実にカバーしています. また、語彙アナライザーとパーサーを構築するために、おそらく *nix ツールの lex と yacc を使用するでしょう。そして、面白くないことに、「lex and yacc」という本が、ドラゴンブックがこの部分で中断したところから取り上げられました。
MLでの最新のコンパイラの実装は、テキストを書くための最高の入門コンパイラだと思います。Java バージョンとC バージョンもありますが、言語のバックグラウンドを考えると、どちらの方がアクセスしやすいかもしれません。この本には、有用な基本的な資料 (スキャンと解析、セマンティック分析、アクティベーション レコード、命令の選択、RISC と x86 ネイティブ コードの生成) とさまざまな「高度な」トピック (OO と関数型言語のコンパイル、ポリモーフィズム、ガベージ コレクション、最適化と単一の静的割り当てフォーム) を比較的小さなスペース (~500 ページ) に配置します。
私は Dragon book よりも Modern Compiler Implementation の方が好きです。なぜなら、Modern Compiler の実装は調査対象分野が少ないからです。代わりに、本格的で適切なコンパイラを作成するために必要なすべてのトピックを確実にカバーしています。この本を読み終えたら、必要に応じて研究論文に直接取り組む準備が整います。
私は Niklaus Wirth のCompiler Construction に深刻な弱点があることを告白しなければなりません。PDFとしてオンラインで入手できます。Wirth のプログラミングの美学は単純に美しいと思いますが、彼のスタイルが最小限すぎると感じる人もいます (たとえば、Wirth は再帰降下パーサーを好みますが、ほとんどの CS コースはパーサー生成ツールに焦点を当てています。Wirth の言語設計はかなり保守的です)。ヴィルトの基本的な考え方が書かれているので、彼のスタイルが好きかどうかにかかわらず、この本を読むことを強くお勧めします。
Dragon Book の参照に同意します。IMO、これはコンパイラ構築の決定的なガイドです。ただし、いくつかの筋金入りの理論の準備をしてください。
より軽い理論の本が必要な場合は、Game Scripting Masteryの方が適しているかもしれません。あなたがコンパイラ理論のまったくの初心者である場合、それはより穏やかな導入を提供します. より実用的な構文解析方法 (LL または LR 構文解析については説明せずに非予測的再帰降下を選択する) については説明していません。思い出したように、最適化理論についても説明していません。さらに、マシン コードにコンパイルする代わりに、ユーザーが記述した VM 上で実行することになっているバイトコードにコンパイルします。
特にAmazonで安く手に入れることができれば、それはまだまともな読み物です. コンパイラの簡単な紹介だけが必要な場合は、Game Scripting Mastery を受講するのも悪くありません。前もってハードコアになりたい場合は、Dragon Book に落ち着く必要があります。
「Let's Build a Compiler」は素晴らしいですが、少し時代遅れです。(それが少しでも有効性を低下させると言っているわけではありません。)
または、 SLANGをチェックしてください。これは「Let's Build a Compiler」に似ていますが、特に初心者にとってははるかに優れたリソースです。これには、コンパイラーを教えるために 7 ステップのアプローチをとる pdf チュートリアルが付属しています。C++、Java、JS の SLANG のさまざまなポートすべてへのリンクがあるため、quora リンクを追加します。Python と Java のインタープリターもあり、元々は C# と .NET プラットフォームを使用して作成されました。
自分ですべてを構築するのではなく、強力で高レベルのツールを使用することを検討している場合は、このコースのプロジェクトと読み物に目を通すことは非常に良いオプションです. これは、Java パーサー エンジン ANTLR の作成者による言語コースです。このコースの書籍は、Pragmatic Programmersから PDF として入手できます。
このコースでは、解析、型と型チェック、ポリモーフィズム、シンボル テーブル、およびコード生成など、他の場所で見られる標準的なコンパイラ コンパイラについて説明します。カバーされていない唯一のものは、最適化です。最後のプロジェクトは、C のサブセットをコンパイルするプログラムです。ANTLR や LLVM などのツールを使用するため、コンパイラ全体を 1 日で作成することは可能です (私はこれの存在証明を持っていますが、実際には 24 時間ほどかかります)。最新のツールを使用した実用的なエンジニアリングに重点を置いており、理論については少し軽くなっています。
ところで、LLVM は単に素晴らしいものです。通常はアセンブリにコンパイルする多くの状況では、代わりにLLVM の中間表現にコンパイルする方がはるかに優れています。それは高レベルでクロスプラットフォームであり、LLVM は最適化されたアセンブリを生成するのに非常に優れています。
時間がない場合は、Niklaus Wirthの「CompilerConstruction」(Addison-Wesley.1996)をお勧めします。これは、1日で読むことができる小さな小冊子ですが、基本(レクサー、再帰下降パーサーの実装方法など)について説明しています。および独自のスタックベースの仮想マシン)。その後、深く掘り下げたい場合は、他のコメント投稿者が示唆しているように、ドラゴンの本を回避する方法はありません。
まだ提案されていませんが、非常に重要な 1 冊の本は、John Levine による「Linkers and Loaders」です。外部アセンブラを使用していない場合は、最終的なプログラムにリンクできるオブジェクト ファイルを出力する方法が必要になります。外部アセンブラを使用している場合でも、ツールを機能させるには、おそらく再配置と、プログラムのロード プロセス全体がどのように機能するかを理解する必要があります。この本は、Win32 や Linux を含むさまざまなシステムについて、このプロセスに関するランダムな伝承をたくさん集めています。
FraserとHansonのLCCコンパイラ(ウィキペディア)(プロジェクトのホームページ)(github.com/drh/lcc)は、彼らの著書「A Retargetable CCompiler:DesignandImplementation」で説明されています。非常に読みやすく、コード生成に至るまでのコンパイラ全体を説明しています。
LLVMを使用する場合は、http://llvm.org/docs/tutorial/を確認してください。LLVMのフレームワークを使用してコンパイラーを最初から作成する方法を説明し、この主題についての知識があることを前提とはしていません。
チュートリアルでは、独自のパーサーやレクサーなどを作成することをお勧めしますが、アイデアが浮かんだら、バイソンとフレックスを調べることをお勧めします。彼らは人生をとても楽にしてくれます。
ドラゴンの本は、実際にコンパイラを書くのに実際には必要ない言語理論に焦点を当てすぎているため、読むのが難しすぎることがわかりました。
驚くほど高速でシンプルな Oberon コンパイラProject Oberonの完全なソースを含むOberon book を追加します。
Dragon Bookは間違いなく「ビルド コンパイラ」の本ですが、言語が現在の世代の言語ほど複雑でない場合は、Design Patternsの Interpreter パターンを参照することをお勧めします。
この本の例は、正規表現のような言語を設計し、よく考え抜かれていますが、本で彼らが言うように、プロセスを考えるのには適していますが、実際には小さな言語でのみ有効です。ただし、このパターンを使用して小さな言語のインタープリターを作成する方が、yacc や lex などのさまざまな種類のパーサーをすべて学習するよりもはるかに高速です...
私がプログラミングにかなり慣れていなかった約 7 年前に、この質問をしたことを覚えています。
私が尋ねたとき、私は非常に慎重でした、そして驚くべきことに、私はあなたがここに来ているほど多くの批判を受けませんでした. しかし、彼らは私に " Dragon Book " の方向性を教えてくれました。これは私の意見では、コンパイラーを書くために知っておくべきことをすべて説明している本当に素晴らしい本です (もちろん、1 つまたは 2 つの言語を習得する必要があります)。あなたが知っている言語、楽しいです。)
そうです、多くの人がその本を読むのはクレイジーで、そこから何も学べないと言いますが、私はそれには完全に同意しません。
多くの人は、コンパイラを書くことは愚かで無意味だとも言います。コンパイラの開発が役立つ理由はいくつかあります。
私はすぐに独自のコンパイラを作成しませんでしたが、尋ねたところ、どこから始めればよいかわかりました。そして今、多くの異なる言語を学び、ドラゴンブックを読んだ後、書くことはそれほど問題ではありません. (私はコンピューター工学の勉強もしていますが、プログラミングについて知っていることのほとんどは独学です。)
結論として、The Dragon Book は素晴らしい「チュートリアル」です。ただし、コンパイラを作成する前に、1 つまたは 2 つの言語を習得するのに時間を費やしてください。ただし、今後 10 年ほどでコンパイラの第一人者になることを期待しないでください。
この本は、パーサー/インタープリターの書き方を学びたい場合にも適しています。
私は同じ概念を調べており、Joel Pobar によるこの有望な記事を見つけました。
.NET Framework 用の言語コンパイラを作成します - これがどこに行ったのかわかりません
.NET Framework 用の言語コンパイラを作成する - 元のドキュメントの pdf コピー
彼は、コンパイラの高レベルの概念について議論し、.Net フレームワーク用の独自の言語の発明に取り掛かります。.Net Framework を対象としていますが、概念の多くは再現できるはずです。この記事は以下をカバーしています:
他のトピックがありますが、あなたはただ得ます。
C# (完全な Java ではない) で書かれた、始めたばかりの人を対象としています。
HTH
骨格
「……コンパイラを作ろう……」
@sasbのhttp://compilers.iecc.com/crenshaw/を2 番目に使用します。今のところ、本をさらに購入することは忘れてください。
なんで?ツールと言語。
必要な言語は Pascal です。私の記憶が正しければ、Turbo-Pascal に基づいています。http://www.freepascal.org/にアクセスして Pascal コンパイラをダウンロードすると、すべての例がページから直接動作します ~ http://www.freepascal.org/download.var Free の美しい点Pascal は、気にすることができるほとんどすべてのプロセッサまたは OS を使用できます。
レッスンをマスターしたら、より高度な「Dragon Book」を試してください~ http://en.wikipedia.org/wiki/Dragon_book
Per Brinch Hansen Prentice-Hall 1982ISBN0-13-730283-5による「パーソナルコンピュータのプログラミング」
この残念なタイトルの本は、Edisonと呼ばれるPascalのような言語を使用して、マイクロ用のシングルユーザープログラミング環境の設計と作成について説明しています。著者は、Edisonコンパイラとシンプルなサポートオペレーティングシステムのステップバイステップの実装に関するすべてのソースコードと説明を提示します。これらはすべてEdison自体で記述されています(PDP11/23のシンボリックアセンブラで記述された小さなサポートカーネルを除く。完全なソースは、IBM PC用に注文することもできます)。
この本の最も興味深い点は、1)完全な、自己完結型、自己保守型の、便利なコンパイラとオペレーティングシステムを作成する方法を示す能力、および2)言語の設計と仕様の問題とトレードに関する興味深い議論です。第2章でオフ。
パー・ブリンチ・ハンセン・プレンティスによる「パスカル・コンパイラーのブリンチ・ハンセン」-ホール1985 ISBN 0-13-083098-4
理論に基づいたもう1つの実用的な方法で、コーディング方法の本を紹介します。著者は、ブール型と整数型(ただし、文字、実数、サブレンジ、または列挙型は含まない)のPascalサブセットであるPascal-(Pascal "マイナス")のコンパイラーとpコードインタープリターの設計、実装、および完全なソースコードを示します。 、定数および変数の定義と配列およびレコードのタイプ(ただし、パック、バリアント、セット、ポインター、名前のない、名前の変更、またはファイルのタイプはありません)、式、代入ステートメント、値と変数のパラメーターを持つネストされたプロシージャ定義、ifステートメント、whileステートメント、および開始-終了ブロック(ただし、関数定義、手続き型パラメーター、gotoステートメントとラベル、caseステートメント、repeatステートメント、forステートメント、およびwithステートメントはありません)。
コンパイラとインタプリタはPascal*(Pascal "star")で記述されています。これは、ソフトウェア開発システムを作成するためのいくつかのEdisonスタイルの機能で拡張されたPascalサブセットです。IBMPC用のPascal*コンパイラは著者によって販売されていますが、本のPascalコンパイラを便利なPascalプラットフォームに移植するのは簡単です。
この本は、コンパイラの設計と実装を簡単に見せてくれます。私は、作者が品質、信頼性、およびテストに関心を持っている方法が特に好きです。コンパイラーとインタープリターは、より複雑な言語またはコンパイラー・プロジェクトの基礎として簡単に使用できます。特に、何かをすばやく起動して実行する必要がある場合はそうです。
コンパイラを作成する簡単な方法は、bisonとflex(または同様のもの)を使用して、ツリー(AST)を構築し、Cでコードを生成することです。Cコードを生成することが最も重要なステップです。Cコードを生成することにより、言語はCコンパイラを備えたすべてのプラットフォームで自動的に機能します。
Cコードの生成は、HTMLを生成するのと同じくらい簡単です(印刷または同等のものを使用するだけです)。これは、CパーサーまたはHTMLパーサーを作成するよりもはるかに簡単です。
Darius Bacon の " ichbins "をチェックしてみてください。これは、C をターゲットとする小さな Lisp 方言のコンパイラであり、6 ページ強のコードで構成されています。ほとんどのおもちゃのコンパイラよりも優れている点は、言語が十分に完成していて、コンパイラがその言語で書かれていることです。(tarball には、物事をブートストラップするためのインタープリターも含まれています。)
Ur-Scheme のWeb ページには、コンパイラの書き方を学ぶのに役立つと思われる内容が他にもあります。
Pythonには、Pythonで記述されたPythonコンパイラがバンドルされています。ソースコードを見ることができ、解析、抽象構文木、コードの発行など、すべてのフェーズが含まれています。ハックしてください。
申し訳ありませんが、これはスペイン語ですが、これはアルゼンチンの「Compiladores e Intérpretes」(コンパイラとインタープリター) というコースの参考文献です。
コースは、正式な言語理論からコンパイラの構築まででした。これらは、少なくとも単純なコンパイラを構築するために必要なトピックです。
C.
Allen I. Holub
Prentice-Hall のコンパイラ デザイン。1990年。コンパイル。テオリア・イ・コンストルシオン。
Sanchis Llorca, FJ, Galán Pascual, C. Editorial Paraninfo. 1988年。コンパイラの構築。
ニクラウス・ワース
・アディソン=ウェズリー。1996年。Lenguajes、Gramáticas y Automatas。Un enfoque práctico.
ペドロ・イサシ・ビニュエラ、パロマ・マルティネス・フェルナンデス、ダニエル・ボラホ・ミラン。Addison-Wesley Iberoamericana (スペイン)。1997年。コンパイラ設計の芸術。理論と実践。
トーマス・ピットマン、ジェームズ・ピーターズ。
プレンティスホール。1992年。オブジェクト指向コンパイラの構築。
ジム・ホームズ。
プレンティス ホール、イングルウッド クリフ、ニュージャージー州 1995コンパイル。コンセプトの基礎。
B. トイフェル、S. シュミット、T. トイフェル。
アディソン・ウェズリー・イベロアメリカーナ。1995年。オートマトン理論、言語、および計算の紹介。
ジョン・E・ホプクロフト。ジェフレフ・D・ウルマン。
アディソン・ウェズリー。1979年。形式言語の紹介。
GyörgyE.Révész。
マック・グロー・ヒル。1983年。解析テクニック。実用ガイド。
ディック・グリューン、セリエル・ジェイコブス。
Impreso por los autores. 1995
http://www.cs.vu.nl/~dick/PTAPG.htmlYacc: まだ別のコンパイラ-コンパイラ。
Stephen C. Johnson
Computing Science Technical Report Nº 32、1975 年。ベル研究所。ニュージャージー州マレーヒル
。Lex: レキシカル アナライザー ジェネレーター。
MEレスク、E.シュミット。Computing Science Technical Report Nº 39、1975 年。ベル研究所。ニュージャージー州マレーヒル。レックス&ヤク。
ジョン・R・レヴィーン、トニー・メイソン、ダグ・ブラウン。
オライリー&アソシエイツ。1995年。計算理論の要素。
ハリー・R・ルイス、クリストス・H・パパディミトリウ。セグンダ エディシオン。プレンティス・ホール。1998年。Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control.
サルバドール・V・カバディーニ。
Trabajo Final de Grado para obtener el Título de Ingeniero en Computación.
Facultad de Matemática Aplicada. UCSE 2001。
ここには良い答えがたくさんあるので、リストにもう1つ追加するだけだと思いました。
私は10年以上前にProjectOberonという本を手に入れました。この本には、コンパイラーに関する非常によく書かれたテキストが含まれています。この本は、出典と説明が非常に実践的で読みやすいという意味で本当に際立っています。全文(2005年版)はPDF形式で提供されているため、今すぐダウンロードできます。コンパイラについては、第12章で説明します。
http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf
ニクラウス・ヴィルト、ユルグ・グトクネヒト
(扱いはコンパイラに関する彼の本ほど広範ではありません)
私はコンパイラに関する本を何冊か読んだことがありますが、ドラゴンの本を2番目に読むことができます。この本に費やした時間は、非常に価値があります。
本ではなく、技術論文であり、コンパイラ (およびメタコンパイラ) について詳しく知りたい場合は、非常に楽しい学習体験です... この Web サイトでは、それ自体と他の言語をコンパイルできる完全に自己完結型のコンパイラ システムを構築する手順を説明しています。
これはすべて、驚くほど小さな 10 ページのテクニカル ペーパーに基づいています。
Val Schorre META II: 構文指向のコンパイラ記述言語
1964年の正直者から. 私は1970年にこれからコンパイラーを構築する方法を学びました.
私は学生時代からウェブサイトの作者を知っていますが、私はウェブサイトとは何の関係もありません。
Crenshaw のチュートリアルも気に入りました。コンパイラは、入力を読み取って出力を書き込む単なる別のプログラムであることが明確に示されているからです。
それを読んで。
必要に応じて作業してください。ただし、より大きく、より完全なコンパイラが実際にどのように作成されているかについては、別のリファレンスを参照してください。
そして、 On Trusting Trustを読んで、このドメインで実行できる自明でないことについての手がかりを得てください。
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();
}
関数型言語 (手続き型言語ではなく) のコンパイラを作成することに興味がある場合は、Simon Peyton-Jones と David Lester の「関数型言語の実装: チュートリアル」が優れたガイドです。
機能評価がどのように機能するかの概念的な基本は、「コア」と呼ばれるシンプルだが強力な機能言語の例によって導かれます。さらに、Core 言語コンパイラの各部分は、Miranda (Haskell に非常によく似た純粋な関数型言語) のコード例で説明されています。
いくつかの異なるタイプのコンパイラが説明されていますが、コア用のいわゆるテンプレート コンパイラだけに従っている場合でも、関数型プログラミングを動かしているものをよく理解できます。
言及されていないことに驚いていますが、DonaldKnuthのTheArt of Computer Programmingは、もともとコンパイラの作成に関する一種のチュートリアルとして作成されました。
もちろん、Knuth博士がトピックについて深く掘り下げる傾向があるため、コンパイラ作成チュートリアルは推定9巻に拡張され、そのうち3巻だけが実際に公開されています。これはプログラミングのトピックに関するかなり完全な解説であり、コンパイラーの作成について知る必要があるすべてのことを詳細にカバーしています。
リストにない: ガベージ コレクション: 自動動的メモリ管理のアルゴリズム、Jones と Lins 共著。
(コンパイラとランタイム システムを作成していて、ガベージ コレクション言語を実装していると仮定します。
ドラゴンブックは難しすぎる。したがって、出発点としてそれを無視してください。それは良いことであり、すでに出発点を持っていると、多くのことを考えさせられますが、まず最初に、RD、LL、または LR 構文解析手法を使用して、すべて (字句解析/解析) を記述した数学/論理式エバリュエーターを作成してみることをお勧めします。おそらくC/Javaで手動で。これはそれ自体興味深いものであり、コンパイラーに関係する問題についてのアイデアを与えてくれます。次に、何らかのスクリプト言語を使用して独自の DSL に飛び込むことができます (テキストの処理は通常、これらの方が簡単であるため)。誰かが言ったように、スクリプト言語自体または C でコードを生成します。おそらく flex/bison/antlr などを使用する必要がありますc/java で行う場合は、字句解析/解析を行います。
出発点として、コンパイラの書き方を理解するために、再帰降下パーサー (RDP) を作成することをお勧めします (独自の BASIC を作成し、BASIC インタープリターを構築するとします)。Herbert Schild の C Power Users の第 7 章に最良の情報が見つかりました。この章では、H. Schildt の別の本「C The complete Reference」を参照して、電卓 (単純な式パーサー) の作成方法を説明しています。私は eBay で両方の本を非常に安く見つけました。 この本のコードは、www.osborne.comにアクセスするか、www.HerbSchildt.comで確認できます
本を探しているだけでなく、このトピックに関する記事が掲載されている Web サイトにも興味がある場合は、プログラミング言語の作成に関するさまざまな側面についてブログを書いています。ほとんどの投稿は、私のブログの「言語デザイン」カテゴリにあります。
特に、Intel マシン コードの手動生成、マシン コードまたはバイトコードの自動生成、バイトコード インタープリターの作成、オブジェクト指向ランタイムの作成、単純なローダーの作成、および単純なマーク/スイープ ガベージ コレクターの作成について説明します。多くの理論であなたを退屈させる代わりに、これらすべてを非常に実用的かつ実用的な方法で行います。
これらに関するフィードバックをいただければ幸いです。
最も簡単な方法は、次の 2 つの書籍を使用することです。
An Introduction to Compiling Techniques, a First Course using ANSI C, LeX, and YaCC by JP Bennett の1990 年版- コード例、解析理論、および設計の完璧なバランス - C、lex、および yacc で書かれた完全なコンパイラが含まれています。簡単な文法
Dragon Book (古いバージョン) - 主に、以前の本でカバーされていない機能の詳細なリファレンス
新しい言語のアイデアを試したいときはいつでも、単純なパーサーを作成して、C などの優れたコンパイラを簡単に入手できる言語を生成します。
C++ はどのように作成されたと思いますか?