Chapter 4 변수 및 바인딩
Introduction 변수 (variable)의 기본적 특성 속성 (attribute) 바인딩 (binding) 주소 (address) 값 (value) 유형 (type) 유효 범위 (scope) 존속 기간 (lifetime) 타입 검사, 초기화 바인딩 (binding) 변수에 각 특성의 값을 연결시키는 것
Identifier 프로그램의 구성 요소, 개체를 식별하기 위해 사용 하는 문자스트링 설계 고려사항 최대 길이 사용할 수 있는 문자 집합 대소문자 구분 여부
Variable (1) 기억장치의 한 장소 속성 데이터 값 저장 이름 주소: 기억장소 주소, l-value 영역: 변수가 사용될 수 있는 프로그램의 부분 수명: 기억 장소 할당 시간 값: r-value, 기억장소의 내용 형: 변수의 값의 범위, 가능한 연산 집합 결정
<D.W.Barron의 변수정의> Variable (2) Example var sum: integer; sum := 0; 이름: sum 유형: 정수 값: 0 주소(참조) <D.W.Barron의 변수정의> 속성 (attribute) 값 속성 결정 시간 이름 (name) sum 컴파일 시간 유형 (type) 정수형 주소 (address) ? Loading time 값 (value) 실행 시간
Variable (3) 기타 속성 정수의 내부 표현 방법 정수형 변수의 최대 값과 최소 값 정수형 변수에서 가능한 모든 연산 16 bit, 32 bit, … 음수 표현: 1의 보수, 2의 보수 정수형 변수의 최대 값과 최소 값 FORTRAN: -32,768 ~ 32,767 프로그래밍 언어 구현 시간에 결정 프로그래밍 언어 설계 시간에 결정: Java 기계독립적 정수형 변수에서 가능한 모든 연산 언어 정의 (설계) 시간에 결정
Declaration (1) 프로그램에서 사용할 데이터의 속성에 관한 정보를 컴파일러, 인터프리터에게 알려주는 문장 프로그램에서 사용할 데이터의 속성에 관한 정보를 컴파일러, 인터프리터에게 알려주는 문장 정보: 변수의 유형, 변수의 이름, 배열 크기, … 예: int a[10]; 배열의 이름: a 배열 a의 자료형: 정수 배열의 차원: 1차원 배열 요소의 수: 10 배열 첨자 범위: 0 ~ 9
Declaration (2) 역할 효율적인 기억장소 사용과 액세스를 가능하게 한다. 효율적인 주기억장치 관리 가능 자료 구조 크기 생성, 소멸 시기 정보 보다 효율적인 기억장소 할당 기법 사용 컴파일 시간에 변수의 형 검사 (static type checking) 오류 발견
Declaration (3) 묵시적 변수 선언 FORTRAN: I ~ N 사이의 문자로 시작하는 변수는 정수 BASIC: 정수 변수는 %로 끝나고 문자 변수는 $로 끝남 Perl: 변수명 앞의 $는 scalar 형, @는 배열
Binding (1) 프로그램 요소에 지정 가능한 속성값을 지정하는 것 바인딩 시간 바인딩이 발생하는 시간 종류 언어 설계 시간: 허용 연산, 혼합형 연산의 피연산자 형 결정, … 언어 구현 시간: 정수의 자릿수, 실수의 유효숫자 개수, 수 의 표기법, … 언어 번역 시간: 변수의 형, 자료 구조의 크기, … 실행 시간: 변수값 배정, 매개변수 바인딩, 기억 장소 할당, …
Binding (2) Example: min := min + 5; binding 되는 속성 binding time 변수 min의 유형 (type) 변수 min이 가질 수 있는 값의 범위 변수 min의 주소 값 변수 min의 값 연산자 +의 의미의 집합 연산자 +의 연산 종류 5의 내부적 표현 언어 설계 시간 컴파일 시간 언어 설계시간 or 구현시간 프로그램 적재 시간 언어 실행 시간 언어 구현 시간
Binding (3) 종류 동적 바인딩 (dynamic binding) 실행 시간 바인딩 프로그래밍의 편리성, 프로그램 실행의 융통성 인터프리터 언어: LISP, Perl, Prolog, …
Binding (4) 종류 정적 바인딩 (static binding) 컴파일 시간 바인딩: 프로그램 실행 전 변수의 명시적 선언 컴파일 시간에 대부분의 속성 결정 실행 시간의 오버 헤드를 줄임 효율적 코드 컴파일 언어: FORTRAN, Pascal, …
Binding (5) 융통성의 예 Perl 언어 $price = 1000; $price = $price + 100; $price = “Very expensive”;
Assignment statement (1) 배정문 변수의 내용을 변경하는 기본 연산 Perl: ($a, $b) = ($x, $y); l-value 배정 연산자 왼편 변수 주소 r-value 배정 연산자 오른편 변수 값
Assignment statement (2) 특성 모든 변수는 l-value, r-value를 가진다. 상수는 r-value만 가진다. 포인터 변수: int *ip l-value: ip 자신의 주소 r-value: 다른 변수의 주소 (l-value) 배열: A[i] l-value: A의 i번째 요소의 주소 r-value: 그 주소에 저장된 값
int a = 1, b = 2; a = b; Case 1 a: 1 a: 2 b: 2 b: 2 int *a = 1, *b = 2; a = b; Case 2 a: 1 a: b: 2 b: 2 int *a = 1, *b = 2; *a = *b; Case 3 a: 1 a: 2 b: 2 b: 2
Alias 이명(Alias) 이명 생성 둘 이상의 이름으로 하나의 변수를 참조할 때 하나의 변수 (기억 장소)를 두 개 이상의 이름으로 액 세스 이명 생성 C의 포인터 변수 FORTRAN의 EQUIVALENCE, COMMON 문 부 프로그램의 매개 변수 void main() { int *ip, i = 3; ip = &i; *ip = 10; printf(“%d”, i); }
Scope (1) 변수의 영역(Scope) 변수 이름이 동일한 의미를 갖는 프로그램의 일부분 변수가 참조될 수 있는 문장의 범위 가시적 (visible): 변수가 영역에서 참조될 수 있는 것
Scope (2) 예 1 Area A float a, b, c, d; void main() { int a, b; float c, d Area B int a char b, c float d float a, b, c, d; void main() { int a, b; a = b = 12; … { char b, c; } Area A Area B
Scope (3) 예 2 main: a, b, Large Large: a, b, x, y, Large, sub1 sub1: a, b, x, y, z, Large, sub1 program main; var a, b : integer; procedure Large; var x, y : integer; procedure sub1; var z : integer; begin { sub1 } end; { Large } { main } end. main Large sub1
Scope (4) 정적 영역 규칙 (static scope rule) 변수의 영역 결정: 프로그램 블록의 포함 관계 블록 내의 모든 비지역 변수는 자신을 둘러싼 가장 가 까운 블록에서 선언된 변수를 참조 컴파일 시간에 정적 영역 결정 C, C++, Pascal, …
Scope (5) 동적 영역 규칙 (dynamic scope rule) 함수 호출 순서 실행 시간에 동적 영역 결정 실행중인 블록 안에 있는 비지역 변수를 참조할 때 자 신을 호출한 함수의 정의를 사용 APL, SNOBOL4, …
Scope (6) 예 정적 영역 규칙 동적 영역 규칙 print(x): 2 print(x): 4 program scope_rule; var x: integer; procedure sub1; begin print(x) end; procedure sub2; x := 4; sub1 x := 2; sub2 end. scope_rule sub1 sub2 2424
Scope (7) 변수의 영역과 변수의 수명 (lifetime) 수명 (= 존속 기간) 예 1 변수의 메모리 할당 시간 ~ 메모리 반환 시간 블록 구조 언어: 영역 = 수명 C, C++의 static 영역: 정적, 함수에 지역적 수명: 함수가 속한 프로그램의 전체 실행시간까지 연장됨 예 1 temp의 영역과 수명: if { } if (a[j] > a[k]) { int temp; temp = a[j]; a[j] = a[k]; a[k] = temp; } 2525
Scope (8) 예2 void sub() { static int j = 1; int k = 1; printf(“j = %d k = %d\n”, j, k); j++; k++; } void main() { sub(); j = 1 k = 1 j = 2 k = 1 j = 3 k = 1 2626
변수의 초기화 초기화 변수 선언 시 값을 배정하는 것 기억장소 바인딩 시간 = 값 바인딩 시간 Pascal, Modula-2에서는 변수 초기화를 하지 못함
참조 환경 문장의 참조 환경 (referencing environment) 그 문장에서 가시적인 모든 이름들 (데이터, 변수, 함수) 의 집합 정적 영역 언어 지역 영역에 선언된 변수 + 조상 영역에서 가시적인 모 든 변수 동적 영역 언어 지역적으로 선언된 변수 + 현재 활성인 모든 다른 부 프 로그램에 선언된 변수
sub1 sub2 sub3 program example; var a, b : integer; … procedure sub1; var x, y : integer; begin { sub1 } end; { sub1 } procedure sub2; var x : integer; procedure sub3; begin { sub3 } end; { sub3} begin { sub2 } end; { sub2 } begin { example } end. { example } example sub1 sub2 sub3 1 1: sub1의 x, y, example의 a, b 2: sub3의 x, example의 a, b 3: sub2의 x, example의 a, b 4: example의 a, b 2 3 4
void sub1() { int a, b; … } void sub2() { int b, c; sub1(); void main() { int c, d; sub2(); 1 2 3 1: sub1의 a, b, sub2의 c, main의 d 2: sub2의 b, c, main의 d 3: main의 c, d
기억장소 바인딩과 변수의 종류 (1) 정적 변수 (static variable) 프로그램 실행 전에 메모리 셀에 바인딩 프로그램 종료까지 동일한 메모리 셀에 바인딩 전역 변수 효율성 기억 장소 할당, 회수: 실행 시간 부담이 되지 않음 단점 유연성 감소 정적 변수만을 갖는 언어: recursion이 지원되지 않음 기억장소가 변수들 간에 공유될 수 없다. C, C++, Java: static
기억장소 바인딩과 변수의 종류 (2) 스택-동적 변수 (stack-dynamic variable) 선언문이 세련화될 때 기억장소 바인딩 타입은 정적으로 바인딩 세련화 (elaboration) 선언문이 지시한 기억장소 할당과 바인딩 과정 실행이 선언문에 연관되어 있는 코드에 이르렀을 때 발생 실행시간 스택에서 할당됨 재귀적 프로그램 부프로그램의 각 활성 복사본이 자신의 지역 변수를 가질 수 있도록 동적 지역 기억장소의 형태를 요구
기억장소 바인딩과 변수의 종류 (3) 기억장소 할당과 회수에 따른 실행시간 부담 C, C++ 지역 변수는 디폴트로 스택-동적
기억장소 바인딩과 변수의 종류 (4) 명시적 힢-동적 변수 (explicit heap-dynamic variable) 프로그래머가 명시하는 명시적 실행시간 명령어에 의 해 할당되고 회수되는 이름이 없는 (추상) 메모리 셀 힢에서 할당되고 힢에 반환됨 포인터, 참조 변수에 의해서만 참조됨 C: malloc(), free() function C++: new, delete operator