ブートストラップには依然として外部サポートが必要です


96

言語をブートストラップする、つまり、言語自体のコンパイラー/インタープリターを作成するという考えを聞いたことがあります。私はこれがどのようにして達成され、少し周りを見渡せるのか疑問に思っていました。

  • 別の言語で初期コンパイラを書く。
  • 最初のコンパイラの特別なケースのように見えるアセンブリでの初期コンパイラのハンドコーディング

私には、どちらも外部のサポートが必要であるという意味で、どちらも実際に言語をブートストラップしているようには見えません。実際にコンパイラを独自の言語で作成する方法はありますか?


私はそのようなことについてはあまり経験がありませんが、最初のコンパイラーは別の言語で書かれる必要があると思います。コンパイラーに関する「ブートストラップ」とはコンパイラーを意図した言語でコンパイラーを作成することを指しコンパイルする言語で最初のコンパイラーを作成することではないことを私はかなり確信しています。
jdd 2008

1
皆さん、情報ありがとうございます。最初に限られたコンパイラーを作成し、その上に構築するというアイデアで説明すると、ブートストラップのアイデアはより理にかなっています。私は今学期にコンパイラクラスを受講します。この決定は、コンパイラのクラスがどれほど重要であるかに関するSteve Yeggeの投稿に大きく影響を受けており、Amazonリンクからドラゴンブックのコピーを購入しました。
pbh101 2008

1
同様の質問も参照してください:コンパイラー自体の実装
Urban Vagabond 2013年

回答:


107

実際にコンパイラを独自の言語で作成する方法はありますか?

君は 持っている中で、あなたの新しいコンパイラを書くために、いくつかの既存の言語を持っている。あなたが新しいを書いていた場合は、C ++コンパイラを言って、あなただけのC ++でそれを書いて、最初に既存のコンパイラでコンパイルします。一方、新しい言語用のコンパイラを作成する場合は、Yazzleofと呼びましょう。最初に新しいコンパイラを別の言語で作成する必要があります。通常、これは別のプログラミング言語ですが、そうである必要はありません。アセンブリ、または必要に応じてマシンコードを使用できます。

あなたがいる場合された Yazzleof用のコンパイラをブートストラップに行く、あなたは一般的に、最初は完全な言語のコンパイラを書きません。代わりに、Yazzleofの可能な限り最小のサブセットであるYazzle-lite用のコンパイラーを作成します(少なくともかなり小さいサブセットです)。次に、Yazzle-liteで、完全な言語用のコンパイラーを作成します。(明らかに、これは1回のジャンプの代わりに繰り返し発生する可能性があります。)Yazzle-liteはYazzleofの適切なサブセットであるため、それ自体をコンパイルできるコンパイラーがあります。

あり、本当に題し、(現代のマシン上で基本的にバイナリエディタである)可能な限り低いレベルからコンパイラをブートストラップについて良いWRITEUP 何から簡単なコンパイラのブートストラップが。それはで見つけることができhttps://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html


19

あなたが読んだ説明は正しいです。これについては、コンパイラ:原則、テクニック、ツール(ドラゴンブック)で説明されています。

  • 言語XのコンパイラC1を言語Yで記述します。
  • コンパイラーC1を使用して、言語Xで言語X用のコンパイラーC2を作成します。
  • 現在、C2は完全に自己ホスティング環境です。

7

これについての非常に興味深い議論は、Unixの共同創設者であるケントンプソンチューリング賞の講演です。

彼は次のように始まります:

私が説明しようとしているのは、コンパイラが独自の言語で書かれているときに発生する多くの「鶏と卵」の問題の1つです。ここでは、Cコンパイラの特定の例を使用します。

Cコンパイラはログインプログラムを認識して特別なコードを追加するため、パスワードなしで常にログインできるUnix Cコンパイラのバージョンをどのように作成したかを示します。

2番目のパターンは、Cコンパイラを対象としています。置換コードは、両方のトロイの木馬をコンパイラに挿入するステージIの自己複製プログラムです。これには、ステージIIの例のように学習フェーズが必要です。最初に、修正されたソースを通常のCコンパイラでコンパイルして、バグのあるバイナリを生成します。このバイナリを公式Cとしてインストールします。これで、コンパイラのソースからバグを削除でき、新しいバイナリはコンパイルされるたびにバグを再挿入します。もちろん、loginコマンドは、ソースのどこにもトレースがなく、バグが残ります。


9
これはトピック外です。興味深いですが、混乱を招き、質問への答えではありません。
blueshift 2012年

