2

コンパイラは、独自の言語でブートストラップと呼ばれるトリックを使用して記述することができます。私の質問は、このトリックを通訳にも適用できるかどうかです。インタプリタをブートストラップしますか?

理論的には答えは間違いありませんが、反復を繰り返すうちに、ソースコードの解釈がますます非効率になるという心配があります。それは深刻な問題だろうか?

私はプログラムが絶えず変化する非常に力強いシステムをブートストラップしているので、コンパイラは除外されています。

私はこの方法でそれをスペルアウトしてみましょう:

は私のことが通訳をしてみましょう。

Lをプログラミング言語にしましょう。

  • L1を解釈するために、マシンコード(最下位レベル)にi1を書くことができます。
  • 次に、L1にi2を書いて、新しい言語であるL2を解釈します。
  • 次に、私はL2でi3を書いて、L3を解釈します。もう1つの新しい言語です。
  • のように...

私たちは、上記だけで通訳を任意のコンパイラを必要としません。右?

これは非効率的である可能性があります。それは私の質問であり、それが本当に非効率な場合にそれを克服する方法です。

+1

これが可能であるかどうかわからない場合、あなたはほぼ確実にあなた自身のプログラミング言語を作成しようとはなりません。また、コンパイルされた動的システムを持つことができないことは間違いありません。 – Marcin

+2

これは実際にはブートストラップではありません。ブートストラップを使用すると、インタプリタBは、自身のために通訳を解釈されている場合これは、通訳には適用できない言語Aに書かれたコンパイラの言語Aをコンパイルすること、および関連する_no_他の言語があり、その後、正確Bの実行されていますか?ロジックは、何かがコンパイルされたことを意味する別の言語(たぶんマシンコード)が必要であることを示しています。あなたが話しているのは、インタープリタスタックです。 PyPyプロジェクトはPythonでPythonインタプリタを構築した経験があります(制限されたサブセットではありますが):http://pypy.org。 –

答えて

3

これは意味をなさない。インタプリタはバイナリを生成しないため、スタンドアロンで実行できるものを作成することはできません。どこかで、最終的には、バイナリがインタープリタである必要があります。

コンパイラのブートストラップの例。 A(ssembler)とCの2つの言語があるとしましょう.Cで書かれたCコンパイラをブートストラップしたいのですが、まずはアセンブラだけがあります。

  1. はCで
  2. 書き込みCコンパイラにおける基本的なCコンパイラを書くと
  3. で書かれた以前のコンパイラでコンパイルするようになりまし自身をコンパイルすることができ、Cコンパイラを持っている、あなたはAまたは必要はありません。元のコンパイラはもうありません。

その後C

で書かれたコンパイラを使用してなるだけ

  1. コンパイルCプログラムは今、私はそれが最初のバージョンをY.呼ぶことにします、あなたが代わりにインタプリタ言語を持っているとしましょう走りますY1、次のY2などと呼ぶことができます。それを "ブートストラップ"しようとしましょう。

    まず、Yプログラムを解釈できるものはありません。基本的なインタプリタを書く必要があります。私たちがCコンパイラを持っていて、CでY1インタプリタを書くとします。Cで

    1. 書き込みY1インタプリタは、Y2に
    2. 書き込みY3インタプリタCで書かれたY1インタプリタ上でそれを実行し、Y1で
    3. 書き込みY2インタプリタをコンパイルY1インタプリタ上で実行されているY2インタプリタ上で実行します。 .. Cで書かれています。

    問題は、高レベルのインタプリタをコンパイルしないので、決してインタプリタのスタックをエスケープできないということです。だから、あなたはいつも、Cで書かれた最初のバージョンのインタプリタをコンパイルして実行する必要があります。それをエスケープすることはできません。これは、コンパイラのブートストラッププロセスの基本的なポイントです。これがあなたの質問が理にかなっていないと言う理由です。

+4

効率的ではありませんが、それは意味があります:インタプリタがプログラムを取り出して(バイナリを生成せずに)実行します。新しいバージョンのインタープリタを自分自身に提供すればどうなるでしょうか?新しい方法で通訳を開始します。バイナリは必要ありません。それで、それは動作します。問題はそれを効率的にする方法です。 –

+1

インタープリタがスタックされていても、それは意味を成します。これはちょうど再帰の一種です。また、ステップ1にはコンパイラーは必要なく、コード出力のないインタープリターにすることもできます。 私の質問はそれを効率的にする方法であり、部分的な評価が答えかもしれません(友人が私に言っただけです)。 –

-1

あなたは確かにすることができ、これはきしみが使用するアプローチである(と私は他の多くのsmalltalksを信じています)。ここではちょうどそれをやって1つのアプローチがある:https://github.com/yoshikiohshima/SqueakBootstrapper/blob/master/README

+0

このプロセスを英語で説明できますか? :) –

+1

@ YanKingYinいいえ、それは私のプロジェクトではありません。もう一度、これがあなたにとっては複雑すぎる場合は、新しい言語の作成に乗り出すべきではありません。世界にはすでに多くのプログラミング言語があります。既存の言語や言語の設計についてすでによく知っていない限り、あなたはその道を再考するでしょう。 – Marcin

+0

私は潜在的に英語を理解することができる帰納的かつ潜在的なファジィ確率的高階論理関数言語を実装しています。私はこのトピックを8年間研究してきましたが、最近ではブートストラップを実装することが非常に望ましいことを認識しています。だから私は今、その側面を学んでいる... :) –

0

この文は意味をなすようには見えません。

私は、プログラムが常に変化することになる非常に動的システムをブートストラップしていますので、それは除外しますコンパイラ。

どんなにあなたがインタプリタやコンパイラを持っている場合:両方のあなたの言語と変更ない何か、すなわちに対処する必要があります。言語が何らかの形で「動的」であっても、修正されたメタ言語が存在します。ほとんどの場合、低レベルのコード、または少なくともインタプリタが扱っているデータ構造もあります。

あなたは最初に設計し、正式この低レベルのコードを(それが何であれ)と、これを「実行」することができ、いくつかのプログラムを書くことができます。いったんこれを取れば、インタープリタのスタックを追加することができ、それらのすべてがこの低レベルのコードを生成する限り、効率は問題ではありません。

+0

私の編集を参照してください - 私は明らかに人々が私の質問を理解していないので、私は多くの投票を受けているとうんざりしています... –

+0

また、私の例では、何も固定されていません(機械コード以外) 。これは不可能であるというあなたの意見と矛盾しているようです。 –

2

答えが解釈されているものに依存します。バイトコードを解釈する仮想マシンをターゲットにしており、バイトコードが変更されないうちに言語が繰り返し開発されている場合は、途中でパフォーマンスが低下することはありません。ターゲットVM上でブートストラップされた言語の例はたくさんあり、特にその言語用に設計されておらず、直接的な結果として大きな成果を上げることはありません(例えば、JVM上のScala)。例えばJVMを使用して

、あなたはJVMバイトコードへのあなたのソース言語をコンパイルしたJavaの最初のコンパイラを記述します。次に、新しいソース言語で、まったく同じことを行うようにコンパイラを書き直します。結果のバイトコードは、2つの間で区別できない可能性があります。インタプリタをインタプリタ言語で書くのと同じことではないことに注意してください。インタプリタ言語は各繰り返しで遅くなります。

関連する問題