Union types
유니온은 실행시간의 다른 시간들동안 다른 타입의 값들을 저장할 수 있도록 하는 타입이다. 단점은 type checking이 dynamic해야한다는 것이며 이는 discriminant라는 indicator에 의해서 이루어진다. 반면 C/C++에서는 유니온 타입의 type checking을 지원하지 않는데 이런한 유니온 타입을 Free Union 이라고 한다. Free Union은 안전하지 않은 방법이며 Java나 C# 같이 reliability가 높은 언어들은 유니온 자체를 지원하지 않는다.
Pointer types and Reference types
포인터 타입 변수는 indirect addressing과 dynamic memory를 제공한다. 이를 통해 포인터는 dynamically하게 생성되는 공간인 heap에 접근한다. 포인터는 assignment(할당)과 dereferencing(참조) 연산을 지원하는데 할당은 보통 &연산자를 통해 이루어지고 참조는 *연산자를 통해 이루어진다.
※ 포인터의 문제점 1 - Dangling Pointers
Dangling Pointer란 메모리 해제된 heap-dynamic variable을 가리키는 포인터를 의미한다. heap 영역에 있는 변수 하나를 포인터 p1과 p2가 가리키고 있다가 *p1 = NULL을 한 경우 deallocation(회수) 작업이 일어난다. 그러면 포인터 p2는 이미 회수된 heap영역을 가리키는 dangling pointer가 된다. 다음은 dangling pointer 문제를 해결하기 위한 방법들이다.
- Tombstone
: 포인터 p1, p2는 오직 tombstone이라는 포인터 변수를 가리키고 이 tombstone이 heap-dynamic variable을 가리키는 구조로 이루어져서 heap-dynamic variable가 회수되더라도 dangling pointer 문제를 막을 수 있다. - Locks-and-keys
: heap-dynamic variable가 할당 될때 lock 값도 같이 할당해주고 이를 가리키는 포인터 p1, p2에 같은 값의 key 값을 할당해주는 방식으로 참조할 때마다 lock값과 key값을 비교하여 만약 다르다면 포인터 변수의 메모리를 회수하여 dangling pointer 문제를 막을 수 있다.
※ 포인터의 문제점 2 - Lost heap-dynamic variable
할당된 heap-dynamic variable이 더 이상 접근 불가능해져 garbage가 되는 현상이다. 예를들어 어떤 heap 영역의 변수를 포인터 p1으로 가리키고 있다가 p1이 새로운 변수를 가리키게 되면 더 이상 처음 가리키던 변수를 참조할 수 없어 garbage가 된다. 이는 memory leakage 문제를 발생시킬 수 있다.
Heap Management
힙 영역의 관리에서는 garbage 회수가 중요하다. garbage 회수 방식에는 두 가지가 있다.
- Reference counters (점진적인 방법)
- 각 변수를 가리키는 포인터의 개수를 세서 그 개수가 0개라면 그 변수의 메모리를 리턴 - Mark-Sweep(게으른 방법)
- 각 포인터가 가리키는 셀들에 표시를 해두고 표시되지 않은 셀을 한 번에 리턴
- 주기적으로 수행해주어야함
Type checking
타입 체킹이란 피연산자들이 다 compatible한 타입인지 확인하는 것이다. compatible하다는 것은 연산자에 대해서 적절한 타입이거나 자동 또는 명시적으로 적절한 타입으로 변환될 수 있다는 것을 의미한다. 모든 타입 바인딩이 static이라면 타입 체킹도 static 해야하고 모든 타입 바인딩이 dynamic이라면 타입 체킹도 dynamic 해야한다.
※ Type checking에 따른 언어의 분류
- Strongly typed language
- 프로그램 실행 전에 타입 검사를 엄격하게 수행
- 런타임 타입 오류를 확실하게 예방
- ex) Java, C#, Python 등 - Weakly typed language
- 느슨한 타입 규칙을 적용하여 타입 검사
- 검사를 통과하더라도 런타임 타입 오류가 발생할 수 있음
- ex) C/C++, JavaScript 등
※ Type Equivalence
- Name Type Equivalence
- 두 개의 변수가 같은 타입을 갖는다는 의미 - Structure Type Equivalence
- 두 개의 변수가 같은 structure을 가진 타입이라면 동등한 타입을 갖는다는 의미
'PL' 카테고리의 다른 글
[PL] Data types(2) (0) | 2022.04.18 |
---|---|
[PL] Data types(1) (0) | 2022.04.18 |
[PL] Names, Binding, Scope (0) | 2022.04.17 |
[PL] 어휘분석과 구문분석(Lexical and Syntax Analysis) (0) | 2022.04.17 |
[PL] Semantic의 표현 (0) | 2022.04.17 |