제5장 기초 의미론 (Basic Semantics)

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
Chapter 7 서브프로그램. Introduction 서브 프로그램의 명시 형식 인자전달 방법 ▫ Call by value ▫ Call by value result ▫ Call by reference ▫ Call by name 구현 방법 2.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
Vision System Lab, Sang-Hun Han
10. 예외 처리.
C++ Espresso 제1장 기초 사항.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 7 장 문장 구조화 제어문 지정문 조건문 반복문 GOTO 문 비결정적문.
제 9 장 구조체와 공용체.
제3장 시맨틱스(Semantics) Reading Chap 13 © 숙대 창병모.
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
8. 객체와 클래스 (기본).
제7장 제어구조 I – 식과 문장.
제9장 추상 데이터 타입 및 모듈 (Abstract Data Type & Module)
바인딩, 메모리 관리 SANGJI University Kwangman Ko
자료 구조: Chapter 3 (2)구조체, 포인터
프로그래밍언어론 2nd edition Tucker and Noonan
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
10장 함수.
제 3장. C보다 나은 C++ II.
명품 C++ 7장 프렌드와 연산자 중복.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
C++ Programming: Sample Programs
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
6주차: Functions in C and Others
5.1 데이터 타입 개요 5.2 사례 연구 5.3 타입 검사 Reading Chap 6
14. 예외처리.
C#.
13. 연산자 오버로딩.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
5장 이름, 바인딩, 영역(2) 순천향대학교 컴퓨터공학과 하상호.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
6장 데이터 타입(4) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
2장. 변수와 타입.
프로그래밍언어론 2nd edition Tucker and Noonan
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Chapter 4 변수 및 바인딩.
6.4 타입 검사 (Type Checking).
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Fucntion 요약.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Signature, Strong Typing
Signature, Strong Typing
Signature, Strong Typing
9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호.
Chapter 2 C++ 함수와 네임스페이스. 최호성.
Lecture 4 C 프로그램 구성의 기본 C 프로그램에서 이름짓기 C 프로그램에서 이름 충돌/이름 재사용.
자료구조 세미나 발표 주제: 자료구조 기초 - 1회 차: 자료구조의 정의, 기초 지식 (함수, 포인터, 레퍼런스)
발표자 : 이지연 Programming Systems Lab.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
13. 포인터와 배열! 함께 이해하기.
Machine architecture Programming Language Design and Implementation (4th Edition) by T. Pratt and M. Zelkowitz Prentice Hall, 2001 Chapter 2.
6장 데이터 타입(5) 순천향대학교 컴퓨터공학부 하 상 호.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제5장 기초 의미론 (Basic Semantics) 5.1 간단한 의미론 5.2 이름 및 바인딩 5.3 선언, 블록 및 유효범위 5.4 심볼 테이블 5.5 이름 해결 및 중복 정의 5.6 메모리 할당

5.1 간단한 의미론

의미론의 필요성 프로그램 의미의 정확한 이해 소프트웨어의 정확한 명세 소프트웨어 시스템에 대한 검증 혹은 추론 컴파일러 혹은 해석기 작성의 기초

의미론의 종류 Operational Semantics Denotational Semantics 프로그램의 동작 과정을 정의 Denotational Semantics 프로그램의 의미를 함수 형태로 정의 Axiomatic Semantics 프로그램의 시작 상태와 종료 상태를 논리적 선언(assertion) 형태로 정의

동작 의미론(Operational Semantics) 기본 아이디어 프로그램의 의미를 (변수 값들의) 상태 전이 과정으로 설명한다. 예제 y := 1; while (x != 1) do (y := x*y; x := x-1) y에 1 배정 x 값이 1이 아닌지 검사 참이면 종료 거짓이면 y 값을 x 값과 현재 y 값의 곱으로 변경 x 값 1 감소 2 번부터 반복

While 언어 정수 변수 식 문장 S → x := e | skip | S1 ; S2 | if e then S1 else S2 n  Int 변수 x  Var 식 e  Exp 문장 S → x := e | skip | S1 ; S2 | if e then S1 else S2 | while b do S

상태(State) 상태(A state) 모든 상태들의 집합 상태에서 변수 값 검색 상태 갱신: s’ = s[y -> v] 변수들의 현재 값 s  Var  Int 모든 상태들의 집합 State = Var  Int 상태에서 변수 값 검색 s(x) 상태 갱신: s’ = s[y -> v] s’ (x) = s(x) if x != y v if x = y

