3

私の英語を許してください。私は最近、コンパイラのさまざまな部分を理解し、それらを再生言語で実装しようとしています。セマンティックアナライザーの仕事は何であるか疑問に思っています。セマンティックアナライザーが行うことを前提としていることを読んだ多くのことは、実行時にチェックされるため、型チェックやスコープチェックなどの動的言語では実際にはありません。時間。

したがって、動的言語(LUA、PYTHON、RUBYなど)のセマンティックアナライザーの仕事のいくつかは、

  1. 1=aまたは5=5のように割り当てが悪くないことを確認してください

ただし、動的言語用のコンパイラーのセマンティック分析フェーズが他にどのような仕事であるかはわかりません。ほとんどが実行時に行われるため、動的言語で行う作業は非常に小さいようです。セマンティックアナライザーは動的言語のために他にどのような一般的な仕事をしますか?セマンティックアナラシスの一部が欠けているように感じます。ありがとうございました。

4

1 に答える 1

4

そうです、多くの分析タスクは動的言語コンパイラーには存在しません(そのため、それらは比較的簡単に実装できます)。ただし、私が考えることができるタスクは他にもいくつかあります。

  • スコープ。変数のタイプと場合によっては変数の存在さえも動的に決定されるのは正しいですが、少なくともLuaとPythonの場合、スコープの一部を実行できます(実装を不必要に複雑にしたくない場合は)。コンパイル時:非グローバル変数のスコープ。

    • 何を分析する必要がありますか?明示的なキーワードがあるため、Luaではその部分は簡単ですlocalが、それでもコンパイラーがそれを認識する必要があります。-そして、Pythonで比較的広範な分析を行う必要があります。割り当てにより、変数がローカルになり、その動作を変更するために2つの(3.xでは1つ、2.xでは1つ)キーワードが暗黙的に作成されます。

    • なぜそれが重要なのですか?Pythonでは、まだ初期化されていないローカル変数にアクセスすることは、Pythonで存在しないグローバルにアクセスすることと同じくらい多くのエラーですが、別のエラーです。Luaでは、前の割り当てのスコープにつながり、変更さnillocalませんが、後続の読み取り/書き込みのセマンティクスは変更されます。また、のバイトコード命令はどちらの場合も大きく異なります。

  • 最適化。もちろん、変数/「定数」に含まれる情報は限られています(場合によっては)。それにもかかわらず、少なくともCPythonにはさまざまな定数畳み込みとバイトコード最適化パスがあり(peephole.cを参照)、非常に高速なワンパスコンパイラーを備えたLuaでさえ、算術命令に対して定数畳み込みを行います。そして、PyPyインタープリター(そのJITとは独立して)はCALL_LIKELY_BUILTIN、おそらく組み込み関数であるグローバルへの呼び出しのために発行されるオペコードを導入しました。これにはスコープ分析が必要であることは明らかです。

  • あなたが自分で言ったように、コンパイル時に禁止されているいくつかの構造について不平を言っています。ただし、これは構文解析でもカウントできます(これらのルールの多くは実際には文法にエンコードされています)。別の例(文法で簡単にエンコードされない)は、重複する関数パラメーター名です。

于 2011-08-25T06:44:50.037 に答える