スコープとは、関数スコープ、クラス スコープ、ライブラリ、DLL などを意味します。
最後にすべてのコードが一連の命令に (コンパイラによって) 変換される場合、高水準言語の高水準スコープは最下位レベルのコードにどのように影響しますか?
スコープとは、関数スコープ、クラス スコープ、ライブラリ、DLL などを意味します。
最後にすべてのコードが一連の命令に (コンパイラによって) 変換される場合、高水準言語の高水準スコープは最下位レベルのコードにどのように影響しますか?
それが全体のポイントです。1つは高レベルで、もう1つは低レベルです。CPU命令は、スコープについて何も知りません。それはメモリ管理の問題です。
「スコープ」は高水準プログラミング環境の一部です。コンパイラは、アクセスしようとしているものにアクセスできるかどうかを(プログラミング言語の規則に従って)チェックします(たとえば、変数xにはアクセスできません)。これは別の関数に対してローカルです)。これはバグを減らす手段だと言う人もいるかもしれません。
実行されている「実際の」コードは、スコープを認識していません。
各変数名や関数名などは、対応する情報やコードが格納されているメモリ内の場所に対応しています。(これは少し単純化されていますが、アイデアは得られます)。スコープは、名前から場所へのマッピングを表します。お気に入りの言語の辞書または同様のデータ構造と考えてください。
ネストされたスコープは一種のスタックとして機能します。言語構文が新しいスコープを導入すると、新しいマッピングがスタックにプッシュされます。たとえば、変数名を使用するとi
、コンパイラまたはインタープリターは最上位のマッピングでそれを検索し、(そこに見つからない場合) 言語の規則に従って上方向に検索します。スコープが終了すると、関連するマッピングがスタックからポップされ、以前のマッピングが有効になります。
これがどのように機能するかの醜い詳細はさまざまです。最も単純なケースでは、コンパイラはメモリ位置を直接参照するコードを生成できます。より現実的には、C コンパイラは、変数名と関数名をメモリ内の場所にマップする「シンボル テーブル」を含む実行可能オブジェクトを生成します。リンカーは、あるモジュールの参照を別のモジュールのシンボル テーブルで検索することにより、モジュール間の参照を解決します。また、名前は絶対位置にマッピングされるのではなく、ある基準点からのオフセットにマッピングされます。これにより、ライブラリを「再配置可能なコード」にすることができます。つまり、実行中にメモリ内の任意の場所にロードしても、適切に動作することができます。仮想マシンにコンパイルされる言語はいくつかの手抜きをしているかもしれませんが、原則は同じです。
スコープは、高水準言語の構成要素およびメカニズムです。低レベルの CPU 命令はスコープに関係ありません。