Presentation is loading. Please wait.

Presentation is loading. Please wait.

5장 이름, 바인딩, 영역(2) 2017. 4. 12 순천향대학교 컴퓨터공학과 하상호.

Similar presentations


Presentation on theme: "5장 이름, 바인딩, 영역(2) 2017. 4. 12 순천향대학교 컴퓨터공학과 하상호."— Presentation transcript:

1 5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호

2 목차 서론 이름 변수 바인딩개념 영역 영역과 존속기간 참조환경 이름 상수

3 영역 변수의 영역(scope)은 그 변수가 가시적인 문장들의 범위이다
변수가 어떤 문장에서 참조될 수 있으면, 변수는 그 문장에서 가시적(visible)이라고 함 언어의 영역 규칙은 이름의 참조가 변수와 어떻게 연관되는지를 결정 정적 영역 동적 영역 변수 유형 프로그램 단위의 지역 변수(local variables)는 그 단위에 선언된 변수 프로그램 단위의 비 지역변수(nonlocal variables)는 그 단위에서 가시적이나 그 곳에 선언되지 않은 변수 전역 변수(global variables)는 비 지역 변수의 특정 부류이며, 부 프로그램 외부에 선언된 변수

4 정적 영역 정적 영역(static scope)은 프로그램 텍스트에 기반
변수의 영역이 실행 전에 결정 프로그램 판독자나 컴파일러가 모든 변수의 타입을 결정 가능 이름을 변수에 대한 참조와 연관하기 위해서 그 선언문을 찾아야 한다 먼저, 지역적으로 선언문을 찾고, 다음에, 그 이름에 대한 선언문이 찾아질 때까지, 현재 영역을 포함한 영역(enclosing scope)에서 점차 더 큰 영역 순으로 선언문을 찾는다. 용어 현재 영역을 포함한 더 큰 영역들을 정적 선조(static ancestors)라 하고, 가장 가까운 정적 선조를 정적 부모(static parents)라 한다.

5 정적 영역 부프로그램 정의 중첩이 가능한 언어는 중첩 정적 영역을 생성
Ex. Pascal, Python, Ada, JavaScript, Fortran 등 그렇지 않는 언어는 중첩된 클래스나 블록에 의해서 중첩된 영역 생성 Ex. C 기반 언어

