PL-2.3変数有効範囲(Scope)とその他
10264 ワード
Scope
Scope:任意の変数のビジュアルコード領域
Scope:任意の変数を参照できる領域、近接時にエラーが発生しないコード領域
つまり、Scopeは空間概念です.
Static Scoping
C言語のように、ほとんどの言語で採用されている方式で、変数の範囲は静的に定義されている方式です.by Compiler
Static Scoptingは「どこで発表されたのか」に注目している.
ローカル変数:もちろん、ローカル変数を宣言するデバイスでのみ使用できます.
Nonlocal Variable:独自のデバイスで使用できますが、宣言はデバイス上で行われる変数ではなく他の場所で行われる変数を意味します.
グローバル変数は非ローカル変数に含まれます.
あるいは、より大きな外部のユニット(関数)によって宣言される変数も含まれます.
int a;
int main(void) {
int a, b;
while(...) {
int a; // 이 a는 while문 내에서 선언된 a를 가리킨다. (Local)
a++; // Static Scoping
b = 3; // Nonlocal Variable for while()
}
return 0;
}
~>,while文がaを宣言しない場合,Static Scoptingロジックはmainで宣言したaを指す.~>でmainがaを宣言しない場合、Static Scoptingロジックはグローバル変数aを指す.
次のPascalコードを見てみましょう.
procedure big ;
var x : integer ;
procedure sub1 ; // Inner(Nested) Function : 로컬 변수처럼, 로컬 함수를 정의!
begin
... x .... // 이때, 이 x는 어디의 x인가.
end ;
procedure sub2;
var x : integer ;
begin
sub1 ;
end ;
begin
sub2 ;
end
~>bigというサブルーチンでは、変数x、ローカルサブルーチンsub 1、sub 2を宣言して定義する.~>bigはsub 2を呼び出す.sub 2はsub 1を呼び出す.このとき、sub 1のxはどこのxなのでしょうか.
~>sub 1はbig,bigはstatic parentである.
呼び出し~>sub 1はsub 2であるため、sub 2は動的パラメータである.
~>すなわちStatic Scopting言語の場合、xはbigで宣言されたxを指す.★
Scoptingはコンパイラによって実行されます.
※Nested(Inner)Function機能:別の関数の機能を関数に宣言して定義できます.C言語はサポートされておらず、Ada、JavaScript、Python、FORTRAN 2003などがサポートしている.
※Block:ブロック単位でScopeを計算する言語もあります.(最近の傾向)
~>ローカル変数をコードブロック内で使用できる言語.ex)C言語
~>は、Static Scoptingに相当します.宣言が基準だからです.
ex) if (a >= b) { int temp ; temp = a ; a = b ; b = temp; }
CはInner Function機能がなく,Blockを基準としたStatic Scopting方式と考えられる.
静的スキャンの欠点
上の図の構造を使用してプログラムを作成する場合、Static Scopting言語では、コンパイラはエラーを検出せず、正常に通過します.
実際、プログラマーが注意すれば、間違いはないと考えることもできます.
1)EでDを呼べますか?
2)EでBを呼べますか?
3)D内でBを呼んでもいいですか.
4)EでEを呼べますか?
Static Scoptingは「宣言」だけに注目しているからだ.
※C/C++はInner(Nested)機能がなく、Block単位でStatic Scoptingを行う言語なので、このような問題は発生しません.
※一方、上記の図では、BのAのコールはDellableの場合でも可能であることに注意してください.これはTop-Down方式のインスタント言語だからです.
~>同様に、DからCを呼び出すことができる.逆に,CからDを呼び出すことは不可能である.Top-Down!
Dynamic Scoping
ダイナミックスキャンは「誰が発表したのか」ではなく、「誰が呼んだのか」です.
Dynamic Scoping is based on the 'Calling Sequence' of subprograms!
つまり、Dynamic Parentについて行きます.
従って、動的走査方式では、走査は実行時に行われる.
これはCompilerの
ダイナミックスキャンの利点
ダイナミックスキャンの欠点
Nonlocal変数にアクセスする場合、静的タイプチェックはできません.コールフローに従って、タイプを見つけることです.
「テキストの近接性」を考慮せずに、任意のビジュアルサブルーチンのローカル変数にアクセスできます.
ex)以前に動的スキャンを使用した言語:APL、SNOBL、LISPのいくつかの要約バージョン
Pascal言語の例
Pascal言語を例にとると、以下のようになります.プログラム内のローカル変数の内容.
Pascalの
procedure example;
procedure increments;
begin
sum++; // Static Scoping에선 에러, Dynamic Scoping에선 가능
end; // Pascal은 Static Scoping이므로 에러이다!
procedure computes;
var sum : integer;
begin
increments;
end
begin
computes;
end;
~>状態スキャンを基準としてincrements関数のsumという変数は表示されません.しかし,Scopeは非可視であるがsumのLifetimeはincrementsで有効であることに注目すべきである.
どうして.sumは計算中に宣言されるため、このプロセスはincrementsプロセスを囲んでいる.
つまり、ScopeとLifetimeは別々にしなければなりません.ライフサイクルは「発表から終了まで」です.
Referencing Environment
Reference Environment:特定の状態で表示されるすべての名前の集合を指します.
Static Scopting言語では、環境を参照
ダイナミックスキャン言語で、環境を参照
この場合、両方のメソッドに同じ名前がある場合、Scopeに近い変数のみが処理され、遠い変数はHidden Variableとみなされます.★
≪アクティブ・プロシージャ|Active Procedure|emdw≫:プロシージャは実行を開始しましたが、まだ終了していません.
procedure example ;
var a, b : integer ;
procedure sub1 ;
var x, y : integer ;
begin
.... // 여기서는 sub1의 x, y, example의 a, b를 접근 가능 (Static Scoping)
end ;
procedure sub2
var x : integer; // ⓐ 지역 입장에선 sub2의 x가 Hidden Variable이다.
procedure sub3 ;
var x : integer ;
begin
.... // ⓐ 지역. 여기서는 sub3의 x, example의 a, b 접근 가능 (Static)
end
begin
.... // 여기서는 sub2의 x, example의 a, b만 Reference 가능 (Static)
end
begin
.... // 여기서는 a, b만 접근 가능 (Static Scoping)
end ;
~>注釈を読むことで、流れを理解します.Named Constant
Named Constant:Bindingが発生したときに発生したValue Bindingは1回のみ保存され、その後も値が変わらない変数
#define MAX_LEN 100000 // 얘는 변수가 아니다. 그냥 바꾸는거지.
const float PI = 3.141592;
PI += 3; // Compile Error since it's Named Constant !
Initialization
初期化:ストレージBindingが発生したときにValue Binding、すなわち初期化を実行します.
各種言語の初期化方法
1) C
int a = 3;
const int a = 3; (Named Constant)
2) FORTRAN
REAL PI
INTEGER SUM
DATA SUM/0/, PI/3.14159/
3) Ada
SUM : INTEGER := 0 ;
4) ALGOL ★
int first := 10;
int first = 10; (Named Constant)
Reference
この問題について(PL-2.3変数有効範囲(Scope)とその他), 我々は、より多くの情報をここで見つけました https://velog.io/@junttang/PL-2.3-변수-유효-범위Scope-및-기타テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol