Binding은 속성과 개체 혹은 operation과 symbol 간의 협력(association)이다. Binding time이란 binding이 발생할 때 걸리는 시간인데 어디서 발생하느냐에 따라 여러 시간으로 나뉜다.
Language design time | '*'는 보통 곱하기 연산자로 묶인다 |
Language implementation time | 데이터 타입(예를 들어 integer)은 가능한 값의 범위로 묶인다 |
compile time | Pascal 프로그램 내의 변수는 특정한 데이터 타입으로 묶인다 |
link time | library subprogram을 call하는 것은 subprogram의 코드로 묶인다 |
load time | 프로그램이 메모리에 올라갈 때 변수는 storage cell에 묶일 수도 있다 |
run time | procedure가 실제로 call될 때, procedure 내의 변수들이 storage cell에 묶일 수도 있다 |
[1] Binding of Attributes to Variable
만약 Binding이 런타임 이전에 발생하고 프로그램 실행한 후에도 변하지 않으면 static하다.
만약 Binding이 런타임 중에 발생하고 프로그램 실행 후에 바뀔 수 있으면 그것은 dynamic하다.
[2] Type Binding
Static Type Binding | Dynamic Type Binding |
explicit declaration : 변수 이름과 그들을 특정한 타입으로 선언하는 프로그램 내의 statement (1960년대 이후 설계된 대부분의 프로그래밍 언어들이 모든 변수들에 대해 explicit declaration을 필요로 한다) implicit declaration : FORTRAN(I, J, K, L, M, N), BASIC, PL/I와 같이 default convention을 통해 variable과 type이 이미 결정되어 진 것을 말한다. |
JavaScript, Python, Ruby, PHP, and C#(limited) 모든 변수들이 assignment statement에서 값이 할당되어 질 때 타입과 binding 된다. 머신 코드 내에서 변수의 타입을 dynamic하게 바꾸는 것이 어렵기 때문에 보통 interpreter를 이용하여 구현한다. Flexable하다는 장점이 있지만, 컴파일 시간에서 에러를 찾기 어려우며 tag를 위한 space cost와 type checking을 위한 run time cost의 비용이 있다. |
[3] Storage Binding and Lifetime
프로그램 변수의 lifetime은 변수가 특정한 메모리 영역에 묶여있는 시간이다.
Static Variables : 변수가 실행이 시작하기 전에 memory cell에 고정되어 있고 실행이 끝날 때 까지 같은 memory cell에 묶여서 남아있다. 장점은 효율적이지만 flexibility가 떨어진다. recursion을 지원하지 못한다.
Stack Dynamic Variable : 스택 동적 변수는 storage binding이 그들의 선언문이 수행될 때 이루어지지만 그들의 type은 프로그램이 실행되기 전에 binding된다(static). 장점으로는 recursion이 가능하고 서로 다른 procedures 사이에서 같은 메모리 영역을 공유할 수 있다. 반면 단점은 지역 변수에 대해 메모리 영역을 allocation하고 deallocation하는 runtime overhead가 존재한다.
[4] Explicit Heap Dynamic Variables (by programmer)
explicit dynamic variable은 메모리를 할당하고 해제하는 것이 programmers에 의해 상세화된 explicit run-time 명령어에 의해 이루어지는 이름 없는 객체(nameless object)이다. type은 컴파일 할 때 정해지지만 storage는 변수가 생성될 때 정해진다. 예를 들어,
type intnode = ^integer;
var anode : intnode;
...
new(anode); // storage binding
...
dispose(anode);
....
위의 코드 같은 경우, new(anode)에서 storage가 binding된다. 장점으로는 dynamic structures를 위하여 사용되어 질 수 있지만 정확하게 사용하기 어렵고 reference와 allocation 그리고 deallocation의 비용이 존재한다. 다시 말해, 비효율적이고 unreliable하다.
[5] Implicit Heap Dynamic Variables (by system) (Javascript and PHP)
implicit dynamic variable은 값이 할당되어 질 때 storage를 바인딩한다. 예를 들어 APL에서는
LIST = 10.2 5.1 0.0 // memory allocation for list
LIST = 47 // memory allocation for integer
같이 선언만 하더라도 자동으로 type에 대한 storage 바인딩이 이루어진다. 장점은 매우 높은 flexibility가 있지만 모든 dynamic attributes를 유지하는 것과 error detection에 대한 loss의 run time overhead가 있다.
'프로그래밍 언어(Programming Language)' 카테고리의 다른 글
Python3의 산술연산자 정리 (0) | 2020.01.14 |
---|