697

推奨言語: C/C++、Java、および Ruby。

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

4

38 に答える 38

1164

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

伝説:

  • ¶ PDFファイルへのリンク
  • $ 印刷された本へのリンク
于 2008-08-04T22:52:00.650 に答える
74

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

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

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

Compilers Principles and Techniques (または、表紙のかわいいドラゴンのため、Dragon Book) は、このトピックに関する本で特に役に立ちました。それはいくつかの素晴らしい理論を持っており、本当にアクセスしやすい方法で文脈自由文法を確実にカバーしています. また、語彙アナライザーとパーサーを構築するために、おそらく *nix ツールの lex と yacc を使用するでしょう。そして、面白くないことに、「lex and yacc」という本が、ドラゴンブックがこの部分で中断したところから取り上げられました。

于 2009-07-20T23:01:20.580 に答える
60

MLでの最新のコンパイラの実装は、テキストを書くための最高の入門コンパイラだと思います。Java バージョンC バージョンもありますが、言語のバックグラウンドを考えると、どちらの方がアクセスしやすいかもしれません。この本には、有用な基本的な資料 (スキャンと解析、セマンティック分析、アクティベーション レコード、命令の選択、RISC と x86 ネイティブ コードの生成) とさまざまな「高度な」トピック (OO と関数型言語のコンパイル、ポリモーフィズム、ガベージ コレクション、最適化と単一の静的割り当てフォーム) を比較的小さなスペース (~500 ページ) に配置します。

私は Dragon book よりも Modern Compiler Implementation の方が好きです。なぜなら、Modern Compiler の実装は調査対象分野が少ないからです。代わりに、本格的で適切なコンパイラを作成するために必要なすべてのトピックを確実にカバーしています。この本を読み終えたら、必要に応じて研究論文に直接取り組む準備が整います。

私は Niklaus Wirth のCompiler Construction に深刻な弱点があることを告白しなければなりません。PDFとしてオンラインで入手できます。Wirth のプログラミングの美学は単純に美しいと思いますが、彼のスタイルが最小限すぎると感じる人もいます (たとえば、Wirth は再帰降下パーサーを好みますが、ほとんどの CS コースはパーサー生成ツールに焦点を当てています。Wirth の言語設計はかなり保守的です)。ヴィルトの基本的な考え方が書かれているので、彼のスタイルが好きかどうかにかかわらず、この本を読むことを強くお勧めします。

于 2008-08-10T07:54:32.790 に答える
46

Dragon Book の参照に同意します。IMO、これはコンパイラ構築の決定的なガイドです。ただし、いくつかの筋金入りの理論の準備をしてください。

より軽い理論の本が必要な場合は、Game Scripting Masteryの方が適しているかもしれません。あなたがコンパイラ理論のまったくの初心者である場合、それはより穏やかな導入を提供します. より実用的な構文解析方法 (LL または LR 構文解析については説明せずに非予測的再帰降下を選択する) については説明していません。思い出したように、最適化理論についても説明していません。さらに、マシン コードにコンパイルする代わりに、ユーザーが記述した VM 上で実行することになっているバイトコードにコンパイルします。

特にAmazonで安く手に入れることができれば、それはまだまともな読み物です. コンパイラの簡単な紹介だけが必要な場合は、Game Scripting Mastery を受講するのも悪くありません。前もってハードコアになりたい場合は、Dragon Book に落ち着く必要があります。

于 2008-08-04T23:08:18.603 に答える
31

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

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

于 2008-08-04T22:56:30.767 に答える
25

自分ですべてを構築するのではなく、強力で高レベルのツールを使用することを検討している場合は、このコースのプロジェクトと読み物に目を通すことは非常に良いオプションです. これは、Java パーサー エンジン ANTLR の作成者による言語コースです。このコースの書籍は、Pragmatic Programmersから PDF として入手できます。

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

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

于 2008-08-04T23:13:49.450 に答える
22

時間がない場合は、Niklaus Wirthの「CompilerConstruction」(Addison-Wesley.1996)をお勧めします。これは、1日で読むことができる小さな小冊子ですが、基本(レクサー、再帰下降パーサーの実装方法など)について説明しています。および独自のスタックベースの仮想マシン)。その後、深く掘り下げたい場合は、他のコメント投稿者が示唆しているように、ドラゴンの本を回避する方法はありません。

于 2010-08-28T23:14:41.273 に答える
18

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

この FAQが役に立ちますし、このチュートリアルもとても役に立ちます。

于 2009-07-20T22:47:04.167 に答える
14

以下の本を見てみましょう。著者はANTLRの作成者です。

言語実装パターン: 独自のドメイン固有および汎用プログラミング言語を作成します

代替テキスト

于 2010-05-17T23:38:29.353 に答える
12

