Language Theory & Type Systems
언어의 문법 구조를 정의하는 구문론과 의미를 부여하는 의미론, 그리고 안전성을 담보하는 타입 이론의 기초를 다루는 학습 노드입니다.
sys.entry
M
Me
hyunyoun's Blog
posts6 min read
1. Overview
언어 설계 및 타입 시스템 기초(Language Design & Type Systems Foundations, LDT)는 인간의 의도를 컴퓨터가 이해할 수 있는 엄격한 규격으로 변환하는 설계 원칙을 다룹니다.
프로그래밍 언어는 단순히 코딩을 위한 도구가 아니라, 사고를 구조화하는 프레임워크입니다. 학습자는 어휘/구문 분석의 근간이 되는 정규 문법과 문맥 자유 문법(CFG)을 이해하고, 정적(Static) vs 동적(Dynamic) 타이핑의 설계적 차이와 타입 안전성(Type Safety)이 시스템 안정성에 미치는 물리적 영향을 학습합니다. 이를 통해 언어 제작자와 고급 개발자로서의 이론적 기틀을 마련합니다.
2. Scope & Boundaries
In-Scope
- Syntax & Grammar: 초름스키 계층(Chomsky hierarchy), BNF/EBNF 표현식, 추상 구문 트리(AST)
- Semantics Models: 실행 의미를 기술하는 연산 의미론(Operational), 표시 의미론(Denotational) 기초
- Type Theory Intro: 기본 타입 시스템, 타입 검사(Checking) vs 타입 추론(Inference) 이론
- Design Paradigms: 명령형, 선언형, 함수형, 객체지향 언어의 핵심 설계 철학 비교
Out-of-Scope
- 구체적인 컴파일러 구현 최적화 (05-02 Compiler Design 영역으로 위임)
- 특정 언어의 프레임워크/라이브러리 사용법 (14. Web 영역 등으로 위임)
Boundaries
- LDT vs. Algorithms: Algorithms는 '문제를 푸는 절차'에 집중하지만, LDT는 '그 절차를 기술하는 문법과 안전성 규칙'에 집중합니다.
3. Counterexample
- 단순히 "C언어는 정적 타입이다"라고 암기하는 것은 LDT 학습이 아닙니다. 왜 C언어의 타입 캐스팅이 하드웨어 레벨에서 위험한지, 그리고 강한 타입(Strongly typed) 언어가 런타임 오류를 컴파일 타임에 어떻게 물리적으로 잡아내는지 타입 바인딩 관점에서 설명할 수 있어야 합니다.
4. Prerequisites
- 이산 구조 및 모델링 (Recommended): 집합론, 논리 연산, 그래프 이론(AST 표현용)이 선행되면 좋습니다. (01. Discrete Structures)
- 디지털 논리 및 프로세서 물리 (Basic): 데이터의 비트 표현과 메모리 주소 개념을 알아야 합니다. (01. Digital Logic)
5. Learning Map
- Defining Structure: BNF를 통해 프로그래밍 언어의 뼈대(Syntax)를 정의하는 법을 익힙니다.
- Injecting Meaning: 작성된 코드가 실제 어떤 연산을 지칭하는지 의미(Semantics)를 연결합니다.
- Type Logic: 변수와 함수에 규칙을 부여하여 데이터 충돌을 막는 타입 시스템을 이해합니다.
- Paradigm Analysis: 문제 영역에 따른 최적의 언어 모델을 선택하는 안목을 기릅니다.
6. Learning Topics
Basic
Core: 구상 구문과 추상 구문 (Syntax & Grammar)
- Why to Learn: 소스 코드가 컴퓨터 내부에서 어떻게 트리 구조로 인식되는지 물리적 과정을 이해하기 위함입니다.
- What to Learn:
- 정규 표현식과 어휘 분석(Lexing)의 한계 인지
- 문맥 자유 문법(CFG)과 BNF를 이용한 프로그래밍 언어 기술
- 추상 구문 트리(AST)의 구조와 정보 보존 범위
- How to Learn:
- 간단한 사칙연산 계산기를 BNF로 설계하고 수기 파싱 수행
- 온라인 AST 시각화 도구를 사용하여 코드의 트리 형태 관측
- Implement: BNF 규격에 따라 수식이 유효한지 검사하는 기초 파서(Parser) 로직
Recommended
Core: 의미론과 바인딩 역학 (Semantics & Binding)
- Why to Learn: 코드가 실행될 때 변수의 이름과 값이 언제, 어떻게 연결되는지 파악하기 위해서입니다.
- What to Learn:
- 정적 바인딩(Static Binding) vs 동적 바인딩(Dynamic Binding) 물리 차이
- 유효 범위(Scope): 정적 스코프 vs 동적 스코프의 결정 시점
- 제어문(Control Flow)의 수리적 의미와 부수 효과(Side Effect)
- How to Learn:
- 함수 호출 시 환경(Environment) 레코드가 생성되고 사라지는 과정 도식화
- 클로저(Closure)가 스코프 체인을 유지하는 물리적 방식 실습
- Implement: 스코프 계층을 지원하는 단순 이름 관리기(Symbol Table)
Practical
Core: 타입 시스템과 안전성 (Type Systems)
- Why to Learn: 프로그램 실행 전 논리적 오류를 차단하여 시스템의 고신뢰성을 확보하기 위함입니다.
- What to Learn:
- 타입 검사기(Type Checker)의 동작 원리와 다형성(Polymorphism) 기초
- 정적 타이핑의 컴파일 오버헤드 vs 동적 타이핑의 런타임 유연성 비중
- 타입 안전성(Type Safety)의 정의와 프로그레스/프리저베이션 개념 입문
- How to Learn:
- TypeScript와 JavaScript의 타입 체크 시점 차이 벤치마킹
- 힌들리-밀너(Hindley-Milner) 타입 추론 알고리즘의 작동 원리 연구
- Implement: 변수 간의 타입 일치 여부를 판별하는 기초 유니피케이션(Unification) 로직
Advanced
Core: 메타 프로그래밍과 언어 확장 (Advanced PL Design)
- Why to Learn: 도메인 특화 언어(DSL)를 직접 설계하거나 언어 자체를 확장하기 위해서입니다.
- What to Learn:
- 매크로(Macros) 시스템과 코드 생성(Code Generation) 물리
- 리플렉션(Reflection) 및 타임 메타데이터 활용의 득실
- 의존 타입(Dependent Types) 및 고수준 추상화 물리
- How to Learn:
- Lisp 계열 언어에서 코드가 데이터로 취급되는(Homoscadasticity) 특성 연구
- 런타임에 코드를 동적으로 컴파일하고 실행하는 성능 비용 분석
- Implement: 특정 도메인을 위한 단순 인터프리터(Interpretation) 핵심 루프
7. Terminology
8. References
Primary
- [P1] CS2023 - PL/Foundations & Design — Language theory and structure.
- [P2] SWEBOK - Computing Foundations — Programming language selection and theory.
Secondary
- [Concepts of Programming Languages] Robert W. Sebesta — Comprehensive design focus.
- [Types and Programming Languages (TAPL)] Benjamin C. Pierce — The type theory Bible.
Industry
- [TypeScript Deep Dive] — Practical type system implementation in JS.
- [ECMAScript Specification] — Real-world semantics and grammar standard.
9. Final Checklist
Primary
- 정적 타입 언어와 동적 타입 언어의 차이를 '메모리 할당 시점'과 '오류 감지 시점' 관점에서 설명 가능한가? (P1)
- 간단한 수식(예: )에 대한 AST 구조를 명확히 그려낼 수 있는가? (P1)
Secondary
- 정적 스코프(Static Scope) 환경에서 자유 변수(Free Variable)의 값이 어떻게 물리적으로 검색되는지 이해하는가?
- 타입 추론(Type Inference)이 개발자의 편의성과 컴파일러의 엄격함 사이에서 어떤 역할을 하는지 인지하는가?
Industry
- 실무 코딩 중 만나는
Type Mismatch에러를 언어 명세(Specification) 관점에서 분석하고 해결 가능한가? (SFIA) - 대규모 프로젝트에서 강한 타입 시스템을 적용했을 때의 유지보수 비용 절감 효과를 정량적으로 논할 수 있는가?