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 등)