Skip to content

Latest commit

 

History

History
74 lines (70 loc) · 5.42 KB

chap07.md

File metadata and controls

74 lines (70 loc) · 5.42 KB

CHAP 07

타입 오류와 타입 검사

타입 오류

  • 문법에는 맞지만 제대로 실행될 수 없는 프로그램들이 많음
    • 데이터 타입이 잘못 사용되는 것 (Type error)
  • 타입 오류(type error): 프로그램 실행 중에 수식, 문장, 함수 등의 프로그램 구성 요소가 타입에 맞지 않게 잘못 사용되어 발생하는 오류

타입 검사

  • 타입 검사의 필요성
    • 프로그램의 안전한 실행
      • 실행 중에 타입 오류로 갑자기 죽는 프로그램을 미리 예방해야
      • 타입 검사를 하여 실행시간 타입 오류를 미리 예방 가능
  • 타입 검사: 타입 정보를 이용하여 실행 중에 발생 가능한 타입 오류를 미리 검사하는 것
    • 프로그램에서 타입이 올바르게 사용되고 있는지 검사
  • 정적 타입 검사(static type checking): 컴파일 시간에 가능한 타입 오류 미리 검사 (프로그램의 안전성을 위해 매우 중요)
  • 구문 검사(syntax analysis): 프로그램이 구문법(syntax grammar)에 맞는지 검사. 1세대 기술로 1970년대 활발히 연구 개발됨. 모든 언어에 적용되고 있음
  • 타입 검사(type checking): 프로그램 구성 요소가 데이터 타입에 맞게 올바르게 사용되고 있는지 검사. 2세대 기술로 1990년대부터 활발히 연구 개발됨. 안전한 타입 시스템을 갖춘 언어(Java,C#,Haskell,Smalltalk)

강한 타입 언어 vs 약한 타입 언어

  • 강한 타입 언어(strongly typed language)
    • 프로그램 실행 전에 타입 검사를 엄격하게(strict)하면 할수록 실행시간 타입 오류를 확실하게 예방 가능
    • 엄격한 타입 규칙을 적용하여 타입 오류를 찾아내는 언어
    • Java, ML, C#, Python 등
  • 약한 타입 언어(weakly typed language)
    • 느슨한 타입 규칙을 적용하여 타입 검사하는 언어
    • C/C++,PHP,Perl, Java Script 등
    • 타입 규칙을 적용하여 타입 검사를 하더라도 이 검사를 통과한 프로그램이 실행 중에 타입 오류가 발생할 수 있음

안전한 타입 시스템

  • 안전한 타입 시스템(sound type system): 이 타입 시스템의 타입 검사를 통과한 프로그램은 타입 오류를 일으키지 않을 것이 보장 됨 (no false positive)

타입 검사 종류

  1. 정적 타입 타입 검사를 컴파일 시간에 함
    • java, pascal, c, c++, ML, Haskell
  2. 동적 타입 검사 (Dynamically typed)
    • 실행 시간에 타입 검사
    • Lisp, Scheme
  3. 타입 검사 안함: 어떤 종류의 타입 검사도 하지 않음 (어셈블리어)

타입 시스템 개요

  • 타입 규칙(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
      • 엄격하면서 안전한 타입 시스템을 갖추고 있음
      • 컴파일 과정에서 엄격하게 타입 검사를 함으로써 실행 시간에 타입으로 인한 오류를 미연에 방지함

언어 S의 타입 시스템

  • 타입 규칙: 상수/변수
    • 타입 환경: 각 지점에서 유효한 변수들의 타입 정보를 유지
  • 타입 규칙: 수식
  • 타입 규칙: 대입문: 대입문의 왼쪽 변수는 유효하고 오른쪽 식의 타입과 같아야함
  • 타입 규칙: let문
    • let문의 변수 선언에서 초기화 수식은 변수의 타입과 같아야함
    • let문의 문장 S가 타입 오류가 없어야 함
    • 타입 검사 과정
  • 타입 규칙: return문
  • 타입 규칙: 조건문
  • 타입 규칙: 복합문
  • 타입 규칙: 반복문

타입 검사 구현

  • 타입 환경: 프로그램 각 지점에서 유효한 변수/함수의 타입 정보
  • 타입 환경 구현: 일종의 심볼 테이블로 Stack을 확장하여 구현.
  • 타입 검사기 구현: 입력 프로그램의 AST를 순회하면서 Stmt와 Expr을 만날 때마다 해당 타입 규칙(type rule)을 적용하여 타입 검사를 구현. 타입 오류에 대해서 오류 메시지 출력