프로그래밍 언어론 2nd edition Tucker and Noonan

Slides:



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

제철고 프로그래밍언어 2015 가을학기 강의 #2 Python 변수, 입출력, 배열 박성우 POSTECH 컴퓨터공학과 2015 년 9 월 30 일.
파이썬 (Python). 1 일 : 파이썬 프로그래밍 기초 2 일 : 객체, 문자열 3 일 : 문자인코딩, 정규표현식, 옛한글 4 일 : 파일 입출력 5 일 : 함수와 모듈 6 일 : 원시 말뭉치 다루기 실습 7 일 : 주석 말뭉치 다루기 실습 8 일 : 웹 데이터로.
Python Ch.06 RaspberryPi Sejin Oh. Raspberry Pi Python  IDLE(Integrated Development Environment)  라즈베리 파이 배포본들은 일반적으로 파이썬과 파이썬 3 의 IDLE 파 이썬 개발 도구를.
변수와 조건문 빛나리 36 호 박승운. 파이썬 쉽게 사용하기 Python IDLE 사용 FILE - New File 로 파일 만들기 Run – Run Module 로 실행하기.
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++ 프로그래밍 기초 : 객체지향의 시작 C++로 프로그래밍한다는 것의 의미
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
1장. 이것이 C 언어다.. 1장. 이것이 C 언어다. 프로그래밍 언어 1-1 C 언어의 개론적 이야기 한글, 엑셀, 게임 등의 프로그램을 만들 때 사용하는 언어 ‘컴퓨터 프로그래머’라는 사람들이 제작 C 언어(C++ 포함)를 가장 많이 사용함.
Chapter 7. 조건문.
제 9 장 구조체와 공용체.
10장 예외 Lab 10-1.
제7장 제어구조 I – 식과 문장.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Lesson 9. 예외처리.
5장. 참조 타입.
제3장 스택과 큐.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
고급 선택 제어문과 반복문 Chapter 9 C에서의 다중 선택 제어문 선 검사 반복 구조와 for 문
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
3장 자바의 기본문법(2).
Part 07 제어 구조 ©우균, 창병모 © 우균, 창병모.
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
10장. 예외처리.
순서도.
C#.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
MATLAB
JA A V W. 03.
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Lesson 4. 수식과 연산자.
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
01_ C++ 스타일의 입출력 02_ C 스타일의 입출력
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
루프와 카운트 Looping and counting
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
7주차: Functions and Arrays
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
16장. 변수, 연산자, 사용자 정의 함수 변수 배열과 객체 연산자 함수.
Numerical Analysis Programming using NRs
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
 6장. SQL 쿼리.
제 3장 연 산 자 연 산 자 의 종 류 연 산 자 우 선 순 위 형 변 환.
13. 포인터와 배열! 함께 이해하기.
3장 자바의 기본문법(2).
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

프로그래밍 언어론 2nd edition Tucker and Noonan 7장 의미 구조 이스마엘(Ishmael): 분명히 이 모든 것이 의미없이 존재하지 않아 헤르만 멜빌(Herman Melville), 모비딕 (Moby Dick)

소목차 7.1 동기 7.2 계산식의 의미구조 7.3 프로그램 상태 7.4 저장문의 의미구조 7.5 제어 흐름 의미구조 7.6 입출력 의미구조 7.7 예외 처리의 의미구조

7.1 동기 프로그래밍 언어의 의미구조를 엄밀하게 정의하 면 다음 사람들에게 도움이 된다. 프로그래머 컴파일러 작성자 7.1 동기 프로그래밍 언어의 의미구조를 엄밀하게 정의하 면 다음 사람들에게 도움이 된다. 프로그래머 컴파일러 작성자 표준 제정자 프로그래밍 언어는 문법, 타입 체계, 의미구조가 모두 정의되어야만 완전하다.