まだ提案されていませんが、非常に重要な 1 冊の本は、John Levine による「Linkers and Loaders」です。外部アセンブラを使用していない場合は、最終的なプログラムにリンクできるオブジェクト ファイルを出力する方法が必要になります。外部アセンブラを使用している場合でも、ツールを機能させるには、おそらく再配置と、プログラムのロード プロセス全体がどのように機能するかを理解する必要があります。この本は、Win32 や Linux を含むさまざまなシステムについて、このプロセスに関するランダムな伝承をたくさん集めています。

于 2008-08-18T20:18:32.163 に答える
11

FraserとHansonのLCCコンパイラ(ウィキペディア)(プロジェクトのホームページ)(github.com/drh/lcc)は、彼らの著書「A Retargetable CCompiler:DesignandImplementation」で説明されています。非常に読みやすく、コード生成に至るまでのコンパイラ全体を説明しています。

于 2008-09-16T16:21:23.343 に答える
11

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

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

于 2008-08-20T10:01:17.023 に答える
11

ドラゴンの本は、実際にコンパイラを書くのに実際には必要ない言語理論に焦点を当てすぎているため、読むのが難しすぎることがわかりました。

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

代替テキスト

于 2010-08-09T18:33:42.603 に答える
11

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

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

于 2008-08-05T16:16:01.150 に答える
10

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

私が尋ねたとき、私は非常に慎重でした、そして驚くべきことに、私はあなたがここに来ているほど多くの批判を受けませんでした. しかし、彼らは私に " Dragon Book " の方向性を教えてくれました。これは私の意見では、コンパイラーを書くために知っておくべきことをすべて説明している本当に素晴らしい本です (もちろん、1 つまたは 2 つの言語を習得する必要があります)。あなたが知っている言語、楽しいです。)

そうです、多くの人がその本を読むのはクレイジーで、そこから何も学べないと言いますが、私はそれには完全に同意しません。

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

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

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

結論として、The Dragon Book は素晴らしい「チュートリアル」です。ただし、コンパイラを作成する前に、1 つまたは 2 つの言語を習得するのに時間を費やしてください。ただし、今後 10 年ほどでコンパイラの第一人者になることを期待しないでください。

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

于 2009-08-06T22:37:05.273 に答える
10

私は同じ概念を調べており、Joel Pobar によるこの有望な記事を見つけました。

.NET Framework 用の言語コンパイラを作成します - これがどこに行ったのかわかりません

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

彼は、コンパイラの高レベルの概念について議論し、.Net フレームワーク用の独自の言語の発明に取り掛かります。.Net Framework を対象としていますが、概念の多くは再現できるはずです。この記事は以下をカバーしています:

  1. 言語の定義
  2. スキャナ
  3. パーサー (私が主に興味を持っているビット)
  4. .Net Framework をターゲットにする
  5. コードジェネレーター

他のトピックがありますが、あなたはただ得ます。

C# (完全な Java ではない) で書かれた、始めたばかりの人を対象としています。

HTH

骨格

于 2008-12-30T23:01:20.493 に答える
9

「……コンパイラを作ろう……」

@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

于 2008-08-20T11:28:58.717 に答える
8

comp.compilers FAQから:

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プラットフォームに移植するのは簡単です。

この本は、コンパイラの設計と実装を簡単に見せてくれます。私は、作者が品質、信頼性、およびテストに関心を持っている方法が特に好きです。コンパイラーとインタープリターは、より複雑な言語またはコンパイラー・プロジェクトの基礎として簡単に使用できます。特に、何かをすばやく起動して実行する必要がある場合はそうです。

于 2010-06-26T20:17:04.560 に答える
8

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

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

于 2008-08-20T09:56:34.367 に答える
8

Darius Bacon の " ichbins "をチェックしてみてください。これは、C をターゲットとする小さな Lisp 方言のコンパイラであり、6 ページ強のコードで構成されています。ほとんどのおもちゃのコンパイラよりも優れている点は、言語が十分に完成していて、コンパイラがその言語で書かれていることです。(tarball には、物事をブートストラップするためのインタープリターも含まれています。)

Ur-Scheme のWeb ページには、コンパイラの書き方を学ぶのに役立つと思われる内容が他にもあります。

于 2008-10-05T16:00:52.583 に答える
7

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

于 2008-08-12T11:25:34.113 に答える
7
  1. これは広大なテーマです。この点を過小評価しないでください。そして、それを過小評価しないように私のポイントを過小評価しないでください.
  2. ドラゴンブックは、検索とともに開始する場所だと聞きました。:) 検索が上手になり、最終的にはあなたの人生になります。
  3. 独自のプログラミング言語を構築することは、絶対に良い練習になります! しかし、それが最終的に実用的な目的で使用されることは決してないことを知っておいてください. これに対する例外はほとんどなく、非常に大きな差があります。
于 2009-07-20T22:44:40.147 に答える
7

