-
2. 변수 및 바인딩전공/프로그래밍 언어론 2020. 5. 4. 10:08
변수
- 기억장소(main memory)의 하나의 장소(cell)을 추상화한 것.
- 원하는 데이터의 값을 저장할 수 있다.
- 속성
1. Address(기억장소의 주소, l-value)
2. Value(값, r-value)
3. Type(변수 값의 범위와 가능한 연산의 집합 결정)
4. Scope(변수가 사용될 수 있는 프로그램의 부분)
5. Lifetime(변수와 연관된 기억장소의 할당 기간)
6. Type checking
7. Initialization
선언문
- 프로그램 실행 시에 사용할 데이터의 속성에 관한 정보(type, name, size 등)를 컴파일러에게 알려주는 문장.
- 예 : int a[10];
- 컴파일러가 소스 코드를 기계어로 번역할 때 필요로 하는 중요한 정보.
- 메모리가 얼마나 필요할지 계산할 수 있어 효율적인 주기억장치 관리가 가능.
- 서로 맞지 않는 연산자와 변수의 형이 연관되어 있는 잘못된 문장을 컴파일 시간에 미리 알아낼 수 있어 프로그램의 오류를 줄일 수 있음(Static type checking, compile-time binding).
인터프리터는 실행 시간에 이런 것들을 다 계산하기 때문에 느린 것이고, 컴파일 언어는 컴파일러가 알아서 해주므로 실행 시간이 빠른 것이다.
바인딩
- 프로그램의 요소에 지정 가능한 속성값을 지정하는 것.
- 언어 설계 시간(Design time), 언어 구현 시간(Implementation time), 컴파일 시간, 적재 시간 및 실행 시간(Execution time)에 이루어질 수 있다.
- 바인딩 시간
1. 동적 바인딩 : 실행 시간 중에 일어남.
- 인터프리터형 언어(예 : JavaScript)
- 인터프리터형 언어는 명시적인 선언을 요구하지 않으며, 실행 시간에 변수의 값을 지정할 때까지 변수의 형을 바인딩하지 않는다.
- 변수의 유형 및 기억장소 할당 등이 실행시간에 이루어지므로 프로그램의 실행이 지연되는 것은 당연하다.
2. 정적 바인딩 : 프로그램이 실행되기 전(주로 컴파일할 때)에 바인딩이 발생하는 것.
- 수치 계산을 목적으로 개발된 언어.
- 컴파일할 때 대부분의 속성을 결정하여 실행 시간의 오버헤드를 줄임.
배정문
- 모든 변수는 l-value와 r-value를 가진다. l-value는 주소, r-value는 변수의 값을 의미한다.
- Constant(상수)는 r-value만 가지고 있으므로 값을 할당하려고 하면 에러가 발생한다.
- C에서 정수 포인터를 int *ip;와 같이 선언하였다면, 변수 ip의 l-value는 ip 자신의 주소이며, r-value는 다른 변수의 주소(l-value)가 된다.
스코프
1. 정적 영역 규칙(static scope rule)
- 프로그램의 실행 순서와 무관하게 프로그램 블록의 포함 관계에 따라 변수의 영역을 결정.
- 블록 내의 모든 비지역 변수는 자신을 둘러싸고 있는 가장 가까운 블록에서 선언된 변수를 참조.
2. 동적 영역 규칙(dynamic scope rule)
- 함수 호출 순서에 기반을 둔 것.
- 동적 영역은 실행 시간에 결정된다. 즉 실행 중인 블록 안에 있는 비지역 변수를 참조함에 있어서 자신을 호출한 함수에서의 정의를 사용한다. 그러므로 비지역 변수의 값은 실행 시간에 어떤 함수가 자신을 호출했는가에 따라서 결정된다.
수명
- 변수가 메모리에 할당되는 시간부터 그 역할을 마치고 저장 공간이 반환되는 시간까지.
- 블럭 구조 언어에서는 지역 변수의 영역과 수명이 일치한다.
- static 변수느 한 번 할당되면 프로그램이 종료될 때까지 기억장소가 회수되지 않는다.
메모리 바인딩과 변수의 종류
1. static 변수(정적 변수)
- 스택에 저장된다.
- 프로그램 실행 전에 메모리 셀에 연관(바인딩)되고, 프로그램이 종료될 때까지 동일한 메모리 셀에 대한 바인딩이 유지된다.
- 전역 변수.
2. static-dynamic 변수(스택-동적 변수)
- 스택에 저장된다.
- 변수가 선언된 블록이 실행될 때 기억장소 바인딩이 이루어진다. 기억 장소의 할당과 회수가 프로그램의 실행 시간에 이루어진다. → 할당 받은 메모리를 해제해야하므로 실행 시간 효율성이 정적 변수에 비해 떨어지는 단점이 있다.
- 지역 변수.
3. explicit heap-dynamic 변수(명시적 힙-동적 변수)
- 힙에 저장된다.
- 프로그래머가 명시하는 명시적 실행 시간 명령어(C에서의 malloc(), free() 함수나 C++에서의 new, delete 연산자)에 의해 할당되고 회수되는 이름이 없는 메모리 셀에 연관된 변수.
'전공 > 프로그래밍 언어론' 카테고리의 다른 글
기본 데이터 형(primitive data types) (0) 2020.05.14 1. 프로그래밍 언어의 소개 (0) 2020.05.02