프로그래밍 언어론 7강. 타입 시스템(Type Systems)

[프로그래밍 언어론]

2019. 12. 10. 19:28

 

[타입의 목적]

: 대부분의 프로그래밍 언어들은 표현식들과 객체들에 대해 타입의 개념을 포함하고 있다.

 

1. 타입은 많은 연산자들에 대해 암시적인 문맥을 지원해, 프로그래머가 해당 문맥을 명시적으로 지정할 필요가 없다.

  # C 에서 표현식 a + b에서 a와 b가 int(정수형) 타입이면 정수형의 합을 사용할 것이다. ( a, b가 실수형이면 실수형의 합 사용)

  # Pascal에서 'new p'는 p에 의해 지정된 타입에 적절한 크기의 힙 저장소의 블록을 할당한다.

  # C++, Java, C#에서 'new my_type()' 연산자는 해당 타입에 알맞은 저장소 크기를 할당할뿐만 아니라,

    자동으로 해당 타입과 연관있는 사용자 정의(struct) 초기화 함수를 호출한다.

 

2. 타입은 시맨틱적으로 유효한 프로그램으로 수행되는 연산자들의 집합을 제한한다.

  : 프로그래머가 레코드에 character을 추가하거나, 집합의 역 탄젠트를 가져가거나, 파일을 정수형으로 예상되는 subroutine에 파라미터로 전달되는걸 예방해준다.

  : 좋은 타입 시스템은 실수들을 충분히 잡아주기때문에 실제에서 매우 가치가 있다.

 

3. 타입이 원본 프로그램에 명시되어 있으면, 프로그램을 읽고 이해하기 쉽다.

4. 타입들이 컴파일 시점에 알게되면(명시해주었기에), 수행시간 최적화에 좋은 영향을 준다.

 

 

 

[타입 시스템의 개요]

: 컴퓨터 HW는 메모리 안의 비트들을 여러가지 방법으로 해석할 수 있다. (지시어, 문자열, 주소, float 등..)

: 비트들은 untpyed 이다. (대부분의 HW 기계들에서 해석이 기억의 어느 위치에 해당하는지 추적하지 않는다)

: 어셈블리 어에서는 위와 같은 typing의 부족함을 반영한다. (어떤 종류의 연산자들이든 아무값들에 적용된다)

: 고급수준 언어들은 문맥정보와 오류검사기능을 제공하기 위해 거의 항상 값과 타입을 연관시킨다.

 

# 타입 시스템의 구성

  : 타입들을 정의하고, 그 타입들을 확실한 언어 구조와 연관시키려는 매커니즘

  : 타입 동등성, 타입 호환성, 타입 추론에 대한 규칙의 집합

 

# 타입이 있어야 하는 언어구조

  : 값들이 정확히 있거나, 값들을 가지고 있는 객체들을 참조할 수 있는 것은 타입이 있어야 한다.

  (상수, 변수, 레코드 영역, 파라미터, subroutines등 포함)

 

# 타입 시스템의 구성중 규칙의 집합

  1. 타입 동등성(Type equivalence) 규칙 : 두 값들의 타입이 동일할때 적용되는 규칙

  2. 타입 호환성(Type compatibility) 규칙 : 주어진 타입들의 값이 주어진 문맥에 사용될 수 있을때 적용되는 규칙

  3. 타입 추론(Type inference) 규칙 : 표현식의 타입이 해당 표현식의 구성요소나 주변 문맥에 따라 정의되는 규칙

 

# 다형성 값 혹은 파라미터들을 가지고 있는 언어에서, 타입이 참조형인지 포인터 형인지 구분하는 것은 중요하다,(7-1-1)

 

# Subroutine의 타입

  : 언어에 따라 subroutine이 타입을 가지는 경우와 안가지는 경우가 있다.

  : first, second-class values 의 경우엔 타입을 가져야 한다.

  : 위와 같은 경우에, 언어 안에 동적으로 결정된 서브루틴의 값인 구조가 있다

  : 타입 정보들은 언어가 특정 서브루틴 인터페이스를 제공하는 값에 대해 허용가능한 값 집합을 제한하는걸 허용한다.

 

 

 

[Type Checking]

: 프로그램이 언어의 타입 호환성(Type compatibility) 규칙을 지키는지 확인하는 과정이다.

= 연산자에 제공되는 피연산자들의 타입이 호환되는지 검사하는 것.

 

1) Strongly typed

  : 모든 타입 오류를 검사하는 언어. 신뢰성 높지만 효율 낮아진다.

  : 어떤 연산자든 '잠재적으로 연산을 지원하는걸 의도하지 않는 객체'들에 대해 적용되는 것을 금지하는 언어를 의미

2) Statically typed

  : strongly typed되고 대부분의 type checking이 컴파일 시점에 이뤄지는 언어를 의미

 

# 1970년대 이후로 개발된 대부분의 언어들은 strongly typed지만 statically typed는 아닌편이다.

# C : 언어가 발전하며 점점 strongly typed되고 있다 / 단, 실행 시점에 checking은 거의 안한다.

 

3) Dynamic(run-time) type checking

  : late-binding 방식, 실행 시점까지 문제점 체크 미룬다.

  : 변수의 타입이 프로그램 실행 중간에 동적으로 변할 수 있다.

  : 프로그래밍 쉽게 하기 위해 주로 사용 / 대부분의 스크립트 언어(동적 scoping 방식 언어 일반적으로 이 방식 사용)