6.4 타입 검사 (Type Checking).

Slides:



Advertisements
Similar presentations
파이썬 (Python). 1 일 : 파이썬 프로그래밍 기초 2 일 : 객체, 문자열 3 일 : 문자인코딩, 정규표현식, 옛한글 4 일 : 파일 입출력 5 일 : 함수와 모듈 6 일 : 원시 말뭉치 다루기 실습 7 일 : 주석 말뭉치 다루기 실습 8 일 : 웹 데이터로.
Advertisements

Format String Attack! 포맷 스트링 공격 경일대학교 사이버보안학과 학년 남주호.
YACC 응용 예 Desktop Calculator.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
1. 컴파일러 개론 1-1. Compiler 정의 1-2. Language Processing System
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
컴퓨터 프로그래밍 기초 [Final] 기말고사
제3장 시맨틱스(Semantics) Reading Chap 13 © 숙대 창병모.
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
프로그래밍 언어 프로그래밍 언어의 개요 프로그래밍 언어의 구문 정의 변수와 영역 자료형 조건문과 반복문 부프로그램
컴퓨터 개론 √ 원리를 알면 IT가 맛있다 쉽게 배우는 컴퓨터 기본 원리 한빛미디어 교재출판부.
10장 함수.
제5장 기초 의미론 (Basic Semantics)
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6주차: Functions in C and Others
5.1 데이터 타입 개요 5.2 사례 연구 5.3 타입 검사 Reading Chap 6
2주차: 변수, 수식, Control Flow.
Part 07 제어 구조 ©우균, 창병모 © 우균, 창병모.
6장. printf와 scanf 함수에 대한 고찰
Tail-recursive Function, High-order Function
7.1 함수 정의 7.2 매개변수 전달 7.3 함수 구현 7.4 인터프리터에서 함수 구현 Reading Chap 8
14장. 포인터와 함수에 대한 이해.
공학컴퓨터프로그래밍 Python 염익준 교수.
순서도.
C#.
프로그래밍언어론 2nd edition Tucker and Noonan
13. 연산자 오버로딩.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Introduction to Programming Language
6장 데이터 타입(4) 순천향대학교 컴퓨터공학부 하 상 호.
에어 조건문.
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Chapter 08. 함수.
C++ Espresso 제11장 예외 처리와 형변환.
17장. 제어문과 내장 함수 제어문 내장 함수 제어문 내장 함수.
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
[ 단원 04 ] 반복과 배열.
제 6 장 함수(functions).
제 15 강 문자와 코드 shcho.pe.kr.
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Flow Diagram IV While.
프로그램분석 어떻게하나 (quick/tiny)
7주차: Functions and Arrays
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
Lecture 4 C 프로그램 구성의 기본 C 프로그램에서 이름짓기 C 프로그램에서 이름 충돌/이름 재사용.
1장 기본적인 사항(2) 순천향대학교 컴퓨터공학부 하 상 호.
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
프로그래밍 개론 Ⅰ-실습 2장 데이터와 식①.
프로그래밍언어론 Chapter 6 타입시스템 나는 발생 가능한 오류의 수를 최소화하고
6장 데이터 타입(5) 순천향대학교 컴퓨터공학부 하 상 호.
함수 정의, void 자료형 함수 원형선언 함수 호출 변수 영역 규칙 재귀 함수
Presentation transcript:

6.4 타입 검사 (Type Checking)

의미 없는 프로그램들 let x = 1 in call x(2) end let y = true in x = x + y let proc f(x) : x = x + 1 in f + 2 in call f(f))

의미 있는 프로그램 의미 있는 프로그램만 돌리고 싶다! 실행 중에 문제없이 돌아가는 프로그램 의미 있는 프로그램들 문법에 맞는 프로그램들 의미 있는 프로그램들

질문 어떤 프로그램이 의미 있는지 어떻게 결정할까요? 완전하지는 않지만 타입을 이용해서 결정할 수 있다. 이것이 바로 타입 검사(Type Checking)

