0

Flex と Bison を使用して、C でプログラミング言語のインタープリターを作成しています。ASTを生成する方法がわかりません。インタープリターが見ているようにコードを解釈した場合、どのようなパフォーマンスの違いがあるか知りたいですか?

また、Bison がバックグラウンドで AST を生成するかどうかを知りたいのですが、一部のフォーラムで AST が生成されていると聞いたり、他の Web サイトで人々が独自の AST を作成しているのを見たりしていませんか?

前もってありがとう、フランシス

4

2 に答える 2

3

re: Bison を使用して AST を構築する方法:

Bison から AST を構築する簡単な例については、このサイトを参照してください: EPaperPress

Mitsuhisa Sato の例も参照してください(これは、Bison を使用した単純なインタープリターのコードです)。

re: AST を使用した通訳者とストレート通訳者のパフォーマンスの違い。

インタープリターを作成する方法はたくさんあります。以下のリストは、(一般的に) パフォーマンスが最も遅いものから最も速いものまでです (単純なプログラムの場合、ほとんど違いがないことに注意してください。しかし、同じコードを何度も繰り返すプログラムの場合、大きな違い):

  1. ストレートな解釈
  2. コメントのトークン化や削除など、いくつかの前処理を行う
  3. ASTを構築し、それを解釈する
  4. 中間コード (バイトコード) に変換し、AST を使用するかどうかに関係なく、それを解釈します。

速度を比較するには、次のようにします。

移動先: Tom Gibson の Tiny C サイト

そして、適切なインタープリターをダウンロードします。Tom Gibson の Tiny C for DOS か、おそらく Windowsか、Tom Gibson の Tiny C for Linuxです。

これは純粋なインタープリターです - 上記の #1。素数などを計算する小さなプログラムを作成し、それを計測します。

Sato のサイトの「Tiny C」には、上記の AST - #3 から解釈するインタープリターが含まれています。同様のプログラムを作成し、時間を計ってください。

最後に、Marc Feeley の Tiny C から別の Tiny C を入手します。

これは AST を作成し、それをバイト コードに変換してから解釈します - 上記の #4。これのために小さなプログラムを書き直して、その時間を計ってください。

これが役立つことを願っています!

于 2013-11-21T01:09:52.483 に答える
2

Bison は単独で AST を生成しませんが、AST を構築するためのコードを作成するのに役立つ機能を備えています。

まず、この%unionステートメントを使用すると、AST で使用するノードの型を表す共用体を定義できるため、変数宣言や式などの型を定義できます。

次に、特定のパターンが認識されたときに実行されるコードに関連付けるユニオン メンバーを指定できるため、C コンパイラは基本的にユニオンの型チェックを行いませんが、型チェックを行うことができます。

パフォーマンスの違いに関する限り、推測するのはほぼ不可能です。一般に、最初に AST を構築することは最適化を目的としていますが、最適化がどれほど効果的かは、解釈する言語と (特に) 記述するコードの両方に依存します。

于 2013-08-25T15:44:37.457 に答える