프로그래밍언어론 Chapter 6 타입시스템 나는 발생 가능한 오류의 수를 최소화하고

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 7. 조건문.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
프로그래밍 언어론 2nd edition Tucker and Noonan
컴퓨터 프로그래밍 기초 [Final] 기말고사
프로그래밍언어론 2nd edition Tucker and Noonan
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
10장 함수.
제3장 스택과 큐.
명품 C++ 7장 프렌드와 연산자 중복.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
고급 선택 제어문과 반복문 Chapter 9 C에서의 다중 선택 제어문 선 검사 반복 구조와 for 문
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
6주차: Functions in C and Others
23장. 구조체와 사용자 정의 자료형 2.
3장 자바의 기본문법(2).
2주차: 변수, 수식, Control Flow.
Tail-recursive Function, High-order Function
10장. 예외처리.
순서도.
C#.
프로그래밍언어론 2nd edition Tucker and Noonan
13. 연산자 오버로딩.
3. while문 반복문의 종류 while 문 while( 조건식 )        문장;.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
MATLAB
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
어서와 C언어는 처음이지 제15장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Lesson 4. 수식과 연산자.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
6장 데이터 타입(4) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
프로그래밍언어론 2nd edition Tucker and Noonan
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
6.4 타입 검사 (Type Checking).
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Fucntion 요약.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
[ 단원 04 ] 반복과 배열.
7주차: Functions and Arrays
Lecture 4 C 프로그램 구성의 기본 C 프로그램에서 이름짓기 C 프로그램에서 이름 충돌/이름 재사용.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
제 22 강 논리식 및 논리 값 shcho.pe.kr.
Numerical Analysis Programming using NRs
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
3장 (2) 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
6장 데이터 타입(5) 순천향대학교 컴퓨터공학부 하 상 호.
7 생성자 함수.
3장 자바의 기본문법(2).
Presentation transcript:

프로그래밍언어론 Chapter 6 타입시스템 나는 발생 가능한 오류의 수를 최소화하고 발생하더라도 컴파일 시간에 안전하게 감지할 수 있도록 하는 프로그래밍 표기법을 설계할 필요성을 마침내 가지게 되었다. -토니 호어(C.A.R Hoare)

목차 6.1 Clite를 위한 타입시스템 6.2 자동 타입 변환 6.3 Clite 타입시스템의 정형화

Motivation: 타입 오류의 감지 컴파일 시간이나 실행 시간에 타입 오류를 감지하는 것을 타입 검사라고 한다. 컴파일 시간이나 실행 시간에 타입 오류를 감지하는 것을 타입 검사라고 한다. 타입오류는 프로그램에서 빈번하게 발생한다. 타입오류는 EBNF로 방지하거나 감지할 수 없다. 감지되지 않은 타입오류는 심각한 실행시간 오류를 일으킨다. 타입 시스템은 타입오류가 발생하기 전에 이를 식별하는 것이다.

6.1 CLITE를 위한 타입 시스템 정적 바인딩 단일 함수: main 단일 유효범위: 유효범위 중첩이나 전역변수가 없음. 단일 유효범위: 유효범위 중첩이나 전역변수가 없음. 이름 풀이 오류가 컴파일 시간에 감지됨 선언된 변수는 유일한 명칭을 가져야 한다. 명칭은 키워드가 아니어야 한다.(구문적으로 강제됨) 참조되는 변수는 선언되어 있어야 한다.

Clite 예제 프로그램(Fig 6.1) // 정수 n의 계승을 계산하는 함수 void main ( ) { int n, i, result; n = 8; i = 1; result = 1; while (i < n) { i = i + 1; result = result * i; }

타입 시스템의 설계 자연어로 작성된 규칙 집합 V 정적 타입 검사를 용이하게 함. 규칙에 위배되면 예외를 발생하도록 구현됨. 결과값은 true 또는 false 추상 구문을 기반함. 수학 함수로 나타내면: V: AbstractSyntaxClass → Boolean 정적 타입 검사를 용이하게 함. 규칙에 위배되면 예외를 발생하도록 구현됨.

타입 규칙 6.1 참조되는 모든 변수는 선언되어 있어야 한다. 타입환경(타입맵)은 순서쌍 집합이다: E.g., {<n, int>, <i, int>, <result, int>} 해쉬 테이블로 구현할 수 있다. 함수 typing 은 타입 환경을 생성한다. 함수 typeOf 은 변수의 타입을 검색한다: typeOf(id) = type

