콘텐츠로 이동

Swift 컴파일러 입문 7일 코스

Swift 컴파일러 위키를 처음부터 끝까지 한 번에 읽는 건 꽤 버겁다. 이 코스는 “문법을 아는 Swift 개발자”가 7일 동안 위키와 실제 소스 트리를 오가며 컴파일러 내부 구조에 익숙해지도록 만든 입문용 루트다.

이 코스의 전제

  • 하루 60~90분 정도를 가정한다.
  • 로컬에 클론한 Swift 저장소는 swift/ 기준으로 읽는다.
  • 아래 경로 표기는 모두 swift/... 기준이다.
  • 사용 중 toolchain 정보는 먼저 swiftc --version으로 확인한다.
  • 입문 탐색에 자주 쓰는 플래그:
  • -dump-parse
  • -dump-ast
  • -typecheck
  • -emit-silgen
  • -emit-sil
  • -emit-irgen
  • -emit-ir
  • -swift-version 6
  • -strict-concurrency=complete

Day 1 — 큰 그림과 Parser

목표: - Swift 소스가 어떤 단계를 거쳐 기계 코드로 가는지 큰 그림을 잡는다. - Parser가 “문법 구조를 만드는 단계”라는 감각을 익힌다.

읽을 페이지: - Swift 컴파일러 모노레포 개요 - Swift.org Documentation 허브 해설 - Swift Compiler 공개 개요 해설

실제 경로: - swift/docs - swift/lib/Parse/Parser.cpp - swift/lib/Parse/PersistentParserState.cpp

해볼 명령: - swiftc -dump-parse sample.swift

끝나면 이해해야 할 것: - Parser는 아직 타입을 “판단”하지 않고 구조를 만든다. - 이후 Sema/TypeChecker가 의미를 붙인다.

Day 2 — Type Checker와 Diagnostics

목표: - Swift 타입 체커가 제약 기반 시스템이라는 점을 이해한다. - 진단 메시지가 어디서, 어떤 원칙으로 나오는지 본다.

읽을 페이지: - 타입 체커 설계 및 구현 - 진단 시스템 (Diagnostics) - TypeChecker.md 해설 - Diagnostics 작성 가이드 해설

실제 경로: - swift/docs/TypeChecker.md - swift/lib/Sema/TypeChecker.cpp - swift/lib/Sema/CSGen.cpp - swift/lib/Sema/CSSolver.cpp - swift/lib/Sema/CSApply.cpp - swift/lib/Sema/CSDiagnostics.cpp

해볼 명령: - swiftc -dump-ast sample.swift - swiftc -typecheck sample.swift

끝나면 이해해야 할 것: - Swift 타입 추론은 bottom-up + top-down이 섞인 constraint solving 문제다. - 좋은 diagnostics는 타입 체커 구조와 분리해서 생각하기 어렵다.

Day 3 — Generics

목표: - Swift 제네릭이 단순 문법 설탕이 아니라 컴파일러 핵심 구조라는 점을 이해한다. - generic signature / substitution / conformance를 큰 축으로 잡는다.

읽을 페이지: - Compiling Swift Generics - Generic Signatures - Substitution Maps - Conformances - Compiling Swift Generics PDF 해설 - Generics Manifesto 해설

실제 경로: - swift/docs/Generics/README.md - swift/docs/Generics - swift/lib/AST/GenericSignature.cpp - swift/lib/AST/GenericEnvironment.cpp - swift/lib/AST/RequirementMachine/GenericSignatureQueries.cpp - swift/lib/AST/GenericParamList.cpp

끝나면 이해해야 할 것: - generic signature는 “문법 정보”가 아니라 의미적으로 정규화된 제약 집합이다. - substitution / conformance는 이후 SIL/IRGen까지 계속 따라간다.

Day 4 — SIL과 SILGen

목표: - AST 이후 왜 SIL이라는 별도 IR가 필요한지 이해한다. - raw SIL과 canonical SIL의 차이를 감으로 잡는다.

읽을 페이지: - SIL (Swift Intermediate Language) - SIL 타입 - SIL 인스트럭션 - SIL.md 해설

실제 경로: - swift/docs/SIL/SIL.md - swift/lib/SIL - swift/lib/SILGen/SILGen.cpp - swift/lib/SILGen/SILGenExpr.cpp - swift/lib/SILGen/SILGenApply.cpp - swift/lib/SILGen/SILGenConcurrency.cpp

