27

一度にすべてのコンパイルジョブを実行するコンパイラの作成に関する本や記事がたくさんあります。そして、IDEで使用されるインクリメンタルコンパイラ/パーサーの設計についてはどうでしょうか。私は最初のクラスのコンパイラに精通していますが、2番目のクラスのコンパイラを使用したことはありません。

Eclipse Java開発ツールに関するいくつかの記事を読み込もうとしましたが、内部設計(つまり、内部での動作)ではなく、完全なインフラストラクチャ(つまり、API)の使用方法について説明しています。

私の目標は、自分のプログラミング言語用のインクリメンタルコンパイラを実装することです。どの本や記事をお勧めしますか?

4

3 に答える 3

14

この本は一見の価値があります: 柔軟なインクリメンタル コンパイラ バックエンドの構築。

Ch からの引用。10「結論」:

このホワイト ペーパーでは、インクリメンタル コンパイル システムのバックエンドの設計について説明しました。単一の固定インクリメンタル コンパイラを構築するのではなく、このホワイト ペーパーでは、ユーザーのニーズに応じてそのようなシステムを構築するための柔軟なフレームワークを提示しました。

これがあなたが探しているものだと思います...

編集:
「クロスコンパイラ」として知られるものを作成する予定ですか?!
新しい試みを始めました。これまでのところ、究極のリファレンスを提供することはできません。このような大きなプロジェクトを計画しているのであれば、経験豊富なプログラマーだと確信しています。したがって、これらのリンクをすでに知っている可能性があります。

Compilers.net
特定のコンパイラのリスト。クロス コンパイラ (トランスレータ) も含まれます。残念ながらリンク切れがいくつかありますが、「Toba」はまだ機能しており、ソース コードへのリンクがあります。これはあなたにインスピレーションを与えることができるかもしれません。

clang: LLVM 用の C 言語ファミリ フロントエンド
OK、LVVM用ですが、ソースは SVN リポジトリで入手でき、コンパイラ (トランスレータ) 用のフロント エンドのようです。これはあなたにも刺激を与えることができるかもしれません。

于 2011-06-01T05:45:37.503 に答える
4

ほとんどの従来の通念は、完全な言語設計や極端な効率の必要性など、目標について書かれていない前提を置いているため、これについては従来の通念に同意しません。あなたの質問から、私はこれらの目標を想定しています:

  • 自分の言語を書くことについて学ぶ
  • エレガントに見えるまで、言語をいじってみましょう
  • 実際の実行のためにコードを別の言語またはバイトコードに出力しようとします。

ハッキング ハーネスと再帰降下パーサーを構築したいと考えています。

テキストベースのプロセッサのみを使用して、ハーネス用に作成したいものを次に示します。

  1. コード フラグメントを変更します (現在は「AT 0700 SET HALLWAY LIGHTS ON FULL」)。
  2. フラグメントをコンパイルする
  3. コード ファイル (現在は「tests.l」) を変更します。
  4. ファイルからコンパイル
  5. レクサー出力の切り替え (現在オン)
  6. エミッター出力の切り替え (現在オン)
  7. 家庭用ハードウェアでの実行の切り替え (現在はオフ)

    あなたの命令ですか?

Python やその他のスクリプト言語でコードを書きたいと思うでしょう。実行ではなく、プレイの速度を最適化しています。再帰降下パーサーは次のようになります。

def cmd_at():
    if next_token.type == cTIME:
        num = next_num()
        emit("events.setAlarm(events.DAILY, converttime(" + time[0:1] + ", " 
           + time[2:] + ", func_" + num + ");")
        match_token(cTIME)
        match_token(LOCATION)
        ...

したがって、次のように記述する必要があります。

  • ハッキングのための小さなメニュー。
  • 数値、予約語などに対して異なるトークンを返す、いくつかの字句解析ルーチン。
  • あなたの言語のロジックの束

このアプローチは、言語を一緒にハッキングするためのサイクルをスピードアップすることを目的としています。このアプローチが終了したら、BISON、テスト ハーネスなどに手を伸ばします。

自分の言語を作ることは素晴らしい旅になるでしょう!学ぶことを期待してください。金持ちになることを期待しないでください。

于 2011-06-01T18:52:26.140 に答える
1

受け入れられた答えがあるように見えますが、このページにいくつかの追加資料が役立つと思います。

このトピックに関するウィキペディアの記事を読みましたが、1997年のDDJの記事にリンクしています。

http://www.drdobbs.com/cpp/codestore-and-incremental-c/184410345?pgno=1

記事の内容は最初のページです。エディター内のコードは、「CodeStore」(データベース)に「組み込まれる」部分に分割されることを説明しています。ピースは、組み込まれていないピースを含むワークキューを介して組み込まれます。コードの一部が解析されてワークキューに複数回返される場合がありますが、正常に完了するまで、試行ごとに失敗します。データベースにはピース間の依存関係が含まれているため、ソースコードを編集すると、編集したピースや他のピースへの影響を確認して、これらのピースを再処理できます。

他のシステムでは問題へのアプローチが異なると思います。JavaにはC/C ++とは異なる問題がありますが、利点もあるため、Eclipseの設計はおそらく異なります。

于 2012-07-08T22:42:32.140 に答える