타입 검사가 왜 필요한가? 타입 검사란 무엇인가? 정적 타입 검사 프로그램의 신뢰성 향상에 기여 프로그램이 의미가 있는지 타입을 중심으로 검사하는 것 프로그램에서 타입이 올바르게 사용되고 있는지 검사 정적 타입 검사 실행 전에 타입 오류 검사 컴파일 시간에 타입이 잘못 사용된 오류를 검출할 수 있다. 프로그램 신뢰성을 위해 매우 중요한 일 ! 프로그램의 신뢰성 향상에 기여 엄격한 타입 검사는 실행 중에 오류로 갑자기 죽는 프로그램을 미리 예방할 수 있다.

타입 검사 개요 정적 타입 검사(Statically typed) 동적 타입 검사(Dynamically typed) 거의 모든 타입 검사를 컴파일 시간에 한다 Java, Pascal, C++, ML, Haskell 엄격 타입(strongly typed) 언어라고 함 동적 타입 검사(Dynamically typed) 실행 시간에 타입 검사 Lisp, Scheme 타입 검사 안 함 어떤 종류의 타입 검사도 하지 않음(어셈블리어)

타입 및 타입 검사 프로그래머는 식별자의 타입을 선언한다 타입 추론(type inference) 타입 검사 각 식(expression)의 타입을 추론한다. 타입 검사 프로그램에서 타입이 올바르게 사용되고 있는지 검사한다.

지금까지 한 것/앞으로 할 것! Topic Logic Implementation -------------------------------------------- Syntax Grammar Parser Semantics Semantics rules Interpreter Type Typing rules Type checker

타입 규칙(Typing Rule) 타입 검사에 사용되는 규칙 논리적 추론 규칙(logical inference rule) “If this expression has this type and that expression has the other type, then this third expression must have another type.” “if X and Y then Z”

영어를 타입 규칙으로 표현 Read “x : T” as “x has type T”. 규칙 예 If e1 has type Int and e2 has type Int, then e1+ e2 has type Int (e1 has type Int  e2 has type Int)  e1+ e2 has type Int (e1 : Int  e2 : Int)  e1+ e2 : Int

영어를 타입 규칙으로 표현 추론 규칙 예 (e1 : Int  e2 : Int)  e1+ e2 : Int 일반적 형태 Hypothesis1  …  Hypothesisn  Conclusion 추론 규칙 Hypothesis1 … Hypothesisn Conclusion

타입 규칙 예 정수와 + 식에 대한 타입 규칙: ⊢ n : int ⊢ e1 : int ⊢ e2 : int ⊢ e1+e2 : int 식 2 + 5의 타입은 ? ⊢ 2 : int ⊢ 5 : int ⊢ 2+5 : int 그런데 x+y의 타입은 ? 변수 x와 y의 타입에 따라 다르다! 유효한 변수의 타입을 유지하는 Type env가 필요하다!

타입 규칙 예 Type environment 각 지점에서 유효한 변수들의 타입 정보를 유지한다. T: Var → Type Example: T = {x ↦ int, y ↦ int} 변수 x의 타입은 ? T(x) = t T ⊢ x : t 식 x + y의 타입은 ? T ⊢ x : int T ⊢ y : int T ⊢ x+y : int

타입 규칙의 의미 ⊢는 타입 규칙에 의해서 “증명 가능함”을 의미한다. 안전한(sound) 타입 시스템 ⊢ e : t이면 실제 실행에서 e의 계산된 값이 t 타입이다. If ⊢ e : t and e → v, then v : t

우리 언어 Stmt S  x = E; | S1; S2 | if E then S | if E then S1 else S2 | while E do S | read x | print E | let t x = e in S end | let t2 proc f(t1 x) : S1 in S2 end | return E | call f(E) Expr E  n | x | true | false | E + E | E – E | E * E | E / E | E == E | E < E | E > E | !E