의미구조(semantics)는 문법과 타입이 잘 맞는 프로그 램의 “의미”에 대한 정확한 정의이다. 의미를 주는 방법: 특정 기계에서 특정 컴파일러로 번역했을 때 실행 코드가 하는 일 (예: Fortran의 경우 IBM 709) 실행 전후의 상태를 “언어”로 기술 (12 장) 명령문을 상태 변경 함수로 정의 이 장에서는 다소 엄밀하지 못한 첫 번째 방법, 즉 실행 의미구조(operational semantics)를 사용한다.

7.2 계산식의 의미구조 중위 표기법: (a + b) - (c * d) 폴란드 전위 표기법: - + a b * c d 7.2 계산식의 의미구조 중위 표기법: (a + b) - (c * d) 폴란드 전위 표기법: - + a b * c d 폴란드 후위 표기법: a b + c d * - 캠브리지 전위 표기법: (- (+ a b) (* c d)) 중위 표기법에서는 모호함을 해소하기 위해 우선순위 (precedence)와 결합성(associativity)을 사용

연산자의 결합성 언어 + - * / 단항 - ** == != < ... C 부류 좌 우 좌 Ada 좌 없음 없음 없음 Fortran 좌 우 우 좌 이 계산식의 의미는? a < b < c

연산자의 우선 순위 연산자 C 부류 Ada Fortran 단항 - 7 3 3 ** 5 5 * / 6 4 4 + - 5 3 3 == != 4 2 2 < <= ... 3 2 2 not 7 2 2

단축 계산 (Short Circuit Evaluation) 논리곱 a and b 에 대한 정의는: if a then b else false 논리합 a or b 에 대한 정의는: if a then true else b

예제 Node p = head; while (p != null && p.info != key) p = p.next; if (p == null) // 리스트에 없는 경우 ... else // 리스트에서 찾은 경우

단축계산이 없다면 boolean found = false; while (p != null && ! found) { if (p.info == key) found = true; else p = p.next; }

부작용 부작용(side effect)은 계산 도중 지역이 아닌 변수 를 변경시키거나, 입출력이 발생하는 것을 말한 다. 다음을 계산하면 결과가 무엇일까? i = 2; b = 2; c = 5; a = b * i++ + c * i;

7.3 프로그램 상태 프로그램 상태(program state)는 사용하고 있는 개 체에 대해 어떤 값을 가지고 있는지 모아 놓은 것을 말한다. 두 개의 맵(map): 사용 중인 개체에 대해 메모리 주소 메모리 주소에 대해 갖고 있는 값

현재 명령문의 실행 결과는 현재 상태에 따라 다르 다. 프로그램의 실행은 상태를 계속 변경하는 과정으 로 볼 수 있다 현재 명령문의 실행 결과는 현재 상태에 따라 다르 다. 프로그램의 실행은 상태를 계속 변경하는 과정으 로 볼 수 있다. 이 장에서는 간결하게, 프로그램 상태를 변수에서 변수에 저장된 값으로의 맵으로 보겠다.

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 }

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f undef undef undef 3 undef undef

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 undef undef 3 1 undef

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 1 undef 3 1 1

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 1 1

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 1 1 3 2 1

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 2 2 3 2 1

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 2 2 3 3 2 3 3 6

// n의 계승 계산 1 void main ( ) { 2 int n, i, f; 3 n = 3; 4 i = 1; 5 f = 1; 6 while (i < n) { 7 i = i + 1; 8 f = f * i; 9 } 10 } n i f 3 3 6

7.4 저장문의 의미구조 주제 복식 저장 (multiple assignment) 저장 명령문(assignment statement)과 저장 계산 식 (assignment expression) 저장의 복사 의미구조(copy semantics)와 참조 의미구조 (reference semantics)

복식 저장 예: a = b = c = 0; 모든 변수를 0으로 초기화

