34

言語がそれ自体をブートストラップする方法は理解していますが、なぜブートストラップを検討すべきかについての参考文献を見つけることができませんでした。

直観的な答えは、あなたが書いている言語は、コンパイラの「ベース」言語には見られないユーティリティを提供しておりその言語の機能はコンパイラに比較的適しているということです。

たとえば、C++ コンパイラをブートストラップすることは理にかなっています。プレーンな C を使用するのではなく、OOP を適切に使用すると、コンパイラの保守がはるかに簡単になる可能性があります。

一方、MATLAB は確かに単純な C よりも行列演算をはるかに簡単にしますが、MATLAB で MATLAB コンパイラ/インタープリタを作成することによる明らかな利点は見られません。保守性が低下するようです。同様の考え方は、R プログラミング言語にも当てはまります。または、かなり極端な例は、Haskell で記述されたWhitespaceのブートストラップです。間違いなく、Whitespace の巨大なスーパーセットです。

新しい言語の機能を利用するためのブートストラップの唯一の理由は? 「できるから」という理由もあると思いますが、それは私が探しているものではありません:)

4

12 に答える 12

36

「自分のドッグフードを食べる」という原則があります。ツールを使用することで、ツールの有用性を実証します。

「言語 X 用のコンパイラが言語 X で書かれていないのに、なぜそれを使用する危険を冒さなければならないのか?」とよく聞かれます。

もちろん、これはコンパイラー作成のドメインに適した言語にのみ適用されます。

于 2009-09-29T16:57:08.970 に答える
17

ブートストラップされた言語の実装には2つの主な利点があります.1つ目は、あなたが示唆するように、実装でその言語の高レベルの機能を利用することです。ただし、それほど明白ではありませんが、それほど重要ではない利点は、C (または Java、または新しい言語ランタイムの下にあるもの) で記述された下位レイヤーにドロップすることなく、言語をカスタマイズおよび拡張できることです。

メタプログラミングは、ほとんどの日常的なタスクには役立たないかもしれませんが、多くの重複コードやボイラープレート コードを節約できる場合があります。高レベルで言語のコンパイラとコア ランタイムにフックできると、高度なメタプログラミング タスクがはるかに簡単になります。

于 2009-09-29T16:59:55.670 に答える
11

Ken Thompson のReflections on Trusting Trustは、ブートストラップの最良の理由の 1 つを説明しています。基本的に、コンパイラは、ブートストラップ チェーン内のコンパイラのすべてのバージョンについて、二度と教える必要のない新しいことを学習します。

彼が言及した場合、最初に作成するコンパイラ (C1) には、バックスラッシュ エスケープの処理方法を明示的に指定する必要があります。ただし、2 番目のコンパイラ (C2) は C1 を使用してコンパイルされるため、バックスラッシュのエスケープ処理はネイティブに処理されます。

彼の話の要点は、プログラムにバックドアを追加するようにコンパイラに教えることができる可能性であり、侵害されたコンパイラでコンパイルされた将来のコンパイラにもこの機能が与えられ、ソースには決して現れないということです!

基本的に、プログラムはすべてのコンパイル サイクルで新しい機能を学習できますが、コンパイラはそれらについてすべて既に知っているため、後のコンパイル サイクルで再実装または再コンパイルする必要はありません。

その影響を理解するために少し時間を取ってください。

[編集]:これは、コンパイラを構築するための非常にひどい方法ですが、クールな要素は屋根を通り抜けます。適切なフレームワークで管理できるのだろうか?

于 2011-06-22T16:13:33.557 に答える
10

「おもちゃの」言語と「本物の」言語を隔てるバーと考えることができます。言語がそれ自体を実装するのに十分なほどリッチでない場合、それはまだおもちゃです。しかし、C で実装されている今日の人気のある言語の数を考えると、これはおそらく大部分が過ぎ去った時代からの態度です。

于 2009-09-29T16:57:47.190 に答える
8

利点の 1 つは、コンパイラに取り組んでいる開発者が、コンパイルされる言語を知るだけでよいことです。そうしないと、開発者は、コンパイラが記述されている言語だけでなく、コンパイルされている言語も知る必要があります。

于 2009-09-29T16:59:37.920 に答える
3

新しいシステムにコードを配置するには、そこに低レベルのコンパイラが必要なため、低レベルの言語はブートストラップされることがよくあります。Cコンパイラを入手すれば、大量のコードを使用できるようになります。ブートストラップされたコンパイラを使用すると、これが簡単になります。独自のコードをコンパイルおよび改善するには、独自のコードが存在するだけで済みます。

