제 4 장블록및유효범위 Reading Chap. 5 숙대창병모 1
4.1 변수선언및유효범위 숙대창병모 2
변수선언과유효범위 변수선언 Declaration before Use! 대부분의언어에서변수는사용전에먼저선언해야한다. 변수의유효범위 (scope) 선언된변수가유효한 ( 사용될수있는 ) 프로그램내의범위 / 영역 변수이름뿐아니라함수등다른이름도생각해야한다. 정적유효범위 (Static scope) 규칙 선언된이름은선언된블록내에서만유효함대부분언어에서표준규칙으로사용됨 숙대창병모 3
변수선언 Syntax S let T x = E in S {;S} end T int bool Semantics 변수 x는 T 타입이다. 변수 x의유효범위는선언된블록내이다. Syntactic sugar let D1,D2 in S end let D1 in let D2 in S end end 숙대창병모 4
변수선언 Example in S let int x = 1 in x = x + 1 end Example in C { int x = 1; x = x + 1; } 숙대창병모 5
변수의의미 ( 시맨틱스 ) 대입문 x = E; 예를들어 x = x + 1; 오른쪽 x와왼쪽 x의의미가다르다! 변수 x 의의미 V[x]s = s(x) 메모리위치에저장된값 (r-value) (s, x = E) s[x [E]s] 메모리위치 (l-value) 숙대창병모 6
중첩블록 Example in S let int x = 2 in let int y = 3 in x = y + 2 end end outer block Example in C { int x = 2; { int y = 3; x = y+2; } } new variables declared in nested blocks inner block local variable global variable 숙대창병모 7
블록 (Blocks) Pascal procedure or function C, C++, Java {... } Ada ML declare... begin end let in end 숙대창병모 8
같은이름의변수 같은이름의변수가여러개선언될수있다. Example let int x = 1 in let int y = 2 in x = x + y end; let int x = 5 in x = x + 1 end; x = x * 2 end Example in C { int x = 1; { int y = 2; x = x + y; } { int x = 5; x = x + 1; } x = x * 2; } 숙대창병모 9
시맨틱스 수식혹은문장의의미파악 현재유효한변수들에대한바인딩정보가필요하다. 같은이름의변수가여러개있을수도있다. 각변수의바인딩정보 변수의선언된타입변수의유효범위변수의위치 컴파일러 / 인터프리터 실행 번역 / 해석을위해서변수의바인딩정보유지관리 실행을위해서변수값을저장하기위한메모리 (memory) 관리 숙대창병모 10
4.2 함수및유효범위규칙 숙대창병모 11
Syntax 함수선언 S let fun T1 f(t2 x) : S in S {;S} end return E f(e) Semantics 이름 f는선언된블록내에서만유효하다. 이름 f는정의된함수를나타낸다. Example let int y = 0, fun int square(int x) : return x * x in y = square(5) end 숙대창병모 12
함수의시맨틱스 수식혹은문장의의미파악 현재유효한함수들에대한바인딩정보가필요하다. 함수의바인딩정보 함수의선언된타입함수의유효범위함수의코드위치 컴파일러 / 인터프리터 번역 / 해석을위해서함수의바인딩정보도유지관리 숙대창병모 13
선언의유효범위 선언된식별자 ( 이름 ) 의유효범위 (scope) 선언된이름이유효한 ( 사용가능한 ) 프로그램의범위혹은영역 변수이름뿐아니라함수이름등도생각해야한다. 정적유효범위 (static scope) 규칙 선언된이름은선언된블록내에서만유효함대부분언어에서표준규칙으로사용됨 동적유효범위 (dynamic scope) 선언된이름은선언된블록의실행이끝날때까지유효함 실행경로에따라유효범위가달라질수있다. Old Lisp와 SNOBOL에서사용됨 숙대창병모 14
Example 2 0 let int x = 0 in 1 let fun int addsq(int y) : x = x + y * y in 2 let int x = 2 in 3 addsq(5) 4 end 5 end 6 end 정적유효범위규칙 동적유효범위규칙 숙대창병모 15
4.3 바인딩정보유지 / 관리 숙대창병모 16
왜바인딩정보를관리? 유효한이름 ( 식별자 ) 프로그램각지점에서유효한이름들은다르다. 컴파일러 / 인터프리터 프로그램을한줄씩읽으면서번역 / 해석한다. 프로그램의각지점에서유효한이름들에대한정보가있어야번역 / 해석할수있다. 따라서프로그램각지점에서유효한이름들에대한정보를유지관리해야한다. 숙대창병모 17
바인딩유지관리 다음블록을살펴보자 아이디어 let int x = 2 in let int y = 3 in x = y + 2 end end 블록시작 선언된변수들의바인딩정보를유지한다. 문장 바인딩정보를이용해서문장들을컴파일 / 인터프리터한다. 블록끝 선언된변수들은더이상유효하지않으므로바인딩정보를제거한다. 숙대창병모 18
Example 0 let int x = 0 in 1 let fun int addsq(int y) : x = x + y * y in 2 let int x = 2 in 3 addsq(5) 4 end 5 end 6 end 변수이름뿐만아니라함수이름의바인딩정보도유지 / 관리해야한다. 숙대창병모 19
바인딩유지관리 심볼테이블 (Symbol Table) 현재유효한바인딩정보를유지 / 관리하기위한자료구조 환경 (environment) 라고도한다. 심볼테이블유지 / 관리 컴파일러 컴파일하기위해바인딩정보유지 / 관리 인터프리터 해석해서실행하기위해바인딩정보유지 / 관리 숙대창병모 20
블록구조를위한심볼테이블 스택형태로유지관리 블록시작 블록내의선언을처리한다. 선언된이름의바인딩정보를심볼테이블에추가한다. 블록의끝 블록내의선언의바인딩정보를제거한다. 더이상필요없다. 숙대창병모 21
예 symtable[] token val ID 52 lexptr let int x = 1 in let int y = 2 in x = x + y end; let int x = 5 in x = x + 1 end; x = x * 2 end ID 1 lexemes[] x \0 y x \0 숙대창병모 22
HW #3 let 블록을포함한언어 S 에대한인터프리터작성 심볼테이블관리 Syntax S let T id = E {,T id = E} in S {;S} end T int bool Semantics 변수 id 는 T 타입이다. 변수 id 의유효범위는선언된블록내이다. 숙대창병모 23
4.4 Case Study 숙대창병모 24
다른언어에서선언및유효범위 무엇을선언하는가? 상수, 변수, 함수, 클래스 어디에선언하는가? 블록내혹은밖구조체 (struct) 클래스 어떻게선언하는가? 명시적선언 : Pascal, C, C++, Java, 묵시적선언 : Lisp, partly in FORTRAN 숙대창병모 25
블록구조언어 블록의중첩을허용하는언어 A B D C Algol, Pascal, Modula, Ada, C,... 숙대창병모 26
C 의블록 int x; double y; void p (void) { int x = 2; /* p 의블록 */ { int y = 3; /* 또하나의중첩블록 */ x = y + 2; } } 숙대창병모 27
Ada 블록 declare x:integer; y: boolean; begin x := 2; y := true; x := x+1; end 숙대창병모 28
Pascal 의블록 program ex; (* main 프로그램 *) var x: integer; (* 전역선언 *) procedure p; (* 전역선언 *) var y: boolean; (* p 내의선언 *) begin if x = 2 then begin end; end; begin (* main *) (* 선언할수없음 *) end. (* 프로그램 *) 숙대창병모 29
클래스내의선언 public class IntWithGcd { private int value; /* value 필트지역선언 */ public int intvalue() /* intvalue 메쏘드지역선언 */ { return value; } } public int gcd(int v) /* gcd 메쏘드지역선언 */ { } 숙대창병모 30
예 : C 언어의유효범위규칙 핵심아이디어 사용전선언 (Declaration before use) 선언의유효범위는선언된지점부터선언된블록끝까지 지역변수의유효범위 선언된지점부터함수끝까지 전역변수의유효범위 선언된지점부터파일끝까지 숙대창병모 31
예제 void p( ) { char y; y } int x; void q( ) { double z; z } p x q main() { int w[10]; w } main 숙대창병모 32
예 : Ada 언어의유효범위규칙 핵심아이디어 선언의유효범위는선언된블록내 예 B1: declare x: integer; y: boolean; begin x := 2; y := false; B2: declare a, b: integer; begin if y then a := x; else b := x; end if end B2; end B1; 숙대창병모 33
중첩블록에서선언 최중첩우선규칙 (Most closely nested rule) 한식별자가여러번선언된경우최중첩된선언을우선한다. 예 int x; void p( ) { char x; x = a ; /* local x */ } main() { x = 2; /* global x */ } 숙대창병모 34