6

私は現在、プログラミング言語コースの原則を取っていますが、一生これを理解することはできません。これは宿題ではなく、一般的な概念の問題です。

クラスでは、静的チェーンとディスプレイについて話しました。なぜこれらが必要なのか理解できたと思います。そうしないと、ネストされたメソッドがあるときに、ネストされたメソッドがあるときにどの変数について話しているのかを理解できません。

私の教授もシンボルテーブルについて話しました。私の質問は、シンボルテーブルは何に使用されるのですか? 静的チェーンとどのように関係していますか?

背景を説明します(間違っている場合は修正してください)。


(説明を簡単にするために、いくつかのことを定義します)

次のコードがあるとします。

main(){
    int i;
    int j;
    int k;
    a(){
        int i;
        int j;
        innerA(){
            int i = 5;
            print(i);
            print(j);
            print(k);
        }
    }

    b(){
        ...
    }
    ...
}

そして、このスタック:

| innerA  |
| a       |
| b       |
| main    |
-----------              

復習として の静的チェーンの簡単な説明。

静的チェーンは、内部関数内で変数が再定義されたときに使用する変数を見つけるために使用されます。上記のスタックでは、各フレームにそれを含むメソッドへのポインターがあります。そう:

| innerA  | \\ pointer to a
| a       | \\ pointer to main
| b       | \\ pointer to main
| main    | \\ pointer to global variables
-----------        

(静的スコープを仮定すると、動的スコープの場合、すべてのスタック フレームはその下のフレームを指すだけだと思います)

メソッドprint(<something>)内で実行すると、次のようになると思います。innerA

currentStackframe = innerAStackFrame;
while(true){ 
    if(<something> is declared in currentStackFrame)
        print(<something>);
        break;
    else{
        currentStackFrame = currentStackFrame.containedIn();
    }
}

シンボル テーブルの簡単な復習

シンボルテーブルの目的がよくわかりません。しかし、これは次のようになります。

Index is has value, 
Value is reference.
 __
|  |
|--|                        --------------------------------------------------
|  | --------------------> | link to next | name | type | scope level | other |
|--|                        --------------------------------------------------
|  |                              |
|--|                ---------------
|  |                |    
|--|                |             --------------------------------------------------
|  |                 ------->    | link to next | name | type | scope level | other |
|--|                              --------------------------------------------------
|  |
|--|
  • 次へのリンク - 複数のものに同じハッシュ値がある場合、これはリンクです
  • name - 要素の名前 (例: i、j、a、int)
  • type - 内容 (例: 変数、関数、パラメーター)
  • スコープ レベル - これがどのように定義されているかは 100% わかりません。私はそれを考えます:
    • 0 はビルトイン
    • 1はグローバルになります
    • 2が主な方法になります
    • 3はaとbになります
    • 4 は innerA になります

私の質問をもう一度言います:

  • シンボルテーブルは何に使用されますか?
  • 静的チェーンとどのように関係していますか?
  • スコープ情報はシンボル テーブルにあるのに、なぜスタティック チェーンが必要なのですか。
4

2 に答える 2

5

「シンボルテーブル」は、2つの異なる意味を持つ可能性があることに注意してください。これは、変数のどのエイリアスがどこにスコープを持つかを決定するためにコンパイラによって使用される内部構造を意味する場合と、ライブラリによってロード時にユーザーにエクスポートされるシンボルのリストを意味する場合があります。時間。ここでは、前者の定義を使用しています。

シンボルテーブルは、特定の名前を使用するときにユーザーが参照しているメモリアドレスを決定するために使用されます。「x」と言うとき、「x」のどのエイリアスが必要ですか?

静的チェーンとシンボルテーブルの両方を保持する必要がある理由は次のとおりです。コンパイラが特定のスコープで表示される変数を決定する必要がある場合、内部スコープで以前にエイリアスされた変数を「マスク解除」する必要があります。たとえば、innerA戻るからに移動するaと、変数iはそのメモリアドレスを変更します。同じことがまたからaに起こって起こりますmain。コンパイラが静的チェーンを保持していなかった場合、シンボルテーブル全体をトラバースする必要があります。あなたがたくさんの名前を持っているなら、それは高価です。静的チェーンの場合、コンパイラーは現在のレベルを調べ、それに含まれる各変数の最後の定義を削除してから、1つのスコープまでのリンクをたどります。一方、シンボルテーブルがない場合は、ローカルスコープにないすべての変数アクセスにより、コンパイラは静的チェーンをたどる必要があります。

要約すると、静的チェーンからシンボルテーブルを再構築でき、その逆も可能です。しかし、一般的な操作を高速化するために、両方が必要です。シンボルテーブルがない場合、ローカルスコープではない変数アクセスごとに静的チェーンを登る必要があるため、コンパイルに時間がかかります。静的チェーンがない場合は、スコープを離れるときにシンボルテーブルをたどって、現在は無効になっているエントリを削除する必要があるため、コンパイルに時間がかかります。

ちなみに、MichaelScottのProgrammingLanguage Pragmaticsをまだ使用していない場合は、それを確認する必要があります。これは私が見たこのトピックに関する最高の教科書です。

于 2010-08-02T18:18:25.393 に答える
1

これは明らかに、特定のクラスの実装を指しています。それを理解するために、クラスに関係のある人に相談することを強くお勧めします。

シンボル テーブルは、ソース コード識別子をコンパイラが使用できるものに変換するものです。必要な記述を保持します。コンパイルプロセス全体で使用される傾向があります。あなたが言及した「タイプ」は、解析を目的としているように見え、後の段階で(「その他」に)より多くのエントリが存在することは間違いありません。

「スコープレベル」が何であるかさえわからないため、それが静的チェーンにどのように関連しているか、またはなぜそれらが必要なのかを知ることは困難です。ただし、 と の両方a()b()variable がある可能性があることに注意してくださいi。それらは同じスコープ レベルを持っていると思われるため、それらを区別するために何かが必要です。

また、スタティック チェーンはしばしば最適化されるため、コンパイラはどのシンボル テーブル エントリを受け入れるかを認識します。b静的チェーンがない場合、コンパイラは、 で検出された何かのエントリを拒否するために、いくつかのルックアップを実行する必要がありますinnerA

より有用なものを得るには、何が起こっているかについてもっと説明する必要があり (インストラクターや TA などと話すことを強くお勧めします)、おそらくより具体的な質問をする必要があります。

于 2010-08-02T18:23:58.683 に答える