상태 전이 기본 아이디어 상태 전이(State transition) 계산 과정을 (변수 값들의) 상태 전이 과정으로 기술한다. (S,s)  s’ where S is a statement s is the initial state s’ is the final state

상태 전이 시스템(State Transition System) (, T, ) where Configuration  = {(S,s) | S  While, s  State}  State State T Transition relation   {(S,s) | S  While, s  State}  State

전이 관계(Transition Relation) Assignment (x := a, s)  s[x -> [[a]]s] skip (skip, s)  s sequence (S1 , s)  s’, (S2 , s’)  s” (S1; S2, s)  s” if-then-else (S1 , s)  s’ (if e then S1 else S2, s)  s’ (S2 , s)  s’ if [[e]]s = true if [[e]]s = false

전이 관계 while (S, s)  s’, (while e do S, s’)  s” if [[e]]s = true if [[e]]s = false

Denotational Semantics y := 1; while (x != 1) do (y := x*y; x := x-1) The program computes a function from states to states: The final state will be equal to the initial state except that the value of x will be 1 and the value of y will be equal to the factorial of the value of x in the initail state.

Axiomatic Semantics y := 1; while (x != 1) do (y := x*y; x := x-1) If x = n holds before the program is executed then y = n! will hold when the execution terminates. Properties of programs are specified as assertions { P } S { Q } where S is a statement P is the precondition and Q is the postcondition

Pre- and post conditions 예제 { x=n } y:=1; { x=n and y=1} while (x !=1) do (y:=x *y; x := x-1) { y=n! }

5.2 이름 및 바인딩

기본 개념 프로그램의 의미를 정의하는데 가장 기본적인 개념은 무엇일까? 이름(name) 혹은 식별자(identifier) 변수, 프로시져, 상수, 타입 위치(Location) 변수를 저장할 곳의 위치 주소(address) 값 정수 값 등의 저장 가능 값

속성(Attributes) 이름의 의미는 어떻게 결정할까? 예 const int n = 5; int x; double f(int n) { … } 다음 이름들의 속성은 무엇일까? n x f

속성의 종류 속성의 종류 선언의 역할은 무엇인가 ? 값, 타입, 크기, 위치, 등 이름의 의미는 속성에 의해서 결정된다. 이름에 속성을 연관시키는 과정

바인딩(Binding) 바인딩은 무엇인가? 바인딩은 왜 필요할까? 바인딩 시간 이름이 의미하는 대상 혹은 이름의 속성을 결정하는 것 바인딩은 왜 필요할까? 프로그램에 등장하는 이름들이 다양하다. 변수, 상수, 클래스, 메쏘드, 인터페이스, 매개변수 등. 하나의 이름이 여러 용도로 사용될 수도 있다. 따라서 이름이 나타나면 그 대상 및 속성이 결정되어야 한다. 바인딩 시간 정적 바인딩 compile time 동적 바인딩 execution time

정적 바인딩(Static Binding) 컴파일 시간에 이루어지는 바인딩 정적 속성(Static attribute) 정적으로 바인딩 되는 속성 예제 const int n=2; int x; 정적으로 결정되는 것은 무엇인가?

동적 바인딩(Dynamic Binding) 실행 시간에 이루어진 바인딩. 동적 속성 동적으로 바인딩 되는 속성 Java 예제 C x; if (…) x = new C( ); /* memory allocation */ else x = new C1( ); /* C1 is a subclass of C */ x.m( … ); /* method dispatch */ 동적으로 바인딩되는 것은 무엇인가?

바인딩 시간 세분화 언어 정의 시간(Language definition time) boolean, true, false, char, integer,maxint 언어 구현 시간(Language implementation time) integer, maxint 컴파일 시간(Compile- time) 링크/로드 시간(Link/load time) external definition/the location of a global variable 실행 시간(Runtime)

심볼 테이블 바인딩을 유지하기 위한 자료 구조 이름 속성 왜 바인딩을 유지하는가? 누가 유지하는가 이름을 해당 속성에 대응시킨다. 이름 속성 n 상수 2 x int 변수 f 함수 : int  double 왜 바인딩을 유지하는가? 누가 유지하는가 컴파일러 인터프리터 실행시간 시스템