クロスコンパイラを作成するなど、これを実現する方法は他にもあります。ほとんどのシステムでは、通常の使用ではデバイス自体で静的言語をコンパイルできる必要はありません(実際、Windowsなどのシステムにはコンパイラが付属していません)。

コンパイラがしばしばブートストラップするもう1つの理由は、コンパイル時に使用するコンパイラのバグについて心配する必要がないようにするためです。コンパイラーをそれ自体でコンパイルできることを確認し、別のコンパイラーでコンパイルした場合に発生する可能性のあるバグの組み合わせを制限します。

高水準言語のブートストラップは、ほとんどの場合、毛むくじゃらのプログラミングスキルを披露するために行われていると思います。

于 2009-09-29T18:44:16.103 に答える
3

コンパイラは、文字列操作、大きなデータ構造の処理、オペレーティング システムとのインターフェイスなど、さまざまな重要な問題を解決します。あなたの言語がそれらを処理することを意図しているなら、あなたの言語でコンパイラを書くことはそれらの機能を実証します。さらに、言語に含まれる機能が増えると、コンパイラで使用できる機能が増えるため、指数関数的な効果が生まれます。コンパイラの記述を容易にする独自の機能を実装すると、さらに多くの機能を実装するための新しいツールが利用可能になります。

ただし、言語がコンパイルと同じ問題を処理することを意図していない場合、ブートストラップは、ターゲットの問題ではなくコンパイルに関連する機能で言語を混乱させるだけです。Matlab や SQL で自己コンパイルするのはばかげています。Matlab には強力な文字列操作関数を含める理由はなく、SQL にはコード生成をサポートする理由はありません。結果として得られる言語は、不要で雑然としたものになります。

また、インタープリター言語は少し異なる問題であり、それに応じて処理する必要があることにも注意してください。

于 2010-01-05T21:04:11.917 に答える
2

ブートストラップには別の利点もあります。使用する言語が優れている場合は、たとえば C よりも <ここに言語を挿入> でコンパイラを作成することで時間を節約できます。たとえば、C# コンパイラは C++ で作成されましたが、現在は C++ で書き直していますC# のおかげで、(とりわけ) C++ で自分自身をロールバックする代わりに、CLR のスレッド フレームワークを使用できるようになりました (また、Mono の連中の先導に従い、マーケティングの観点からも、Mono は、私たちの C# コンパイラは実際には C# で書かれていると言えます)。

于 2009-09-29T18:52:53.463 に答える
2

DSL 用のコンパイラをブートストラップしません。SQL で SQL クエリ コンパイラを記述しません。MATLAB は汎用言語のように見えますが、実際にはそうではなく、数値計算用に設計された言語です。

于 2009-09-29T17:00:21.133 に答える
2

具体的な例として、バージョン 1.5 (2015 年 8 月リリース) で、Go は完全にブートストラップされた言語に切り替わりました[1] [2]。彼らは次の理由を挙げました。

  • Go は C より (正しく) 書きやすいです。
  • Go は C よりもデバッグが簡単です (デバッガーがなくても)。
  • 知っておく必要がある言語は Go だけです。貢献を奨励します。
  • Go はモジュール性、ツール、テスト、プロファイリングなどに優れています。
  • Go は並列実行を簡単にします。

これらのうち、すべての言語に当てはまる唯一の方法は、コンパイラに貢献するために必要な言語は 1 つだけであるということです。他の議論は、「私たちの新しい言語は古い言語よりも優れている」と要約できます。どちらが正しいと思われますか? そうでなければ、なぜ新しい言語を書くのでしょうか?

于 2016-09-04T22:48:31.573 に答える
1

あなたがそれをしたいと思うかもしれないいくつかの理由があります(理論的には):

  1. コンパイラは、ブートストラッププラットフォーム上の他のコンパイラよりも最適化されたコードを生成します。
  2. コンパイラは、ブートストラッププラットフォーム上の他のコンパイラよりも正確なコードを生成します。
  3. あなたは、そうではないのに、上記のいずれかが真実であると確信している自我のジャークです。
  4. ご使用のプラットフォームで使用可能なコンパイラーはありません(多くのプラットフォームには当時Cコンパイラーがなかったため、これはGCCの元のロジックでした)。
  5. コンパイラがそれを処理できることを証明する必要があります(これは、結局のところ、実際にはコンパイラのかなり良いテストです)。
于 2009-11-06T03:21:25.473 に答える
0

ブートストラップは、汎用プログラミング言語から期待されます。

于 2022-02-07T05:27:58.953 に答える