콘텐츠로 바로가기

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

  1. Linguistics & Types: 언어의 정적 구조(Syntax)와 값의 범주(Type)를 정의하는 수리적 모델을 배웁니다. (P1/FPL-SE)
  2. Compiler Logic: 소스 코드를 중간 표현(IR)으로 변환하고 최적화하는 물리 파이프라인을 구축합니다. (P1/PLC-ST)
  3. Runtime Mechanics: 가비지 컬렉션(GC)과 JIT 컴파일을 통해 코드 실행의 물리적 효율을 극대화합니다. (Industry/V8)
  4. 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)'가 발생하는 조건과 메모리 바인딩 관계를 추적합니다.
  • Implement: 특정 도메인(예: 병렬 데이터 처리)에 적합한 언어 패러다임 선택 가이드라인.

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

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
Abstract Syntax Tree (AST) 소스 코드의 구문적 구조를 트리 형태로 추상화하여 상세 문법 요소를 제거한 모델입니다. 기본 추상화 Parsing Parser, Token 실제 파일의 텍스트 원본과 혼동 Primary core
Type Safety, 타입 안전성 프로그램의 연산이 허용된 데이터 타입의 범위를 넘지 않음을 수리적으로 보증하는 성질입니다. 권장 신뢰성 Static Analysis vs. Duck Typing 단순히 컴파일 오류가 없는 상태와 동일시함 Primary core
Intermediate Repr. (IR) 소스 코드와 기계어 사이의 중간 단계 표현으로, 아키텍처 독립적인 최적화에 사용됩니다. 실무 분석/번역 LLVM IR vs. Bytecode 최종 기계어 바이너리와 동일하게 취급 Primary core
JIT Compilation (JIT) 프로그램을 실행하는 순간에 필요한 부분을 즉석에서 기계어로 번역하여 속도를 높이는 방식입니다. 심화 성능 JVM, V8 vs. AOT 단순 인터프리터 방식과 원리를 혼동 Industry core

8. References

Primary References

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과 같은 현대적 컴파일러 인프라가 언어 설계 및 다중 아키텍처 지원 생산성을 어떻게 높이는지 이해하고 있는가?