Programming Languages & Compilers
추상화의 도구인 프로그래밍 언어의 설계 원리와 이를 기계어로 변환하는 컴파일러의 내부 메커니즘을 정의하는 학습 노드입니다.
sys.entry
M
Me
hyunyoun's Blog
posts7 min read
1. Overview
프로그래밍 언어와 컴파일러(Programming Languages & Compilers, PLC)는 인간의 논리적 사고를 컴퓨터가 물리적으로 실행 가능한 명령어로 정밀하게 변환하는 추상화 및 번역 계층을 다룹니다. 본 카테고리는 단순한 문법 사용법을 넘어, 언어의 구조적 명세(Syntax/Semantics), 타입 시스템의 안정성, 그리고 중간 코드 생성 및 저수준 최적화를 통한 실행 효율성 극대화를 탐구합니다.
CS2023의 Foundational Programming Languages (FPL) 및 Programming Languages and Compilers (PLC) 지식 영역을 근간으로 삼아, 명령형, 객체 지향, 함수형 패러다임의 설계 원칙과 소스 코드가 바이너리로 변하는 전 과정을 체계적으로 다룹니다.
2. Scope & Boundaries
In-Scope
- 언어 설계 및 패러다임: 프로그래밍 모델(Imperative, Functional, Logic), 데이터 가변성 제어, 스코프(Scope) 및 바인딩(Binding) 원칙.
- 컴파일러 프론트엔드: 어휘 분석(Lexing), 구문 분석(Parsing), 추상 구문 트리(AST) 구성 및 정적 의미 분석.
- 중간 코드 및 최적화: 중간 표현(IR: SSA form), 제어 흐름 분석(CFG), 데이터 흐름 분석 및 무효 코드 제거(DCE).
- 런타임 및 가상 머신: 가비지 컬렉션(GC) 전략, JIT(Just-In-Time) 컴파일, 런타임 타입 정보(RTTI) 및 메타프로그래밍.
Out-of-Scope
- 특정 SDK 라이브러리 튜토리얼: Java Spring이나 Python Django와 같은 상위 프레임워크 사용법.
- 소프트웨어 개발 프로세스: 애자일, 테스트 주도 개발(TDD) 등의 방법론 (09. SEDO 노드로 위임).
- 운영체제 시스템 호출 구현: 커널 내부의 스케줄링 메커니즘 구현 상세 (03. OSSM 노드로 위임).
Boundaries
- PLC는 **'코드를 기계어로 번역하는 도구와 의미론'**에 집중하며, 이 도구를 사용하여 실제 비즈니스 가치를 창출하는 제품 공정은 소프트웨어 엔지니어링 도메인에서 다룹니다.
3. Counterexample
- 단순 문법 예약어 암기: 'if', 'while' 등의 키워드를 외우는 것은 PLC 학습이 아닙니다. 왜 해당 언어가 **정적 스코프(Static Scope)**를 택했는지, 혹은 **힙 할당 방지(Escape Analysis)**를 통해 어떤 오버헤드를 줄이는지 분석하는 것이 핵심입니다.
- 표준 라이브러리 인터페이스만 사용: 가비지 컬렉션(GC)의 수거 방식(Mark-and-Sweep vs Copying)을 이해하지 못한 채 객체를 대량 생성하는 것은 런타임 시스템 이해도가 결여된 'API 소비자'일 뿐입니다.
4. Prerequisites
- 수학과 컴퓨팅 논리 (Basic): 정규 표현식, 오토마타(DFA/NFA), 문맥 자유 문법(CFG)은 컴파일러 분석의 수리적 기초입니다. (P1
) - 컴퓨터 구조 (Recommended): 레지스터 할당 전략과 함수 호출 시의 명령어 스택 구조를 이해해야 물리적 코드 생성이 가능합니다. (P1
) - 자료구조 (Practical): 심볼 테이블 및 구문 트리 구축을 위해 트리(Tree)와 해시(Hash) 자료구조에 대한 심화 숙련도가 필요합니다. (P1
)
5. Learning Map
- Linguistics & Types: 언어의 정적 구조(Syntax)와 값의 범주(Type)를 정의하는 수리적 모델을 배웁니다. (P1
/FPL-SE) - Compiler Logic: 소스 코드를 중간 표현(IR)으로 변환하고 최적화하는 물리 파이프라인을 구축합니다. (P1
/PLC-ST) - Runtime Mechanics: 가비지 컬렉션(GC)과 JIT 컴파일을 통해 코드 실행의 물리적 효율을 극대화합니다. (Industry
/V8) - Platform Dynamics: 언어별 생태계와 패키징, 정적 분석 도구가 작동하는 응용 메커니즘을 완성합니다. (SWEBOK v4
)
6. Learning Topics
Basic
Core Topic 01: 프로그래밍 패러다임과 설계 원칙 (Paradigms & Design)
- Why to Learn: 문제의 성격(상태 중심 vs 데이터 흐름 중심)에 따라 가장 효율적인 언어와 설계 모델을 선택하기 위함입니다.
- What to Learn:
- Concepts: 명령형(Imperative), 함수형(Functional: Immutability, HOF), 객체 지향(OOP: Encapsulation, Polymorphism), 선언형.
- Skills: 동일 로직을 패러다임별로 변환하여 설계적 이점 비교하기, 스코프 규칙 분석.
- Tools: Paradigm-specific Linters, REPL.
- Trade-offs: 추상화 수준의 증대 vs 런타임 성능 및 복잡도 증가.
- How to Learn:
- 1단계: 간단한 리스트 필터링 기능을 절차적으로 작성한 뒤, 함수형 고차 함수(
filter,map)로 리팩토링합니다. - 2단계: '클로저(Closure)'가 발생하는 조건과 메모리 바인딩 관계를 추적합니다.
- 1단계: 간단한 리스트 필터링 기능을 절차적으로 작성한 뒤, 함수형 고차 함수(
- Implement: 특정 도메인(예: 병렬 데이터 처리)에 적합한 언어 패러다임 선택 가이드라인.
Recommended
Core Topic 02: 타입 시스템과 정적 분석 (Type Systems & Analysis)
- Why to Learn: 실행 전(Compile-time)에 오류의 90%를 식별하여 시스템의 최종 신뢰성을 보장하고 유지보수 비용을 절감하기 위함입니다.
- What to Learn:
- Concepts: Static vs Dynamic Typing, Strong vs Weak, 타입 추론(Type Inference), 제네릭(Generics), 공변성(Covariance).
- Skills: 정합성이 완벽한 도메인 타입 정의, 타입 가드(Type Guards) 설계.
- Tools: TypeScript, Rust Compiler, MyPy (Python static analysis).
- Trade-offs: 개발 속도(Dynamic) vs 실행 안전성 및 도구 지원(Static).
- How to Learn:
- 1단계: TypeScript의 인터페이스와 유니온 타입을 이용해 복잡한 비즈니스 엔티티를 명세화합니다.
- 2단계: 정적 분석 도구를 사용하여 잠재적 null 참조나 타입 불일치를 사전에 검출합니다.
- Implement: 엄밀한 타입 정의가 적용된 모듈 API 명세서.
Practical
Core Topic 03: AST 및 컴파일러 프론트엔드 (AST & Frontend)
- Why to Learn: 린터(Linter), 코드 포매터, 정적 분석기 또는 도메인 특화 언어(DSL)를 직접 제작할 수 있는 능력을 갖추기 위함입니다.
- What to Learn:
- Concepts: 어휘 분석(Scanning), 구문 분석(Parsing: LL/LR), 추상 구문 트리(AST), 심볼 테이블(Symbol Table).
- Skills: 정규식을 이용한 토큰화, 재귀 하강 파서(Recursive Descent Parser) 구현.
- Tools: ANTLR, Lex/Yacc, Babel AST explorer.
- Trade-offs: 파싱의 엄밀함과 대규모 소스 코드 처리 속도 간의 균형.
- How to Learn:
- 1단계: 간단한 사칙연산 수식을 토큰으로 분해하고 트리 형태로 시각화해 봅니다.
- 2단계: Visitor 패턴을 사용하여 AST를 순회하며 코드를 다른 형태로 변환(Transpiling)하는 실습을 합니다.
- Implement: 특정 코딩 컨벤션을 검사하거나 코드를 자동 수정하는 커스텀 정적 분석기 도구.
Advanced
Core Topic 04: 런타임 시스템과 메모리 관리 (Runtime & Memory)
- Why to Learn: 가비지 컬렉션(GC)으로 인한 Stop-the-world 지연을 제어하고, 고성능 가상 머신 최적화 기법을 실무에 적용하기 위함입니다.
- What to Learn:
- Concepts: GC 알고리즘(Mark-and-Sweep, Copying), 세대별 수집(Generational GC), JIT 컴파일, 인라인 확장(Inlining).
- Skills: 런타임 메모리 단편화 분석, 힙 덤프(Heap Dump)를 통한 누수 지점 식별.
- Tools: JVM Flags, Chrome V8 Inspector (Memory/Performance profile).
- Trade-offs: 메모리 사용량 최소화 vs GC 발생 빈도 및 시스템 응답성 지연.
- How to Learn:
- 1단계: 대량의 객체를 생성/삭제하는 부하 시뮬레이션을 통해 GC 발생 주기를 시각적으로 확인합니다.
- 2단계: JIT 컴파일러가 빈번하게 호출되는 함수('Hot Spot')를 어떻게 감지하고 코드화하는지 로그를 통해 추적합니다.
- Implement: 목표 지연 시간(99th percentile) 달성을 위한 런타임 메모리 튜닝 보고서.
7. Terminology
8. References
Primary References
- [P1] CS2023: FPL — Foundational Programming Languages.
- [P1] CS2023: PLC — Programming Languages and Compilers.
- [P2] SWEBOK v4: Software Construction.
Secondary References
- [Dragon Book] Compilers: Principles, Techniques, and Tools — Aho, Lam, Sethi, Ullman (컴파일러학의 고전).
- [Types and Programming Languages] Benjamin C. Pierce — 타입 이론과 언어 설계의 필독서.
Industry References
- [LLVM Project] Conceptual Guide — 현대 산업계의 컴파일러 제작 표준 인프라.
- [V8 Engine Documentation] Design Elements — JavaScript 실행 효율을 극대화한 구글의 가상머신 설계.
9. Final Checklist
Primary Checklist
- 특정 프로그래밍 패러다임(OOP vs Functional)이 제공하는 추상화의 이점과 런타임 비용을 근거 있게 설명할 수 있는 있는가? (P1-FPL)
- Lexing에서 Code Generation에 이르는 컴파일 전 과정을 단계별 산출물(Token, AST, IR)과 연계하여 기술 가능한가? (P1-PLC-LC)
Secondary Checklist
- 정적 타입 언어와 동적 타입 언어의 트레이드오프를 '타입 안전성'과 '유연성' 관점에서 평가했는가?
- 꼬리 재귀 최적화(Tail Call Optimization)가 실행 시 스택 메모리 점유에 마치는 영향을 원리적으로 이해하고 있는가?
Industry Checklist
- 런타임 프로파일링을 통해 가비지 컬렉터의 동작 방식을 파악하고 Stop-the-world 지연을 최소화하는 설계를 제안했는가?
- LLVM IR과 같은 현대적 컴파일러 인프라가 언어 설계 및 다중 아키텍처 지원 생산성을 어떻게 높이는지 이해하고 있는가?