1

私は OCaml で趣味のリターゲット可能な C コンパイラに取り組んでおり、それをボトムアップで構築しています。これまでのところ、要約された注釈付きの AST タイプがあります。

type 'e expr =
    | Int of 'e * int
    | Var of 'e * var
    | Neg of 'e * 'e expr
    | Add of 'e * 'e expr * 'e expr
    | Sub of 'e * 'e expr * 'e expr

および 3 つの住所コード タイプ (ここでも要約):

type node = Copy of location * location
          | Unary of location * unary_op * location
          | Binary of location * location * binary_op * location

and location = Temp of int | Int of int | Var of string

and unary_op = Neg

and binary_op = Add | Sub

注釈を無視してAST を TAC ノードのリストに変換する関数を作成しました。これに関して、私は2つの質問があります:

  1. 型注釈付き AST を TAC ノードのリストに変換する場合、どうすればよいですか? TAC ノードにも注釈を追加する必要がありますか? これにより、後で高レベルのint/char型をI16/のような低レベルの型に変換できますI8

  2. スコーピングはどのように処理すればよいですか? Var異なるスコープに同じ名前を持つ 2 つの がある場合はどうなりますか?

4

1 に答える 1

1

注釈を TAC に渡す方法は非常に未解決の問題ですが、おそらくそうしたいという意見には同意します。

スコープの 1 つのアプローチは、名前の消去です。スコープを解決するとき、それぞれの一意の識別子を一意の「名前」に置き換えます (または、シンボル テーブル エントリへの参照に直接置き換えます) (これは、従来の Lisp関数にちなんでgensymmingと呼ばれることもあります) 。リダクション、λ計算から取られた用語。これは、ランタイムで名前を使用できない C などの言語で機能します。gensym

ランタイム イントロスペクションが名前にアクセスできる言語 (Python、Javascript) では、このプロセスが多少複雑になりますが、名前の使用ごとに特定のスコープを関連付けることはできます。スコープを動的にできる言語 (Perl、Lisp) では、名前解決操作を TAC に導入する必要があります。

于 2015-06-19T19:05:21.407 に答える