1 장소개 강대기 프로그래밍언어란무엇인가? 프로그래밍언어에서의추상화연산패러다임언어정의, 구현및설계
원리 왜프로그래밍언어를배우는가? 언어가사고를지배함 언어는사고의감옥 프로그래밍언어는우리가컴퓨터에대해생각하는바에영향을줌 컴퓨터가하는일은? 연산 정보처리 컴퓨터 대략사고하는기계 연산의상한 : 튜링머신 프로그래밍언어론 2
프로그래밍언어란? 프로그래밍언어의정의 1 컴퓨터에게우리가원하는일을시키기위한표현체계 인간대기계간의통신모델 프로그래밍언어의정의 2 연산을기계가읽을수있고사람이읽을수있도록기술하는표현체계 사람대기계통신모델 또한사람대사람통신모델 프로그래밍언어론 3
연산이란? 튜링 튜링머신 머신 ( 중요 중요!) 컴퓨터의수학적 수학적모델 처치의설정 (Church s Thesis) 튜링머신보다더강력한기계를만드는것은근본적으로불가능하다. 연산 컴퓨터에의해수행될수있는모든처리과정 튜링완전성 튜링머신이수행할수있는어떤연산이라도기술할수있는프로그래밍언어는튜링완전 (Turing complete) 하다 프로그래밍언어론 4
기계가독성 ( 기계가읽을수있음 ) 프로그래밍언어는기계가읽을수있는코드로효율적으로번역할수있는정도로단순해야함 번역이가능해야함 번역하는알고리즘이존재해야함 번역은충분히쉬어야 (easy) 함 컴파일시간이컴파일된프로그램의실제실행시간보다크면안됨 컴파일시간이선형시간에수행가능하게한다면, 문법은컨텍스트프리문법 (context-free grammar) 에의해기술되어야함 프로그래밍언어론 5
인간가독성 ( 사람이읽기쉬워야 ) 추상화 프로그램언어는컴퓨터하드웨어의추상화를제공해야함 프로그래밍언어는컴퓨터기계의상세한부분은감출수있어야함 복잡도제어 큰프로그램을읽기힘들다 연산의효과가나타내는범위를작게한다면가독성이높아짐 큰프로그램의복잡성을제어하기위한방법중하나로모듈화접근방법이있음 프로그래밍언어론 6
추상화 추상화가가진두가지측면 상세함을감춘다 중요한부분은보인다 몬드리안 (Mondrian) 나무들 몬드리안 (Mondrian) 나무들 프로그래밍언어론 7
사람이용이하게쓰도록 (write) 하는점은어떤가 프로그래밍언어는프로그램을읽기쉽게하는게아니라쓰기쉽게하는거아니던가요? 프로그램을쓰기쉽게하는건, 전문가나해커들이좋아하는목표임 Perl 은매우쓰기쉬우나읽기는어려움 가독성 (Readability) 이야말로진정한목표 프로그래머가프로그램을짜면그프로그램은후에많은사람들이읽게됨 유지보수성 (maintainabilty) 은어떤가? 유지보수성은프로그래밍언어의가독성 (readability) 과쓰기편함 (writability) 과직접적으로연관되어있음 프로그래밍언어론 8
프로그래밍에서의추상화 추상화범주 데이터추상화 제어추상화 추상화레벨 추상화레벨 기본추상화 : 지역화된데이터 / 정보의추상화 구조화된추상화 : 프로그램구조의추상화 단위추상화 : 전체프로그램의추상화 프로그래밍언어론 9
기본추상화 구조화된추상화 단위추상화 추상화의예 데이터추상화제어추상화 기본적인값, 변수, 데이터형 데이터구조, 구조화된형 표현식 (expression) 평가, goto, 배정문 (assignment) 구조화된제어, 서브프로그램 추상화데이터형, 소프트웨어컴포넌트, 라이브러리 프로그래밍언어론 10
연산패러다임 패러다임이란? 토마스쿤 스타일, 패턴, 전형적인예들 문제해결을위한일반적인모델 연산패러다임에영향을주는요소 컴퓨터하드웨어 수학적인연산모델 프로그래밍언어론 11
프로그래밍패러다임 ( 중요!) http://en.wikipedia.org/wiki/programming_paradigm 임퍼러티브패러다임 (Imperative Paradigm) 폰노이만모델 (von Neumann model) 내장프로그램에의해프로세서가움직인다 함수패러다임 (Functional Paradigm) 함수의추상적인개념에근거 람다칼큘러스또는람다계산법 (lambda calculus) 주로함수표현에기반하는형식시스템 ( 쉽게말해프로그래밍언어 ) 논리패러다임 (Logic Paradigm) 기호논리에근거함 수학적인연역법 (deduction) 객체지향패러다임 (Object-Oriented Paradigm) 실세계, 객체들간의상호작용에근거 임페러디브패러다임의확장 프로그래밍언어론 12
임퍼러티브프로그래밍 폰노이만모델 (von Neumann Model) 프로세서는내장된컴퓨터프로그램에의해움직인다 컴퓨터메모리안에데이터뿐만아니라프로그램도들 어간다 ( 너무당연해보이지 만그당시에는획기적이었음 ) fetch-decode-execute 사이클 폰노이만병목현상 (bottle neck) 대표적언어 : C Processor Memory 프로그래밍언어론 13
임퍼러티브프로그래밍예 function gcd (u, v: in integer) return integer is y, t, z: integer; begin z := u; y := v; loop exit when y = 0; t := y; y := z mod y; z := t; end loop; return z; end gcd; 프로그래밍언어론 14
객체지향프로그래밍 객체 메모리위치 + 적용가능한오퍼레이션 클래스 동일한특성을가진모든객체들을기술함 객체들의행동을정의함 클래스의인스턴스가객체 메시지와메쏘드 1 + 2 임퍼러티브한관점 : + 는데이터 1,2 에적용됨 객체지향관점 : 메시지 (+ 2) 가객체 1 에보내짐, 이때 + 는객체 1 의메쏘드 프로그래밍언어론 15
객체지향프로그래밍예 (1/2) import java.io.*; class IntWithGcd { public IntWithGcd( int val ) { value = val; } public int getvalue() { return value; } public int gcd ( int v ) { int z = value; /* imperative version */ int y = v; while ( y!= 0 ) { int t = y; y = z % y; z = t; } return z; } private int value; } 프로그래밍언어론 16
객체지향프로그래밍예 (2/2) class GcdProg /* driver */ { public static void main (String args[]) { System.out.println("Input two integers:"); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); } } try /* must handle I/O exceptions */ { IntWithGcd x = /* create an object */ new IntWithGcd(Integer.parseInt(in.readLine())); int y = Integer.parseInt(in.readLine()); System.out.print("The gcd of " + x.getvalue() + " and " + y + " is "); System.out.println(x.gcd(y)); } catch ( Exception e) { System.out.println(e); System.exit(1); } 프로그래밍언어론 17
함수프로그래밍 연산이란함수의평가이다. 연산을함수의평가라는관점에서응용한언어들 함수언어 값기반 변수나배정문은사용불가 루프도사용불가 재귀함수이론에근거한이론적인특성들튜링완전성은다음을통해얻을수있음 정수값들 수학함수들 이미가지고있는함수, 선택, 및재귀를통해새로운함수를정의할수있는메카니즘 프로그래밍언어론 18
함수프로그래밍예 (define (gcd u v) (if (= v 0) u (gcd v (modulo u v)))) (define (euclid) ; sequential! (display "enter two integers:") function gcd (newline) ; goes to next line on screen (let ((u (read)) (v (read))) (display "the gcd of ") (display u) (display " and ") (display v) (display " is ") (display (gcd u v)) (newline))) gcd driver 프로그래밍언어론 19
논리프로그래밍 연산은증명이다 선언적인언어들 논리언어들 프로그램은참인주장 (assertion) 들의집합 프로그램은참인주장 (assertion) 들의집합 하부구조에내재된시스템들이제어흐름을결정 아주고차원적인언어들 프로그래밍언어론 20
논리프로그래밍예 gcd(u, V, U) :- V = 0. gcd(u, V, X) :- not(v = 0), Y is U mod V, gcd(v, Y, X). 프로그래밍언어론 21
다중패러다임언어 순수하게하나의패러다임만가지고있는언어는거의없음 현재의임퍼러티브언어들은재귀호출을지원함 다음슬라이드의 C 프로그램 어떤객체지향언어들은기본형데이터와객체들을구별함 자바언어는두개의정수데이터형이있음 : 기본정수 (int), 그리고객체정수 (Integer) 대부분의함수언어들은시퀀싱 ( 순서대로나열 ) 기능이있음 Scheme 언어에서는입출력을위해시퀀싱사용 프로그래밍언어론 22
함수스타일 C 프로그램 #include <stdio.h> int gcd(int u, int v) /* functional version */ { if (v == 0) return u; } else return gcd (v, u % v); /* tail recursion */ main() /* I/O driver */ { int x, y; } printf("input two integers:\n"); scanf("%d%d",&x,&y); printf("the gcd of %d and %d is %d\n", return 0; x,y,gcd(x,y)); 프로그래밍언어론 23
일반재귀호출 (Recursion) int sum(int n) { if(n == 1) return 1; return n + sum(n-1); } sum(3) => 3 + sum(2) <-- (1) 3 + (2 + sum(1)) 3 + (2 + (1)) 3 + (3) <-- (2) 6 프로그래밍언어론 24
꼬리재귀호출 (Tail Recursion) int sum(int n, int acc) { if(n == 1) return (acc+1); return sum(n-1, acc+n); } sum(3, 0) => sum(2, 3) <-- (3) sum(1, 5) 6 <-- (4) 6 6 프로그래밍언어론 25
언어의정의 언어를왜정의해야하는가? 1. 주어진프로그램에대해어떤연산이실제수행되는가를알기위해 2. 프로그램에대해수학적으로사고해내기위해 3. 언어의구현을정확히하기위해 ( 기계에독립적으로 ) 4. 프로그래머가부딪히는어려운문제를풀기위해 5. 언어의설계과정에서이론적원리를만들고제공하기위해 언어의정의가필요한사람은? 프로그래머 : 1, 2, 4 언어를구현하는사람 : 3 언어를설계하는사람 : 5 프로그래밍언어론 26
언어를정의하는방법 언어는다음으로정의됨 신택스 (syntax): 프로그램의구조 시멘틱스 (semantics): 프로그램의의미또는실행 참고 : 시멘틱웹 신택스의정의 우리가쓰는자연어 컨택스트프리언어 (context-free grammar) (4 장참고 ) 의미의정의 자연어 : 정확하지않음 형식적방법 (formal methods): 너무어려움 (13 장 ) 프로그래밍언어론 27
언어번역기 언어번역기 언어로쓰여진프로그램을받아서실행함 언어처리기라고도함 언어번역기의두가지형태 ( 중요!) 인터프리터 (interpreter) - 통역 컴파일러 (compiler) - 번역 의사인터프리터또는하이브리드번역기 (pseudo-interpreter, or hybrid translator) 프로그래밍언어론 28
인터프리터 Source Code input INTERPRETER output 프로그래밍언어론 29
Source Code 컴파일러 COMPILER Target Code further translation (assembler or linker) Executable Code processor input output (real machine) 프로그래밍언어론 30
Source Code 의사인터프리터 COMPILER Intermediate Code INTERPRETER input output (virtual machine) 프로그래밍언어론 31
언어번역의중요이슈들 비표준적인특성들 언어 번역기가허용하는언어 즉, 번역기가비표준적인특성을가질수있다는것임 구현에의존하는프로그램 비표준적인특성들은사용하지않는것이좋음 언어특성들의분류 정적특성들 : 프로그램실행이전에결정됨 동적특성들 : 프로그램실행중에결정됨 언어특성들은구현방법과그에상응하는실행환경을결정함 프로그래밍언어론 32
번역의효율성 번역비용실행속도 컴파일높음빠름 인터프리트없음느림 하이브리드중간중간 프로그래밍언어론 33
에러처리 에러의종류 신택스에러 ( 구문에러 ): 프로그램이제대로표현되지않았음, 다른말로폼이안좋음 (not wellformed) 시멘틱에러 ( 의미에러 ) 정적시멘틱에러 : 컴파일시간에잡을수있음 ( 예를들어, 호환되지않는데이터타입 ) 동적시멘틱에러 : 실행시간에잡을수있음 ( 예를들어, 0 으로나누는것 ) 논리에러 : 프로그래머만이알고있는에러 대부분의번역기들은디버깅툴들을지원함 프로그래밍언어론 34
에러의예 (Java) public int gcd ( int v# ) // lexical error { int z = value // syntax error - missing ; } y = v; // static semantic error - // y undefined while ( y >= 0 ) // dynamic semantic - // division by zero { int t = y; y = z % y; z = t; } return y; // logic error - should return t 프로그래밍언어론 35
언어설계 추상화메커니즘 사람이읽을수있어야하는데, 중요한요소 훌륭하고일관성있는추상화집합이제공 킬러응용프로그램 ( 크게히트치는프로그램 ) C: Unix Java: Internet C++: 가장효율적인객체지향언어 언어의실용성 다른언어나시스템과인터페이스가용이함 좋은 API 라이브러리 프로그래밍언어론 36