2012-07-11 7 views
11

私は自分のおもちゃのプログラミング言語に取り組んでいます。今のところ私はASTのソース言語を解釈していますが、バイトコードにどのような利点があり、それを解釈することでどのような利点が得られるのでしょうか?今のバイトコードにコンパイルする動機は何ですか?

私は心の中で三つがあります。

  • 時間の構文木の何百ものトラバースは、(1)ランダムアクセス(すなわち特にアレイサポートO場合、配列内の命令を実行するよりも遅くなることがあります。 10命令を上下にジャンプ)。
  • 型付き実行環境では、ASTが型指定されているため実行時にコストがかかりますが、私は常にそれをトラバースしています(つまり、10種類のノードがあります。実行する)。型指定されていないバイトコードにコンパイルすると、これを改善するのに役立つかもしれません。タイプチェックとコンパイルの後に、タイプのない値とコードがあるからです。
  • バイトコードにコンパイルすると、移植性が向上する場合があります。

ポイントは正しいですか?バイトコードのコンパイルの背景にあるその他の動機は何ですか?

+0

あなたのコードの移植性が向上します – Luis

+0

@ルイス、これはすでに私の心の上にあった、私は追加することを忘れていました。 – sinan

+0

@ルイス:それは偽です。シリアル化されたASTは、同じように移植可能にすることができます。実際、バイトコードは移植可能ではありません。 Pythonバイトコードは、インタープリタの各バージョンに固有のものです。 –

答えて

5

スピードが主な理由です。 ASTの解釈は実際には遅すぎます。

バイトコードを使用するもう一つの理由は、バイトコードを簡単にシリアライズ(ディスクに保存)することができるため、それを配布できることです。これがJavaの役割です。

+0

ええと、基本的にこれです。私は他の興味深い動機を見つけることを望んでいました。 – sinan

+0

"これはJavaの機能です"。 Pythonはありませんか? –

6

バイトコード(またはスレッドコードなどの他の「容易に解釈される」フォーム)を生成するポイントは、本質的に性能です。

次の処理を決定するには、ツリーを走査し、ノードを検査し、ノードのタイプを決定し、オペランドのタイプをチェックし、合法性を検証し、AST-指定された演算子が適用されます(「+」と表示されますが、16ビットの加算または文字列の連結を意味します)。

最終的な行動を取り、簡単に解釈される構造を生成する場合、「実行」時には、インタプリタは、すべてのチェック/特別なケース判定なしでアクションを実行するだけに集中できます。

別の最近の言い訳は、よく知られている多くの仮想マシン(JVM、MSIL、Parrotなど)のいずれかのバイトコードを生成すると、インタープリタをコーディングする必要がないということです。 JVMとMSILの場合、JITコンパイラのメリットも得られます。また、JavaとC#の本当の魅力である言語の慎重な設計、巨大ライブラリとの互換性を得ることができます。

関連する問題