1.0 Introduction
Programming in Old Days
- 초창기 컴퓨터는 monstrous devices(크고, 전력 많이 차지)
- Programmers were cheap
- 기계어로 프로그래밍 함 0, 1로 이루어진 코드
The next step was writing in assembly language
- 비트로 표현하는 것보다 가독성이 좋아짐
- mnemonic: add와 같이 기억하기 쉽도록 단어로 표현
- mnemoni ↔ machine language 1:1 매핑을 통해서 어셈블러가 해석함
- 어셈블러 (어셈블리 언어 → 기계어)에 따라 어셈블리 언어 달라짐
- CPU 달라짐 → 어셈블러 달라짐 (System-specific)
→ 기계어 사용보단 나아졌지만 이식성이 좋지 않음
High Level Language
- Fortan: machine-neutral programming languages에 대해 효율 높이기 위해 나옴
- Lisp, Algol 등장
- 컴파일러: 고급언어를 어셈블리어 or 기계어로 변환시켜줌
- 효율성(인건비 > 하드웨어)을 위해서 고급언어 사용하게 됨
1.1 The Art of Language Design
Why are there so many programming languages?
- Evolution(진화): 시간이 지날수록 쉽게, 잘 할수 있는 방법을 찾길 원함
- 어셈블리 → goto-based control flow(Fortan, Cobol, Basic)
- structured(구조화 프로그래밍) → goto 보다는 반복문, case 사용
- Object Oriented Programming (Smalltalk, C++, Eiffel, Java, C#)
- 스크립트 언어: 빠른 개발에 사용하기 쉬운, 컴파일 언어 대신
- Special Purpose: 특별한 목적
- Lisp dialects: Symbolic data & complex data
- Icon and Awk: character 조작
- C-low-level: low 레벨 → 포인터, 하드웨어 건드리기 쉬움
- Prolog: 데이터 간의 논리적인 관계
- Personal Preference: 개인 기호
- Recursion or Iteration
- 포인터 유무
What makes a language successful?
- Expressive Power: 표현력
- Ease of use for the novice: 초보자를 위한 언어
- Ease of Implementation: 구현의 용이성
- Basic, Forth, Squeak, pascal
- Standardization: 표준화
- 플랫폼에 대해서 호환성
- 표준 pascal, ANSI C
- Open Source
- 쉽게 접근 가능
- 대부분 프로그래밍 언어는 최소 한개의 컴파일러 or 인터프리터 오픈 소스 가짐
- C ←UNIX
- Excellent Compilers
- Fortran(계산) and Common Lisp → 속도 올라감
- Economics, Patronage and Inertia: 경제성, 지원, 관성
- 기술적으로 좋은 것보다 성공에 영향을 미치는 요소
- powerful sponsor
- 어쩔 수 없이 사용해야 함 (cobol)
- No one factor determines whether a language is "good"
- 프로그래머 ↔ 언어 구현 관점 모두 생각해야함
1.2 The Programming Language Spectrum
The top-level division of programming languages
Declarative
- 무엇을 하는지
- 실행 순서가 구체적으로 명시 되어 있지 않음
- Functional Language
- 재귀 호출에 기초를 둠
- 입력이 있으면 출력이 있어야 함 → 또 다른 함수에 전달
- List, ML, Haskell
- 람다
- 반복, 변수 개념 없음
- Dataflow Language
- Logic or constraint-based language
Imperative: 절차적
- von Neuman
- input → func → output
- 상태 변경으로 다른 값을 출력할 수 있음 (side effect)
- Object-oriented language
- Scripting
- 폰 노이만 언어의 부분 집합
- 컴포넌트를 묶어서 좀 더 간단하게 만들어줌
- 특정 목적을 가지고 개발됨
- python, perl, ruby
GCD algorithms
- Functional 언어 → if 문 자체도 지원 안할수도 (재귀 사용)