타입 규칙: 상수/변수/식 상수를 위한 규칙 T ⊢ n: int T ⊢ true : bool T ⊢ false : bool 변수를 위한 규칙 T(x) : t T ⊢ x : t 식을 위한 규칙 T ⊢ E1 : int T ⊢ E2 : int T ⊢ E1 : t T ⊢ E2 : t T ⊢ E1+E2 : int T ⊢ E1 == E2 : bool

타입 규칙: 대입문/복합문/조건문 대입문을 위한 규칙 T ⊢ x: t T ⊢ E: t T ⊢ x = E : void 복합문을 위한 규칙 T ⊢ S1: t1 T ⊢ S2: t2 T ⊢ S1; S2 : t2 조건문를 위한 규칙 T ⊢ E: bool T ⊢ S: t T ⊢ E: bool T ⊢ S1: t T ⊢ S2: t T ⊢ if E then S : t T ⊢ if E then S1 else S2 : t

타입 규칙: 반복문/입출력/블록 반복문을 위한 규칙 T ⊢ E: bool T ⊢ S: void T ⊢ while E do S : void 입출력을 위한 규칙 T ⊢ x: t T ⊢ E: t T ⊢ read x : void T ⊢ print E : void 블록을 위한 규칙 T ⊢ E: t1 T[x ↦ t1] ⊢ S: t2 T ⊢ let t1 x = E in S end : t2

Example let int x = 0 in x = x + 1 end 타입 검사 {x ↦ int} ⊢ x : int {x ↦ int} ⊢ 1 : int {x ↦ int} ⊢ x : int {x ↦ int} ⊢ x + 1 : int { } ⊢ 0 : int {x ↦ int} ⊢ x = x + 1 : void { } ⊢ let int x = 0 in x = x + 1 end : void

타입 규칙: 함수/프로시저 함수 정의 및 타입 리턴문의 타입 규칙 T ⊢ E: t T ⊢ return E : t 함수 정의 bool f(int x) : if x > 0 then return true else return false 함수의 타입 f: int  bool 리턴문의 타입 규칙 T ⊢ E: t T ⊢ return E : t

타입 규칙: 함수/프로시저 T(f) = t1  t2 T ⊢ E: t1 함수 정의의 타입 규칙 T[x ↦ t1] ⊢ S: t2 T ⊢ proc t2 f(t1 x) S : t1  t2 함수 호출의 타입 규칙 실매개변수 타입 = 형식 매개변수 타입 호출 결과 타입 = 함수의 f의 반환 타입 T(f) = t1  t2 T ⊢ E: t1 T ⊢ call f(E) : t2

Example 다음 함수의 타입은 bool f(int x) : if x > 0 then return true else return false T[x ↦ int] ⊢ x : int T[x ↦ int] ⊢ 0 : int T[x ↦ int] ⊢ true : bool … T[x ↦ int] ⊢ x > 0 : bool T[x ↦ int] ⊢ return true : bool … T[x ↦ int] ⊢ if … : bool T ⊢ proc bool f(int x) if … : int  bool

Example 다음 문장에 대한 타입 검사 ? T(f) = int  bool T ⊢ 1: int call f(1); T ⊢ call f(1) : bool

타입 검사 과정 타입 검사는 각 식 e에 대해서 e:t라는 것을 증명한다. 각 식 종류에 대해서 하나의 타입 규칙이 있다. 이 증명은 AST와 같은 모양을 갖는다. AST의 각 노드에 대해서 하나의 타입 규칙이 사용된다. 식 e의 노드에서 가정은 e의 부분식들이고 결론은 e의 타입이다. 각 식 종류에 대해서 하나의 타입 규칙이 있다. 타입 검사 과정은 AST에 대한 상향식 패스이다.

타입 검사 과정 예 (x+y)*z x y z * + int int int int int