함수 typing은 타입 환경을 생성한다: public static TypeMap typing (Declarations d) { TypeMap map = new TypeMap( ); for (Declaration di : d) { map.put (di.v, di.t); } return map;

Type Rule 6.2 모든 변수는 유일한 명칭을 가져야 한다. public static void V (Declarations d) { for (int i=0; i<d.size() - 1; i++) for (int j=i+1; j<d.size(); j++) { Declaration di = d.get(i); Declaration dj = d.get(j); check( ! (di.v.equals(dj.v)), "duplicate declaration: " + dj.v); }

타입규칙 6.2 예제 // compute the factorial of integer n void main ( ) { int n, i, result; n = 8; i = 1; result = 1; while (i < n) { i = i + 1; result = result * i; } 이것들이 유일해야 한다

타입 규칙 6.3 프로그램은 다음을 만족할 때 타당하다: 선언부분이 타당하고 블럭부분이 선언부분에 대한 타입 환경에 의해 타당함. public static void V (Program p) { V (p.decpart); V (p.body, typing (p.decpart)); }

타입규칙 6.3 예제 // 정수 n의 계승을 구하는 함수 void main ( ) { int n, i, result; while (i < n) { i = i + 1; result = result * i; } 이것들이 타당해야 함.

타입 규칙 6.4 문장은 다음에 의해 타당하다: Skip 문은 항상 타당하다. Assignment 는 다음을 만족할 때 타당하다: 변수 Variable 이 선언되었다. 수식 Expression 이 타당하다. 변수 Variable 의 타입이 float이면 수식 Expression 의 타입은 float 이거나 int 이어야 한다. 변수 Variable 의 타입이 int이면 수식 Expression 의 타입은 int 이거나 char 이어야 한다. 그 외에는 변수 Variable 는 수식 Expression와 같은 타입이어야 한다.

타입 규칙 6.4 (계속) 조건문 Conditional 은 다음을 만족할 때 타당하다: 조건식 Expression 이 타당하고 bool 타입을 가진다. then 부분과 else 부분의 Statements 가 타당하다. 루프문 Loop 은 다음을 만족할 때 타당하다: 몸체 문장이 타당하다. 블록 Block은 내부의 모든 문장이 타당하면 타당하다.

타입규칙 6.4 예제 // 정수 n의 계승을 구하는 함수 void main ( ) { int n, i, result; while (i < n) { i = i + 1; result = result * i; } 이 저장문은 타당하다 왜냐면: n 이 선언되어 있고, 8 이 타당한 수식이며, 8의 타입이 int 또는 char이다. (n 이 int 타입이기 때문에).

타입규칙 6.4 예제 // 정수 n의 계승을 구하는 함수 void main ( ) { int n, i, result; while (i < n) { i = i + 1; result = result * i; } 이 루프는 타당하다: i < n 이 타당하고, i < n 의 타입이 bool 이며, 루프 몸체가 타당하다.

타입 규칙 6.5 수식은 다음에 의해 타당하다: 값 Value 는 무조건 타당하다. 변수 Variable 는 이것이 타입환경에 나올 때 타당하다. 이항 수식 Binary 은 다음이 만족할 때 타당하다: 수식 term1 과 term2 이 타당하다. 연산자 op 가 산술연산이면 피연산자 수식은 모두 int 이거나 float 이어야 한다. 연산자 op 가 관계연산이면 피연산자 수식은 같은 타입이어야 한다. 연산자 op 가 논리연산이면 피연산자 수식은 모두 bool이어야 한다. 단항 수식 Unary 는 다음을 만족할 때 타당하다: 수식 term 이 타당하다. …

타입 규칙 6.6 수식 e 의 타입은 다음과 같이 결정된다: 수식 e 가 값이면 그 값의 타입 수식 e 가 이항 연산 op term1 term2 일때 op 가 산술연산자이면 term1 과 term2의 (공통)타입 op 가 관계연산자이거나 논리연산자이면 bool 타입 수식 e 가 단항 연산 op term 일때 op 가 ! 이면 bool 타입 …

타입규칙 6.5 와 6.6 예제 // 정수 n의 계승을 구하는 함수 void main ( ) { 타입규칙 6.5 와 6.6 예제 // 정수 n의 계승을 구하는 함수 void main ( ) { int n, i, result; n = 8; i = 1; result = 1; while (i < n) { i = i + 1; result = result * i; } 이 수식은 타당하다. op 는 산술연산자 (*) 이고 i 와 result의 타입이 int이다. 따라서 결과 타입은 int 이다.

6.2 자동 타입 변환 Clite의 저장문은 상위타입으로의 자동 타입 변환을 제공한다. 6.2 자동 타입 변환 Clite의 저장문은 상위타입으로의 자동 타입 변환을 제공한다. 추상 구문 트리의 필요한 곳에 수동 타입 변환 함수를 자동으로 삽입할 수 있다. 저장문의 좌변 변수 타입과 우변 수식 타입에 따라서 삽입할 변환 함수를 결정할 수 있다.

예제: int 타입을 float 타입에 저장하기 다음의 저장문을 생각해보자. f = i - int(c); (f, i, c는 각각 float, int, char 변수이다.) 추상구문트리는 다음과 같다.

예제 (계속) 따라서 트리에 상위타입으로의 타입변환함수가 삽입된다. 따라서 트리에 상위타입으로의 타입변환함수가 삽입된다. 여기서, c2i 는 char에서 int로의 변환함수이고 i2f 는 int 에서 float으로의 변환함수이다. Note: c2i 는 프로그램에서 연산자 int()에 의해서 주어진 변환함수이다.

6.3 Clite 타입시스템의 정형화 타입환경: 타입규칙 6.1 (타입환경) 타입규칙 6.2 (선언부 타당성)

Clite 프로그램의 타당성 타입규칙 6.3

문장의 타당성 타입규칙 6.4, 저장문에 대한 간략화된 규칙

수식의 타당성 타입규칙 6.5, 이항연산식과 단항연산식은 부분적으로 생략됨

수식의 타입 결정하기 타입규칙 6.6, 부분적으로 생략됨