Why Should We Learn Programming Languages?
- 표현력 증대: 다양한 언어를 알면 아이디어를 더 풍부하게 표현할 수 있음
- 언어 선택 능력 향상: 문제에 따라 적절한 언어를 선택할 수 있음 (AI → Python, 수치해석 → Matlab)
- 새로운 언어 학습 용이: 하나의 PL을 잘 알면 다른 언어도 쉽게 배울 수 있음 (공통 개념이 많음)
- 구현의 의미 파악: 언어 설계 이유, 내부 동작을 이해하게 됨
- 이미 아는 언어의 활용 극대화: 함수형 스타일 등 다양한 패러다임 활용 가능
- 컴퓨팅 전체 수준 향상: 새로운 언어 개발 및 발전에도 기여
Programming Domains
- Scientific Applications: 수치 계산, 배열 중심 → Fortran, ALGOL
- Business Applications: 보고서 생성, 십진수 정확성 → COBOL
- Artificial Intelligence: 심볼 기반 연산, 리스트 처리 → LISP, Prolog, Python
- Systems Programming: OS나 툴 작성, 저수준 접근 필요 → C, C++
- Web Software: 마크업 + 스크립트 언어 → HTML, JS, PHP
Language Evaluation Criteria
좋은 언어를 평가하는 기준
- Readability (가독성):
- 단순성, 일관성(Orthogonality), 자료형, 문법 디자인, 의미와 형태의 일치
- Writability (작성 용이성):
- 추상화 지원, 표현력, 단순한 프리미티브로 구성 가능
- Reliability (신뢰성):
- 타입 검사, 예외 처리, 제한된 aliasing, 가독성과 작성성도 영향을 줌
- Cost (비용):
- 학습, 작성, 컴파일, 실행, 구현 비용, 유지보수 비용 등
- 기타: 이식성, 범용성, 정의 명확성
Other Factors for PL Design
- 컴퓨터 아키텍처: von Neumann 구조 → 명령어 기반 구조 (변수, 대입 사용)
- 프로그래밍 방법론 발전:
- 순차적 → 구조적 → 추상 데이터 타입 기반 → 객체지향 (캡슐화, 상속, 동적 바인딩)
Language Categories
- Imperative: 상태 변화 중심 (C)
- Functional: 순수 함수 중심, 부작용 없음 (LISP)
- Logic: 사실과 규칙의 집합, 순서 없음 (Prolog)
- Object-Oriented: 데이터+기능 통합, 캡슐화/상속 (Java, C++)
Language Design Trade-Offs
- 가독성 vs 실행 효율
- 예: Java (배열 범위 검사 있음 → 느림), C (검사 없음 → 빠름)
- 작성 용이성 vs 신뢰성
- 예: 포인터는 작성은 쉬우나 버그 유발 가능성 높음
Implementation Methods
- Compilation: 코드 → 기계어 (C)
- Pure Interpretation: 코드 해석하며 실행 (Python)
- Hybrid: 중간코드 + 실행 (Java - bytecode)
- Preprocessor: 전처리 단계 처리 (#define 등)