私は現在、プログラミング言語コースの原則を取っていますが、一生これを理解することはできません。これは宿題ではなく、一般的な概念の問題です。
クラスでは、静的チェーンとディスプレイについて話しました。なぜこれらが必要なのか理解できたと思います。そうしないと、ネストされたメソッドがあるときに、ネストされたメソッドがあるときにどの変数について話しているのかを理解できません。
私の教授もシンボルテーブルについて話しました。私の質問は、シンボルテーブルは何に使用されるのですか? 静的チェーンとどのように関係していますか?
背景を説明します(間違っている場合は修正してください)。
(説明を簡単にするために、いくつかのことを定義します)
次のコードがあるとします。
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 になります
私の質問をもう一度言います:
- シンボルテーブルは何に使用されますか?
- 静的チェーンとどのように関係していますか?
- スコープ情報はシンボル テーブルにあるのに、なぜスタティック チェーンが必要なのですか。