- 문법에는 맞지만 제대로 실행될 수 없는 프로그램들이 많음
- 데이터 타입이 잘못 사용되는 것 (Type error)
- 타입 오류(type error): 프로그램 실행 중에 수식, 문장, 함수 등의 프로그램 구성 요소가 타입에 맞지 않게 잘못 사용되어 발생하는 오류
- 타입 검사의 필요성
- 프로그램의 안전한 실행
- 실행 중에 타입 오류로 갑자기 죽는 프로그램을 미리 예방해야
- 타입 검사를 하여 실행시간 타입 오류를 미리 예방 가능
- 프로그램의 안전한 실행
타입 검사
: 타입 정보를 이용하여 실행 중에 발생 가능한 타입 오류를 미리 검사하는 것- 프로그램에서 타입이 올바르게 사용되고 있는지 검사
정적 타입 검사(static type checking)
: 컴파일 시간에 가능한 타입 오류 미리 검사 (프로그램의 안전성을 위해 매우 중요)구문 검사(syntax analysis)
: 프로그램이 구문법(syntax grammar)에 맞는지 검사. 1세대 기술로 1970년대 활발히 연구 개발됨. 모든 언어에 적용되고 있음타입 검사(type checking)
: 프로그램 구성 요소가 데이터 타입에 맞게 올바르게 사용되고 있는지 검사. 2세대 기술로 1990년대부터 활발히 연구 개발됨. 안전한 타입 시스템을 갖춘 언어(Java,C#,Haskell,Smalltalk)
- 강한 타입 언어(strongly typed language)
- 프로그램 실행 전에 타입 검사를 엄격하게(strict)하면 할수록 실행시간 타입 오류를 확실하게 예방 가능
- 엄격한 타입 규칙을 적용하여 타입 오류를 찾아내는 언어
- Java, ML, C#, Python 등
- 약한 타입 언어(weakly typed language)
- 느슨한 타입 규칙을 적용하여 타입 검사하는 언어
- C/C++,PHP,Perl, Java Script 등
- 타입 규칙을 적용하여 타입 검사를 하더라도 이 검사를 통과한 프로그램이 실행 중에 타입 오류가 발생할 수 있음
- 안전한 타입 시스템(sound type system): 이 타입 시스템의 타입 검사를 통과한 프로그램은 타입 오류를 일으키지 않을 것이 보장 됨 (no false positive)
- 정적 타입 타입 검사를 컴파일 시간에 함
- java, pascal, c, c++, ML, Haskell
- 동적 타입 검사 (Dynamically typed)
- 실행 시간에 타입 검사
- Lisp, Scheme
- 타입 검사 안함: 어떤 종류의 타입 검사도 하지 않음 (어셈블리어)
- 타입 규칙(typing rule): 수식검사(static type checking)
- 거의 모든 , 문장, 함수 등과 같은 프로그램의 구성요소의 올바른 타입 사용 규칙
- 타입 검사에 사용됨
- 논리적 추론 규칙(logical inference rule)으로 표현 :
"if X and Y then Z"
- 타입 시스템(type system): 프로그래밍 언어의 수식, 문장, 함수 등과 같은 프로그램의 구성요소의 타입 규칙으로 구성된 시스템을 그 언어의 타입 시스템이라 함
- 변수를 포함한 수식 x+y는 변수 x와 y의 타입에 따라 다르게 나타남 -> 유효한 변수의 타입을 유지하는 타입환경(type env)가 필요함
- 타입 환경(Type environment): 각 지점에서 유효한 변수들의 타입 정보를 유지함
- 안전한 타입 시스템(sound type system): 타입 시스템에 의해 어떤 수식의 타입이 t라고 결정했으면 수식 E를 실제 실행하여 계산된 값이 반드시 t 타입의 값이어야 함.
- 타입 검사에서 수식 E가 오류가 없으면 이 식은 실제 실행에서도 타입 오류가 없다는 것을 의미
- 타입 안전성 사례
- 안전하지 않은 타입 시스템: C, C++
- 느슨하면서 안전하지 않은 타입 시스템을 갖추고 있음
- 주로 타입 캐스트(cast)나 포인터 연산 때문에 안전하지 않음
- 거의 안전한 타입 시스템: Pascal, Ada
- 허상 포인터(dangling pointer) 때문에 안전하지는 않음
- 안전한 타입 시스템 : ML, Java
- 엄격하면서 안전한 타입 시스템을 갖추고 있음
- 컴파일 과정에서 엄격하게 타입 검사를 함으로써 실행 시간에 타입으로 인한 오류를 미연에 방지함
- 안전하지 않은 타입 시스템: C, C++
- 타입 규칙: 상수/변수
- 타입 환경: 각 지점에서 유효한 변수들의 타입 정보를 유지
- 타입 규칙: 수식
- 타입 규칙: 대입문: 대입문의 왼쪽 변수는 유효하고 오른쪽 식의 타입과 같아야함
- 타입 규칙: let문
- let문의 변수 선언에서 초기화 수식은 변수의 타입과 같아야함
- let문의 문장 S가 타입 오류가 없어야 함
- 타입 검사 과정
- 타입 규칙: return문
- 타입 규칙: 조건문
- 타입 규칙: 복합문
- 타입 규칙: 반복문
- 타입 환경: 프로그램 각 지점에서 유효한 변수/함수의 타입 정보
- 타입 환경 구현: 일종의 심볼 테이블로 Stack을 확장하여 구현.
- 타입 검사기 구현: 입력 프로그램의 AST를 순회하면서 Stmt와 Expr을 만날 때마다 해당 타입 규칙(type rule)을 적용하여 타입 검사를 구현. 타입 오류에 대해서 오류 메시지 출력