5

私が聞いた方法は、非常に限られたコンパイラを別の言語で記述し、それを使用して新しい言語で記述されたより複雑なバージョンをコンパイルすることです。この2番目のバージョンを使用して、それ自体をコンパイルし、次のバージョンをコンパイルできます。コンパイルされるたびに、最後のバージョンが使用されます。

これはブートストラップの定義です

同じ目的を果たすより複雑なシステムをアクティブにする単純なシステムのプロセス。

編集:コンパイラのブートストラップに関するウィキペディアの記事は、私よりもコンセプトをカバーしています。




3

私が理解しているように、最初のLispインタープリターは、コンストラクター関数とトークンリーダーを手動でコンパイルすることによってブートストラップされました。次に、残りのインタプリタがソースから読み込まれました。

元のマッカーシーの論文、記号式の再帰関数と機械による計算、パートIを読んで、自分で確認できます。


パート2とパート3はどうなりましたか?... @Wingが同じものを3年前に投稿したことに気づかなかったのはなぜですか。私は馬鹿です。少なくとも私は(助けを借りて)論文をリンクしました。
luser droog 2013

2

別の代替方法は、言語のバイトコードマシンを作成し(または、機能がそれほど珍しくない場合は既存のマシンを使用し)、バイトコードで、または別の中間体を使用して目的の言語でコンパイラをバイトコードに書き込みます-などASTをXMLとして出力し、XSLT(または別のパターンマッチング言語とツリーベースの表現)を使用してXMLをバイトコードにコンパイルするパーサーツールキット。別の言語への依存を削除するわけではありませんが、ブートストラップ作業の多くが最終的なシステムで終了することを意味する可能性があります。


2

これは、鶏と卵のパラドックスのコンピュータサイエンスバージョンです。アセンブラや他の言語で初期コンパイラを書かない方法は考えられません。もしそれができたなら、Lispができたはずです。

実際、Lispはほぼ適格だと思います。Wikipediaのエントリーを調べてください。記事によると、Lisp eval関数は、マシンコードでIBM 704に実装でき、完全なコンパイラー(Lisp自体で作成)が1962年にMITで登場する予定です。


2

私が考えることができる言語(CPyPy)をブートストラップするすべての例は、動作するコンパイラーがあった後に行われました。あなたはどこかから始める必要があり、言語自体を再実装するには、まず別の言語でコンパイラを書く必要があります。

他にどのように機能しますか?概念的には別の方法で行うことも可能だとは思いません。


4
少なくとも、最初のLispコンパイラは、既存のLisp インタプリタを使用してブートストラップされました。つまり、意味論的に別の言語ではなく、別の言語の実装です。
Ken

0

一部のブートストラップコンパイラまたはシステムは、ソースフォームとオブジェクトフォームの両方をリポジトリに保持します。

  • ocamlは、バイトコードインタープリター(つまり、Ocamlバイトコードへのコンパイラー)とネイティブコンパイラー(x86-64またはARMなどへのアセンブラー)の両方を持つ言語です。そのsvnリポジトリーには、コンパイラーのソースコード(files */*.{ml,mli})とバイトコード(file boot/ocamlc)形式の両方が含まれています。したがって、ビルドするときは、最初に(以前のバージョンのコンパイラの)バイトコードを使用して自身をコンパイルします。後で、新しくコンパイルされたバイトコードは、ネイティブコンパイラをコンパイルできます。したがって、Ocaml svnリポジトリには、*.ml[i]ソースファイルとboot/ocamlcバイトコードファイルの両方が含まれています。

  • (使用したコンパイラのダウンロードwget自体をコンパイルするバイナリの以前のバージョンを使用すると、作業のインターネット接続が必要ですので、)。

  • MELTは、GCCをカスタマイズおよび拡張するためのLispに似た言語です。ブートストラップトランスレータによってC ++コードに変換されます。トランスレータの生成されたC ++コードは配布されるため、svnリポジトリには、トランスレータの*.meltソースファイルとmelt/generated/*.cc「オブジェクト」ファイルの両方が含まれています。

  • J.PitratのCAIA人工知能システムは、完全に自己生成型です。これは、何千ものデータファイルのコレクションとともに、何千[A-Z]*.cもの生成されたファイルのコレクションとして(また、生成されたdx.hヘッダーファイルとともに)利用_[0-9]*できます。

  • いくつかのSchemeコンパイラもブートストラップされます。Scheme48、チキンスキーム、...

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