動的に型付けされた言語のインタープリターを作成するには、通常、変数名の値へのマッピングを格納するデータ構造である環境を作成する必要があります。値は、ある種のラッパータイプでボックス化されます。これは、Cでは次のようになります。
typedef struct value {
type_t type;
void * datum;
} value_t;
ここで、type_t
は、指定されたオブジェクトのタイプを明示的に格納します。文字列からvalue_t
までの辞書は、言語通訳者の環境として使用できます。
OCamlとHaskellはどちらも強い型の言語であり、コンパイラとインタプリタの両方があります。 静的に型付けされた言語のインタープリターは、動的に型付けされた言語のインタープリターとどのように異なりますか?
私が最初に考えたのは、変数をその型の記述子(上記の例ではtype_t
)にマップする環境が1つあり、その後にこれまでに見た型ごとに個別の環境が続く可能性があるということでした。しかし、実際にそのようなことをどのように実行するのか想像できません。また、OCamlインタープリターのソースコードをざっと見た後、動的言語でおなじみの値のボックス化/ボックス化解除と同じ種類がそこでも使用されているように見えます。
もちろん、これらのことを行う方法には多くの違いがあります。通訳のパスが2つある場合でも、一般的にはそうです。
静的セマンティクス
これは型チェックを制御しますが、後で解釈を高速化するためにコードのより最適化された中間フォームを生成する場合もあります
動的セマンティクス
これは実際に評価を行い、実際にはタイプフリーである可能性があります。型チェックの後、型が整列することがわかったので、多くの静的に型付けされた言語では、それらを消去するだけです。これは、私たちの環境で大きな結合を使ってすべての価値観を表現できることを意味します。
たとえば、すべての値のタイプと、そのタイプへの名前のマップがあります。ただし、型安全言語では、共用体を実行するのは難しい場合があるため、タグ付き共用体を強制することがよくあります。タグ付き共用体は、どのような場合であるかを示すことができるという利点があります。このようなものを使用するために、式でパターンマッチングを行うのは非常に一般的です。あなたが彼らの通訳で見たものを説明していると私が信じるOCamlで。