저장 명령문과 저장 계산식 대부분의 언어에서 저장은 명령문이다. 계산식 도중에 나올 수 없다. 대부분의 언어에서 저장은 명령문이다. 계산식 도중에 나올 수 없다. C 부류의 언어에서는 저장은 계산식이다. 예: if (a = 0) ... // 오류 while (*p++ = *q++) ; // strcpy while (ch = getc(fp)) ... // ??? while (p = p->next) ... // ???

복사 의미구조와 참조 의미구조 복사: a = b; 참조: a, b 는 같은 값을 갖는다. 한 쪽이 변경되어도 다른 쪽에 영향 없다. 명령 중심 언어에서 사용된다. 참조: a, b 는 같은 객체를 가리킨다. 한 쪽이 변경되면 다른 쪽도 변경된다. 객체지향 언어에서 사용된다.

public void add (Object word, Object number) { Vector set = (Vector) dict.get(word); if (set == null) { // not in Concordance set = new Vector( ); dict.put(word, set); } if (allowDupl || !set.contains(number)) set.addElement(number);

7.5 제어 흐름 의미구조 명령 중심 언어가 완전해 지기 위해 문장 나열 (statement sequence) 조건문 (conditional statement) 루프 (looping statement) 가 필요하다.

문장 나열 s1 s2 의미구조: 중간에 분기가 없다면, s1 실행 후, s2 실행. s1의 결과 상태가 s2의 입력 상태

조건문 IfStatement  if ( Expresion ) Statement [ else Statement ] 예: if (a > b) z = a; else z = b; 조건식이 참이면, 조건문의 결과 상태는 then 부분의 결과 상태, 아니면, 조건문의 결과 상태는 else 부 분의 결과 상태.

루프 WhileStatement  while ( Expression ) Statement 괄호 안의 조건식을 계산한다. 참이면, 뒤의 명령문을 실행하고 다시 루프를 반복 한다. 거짓이면, 루프를 종료한다.

7.6 입출력 의미구조 open/close에 의해 입출력이 시작되고 끝난다. 접근 방법: 순차(sequential)와 임의(random) 스트림(stream)과 고정 길이 레코드 문자 방식과 바이너리 방식 형식 (format)

표준 파일 Unix: stdin, stdout, stderr C: stdin, stdout, stderr C++: cin, cout, cerr Java: System.in, System.out, System.err

입출력 스트림 Fortran Java integer :: i, a(8) write(8,*) “Enter 8 integers: “ read(*,*) a write(*,*) a Java 파일, 파이프, 메모리, 웹 주소 필터 읽기용, 쓰기용

형식 기술자 (Format String) C Fortran 코드: d, e, f, c, s (int, float, float, char, 문자열) 형식: % 길이 (생략가능) 코드 예: %s %5d %20s %8.2f Fortran 코드: i, f, a (integer, float, string) 형식: 반복회수(생략가능) 코드 길이 예: 8i4, f8.2, a20

목적 프로그램을 단순 명료하게 응용 프로그램을 보다 견고하게 (robust) 견고하다는 것이 뭐지?

(. Pascal – 문제가 무엇이지. ) (. open. ) sum := 0 (* Pascal – 문제가 무엇이지? *) (* open *) sum := 0.0; count := 0; count := count + 1; end; ave := sum / count;

예외 처리 모델 그림 7.9 예외 발생 재개 종료

#include <iostream #include <iostream.h> int main () { char A[10]; cin >> n; try { for (int i=0; i<n; i++){ if (i>9) throw "array index error"; A[i]=getchar(); } catch (char* s) { cout << "Exception: " << s << endl; } return 0;

Java 예외의 클래스 상속관계 그림 7.10

새로운 예외 클래스 정의

Java에서의 안전한 입력 처리 그림 7.11

잘못된 입력에 대한 예외 처리 (재개 모델) 그림 7.12

StackUnderflowException 클래스 그림 7.13

예외 발생 그림 7.13

AssertException 클래스

Assert 클래스 그림 7.15

단언문의 사용