해볼 명령: - swiftc -emit-silgen sample.swift - swiftc -emit-sil sample.swift

끝나면 이해해야 할 것: - SIL은 Swift 의미를 보존한 채 최적화/검증이 가능하도록 설계된 IR다. - SILGen은 단순 lowering이 아니라 Swift 언어 규칙을 IR로 번역하는 단계다.

Day 5 — Ownership와 Concurrency Safety

목표: - 값 이동, borrow, actor isolation, Sendable이 왜 한 묶음인지 이해한다. - Swift 6 concurrency migration이 컴파일러에서 실제로 무엇을 강제하는지 본다.

읽을 페이지: - Swift 6 데이터 경쟁 안전성 검사 - SIL 소유권 모델 (OSSA) - 소유권 매니페스토 - Value/Reference Types → SIL 소유권 교차 읽기 - Concurrency Data Race Safety → 컴파일러 검사 교차 읽기

실제 경로: - swift/docs/SIL/Ownership.md - swift/lib/Sema/TypeCheckConcurrency.cpp - swift/lib/AST/ActorIsolation.cpp - swift/lib/SIL/IR/ActorIsolation.cpp - swift/lib/SILGen/SILGenConcurrency.cpp - swift/lib/SILOptimizer/Mandatory/SendNonSendable.cpp - swift/lib/SILOptimizer/Mandatory/FlowIsolation.cpp - swift/lib/SILOptimizer/Utils/RegionIsolation.cpp

해볼 명령: - swiftc -swift-version 6 -typecheck sample.swift - swiftc -strict-concurrency=complete -typecheck sample.swift

끝나면 이해해야 할 것: - Swift 6의 concurrency safety는 “문법 기능”보다 “정적 안전성 검사 체계”에 가깝다. - ownership / isolation / sendability는 서로 떨어진 주제가 아니다.

Day 6 — Optimizer / Performance / Driver

목표: - 컴파일러가 왜 느려지는지, 어떤 단계가 병목이 되는지 구분하는 눈을 익힌다. - 드라이버가 왜 파일 하나만 독립 컴파일하기 어려운지 이해한다.

읽을 페이지: - Swift 옵티마이저 설계 - 컴파일러 성능 측정 - Swift 컴파일러 드라이버 - 의존성 분석 (증분 빌드) - SIL 옵티마이저 패스 카탈로그 - Compiler Performance 문서 해설 - Driver Internals 문서 해설

실제 경로: - swift/docs/CompilerPerformance.md - swift/docs/DriverInternals.md - swift/lib/SILOptimizer/PassManager/PassManager.cpp - swift/lib/SILOptimizer/Mandatory - swift/lib/Sema/CSOptimizer.cpp

끝나면 이해해야 할 것: - 성능 문제는 Parser/Sema/SIL/LLVM 중 어디가 느린지 분리해서 봐야 한다. - Swift driver는 모듈 전체 의미를 유지해야 해서 빌드 시스템과 강하게 얽힌다.

Day 7 — ABI / IRGen / Runtime

목표: - 언어 규칙이 결국 바이너리 레이아웃/메타데이터/호출 규약으로 굳는다는 감각을 잡는다. - IRGen과 runtime이 어디서 만나는지 본다.

읽을 페이지: - ABI 안정성 - ABI: 타입 레이아웃 - ABI: 타입 메타데이터 - ABI: 호출 규약 - Swift 런타임 - 라이브러리 진화 (Library Evolution) - ABI Stability Manifesto 해설

실제 경로: - swift/docs/ABIStabilityManifesto.md - swift/lib/IRGen/IRGenModule.cpp - swift/lib/IRGen/MetadataLayout.cpp - swift/lib/IRGen/MetadataRequest.cpp - swift/lib/Demangling/ManglingUtils.cpp - swift/stdlib/public/runtime/HeapObject.cpp - swift/stdlib/public/runtime/MetadataLookup.cpp - swift/stdlib/public/runtime/DynamicCast.cpp - swift/lib/Frontend/ModuleInterfaceLoader.cpp

해볼 명령: - swiftc -emit-irgen sample.swift - swiftc -emit-ir sample.swift

끝나면 이해해야 할 것: - ABI는 “나중에 배우는 디테일”이 아니라 언어 설계의 장기적 제약 조건이다. - IRGen과 runtime을 보면 Swift가 어디까지 정적이고 어디서부터 동적인지 감이 잡힌다.

7일이 끝난 뒤 추천 분기