Download presentation
Presentation is loading. Please wait.
Published byMaximilian Thornton Modified 6년 전
1
Programming Languages 프로그래밍 언어론 2nd edition Tucker and Noonan
1 장 소 개 A good programming language is a conceptual universe for thinking about programming. 좋은 프로그래밍 언어는 프로그램에 대하여 사고하는 개념적인 세계를 제공해준다. 앨런 펄리스(Allen Perlis)
2
Why study concepts of programming languages?
1. 생각을 표현할 수 있는 능력이 향상된다. 2. 적합한 언어를 선택할 수 있는 능력이 향상된다. 3. 새로운 언어를 배울 수 있는 능력이 향상된다. 4. 구현의 중요성에 대해서 보다 많이 이해한다. 5. 새로운 언어를 설계할 수 있는 능력이 향상된다. 6. 전자계산 분야의 이해가 향상된다.
3
목차 1.1 원리 1.2 패러다임 1.3 주요 개념 1.4 역사 1.5 언어의 설계에 대하여 1.6 컴파일러와 가상기계
4
1.1 원리 프로그래밍 언어의 4가지 구성 요소: 프로그래밍 언어: 구문구조(Syntax) 이름(Names) 타입(Types)
1.1 원리 프로그래밍 언어의 4가지 구성 요소: 구문구조(Syntax) 이름(Names) 타입(Types) 의미구조(Semantics) 프로그래밍 언어: 언어 설계자는 이 구성요소를 모두 정의해야 함 프로그래머는 이 구성 요소에 모두 정통(master)해야 함
5
구문구조(Syntax) 프로그래밍언어의 구문구조 : 문법적으로 올바른 프로그램에 대한 자세한 기술
구문구조를 공부할 때 생기는 궁금증 언어의 문법(grammar)은 무엇일까? 사용할 수 있는 기본 어휘(vocabulary)는 무엇일까? 구문 오류(syntax error)는 어떻게 발견하나?
6
이름(Names) 프로그램은 다양한 종류의 엔티티(entities)를 가지며, 이 엔티티는 이름(name)을 가진다.
변수, 타입, 함수, 매개변수, 클래스, 객체 등 엔티티에 부여된 이름은 프로그램이 실행되는 동안 다음에 묶여있다(bound:결속) 영역Scope (유효범위) 가시성Visibility 타입Type 생명주기Lifetime (수명)
7
타입(Types) 타입은 값들과 그 값에 적용될 수 있는 연산들의 집합이다. 단순 타입 구조 타입
타입은 값들과 그 값에 적용될 수 있는 연산들의 집합이다. 단순 타입 수numbers, 문자characters, 불booleans, … 구조 타입 문자열Strings, 리스트lists, 트리trees, 해시테이블hash tables, … 타입시스템type systems이 제공해주는 이점 허용하는 연산을 결정 타입 오류 감지
8
의미 구조(Semantics) 프로그램의 의미(meaning)를 의미구조로 표현한다.
의미구조를 공부하면 다음과 같은 질문에 답할 수 있다. 프로그램 실행 중 특정 변수의 값은 어떻게 변하나? 각 문장은 어떤 뜻일까? 함수 호출을 하면 일어나는 현상을 설명해줄 수 있는 모델이 있을까? 실행 중에 객체는 어떻게 메모리에 할당될까?
9
1.2 패러다임(Paradigm) 프로그래밍 패러다임은 특정 장르의 프로그램과 언어에 깔려있는 문제 해결 사고의 패턴이다.
프로그래밍 패러다임은 특정 장르의 프로그램과 언어에 깔려있는 문제 해결 사고의 패턴이다. 대표적인 4가지 프로그래밍 패러다임 명령형Imperative 객체지향형Object-oriented 함수형Functional 논리형Logic (선언형declarative)
10
명령형 패러다임 전통적인 폰노이만-엑커르트 계산 모델을 따름: 명령형 언어의 사례:
프로그램과 데이터가 메모리에 구별없이 저장됨 프로그램 = 명령문의 나열 상태State = 프로그램 실행 시, 변수의 값 프로그램이 길어지면 프로시저 추상화procedural abstraction 명령형 언어의 사례: Cobol, Fortran, C, Ada, Perl, …
11
폰노이만-엑커르트 모델 The von Neumann-Eckert Model
12
객체지향(OO) 패러다임 OO 프로그램은 상태를 변환시키는 메시지를 주고받으며 상호 교류하는 객체의 모임이다.
상태를 변환시키는 메시지를 주고받으며 상호 교류하는 객체의 모임이다. OO를 공부하면서 익히는 개념 메시지 전달Sending Messages 상속Inheritance 다형성Polymorphism OO 언어의 사례 Smalltalk, Java, C++, C#, Python
13
함수형 패러다임 함수형 프로그래밍은 계산 문제를 수학 함수의 집합으로 모델링한다. 입력Input = 정의역domain
출력Output = 치역range 연속적인 함수 적용에 의해 결과를 생성 (함수n (함수n-1 ( … (함수1 (데이터) ) … ))) 부작용(side-effect)이 없어, 검증하기 용이 함수형 언어의 특징 함수 합성Functional composition, 재귀Recursion 함수형 언어의 사례 Lisp, Scheme, ML, Haskell, …
14
논리형 패러다임 논리형 프로그래밍은 논리형 프로그램을 공부하면서 관찰할 사항 논리형 프로그래밍 언어의 사례
어떻게 문제를 풀 것인지를 고민하는 대신, 프로그램에서 얻어내야 하는 결과가 무엇인지를 선언하도록 문제를 모델링하여 프로그램을 작성한다. 논리형 프로그램을 공부하면서 관찰할 사항 프로그램을 문제에 대한 제한식의 집합으로 취급 프로그램은 문제의 가능한 모든 답을 만들어 냄 비결정적nondeterministic인 프로그램 작성 가능 논리형 프로그래밍 언어의 사례 Prolog
15
Prolog 예 happy(yolanda). listens2Music(mia). listens2Music(yolanda):- happy(yolanda). playsAirGuitar(mia):- listens2Music(mia). playsAirGuitar(yolanda): listens2Music(yolanda).
16
1.3 주요 개념 이벤트 처리Event handling 동시 계산Concurrency 프로그램의 정확성Correctness
1.3 주요 개념 이벤트 처리Event handling 예: GUI 동시 계산Concurrency 예: 클라이언트-서버 프로그램 프로그램의 정확성Correctness 프로그램이 모든 가능한 상황에서 기획한 대로 작동하는지 어떻게 증명할 수 있을까? 이게 왜 중요하지???
17
1.4 역사 언제 어떻게 프로그래밍 언어가 진화되었나? 어떤 집단이 개발하고 사용했는가?
1.4 역사 언제 어떻게 프로그래밍 언어가 진화되었나? 어떤 집단이 개발하고 사용했는가? 인공지능 Artificial Intelligence 컴퓨터과학 교육 Computer Science Education 과학과 공학 Science and Engineering 정보 시스템 Information Systems 시스템과 네트워크 Systems and Networks 월드 와이드 웹 World Wide Web
19
깃허브(GitHub)는 “프로그래머들의 페이스북”
22
1.5 언어의 설계에 대하여 설계 고려사항 설계 결과와 목표 컴퓨터 구조 Computer architecture
1.5 언어의 설계에 대하여 설계 고려사항 컴퓨터 구조 Computer architecture 기술적인 환경 Technical setting 표준 Standards 유물 시스템 legacy system 설계 결과와 목표 프로그래밍 언어는 어떻게 생겨나고 어떻게 하면 성공하는가? 이상적인 프로그래밍 언어가 되려면 어떤 주요 특징이 필요한가?
24
어떻게 하면 성공적인 언어가 되는가? 주요 특징 단순성과 가독성 Simplicity and readability
묶기(바인딩:결속)의 명확성 Clarity about binding 신뢰성 Reliability 지원성 Support 추상화 Abstraction 직교성 Orthogonality 구현의 효율성 Efficient implementation
25
단순성과 가독성 명령문(instructions) 개수의 소규모화 구문구조의 단순함 장점 예: Java vs Scheme
예: C/C++/Java vs Python 장점 배우기 쉬움 Ease of learning 프로그램 작성이 쉬움 Ease of programming
26
묶기의 명확성 (정적결속vs. 동적결속) 언어에서 필요한 요소들은 언어의 특성이 정의될 때 묶인다(bound).
묶기binding는 어떤 개체(object)와 그 개체의 성질(속성)을 결합(association)하는 것이다. 예: 개체 vs 속성 변수와 그 변수의 타입 변수와 그 변수의 값 조기 묶기 Early binding 는 프로그램 컴파일 시간에 일어남 오류탐지유리, cost↓ 만기 묶기 Late binding 는 프로그램 실행 시간에 일어남. 유연성↑,
27
바인딩(Binding) 바인딩(binding) 개념 바인딩이란 ? - 이름에 어떤 속성을 관련시키는 일련의 작업
즉, 프로그램의 기본 단위에 이 단위가 택할 수 있는 여러 속성 중에서 일부를 선정하여 결정하는 작업 바인딩 예 const int num = 5 ; 이름 num에는 두개의 속성인 상수와 값 5가 바인딩 int x = 100 ; 이름 x에 변수와 정수라는 두개의 속성이 바인딩 x = 2 ; 변수 x에 새로운 속성으로 값 2가 바인딩
28
바인딩 시간 바인딩 시간의 종류 바인딩 시간 - 바인딩이 발생되는 시간
- 바인딩 시간의 종류 : 언어정의시간, 언어 구현시간, 번역시간, 실행 시간 빠른 바인딩 바인딩 시간의 종류 늦은 바인딩 (1) 실행 시간 - 프로그램 실행 시간에 발생되는 바인딩 동적 바인딩(dynamic binding) 예) 변수값 배정, 변수와 자료 구조에 기억 장소 할당 등(동적) ① 서브 프로그램이나 블록 실행 시작 시간에 발생하는 바인딩 예) 형식 매개 변수와 실매개 변수간의 바인딩 지역 변수에 대한 기억 장소 할당 ② 프로그램 실행 시 사용 시점에서 수시로 발생하는 바인딩 예) 배정문으로 값을 변수에 저장하는 바인딩
29
바인딩 시간 바인딩 시간의 종류 (계속) (2) 컴파일 시간 - 언어를 번역하는 시점에서 발생되는 바인딩
정적 바인딩(static binding) (번역시간 - 컴파일 시간, 링크 시간, 로드 시간) 예) 변수의 형, 자료 구조의 형과 크기, 레코드 항목들의 형을 확정 (3) 언어의 구현 시간 -언어 정의 시 원소들에 특성을 한정하지 않고, 언어를 컴퓨터 상에서 구현할 때 특성의 일부를 확정하는 바인딩 - 예) 정수의 자리수, 실수의 유효숫자 개수, 수의 하드웨어에서의 표현법
30
바인딩 시간 바인딩 시간의 종류 (계속) (4) 언어 설계 시간(언어 정의 시간) - 언어를 정의할 때 확정되는 바인딩
- 예) 언어 구문 정의(반복문, 허용되는 자료 구조, 연산 종류 등) 혼합형 연산(덧셈, 곱셈)에서 두 피연산자의 형 결정에 관한 사항
31
바인딩 시간 지정문 Y := X + 10 에서 발생되는 바인딩과 시간 변수 x : 현재값(실행 시간), 자료형(컴파일 시간),
자료형의 종류(언어 설계 시간) 상수 10 : 표현 방법(언어 구현 시간)과 의미(언어 설계 시간), 적재(컴파일 시간) 연산자 + : 성질과 의미(언어 설계 시간), 덧셈의 종류(실수 or 정수: 컴파일 시간) 지정문 := : 성질과 의미(언어 설계 시간) 평가 순서 : 언어 설계 시간 (or 언어 구현 시간)
32
바인딩 시간 바인딩 시간의 중요성 언어들 간의 중요하고, 미묘한 차이점은 바인딩 시간의 차이에서 발생
예) - 큰 배열에 많은 연산이 포함된 문제는 Fortran이 적당 실행시간에 적은 부분만이 바인딩 (실행시간 효율성) - 배열의 크기나 자료형이 실행 시 변화되는 자료형의 처리는 Snobol4가 적당 실행 중 자료가 입력되는 순간에 바인딩 발생(자료 처리의 융통성) 정적(빠른) 바인딩은 효율성이 증가하고 동적(늦은) 바인딩은 융통성이 증가 컴파일러 언어, 명령형 언어: 정적 바인딩(실행 시간 바인딩을 제외한 모든 바인딩) 인터프리터 언어, 함수형 언어: 동적 바인딩
33
바인딩 시간 주요 언어에서 식별자의 바인딩 시간 번역 시간 바인딩 (정적 바인딩: static binding)
컴파일 시간 (프로그램 작성 시간 포함) (1) Fortran, Algol, PL/I, Pascal, Cobol 등 컴파일러 언어 : 대부분의 변수형 확정 (2) 상수값의 기계 내부 표현이 확정됨 번역 시간 바인딩 (정적 바인딩: static binding) (1) Fortran:COMMON 문에 주어진 이름의 상대 주소 확정 (2) Fortran, Algol, PL/I 등: 부프로그램 이름에 관한 상대 주소 확정 Linkage edit 시간 (1) Fortran, Cobol: 모든 변수의 기억 장소 할당 (2) PL/I: 정적 변수로 선언된 변수의 기억 장소 할당 (3) Algol, Pascal: 전역(global) 변수의 기억 장소 할당 (4) Fortran: DATA 문에서 정의된 값을 변수에 배정 적재 시간 (load time) (1) 실매개 변수를 형식 매개 변수에 연결 ① by value: 실매개 변수값을 지역 변수에 배정 ② by reference: 실매개 변수를 형식매개 변수로 사용할 수 있도록 주소를 배정 ③ by name: 사용할 때 주소와 해당 값을 계산할 수 있는 thunk 루틴의 주소 확정 (2) Algol, Pascal: 지역 변수에 대한 기억 장소 할당(활성 레코드가 만들어짐) (3) PL/I: AUTOMATIC 변수에 대한 기억 장소 할당 실행 시간 바인딩 (동적 바인딩: dynamic binding) 호출 시간 (또는 모듈 시작 시간) 실행 시간 사용 시점 (reference) (1) PL/I: BASED 변수 기억장소(ALLOCATE 문, FREE 문) (2) APL, Lisp, Snobol4: 변수들의 자료형 배정, 기억 장소 할당 (3) 모든 프로그래밍 언어: 지정문 등에서 변수값을 배정
34
선언(Declarations) 선언문(Declarations)
- 실행시 사용될 자료의 속성을 언어의 번역기에게 알려주는 프로그램 문장 자료의 속성 자료형, 크기, 이름, 생성 시기, 소멸 시기, 참조하기 위한 첨자 등 예 Java의 선언문 int [ ]x = new int[10] 생성, 소멸 시기 : new 실행~가비지 자료형 : 1차원 배열 원소수 : 10 첨자 범위 : 0 ~ 9 원소 자료형 : 정수 배열 이름 : X
35
선언(Declarations) 선언문의 목적 선언문의 예 (1) 주기억 장치 사용과 접근 방법의 효율성
(변수, 배열, 레코드 등의 효율적인 접근 가능) (2) 주기억 장치 경영의 효율성 (생성과 소멸 시점을 알므로 스택 기반 기억 장소 할당 등을 수행 가능) (3) 정적 형 검사(static type checking) 가능 형 고정 연산(type specific operation) : 하드웨어 제공 혼합형 연산(mixed operation) : 프로그래밍 언어 제공 정적 형 검사로 혼합형 연산을 형 고정 연산으로 변환 효율성 추구 cf> 혼합형 연산의 동적 형 검사 융통성 추구 선언문의 예 float X; int Y; ... X + Y 번역기 동작(정적 형 검사) 1) 혼합형 연산 발견 2) Y를 실수형으로 변환 3) 실수형 덧셈코드 생성
36
선언 정적 형 검사 (static type checking) 모든 변수의 자료형 선언 요구
단점 : 자료 생성, 소멸, 내용 변경 방법에 많은 제약 존재 장점 : 실행 시간 효율이 높음 정적 형 검사 언어 : Java, C, Fortran, Algol, Pascal 등 동적 형 검사 (dynamic type checking) 선언문 사용 안함 장점 : 프로그래밍 단순화, 유연성(flexibility) 높음 단점 : 프로그램 실행 시간 지연, 자료 표현상의 효율 저하, 복잡한 기억 장소 경영 기법 요구 동적 형 검사 언어 : Lisp, APL, Snobol 4
37
변수의 수명(Extent) 수명(Extent 또는life time) 변수가 기억장소를 할당받은 기간 X int
38
변수의 수명 FORTRAN 정적 기억 장소 할당 => 변수 수명 = 프로그램 수명 ALGOL 60 블록 단위 할당/해제
정적 기억 장소 할당 => 변수 수명 = 프로그램 수명 ALGOL 60 블록 단위 할당/해제 => 변수 수명 : (블록 시작 ~ 블록 종료) own 변수(static 변수) => 변수 수명 : (주 프로시져 시작 ~ 주 프로시져 종료) 참고) 변수 영역 : (블록 시작 ~ 블록 끝) 초기화는 첫 번째 진입시 한 번(진입 여부 검사 코드를 작성)
39
변수의 수명 C++, Java new, delete 동적 수명 예) 실행 시간에 기억 장소 할당
Pascal - new() ~ dispose(), C++ – new, delete PL/1 - ALLOCATE() ~ FREE() 힙(heap) 기법 이용: 스택의 원리로 처리할 수 없는 객체들을 생성할 수 있도록 사용 가능한 기억 장소들의 집합 C++, Java new, delete 스택 사용 힙 사용
40
신뢰성 언어를 신뢰할 수 있는 충분조건 다른 플랫폼에서 실행해도 같은 결과가 나옴 타입오류를 모두 감지할 수 있음
예: Fortran 초기 버전 타입오류를 모두 감지할 수 있음 예: C vs Haskell 의미 오류를 적절히 예외처리 할 수 있음 예: C vs C++ 메모리 누수 Memory leaks 를 방지할 수 있음 예: C vs Java
41
지원성 공개 소프트웨어로 쉽게 구하여 사용할 수 있는 컴파일러와 인터프리터가 존재 양질의 교재와 지침서 존재
공개 소프트웨어로 쉽게 구하여 사용할 수 있는 컴파일러와 인터프리터가 존재 양질의 교재와 지침서 존재 활성화된 사용자 커뮤니티의 존재 통합개발환경(IDE)의 존재
42
추상화 데이터 프로그래머 정의 타입 및 클래스 클래스 라이브러리 프로시저 프로그래머 정의 함수 표준 함수 라이브러리
43
직교성 상호 독립된 소규모 기본 연산만으로 프로그램을 구축할 수 있는 언어를 직교적orthogonal이라고 한다.
필요한 예외적 규칙의 최소화 = 개념적으로 단순화 예: 함수 인수의 타입을 제한함(직교적X:함수정의가 인수로 전달될 수 없다) C언어에서 매개변수 전달(직교성 ↓) 배열->주소, 그외 -> 값전달 : 문맥에 의존하는 제한 효율성과 타협 Tradeoffs 의 여지 직교성이 좋아지면 효율성이 낮아질 수 있고, 효율성이 좋아지면 직교성이 낮아질 수 있다.
44
구현의 효율성 내장형 시스템Embedded systems 웹 응용프로그램 전사적 데이터베이스 응용프로그램 AI 응용프로그램
실시간 응답 속도 (예: 네비게이션) 초기 Ada 언어 구현의 실패 사례 웹 응용프로그램 사용자의 요구에 대한 응답 속도 (예: 구글 검색) 전사적 데이터베이스 응용프로그램 효율적인 검색 및 수정 AI 응용프로그램 인간의 행동을 모델링
45
언어설계의 상충(Language Design Trade-offs)
1. 신뢰성 vs 실행비용 (Reliability vs cost of execution) 신뢰성 실행 비용 (배열의 첨자 범위 검사, Ada vs C) 2. 작성력 vs 가독성 (Writability vs readability) 작성력 가독성 (APL의 배열 연산) 3. 유연성 vs 안전성 (Flexibility vs safety) 유연성 안정성 (variant record in Pascal)
46
1.6 컴파일러와 가상기계(Virtual Machine)
컴파일러Compiler – 기계코드를 생성 실행기(해석기)Interpreter – 가상 기계의 명령을 실행 컴파일하는 언어의 예 Fortran, Cobol, C, C++ 실행기를 사용하는 언어의 예 Scheme, Haskell, Python 컴파일러와 실행기를 모두 사용하는 경우 The Java Virtual Machine (JVM) JIT(Just-in-Time) Compiler
47
컴파일 실행 과정
48
position := initial + rate * 60
컴파일 과정의 예 (1) position := initial + rate * 60 Lexical Analyzer Symbol Table id1 := id2 + id3 * num60 position … 1 initial 2 rate 3 4 Syntax Analyzer S V E id1 := id2 + id3 * num60 S V := E E E + E | E * E id | num V id 문 법
49
Intermediate Code Generator
컴파일 과정의 예 (2) Semantic Analyzer Intermediate Code Generator temp1 := inttoreal(num60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 S E id1 := id2 + id3 * num60 inttoreal Code Optimizer temp1 := id3 * 60.0 id1 := id2 + temp2
50
컴파일 과정의 예 (3) temp1 := id3 * 60.0 id1 := id2 + temp2 Code Generator
MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1
51
해석기 실행 과정
52
토의 문제 다익스트라(E. Dijkstra)의 다음 견해에 대한 토의
BASIC을 먼저 습득한 학생들에게 프로그램을 잘 하도록 가르치는 것은 사실상 불가능하다. 잠재적인 프로그래머로서 재생성의 희망도 없이 정신적으로 파괴되었다. 자신이 친숙한 언어에서 특별히 읽기가 힘들다고 생각되는 예제 문장을 하나 생각해 내보자. 예를 들면, C 언어에서 while (*p++ = *q++) 의 의미는 무엇일까? A[i++], x << 1, …
Similar presentations