반응형
(해당 강의노트는Michael L. Scott의 [Programming Language Pragmatics : 4th edition] 책을 기반으로 작성되었습니다)
01 Introduction
Table of Contents
- Introduction
- The art of Language Design
- The Programming Language Spectrum
- (pass)
- (pass)
- (pass)
- An Overview of Compilation
0. Introduction
- Programming in Old Days
- 초기 컴퓨터들은 monstrous 장치였음
- monstrous: very bad, because too big
- Programmers were cheap
- Machine language로 프로그래밍 함
- Machine Language
- bit의 나열로 직접적으로 프로세서를 컨트롤함
- 기계어로 짠 GCD Algorithm
- The next step was writing in assembly language
- 앞서 010011 비트로 표현하는 것보다 코드가 짧고 훨씬 효율적임(가독성이 더 좋음)
- 속도가 빠르기 때문에 성능이 중요한 프로그램에서는 현재도 사용하는 언어
- Use mnemonic abbreviations
- mnemonic abbreviations? a short form of a word that helps remember something
- Assembly Language
- the one-to-one mapping between mnemonics and machine language instructions translated by an assembler
- mnemonic과 기계어 사이의 일대일 매핑을 통해 어셈블러가 해석을 진행하게 됨
- 어셈블러는 매크로 확장을 통해 일반적인 명령 시퀀스에 대한 매개변수화된 약어를 정의한다.
- 기계어보다는 쉽지만 아직도 어렵고, 기계중심적인(Machine-centered) 언어임
- System-specific(not portable) : 이식성이 좋지 않음, 종속적임
- 어셈블리어로 짠 GCD Algorithm
- 고급언어의 등장 배경
- 숫자 연산 능력과 관련된 machine-neutral programming languages 에 관한 Dream으로 Fortan 등장
- 또한 이식성이 좋은, 기계 독립적인 언어를 원하게 됨
- 어셈블리어의 경우 이식성이 좋지 않아 같은 프로그램이라도, 기계마다 다 다른 언어를 작성해주어야 했음
- 처음에는 사람이 더 빨랐으나 점점 시간이 지나면서 컴파일러로 하는게 더 빨라지기 시작함
- 이후 고급 언어로, Lisp, Algol등이 등장함
- 고급언어를 어셈블리어 혹은 기계어로 변환해주는 작업을 하는 것이 컴파일러의 역할이 됨
- Need to economize the programmer effort
- 프로그램의 유지보수 문제면에서 컴파일러가 나음
- 프로그램의 원래 구조를 더 잘 보존 가능
- 인력을 좀 더 효율적으로 사용할 수 있음
1. The Art of Language Design
Why are there so many programming languages?
- Evolution : 시간이 지날수록 더 좋은 방법으로 배우길 원한다
- The constant development of accomplishing things
- goto-based control flow(Fortran, Cobol, Basic)
- 구조화된 프로그래밍: goto 중심의 흐름제어 대신에 while loop, case(switch) 등의 선언 중심 control flow 등장
- Algol, Pascal, C, Ada
- OOP(Smalltalk, C++, Eiffel, Java, C#)
- 스크립트 언어는 신속한 개발을 위해 더 전통적인 컴파일 언어들을 대체한다(Python, Ruby)
- Special Purpose
- 구체적인 문제 영역을 위해 디자인된 언어들.
- Lisp dialects : 심보릭 데이터와 복잡한 데이터 구조체
- Icon and Awk : 문자열을 조작하기에 좋음
- C : 저언어 수준의 시스템 프로그래밍
- Prolog : 데이터 사이의 논리적 관계에 대한 추론(inference = reasoning)
- 다른 일반적인 작업에서도 사용 가능하긴하나 각각의 전문적인 부분에 좀 더 포커스된 언어들임
3.. Personal Preference
- 사람들마다 선호도가 다름
- Recursion/Iteration
- Pointer 개념의 유무
- 보편적으로 수용가능한 프로그래밍 언어는 불가능할 것 이다.
What makes a language successful?
- Expressive power : 표현 능력
- 다른 언어들보다 표현력이 더 좋음
- 언어들의 특징 : 프로그래머들의 유지보수, clear, concise(간결)한 코딩 능력에 도움을 주는 언어
- 이 책의 주요 쟁점이 될 것임
- Ease of use for the novice: 초심자에게 쉬운 언어
- Basic, Pascal과 같은 언어
- Ease of Implementation : 구현이 쉬운 언어
- Basic, Forth, Squeak
- Pascal
- Standardization : 표준화
- 표준화는 플랫폼 전반에 거쳐 이식성이 좋은 것을 보증하는 only truly effective way이다.
- Open Source
- 오늘날의 대부분의 프로그래밍 언어는 최소한 하나의 컴파일러 혹은 인터프리터 오픈소스를 가지고 있음
- C language(GCC 계열), UNIX operating system
- Excellent Compilers
- Fortran, Common Lisp
- Economics, Patronage, and Inertia : 경제, 후원, 관성(유지보수 면)
- 기술적 메리트보다 성공에 더 영향을 미치는 요인
- 스폰서가 좋음(회사에서 만든 언어들)
- 시간이 지나도 유지보수면이 좋은 언어들
- No one factor detemines whether a language is "good"
- 프로그래머와 언어 구현자의 관점에서 생각해볼 필요가 있음
- 실행속도에 대한 소망은 두 관점 모두 빨라지기를 원함
- 하지만 가성비(프로그래머 관점), 퀄리티(언어 구현자 관점) 사이에서는 의견차이가 있음
2. The Programming Language Spectrum
: 많은 종류의 언어들은 computation방법에 따라 분류됨
The top-level division of programming languages
- Declarative(선언적)
- 컴퓨터가 무엇을 하는지에 포커스
- 속성이 선언되어 있음, 단 실행순서가 구체적으로 지정되어있지 않음
- 비교적 higher level로, 사용자 입장의 언어
subfamilies |
programming languages |
functional |
Lisp/Scheme, ML, Haskell … |
dataflow |
Id, Va1 |
logic or constrained-based |
Prolog, spreadsheets, SQL… |
- Imperative(절차적)
- 컴퓨터가 어떻게 해야하는지에 포커스
- 행동지향적
- sequence of actions의 관점으로 computation
- predominate, 이 방식이 더 빠르므로 대부분의 컴퓨터 시작에서는 이 방법을 채택
- Imperative(절차지향): the form of a verb that is usually used for giving orders
subfamilies |
programming languages |
von Neumann |
C, Ada, Fortran, Pascal, Basic… |
object-oriented |
Smalltalk, Eiffel, C++, Java |
scripting |
Perl, Python, PHP |
- Functional Language(함수적 언어)
- 함수의 recursive definition에 기반한 computational model 차용
- 1930년대에 개발된 lambda calculus에 기반
- Input/Output 이 있는 함수적 언어
- Iteration is often accomplished through recursion
- Lisp, ML,Haskell 등이 함수적 언어에 속함
- Dataflow languages
- 초기의 함수적 노드들 사이의 정보의 흐름으로 model computation
- Id, Val, LabView
- Logic or constraint-based language
- 특정 구체화된 관계를 나타내는 값을 찾으려는 시도로 model computation
- Prorlog
- von Neumann languages
- 매우 친숙하고 널리 유용되고 있는 언어
- Fortan, Pascal, Basic, C
- 폰 이만 언어들은 메모리의 값의 변화라는 side effect를 통해서 subsequent computation에 영향을 미치는 statement에 기반함
- side effect : 만약 값을 반환하는것 이외에 함수나 표현식의 선언이 수정될 경우 side effect를 일으킨다고 한다.
- Object-oriented language
- 폰 노이만 언어들과 긴밀히 연관되어 있음
- C++, JAVA, Smalltalk
- OO-functional languages: CLOS, OCaml
- Scripting Language
- 폰 노이만 언어의 부분집합에 해당하는 언어
- 몇몇 스크립트 언어들은 구체적인 목적으로 개발됨
- csh, bash : job control을 위한 input language
- awk : text manipulation
- PHP, JavaScript: intended for the generation of dynamic web content
- Lua is widely used to control computer games
- Python, Ruby, Tcl, Perl are more generic, rapid prototyping
GCD algorithm in different languages
: 각기 다른 언어들로 GCD(최대공약수)를 찾는 코드를 짜보자
Imperative language: 절차지향언어
int gcd(int a, int b){
while( a != b ){
if( a > b) a -= b;
else b -= a;
}
return a;
}
Functional language로 짜보기 : Input/Output 의 수학적 관계를 강조하여 코딩
// OCaml
let rec gcd a b =
if a = b then a
else if a > b then gcd b (a - b)
else gcd a (b - a)
Logic language로 짜보기
gcd(A,B,G) : - A = B, G = A. % Prolog
gcd(A,B,G) : - A > B, C is A-B, gcd(C,B,G).
gcd(A,B,G) : - B > A, C is B-A, gcd(C,A,G).
Language families사이의 구분은 명확하지 않음
- 폰노이만 언어와 객체지향 언어 사이의 구분은 확실치 않으며 또한 많은 스크립트 언어들은 또한 객체지향이기도 함
- 요즘의 많은 언어들이 서로의 장점을 차용하고 있기 때문에 확실히 구분되어 지지 않음
- 대부분의 함수형, 로직 언어들은 몇몇의 절차적인 특징을 가지고 있음
- 몇몇의 절차언어들은 함수 특징을 추가하기도 함
- 경계상에 있는 언어들이 많음
6. An Overview of Compilation
일련의 잘 정의된 단계를 통해 일반적인 컴파일 과정 진행 방식
- 앞의 부분에 있는 몇단계(up through semantic analysis)인 front-end 뒤의 몇단계 back-end로 구분된다
Phase of Interpretation
반응형
'Computer Science > 프로그래밍언어론' 카테고리의 다른 글
[Programming Language Pragmatics] 06 Control Flow(2) (2) | 2020.12.06 |
---|---|
[Programming Language Pragmatics] 06 Control Flow(1) (0) | 2020.10.25 |
[Programming Language Pragmatics] 03 Names, Scopes, and Bindings(3) (0) | 2020.10.23 |
[Programming Language Pragmatics] 03 Names, Scopes, and Bindings(2) (2) | 2020.09.18 |
[Programming Language Pragmatics] 03 Names, Scopes, and Bindings(1) (3) | 2020.09.11 |