5.3 선언, 블록 및 유효 범위 (Declarations, Blocks, and Scope)

선언(Declarations) 선언은 무엇인가? 무엇을 선언하는가? 어디에 선언하는가? 어떻게 선언하는가? 바인딩 정보를 제공한다. 무엇을 선언하는가? 상수, 변수, 함수, 클래스 어디에 선언하는가? 블록 내 혹은 밖 구조체(struct) 클래스 어떻게 선언하는가? 명시적 선언: Pascal,C, C++, Java, … 묵시적 선언: Lisp, partly in FORTRAN

블록(Blocks) Pascal C, C++, Java Ada ML procedure or function { . . . } { . . . } Ada declare . . . begin …. End ML let … in … end

블록 구조 언어 (Block Structured Languages) 블록의 중첩을 허용하는 언어 Algol, Pascal, Modula, Ada, C, ... A B D C

C의 블록 void p (void) { double r, z; /* p의 블록 */ … { int x,y; /* 또 하나의 중첩 블록 */ x = 2; y = 0; x += 1; } int x; double y; main() { int i, j; /* main 블록 내 */

Ada 블록 declare x:integer; y: boolean; begin x := 2; y := true; x := x+1; … end

Pascal의 블록 program ex; (* main 프로그램 *) var x: integer; (* 전역 선언 *) procedure p; (* 전역 선언 *) var y: boolean; (* p 내의 선언 *) begin if x = 2 then begin … end; end; begin (* main *) (* 선언할 수 없음 *) … end. (* 프로그램 *)

구조체 내의 선언 struct A { int x; /* A 내의 지역 선언*/ double y; struct char y; } z; }

클래스 내의 선언 public class IntWithGcd { private int value; /* value 필트 지역 선언 */ public int intValue() /* intValue 메쏘드 지역 선언 */ { return value; } public int gcd(int v) /* gcd 메쏘드 지역 선언 */ { …

선언의 영역(유효범위) 선언된 식별자(이름)의 유효범위(Scope) 유효범위 규칙 그 선언된 이름이 유효한(사용 가능한) 프로그램의 범위 혹은 영역 유효범위 규칙 정적 유효범위(Static scope or Lexical scope) 선언된 블록 내에서 유효함 대부분 언어에서 표준 규칙으로 사용됨 동적 유효범위(Dynamic scope) 실행 순서에 따라 유효범위가 결정된다. 선언은 선언된 블록의 실행이 끝날 때까지 유효함 Old Lisp와 SNOBOL에서 사용됨

예: C 언어의 유효범위 규칙 핵심 아이디어 지역 변수의 유효 범위 전역 변수의 유효범위 사용 전 선언(Declaration before use) 선언의 유효범위는 선언된 지점부터 선언된 블록 끝까지 지역 변수의 유효 범위 선언된 지점부터 함수 끝까지 전역 변수의 유효범위 선언된 지점부터 파일 끝까지

예제 void p( ) p { char y; y … } int x; x void q( ) q { double z; z main() main { int w[10]; w

예: Ada 언어의 유효범위 규칙 핵심 아이디어 예제 선언의 유효범위는 선언된 블록 내 B1: declare x: integer; y: boolean; begin x := 2; y := false; B2: declare a, b: integer; if y then a := x; else b := x; end if end B2; … end B1;

중첩 블록에서 선언 최중첩 우선 규칙(Most closely nested rule) 예 한 식별자가 여러 번 선언된 경우 최중첩된 선언을 우선한다. 예 int x; void p( ) { char x; x = ‘a’; /* */ … } main() { x = 2; /* */

동적 유효범위 핵심 아이디어 프로그램을 실행하면서 선언이 나타나면 처리되고 선언된 블록(함수)의 실행이 끝날 때까지 그 선언은 유효하다. 실행 경로에 따라 유효범위가 달라질 수 있다. 예제 int g( ) { int a = 4; f(3); } int f(x) { a = a+1; return(a) }

5.4 심볼 테이블

시작 질문 바인딩 정보는 무엇 하는데 사용되는가? 컴파일러는 왜 바인딩 정보를 저장해야 하는가? 바인딩 정보를 어디에 저장해야 하는가? 바이딩 정보를 어떻게 저장해야 하는가 ?

심볼 테이블은 왜 필요한가? 현재 유효한 바인딩을 유지/관리하기 위한 자료 구조 환경(environment)이라고도 함

심볼 테이블 관리 다음 블록을 살펴보자 아이디어 { int x = 0 ; x = x+1; printf(x); } 블록의 시작에서 선언의 바인딩을 유지한다. 문장들을 컴파일 한다. 블록의 끝에서 선언은 더 이상 유효하지 않으므로 바인딩을 유지할 필요가 없다.

심볼 테이블 관리 다음 중첩 블록을 살펴보자 void p (void) { double r, z; /* p의 블록 */ int x; … { int x,y; /* 또 하나의 중첩 블록 */ x = 2; y = 0; x += 1; }

블록 구조를 위한 심볼 테이블 선언은 스택 형태로 처리한다. 블록 시작 블록의 끝 블록 내의 선언을 처리한다. 해당 바인딩을 심볼 테이블에 추가한다. 블록의 끝 블록 내의 선언의 바인딩을 제거한다. 더 이상 필요 없다.

심볼 테이블 구현 Structure is a stack. Operations: S_table S_empty(void) | Make a new S_table S_enter(S_table t, S_symbol sym, void *value) Push sym and its info. on the symbol table t. S_look(S_table t, S_symbol sym) Search the symbol table from the top, looking for sym. Return first sym found; NULL if none. S_remove(S_table t) | Pop the stack Searching the stack from the top guarantees the most recently added (i.e., most closely nested) definition is found. Pushing hides old definitions; popping exposes old definitions.

5.5 이름 해결 및 중복정의

이름 해결(Name Resolution) 하나의 이름이 여러 다른 것을 나타낼 수 있는가? 이 경우 어떻게 해결할 것인가? 중복정의(Overloading) 함수 중복정의 연산자 중복정의 이름 중복정의

함수(메쏘드) 중복정의 함수 중복 정의 함수 호출 { return x > y ? x : y; } int max(int x, int y) // max #1 { return x > y ? x : y; } double max(double x, double y) // max #2 int max(int x, int y, int z) // max #3 { return x > y ? (x > z ? x : z) : (y > z ? y : z); } 함수 호출 max(2,3); max(2.1, 3.0); max(2.1,3); max(2,4,3);

연산자 중복 정의 연산자 중복정의 예 컴파일러에서 구현 하나의 연산자가 여러 다른 연산들을 나타내도록 중복해서 정의된 것. 2 + 3 2.1 + 3.2 s1 + s2 S1 + S2 정수 덧셈 실수 덧셈 스트링 접합 합집합 컴파일러에서 구현 피연산자의 타입을 이용해서 해당 연산자를 결정 3.14 + 1 ?

연산자 중복정의 예 #include <iostream> using namespace std; typedef struct { int i; double d;} IntDouble; bool operator < (IntDouble x, IntDouble y) { return x.i < y.i && x.d < y.d; } IntDouble operator + (IntDouble x, IntDouble y) { IntDouble z; z.i = x.i + y.i; z.d = x.d = y.d; return z; } int main() { IntDouble x = {1,2.1}, y = {5, 3.4}; if (x <y) x = x + y; else y = x + y; cout << x.i << “ “ << x.d << endl; return 0;

이름 중복정의 하나의 이름이 여러 가지 다른 것들을 나타내는 경우 Java의 예 class A { static A A(A A) for(; ;) { if (A.A(A) = A) break A; } return A; }

5.6 메모리 할당

메모리 할당 메모리 할당은 무엇인가 ? 메모리 할당은 언제 하는가 ? Names → Locations (컴파일 시간) 정적 할당(static allocation) (실행 시간) 동적 할당(dynamic allocation) 두 가지 혼합

메모리 할당 예 FORTRAN LISP Pascal, C, Modula-2, Java all locations are bound statically LISP all locations are bound dynamically Pascal, C, Modula-2, Java some allocation statically, others dynamically

메모리 할당 전역 변수(global variables) 지역 변수(local variables) static allocation at compile-time 지역 변수(local variables) dynamic allocation on runtime stack when execution reaches the block 동적 메모리 할당(dynamic memory allocation) malloc() in C, new() in Pascal, Java dynamic allocation on heap when executing the function

메모리 배치 static(global) area runtime stack (unallocated) heap