Language Design Issues
프로그래밍 언어의 역할?
: 사람, 기계와의 의사소통!
- 컴퓨터가 알아들을 수 있게 | Man-Machine Interface
- 다른 사람이 알아들을 수 있게 | Man-Man Interface
프로그래밍은 "쓰기"가 강조되는 분야.
하지만 "읽기"도 무시해서는 안 됨! -> 가독성이 중요함
프로그래밍 언어를 학습하는 이유?
- 효과적인 알고리즘 개발을 위한 능력 향상
- 프로그래밍 언어를 더 잘 이해하여 효과적으로 사용
- 유용한 프로그래밍 언어의 기능 사용법을 익히기 위해
- Class
- Co-routine
- ...
- 상황에 맞는 언어를 선택하기 위해
- 새로운 언어를 쉽게 배우기 위해
- 프로그래밍 언어들 간에는 많은 유사성이 있음
- 새로운 언어를 학습하는 시간을 절약할 수 있음!
아는 만큼 보인다. 아는 만큼 쓸 수 있다
프로그래밍 언어의 분류
- 문제 영역에 따른 분류
- 사무
- 과학 계산
- 인공지능
- ...
- 패러다임에 따른 분류
- 절차지향
- 함수형
- 객체지향
- 계산 모델에 따른 분류
- 명령형 - 폰 노이만 컴퓨터 구조 기반
- 함수형 - 순환 함수 이론 기반
- 논리형 - 연역적 논리 기반
프로그래밍 언어의 변천사
- 초창기: 컴퓨터 가격 >>>> 프로그래밍 비용
- 프로그램의 수행 효율이 굉장히 중요했음!
- 현대: 컴퓨터 가격 << 프로그래밍 비용
- 클래스, 상속, 캡슐화, 예외 처리 등 고급 개념들이 프로그래밍 언어에 도입됨
- 고성능의 컴파일러가 효율적인 기계어 번역을 도와줌
- 1950년대: 일괄 처리 환경 (Batch)
- 고가의 메인프레임, 한 번에 하나의 프로세스만 처리 가능
- FORTRAN, ALGOL, LISP
- 1960년대: 시분할 환경 (Time Sharing)
- 메인프레임에
여러 대의 터미널
이 붙음. 멀티프로세싱 - COBOL, BASIC
- 메인프레임에
- 1970~: 마이크로 컴퓨터의 등장 및 보급 (Personal Computer)
- Pascal, C, Smalltalk
좋은 언어의 조건?
: 베스트셀러 != 좋은 책, 성공한 언어 != 좋은 언어
- 명료성 (Clarity), 간결성 (Simplicity), 일관성 (Unity)
- 간단하고 명확해야 배우기 쉽다!
- 다양한 응용 분야를 지원 (via Language Features)
- 필요한 것을 바로 지원하거나, 없으면 직접 만들 수 있도록
- 직교성 (Orthogonality)
- 여러 기능들을
예외 없이
임의로 조합할 수 있는가? - 즉, 기능들의 독립성이 보장되어 있는가?
- 함수형 언어는
함수에 관한 한
직교성을 지원함
- 여러 기능들을
- + 추상화 지원, 테스트 용이성, 이식성, 언어의 비용 등등
프로그래밍 언어의 비용?
- 프로그램 작성 비용 (Cost of Program Creation)
- 프로그램 번역 비용 (Cost of Program Translation) - 기계어로의 번역
- 프로그램 수행 비용 (Cost of Program Execution)
- 프로그램 유지보수 비용 (Cost of Program Maintenance)
프로그래밍 언어의 패러다임
패러다임(Paradigm): 한 시대를 지배하는 개념, 총체적인 틀
프로그래밍 언어에서의 패러다임: A general model for Problem Solving
명령형, 절차지향 (Imperative / Procedural Languages)
- 계산 모델: 상태 전이 기계 (State Transition Machine)
- 초기 상태에 입력이 있고, 상태 전이를 거친 최종 상태에 출력이 존재함
- 특징: 상태를 변경하는
명령문
중심의 언어 - 예시: FORTRAN, COBOL, C
함수형 (Functional / Applicative Languages)
- 계산 모델: 입력값을 받아 출력값을 내는
함수
- (순수 함수형 언어는) 변수가 없고, 대입 연산도 없다
- 출력값은 입력값과 무관함
- 특징: 함수 합성(Function Composition)을 활용함
- 심지어는 자기 자신을 자신과 합성할 수도 있음 (재귀함수)
- 원하는 함수를 작성하는 것이 주된 프로그래밍 작업
- 예시: LISP, Scheme, Haskell, ML
객체지향 (Object-Oriented Languages)
- 계산 모델: 객체들 간의 상호작용
- 주로 명령형 패러다임의 언어 위에 구현됨
- 특징: 유일한 신원을 갖는 객체들로 프로그램을 구성함
- 클래스들은 IS-A 관계를 통해 계층 구조를 가질 수 있음
객체
는 클래스의실체(Instance)
- 객체는 속성(Property)과 동작(Behavior)을 가짐
- 속성은 데이터(data, imperative concepts)
- 동작은 메서드(method, applicative concepts)
- 예시: Smalltalk, C++, Java
구조화 프로그래밍
: goto 사용을 지양하고, 흐름을 따라가기 쉽도록 깔끔하게 짜 보자
- 배경: 막짠 코드(Spaghetti Code)는 이해하고 디버깅하기 어렵다
- 이론적 기반: Böhm-Jacopini theorem
순차
,선택
,반복
세 가지 구조로모든 프로그램
을 작성할 수 있다- 순차(Sequence): 한 작업 후에 다른 작업을 하는 것
- 선택(Selection): 조건에 따라 둘 중 하나를 선택해 실행하는 것
- 반복(Iteration): 조건을 만족하는 동안 같은 작업을 반복하는 것
언어 표준
: 표준과 구현은 1:1 대응이 아니다!!
- 언어 표준: 문서 (언어의 설계도)
- 언어 구현: 컴파일러, 인터프리터
- 표준화를 담당하는 기관들: ISO, IEEE, ANSI, ...
C99
처럼사실상 표준이나 마찬가지
인 것들도 존재de facto standard
국제화
: i18n
이라고도 함! (internationalization을 보면, i와 n 사이에 18개의 문자가 있음)
- 관련 주제들: 문자 세트(Unicode와 같은 charset), 날짜 표기, 통화 단위, 미터법, ...