6 정적 영역 예제: in JavaScript, sub2의 x에 대한 참조와 연관된 선언문은?
sub1에서 big에 선언된 x를 참조 가능한가? function big() { function sub1() { var x = 7; sub2(); } function sub2() { var y = x; var x = 3; sub1();

7 정적 영역 변수는 동일한 이름을 갖는 정적 선조 영역에 속한 변수로 인해서 프로그램 단위로부터 은폐될 수 있다.
은폐된 변수는 정적 선조 영역의 이름을 포함한 선택적 참조(selective reference)로 접근 가능 function big() { // in Ada function sub1() { var x = 7; x = x + big.x; // 해당 조상 영역의 이름 포함 sub2(); } function sub2() { var y = x; var x = 3; sub1();

8 블록 블록(blocks)은 프로그램 단위 내부에서 정적 영역을 생성하는 방법 제공 ALGOL 60에서 도입
블록-구조 언어(block-structured language)의 기원 블록에 선언된 변수는 스택-동적 영역이 최소화된 지역 변수 허용 If (list[i] < list[j]) { int tmp; tmp = list[i]; list[i] = list[j]; list[j] = tmp; }

9 블록 블록에서 더 큰 영역의 이름 재사용 여부? sub의 count는 while 내부에서 은폐
C/C++에서 적법하나 Java/C#에서는 불가 void sub() { int count; while (...) { int count; // 중첩된 블록에서 이름의 재사용 허용 여부? count++; ... }

10 LET 구조 대부분의 함수형 언어는 let 구조를 포함 let 구조는 2개 부분으로 구성 Ex: in Scheme,
첫번째 부분은 이름들을 값들에 바인딩 두번째 부분은 첫번째 부분에서 정의된 이름들을 사용 이름들의 영역은 LET에 지역적 Ex: in Scheme, (LET ( (name1 expression1) (namen expressionn)) expression ) (LET ( (top (+ a b)) (bottom (- c d))) (/ top bottom) )

11 선언 순서 C89에서 선언은 함수의 시작부분에 위치해야 함
C99, C++, Java, C#는 변수 선언은 문장이 올 수 있는 곳이면 어디든지 올 수 있음 C99, C++, Java에서, 지역 변수의 영역은 선언문부터 그 선언문이 나타난 블록 끝까지 C#에서, 블록에 선언된 변수 영역은 블록 전체(선언문의 위치에 관계없이 블록 전체) 그러나 변수는 사용되기 전에 선언되어야 되고, 따라서 변수는 그 선언문에 앞서 사용될 수 없다.

12 선언 순서 C++, Java, C#에서, 변수는 for 문에서 선언 가능 이러한 변수의 영역은 for 구조에 제한
count의 영역은? void fun() { for (int count = 0; count < 10; count++) { }

13 전역 영역 C, C++, PHP, Python은 한 파일에 일련의 함수 정의들을 포함하는 프로그램 구조 지원
이러한 언어는 함수 외부에 변수 정의를 허용 이러한 정의는 전역 변수를 생성하고, 이는 함수에서 가시적일 수 있다. C, C++는 전역 데이터에 대해서 선언(속성만)과 정의(속성과 기억공간)를 구분 단지 한 개의 정의에 대해서 임의 개수의 선언 가능 함수 정의 외부에 오는 변수 선언은 그 변수가 다른 파일에 정의되어 있다는 것을 명세 C의 전역 변수는 그 이후에 오는 모든 함수에서 가시적

14 전역 영역 선언과 정의 함수 뒤에 정의된 전역 변수는 그 함수 내부에서 변수를 다음과 같이 선언함으로써 가시적이게 할 수 있다. C99에서, 전역 변수 정의는 초기 값을 가지나 선언은 초기값을 갖지 않는다. 선언이 함수 정의 외부에 오면, 그 선언은 extern을 포함할 필요 없다. 선언과 정의 개념은 함수에도 적용(C/C++) extern int sum;

15 전역 영역 전역변수는 동일한 이름을 갖는 지역 변수에 의해서 은폐 가능
C++에서, 은폐된 전역변수는 영역 연산자(::)로 접근 가능 // in C++ int i = 1; int main() { int i = 2; cout << i << ::i << “\n”; return 0; }

16 전역 영역 PHP에서, 전역변수는 함수에서 묵시적으로 가시적이지 않다 전역 변수는 global 선언을 통해서 가시적이게
$day = “Monday”; $month = “January”; function calendar(){ $day = “Tuesday”; global $month; print “local day is $day <br />”; $gday = $GLOBALS[‘day’]; print “global day is $gday <br />”; print “global month is $month <br />”; }

17 전역 영역 Python에서, 전역 변수는 함수에서 참조될 수 있으나, 그 변수가 global로 선언된 경우에만 값을 할당받을 수 있다. 비적법 day = “Monday” def tester(): print “The global day is:”, day day = “Monday” def tester(): print “The global day is:”, day day = “Tuesday” print “The new value of day is:”, day day = “Monday” def tester(): global day print “The global day is:”, day day = “Tuesday” print “The new value of day is:”, day

18 정적 영역 평가 많은 상황에서 잘 동작한다. 문제점 대부분의 경우에, 필요 이상의 너무 많은 접근을 허용
프로그램이 수정되면서, 변수와 부프로그램 접근을 제한하는 그 초기 구조는 사라지고, 지역변수와 부프로그램들이 전역화되어 가는 경향

19 동적 영역 동적 영역(dynamic scope)은 부프로그램의 호출 시퀀스에 기반하며 실행 시간에 결정
프로그램 텍스트에 기반하지 않음 Ex. APL, SNOBOL4, LISP 초기 버전 Perl, Common LISP은 디폴트가 정적이나 동적 영역도 허용 변수에 대한 참조는 현 지점의 실행에 이르게 한 부프로그램의 호출 체인의 역순으로 탐색하면서 선언에 연관

20 Perl에서 영역 묵시적으로 선언된 변수는 전역 변수이다. 지역 변수 선언 가능 my $var => 정적 영역 (디폴트)
local $var => 동적 영역

21 동적영역 예제: Perl $name = "Bill Green"; $you = "Bob Smith";
print "In main script block:\n Name is $name and you are $you.\n\n"; &printstuff; # call subroutine print "Back in main script block:\n Name is $name and you are $you.\n\n"; sub printstuff{ my $name = "Joe Brown"; local $you = "Jim White"; # assign in dynamic scope print "In 1st level1 sub:\n Name is $name and you are $you.\n\n"; &printmorestuff; # call subroutine $you = "Mary Jones"; # set $you to local/global value &printevenmorestuff($name); # call subroutine, pass value } sub printmorestuff{ print "In 1st level2 sub:\n Name is $name and you are $you.\n\n”; sub printevenmorestuff{ my $name # locally assign passed value to $name print "In 2nd level2 sub:\n Name is $name and you are $you.\n\n";

22 동적 영역 예제 다음 호출 시퀀스를 고려하라. big => sub1 => sub2 big => sub2
sub2()에서 x의 의미는? function big() { function sub1() { var x = 7; } function sub2() { var y = x; var z = 3 var x = 3;

23 동적 영역 평가 장점: 편의성(convenience) 단점
부프로그램이 실행중일 때, 그 변수들은 그가 호출하는 모든 부프로그램에 가시적 => 비 신뢰적 정적 타입 검사 불가 낮은 판독성: 변수의 참조 의미를 파악하기 위해서 호출 시퀀스 파악 필요 비 지역변수에 대한 접근이 비 효율적

24 영역과 존속기간 영역과 존속기간의 차이는? 공간적 개념 vs. 시간적 개념
C/C++의 함수에 선언된 static 변수의 영역과 존속기간은? void printheader() { } void compute() { int sum; printheader(); sum의 영역과 존속기간은?

25 참조 환경 어떤 문장의 참조 환경(referencing environment)은 그 문장에서 가시적인 모든 이름들의 집합
정적 영역에서 참조 환경은 그 지역 영역에 선언된 변수와 그 조상 영역에 속한 가시적인 모든 변수들로 구성 문장의 참조 환경은 컴파일 과정에서 필요 동적 영역에서 참조 환경은 지역 변수와 현재 활성화된 모든 다른 부 프로그램들에게 속한 모든 변수들로 구성 최근에 활성화 부프로그램의 변수는 그 이전에 활성화된 부프로그램의 동일이름의 변수를 은폐 활성화된 부 프로그램 (active subprogram)은 실행이 시작되었으나 아직 종료되지 않은 상태

26 예제: 참조 환경 (정적 영역) Program example; var a, b: integer; … procedure sub1; var x, y: integer; begin ….  end; procedure sub2; var x: integer; procedure sub3; …  end …  …  end. 지점 참조환경 1 2 3 4

27 예제: 참조환경 (정적 영역) 지점 참조환경 1 2 3 # in Python g = 3; # 전역 변수 def sub1():
a = 5; b = 7; …  def sub2(): global g; c = 9; …  def sub3(): nonlocal c: g = 11; …  지점 참조환경 1 2 3 Python에서, 함수 정의는 새로운 영역을 생성 문장의 참조환경은 그 지역변수들과 그 문장을 내포한 함수들에 선언된 모든 변수들을 포함 전역변수는 함수 내부에서 가시적이나 배정을 위해서는 global로 선언되어야 함 비지역 변수 참조를 위해서 그러한 변수는 nonlocal로 선언되어야 함

28 예제: 참조 환경(동적 영역) void sub1(void) { int a, b; …  } void sub2(void) { int b, c; …  sub1(); void main() { int c, d; …  sub2(); 지점 참조환경 1 2 3

29 이름 상수 이름 상수(named constant)는 단지 한번만 값에 바인딩 되는 변수 판독성, 신뢰성 향상
pi =

30 이름 상수 이름 상수를 프로그램 매개변수로 사용 프로그램 수정(modifiability) 지원 void example() {
final int len = 100; int[] intList = new int[len]; String[] strList = new String[len]; for (index = 0; index < len; index++) { } average = sum / len;

31 이름 상수 예제: const int result = 2 * width + 1; // in C++ // 동적 바인딩 허용
final … // in Java const … // in C#: 정적 바인딩 readOnly… // in C#: 동적 바인딩


Download ppt "5장 이름, 바인딩, 영역(2) 2017. 4. 12 순천향대학교 컴퓨터공학과 하상호."

Similar presentations


Ads by Google