申し訳ありませんが、これはスペイン語ですが、これはアルゼンチンの「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.html

  • Yacc: まだ別のコンパイラ-コンパイラ。
    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。

于 2009-04-25T17:23:55.193 に答える
6

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

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

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

ニクラウス・ヴィルト、ユルグ・グトクネヒト

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

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

于 2008-09-18T23:31:14.747 に答える
6

本ではなく、技術論文であり、コンパイラ (およびメタコンパイラ) について詳しく知りたい場合は、非常に楽しい学習体験です... この Web サイトでは、それ自体と他の言語をコンパイルできる完全に自己完結型のコンパイラ システムを構築する手順を説明しています。

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

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

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

1964年の正直者から. 私は1970年にこれからコンパイラーを構築する方法を学びました.

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

于 2009-08-28T00:01:07.223 に答える
5

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

それを読んで。

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

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

于 2008-08-22T15:57:16.420 に答える
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();
}
于 2011-07-14T15:42:33.180 に答える
5

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

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

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

于 2008-10-01T09:30:26.433 に答える
3

言及されていないことに驚いていますが、DonaldKnuthのTheArt of Computer Programmingは、もともとコンパイラの作成に関する一種のチュートリアルとして作成されました。

もちろん、Knuth博士がトピックについて深く掘り下げる傾向があるため、コンパイラ作成チュートリアルは推定9巻に拡張され、そのうち3巻だけが実際に公開されています。これはプログラミングのトピックに関するかなり完全な解説であり、コンパイラーの作成について知る必要があるすべてのことを詳細にカバーしています。

于 2009-07-21T00:20:14.653 に答える
3

リストにない: ガベージ コレクション: 自動動的メモリ管理のアルゴリズム、Jones と Lins 共著。

(コンパイラランタイム システムを作成していて、ガベージ コレクション言語を実装していると仮定します。

于 2010-06-26T23:43:23.703 に答える
3

ドラゴンブックは難しすぎる。したがって、出発点としてそれを無視してください。それは良いことであり、すでに出発点を持っていると、多くのことを考えさせられますが、まず最初に、RD、LL、または LR 構文解析手法を使用して、すべて (字句解析/解析) を記述した数学/論理式エバリュエーターを作成してみることをお勧めします。おそらくC/Javaで手動で。これはそれ自体興味深いものであり、コンパイラーに関係する問題についてのアイデアを与えてくれます。次に、何らかのスクリプト言語を使用して独自の DSL に飛び込むことができます (テキストの処理は通常、これらの方が簡単であるため)。誰かが言ったように、スクリプト言語自体または C でコードを生成します。おそらく flex/bison/antlr などを使用する必要がありますc/java で行う場合は、字句解析/解析を行います。

于 2008-10-01T20:24:42.443 に答える
3

出発点として、コンパイラの書き方を理解するために、再帰降下パーサー (RDP) を作成することをお勧めします (独自の BASIC を作成し、BASIC インタープリターを構築するとします)。Herbert Schild の C Power Users の第 7 章に最良の情報が見つかりました。この章では、H. Schildt の別の本「C The complete Reference」を参照して、電卓 (単純な式パーサー) の作成方法を説明しています。私は eBay で両方の本を非常に安く見つけました。 この本のコードは、www.osborne.comにアクセスするか、www.HerbSchildt.comで確認できます

于 2008-08-20T11:16:20.307 に答える
2

本を探しているだけでなく、このトピックに関する記事が掲載されている Web サイトにも興味がある場合は、プログラミング言語の作成に関するさまざまな側面についてブログを書いています。ほとんどの投稿は、私のブログの「言語デザイン」カテゴリにあります。

特に、Intel マシン コードの手動生成、マシン コードまたはバイトコードの自動生成、バイトコード インタープリターの作成、オブジェクト指向ランタイムの作成、単純なローダーの作成、および単純なマーク/スイープ ガベージ コレクターの作成について説明します。多くの理論であなたを退屈させる代わりに、これらすべてを非常に実用的かつ実用的な方法で行います。

これらに関するフィードバックをいただければ幸いです。

于 2014-04-02T12:39:16.147 に答える
2

最も簡単な方法は、次の 2 つの書籍を使用することです。

An Introduction to Compiling Techniques, a First Course using ANSI C, LeX, and YaCC by JP Bennett の1990 年版- コード例、解析理論、および設計の完璧なバランス - C、lex、および yacc で書かれた完全なコンパイラが含まれています。簡単な文法

Dragon Book (古いバージョン) - 主に、以前の本でカバーされていない機能の詳細なリファレンス

于 2011-04-01T19:39:19.670 に答える
-1

新しい言語のアイデアを試したいときはいつでも、単純なパーサーを作成して、C などの優れたコンパイラを簡単に入手できる言語を生成します。

C++ はどのように作成されたと思いますか?

于 2009-07-21T00:42:47.327 に答える