CS 6120: 고급 컴파일러 자기주도 온라인 강좌
(cs.cornell.edu)- Cornell CS의 박사 수준 과목 CS 6120을 온라인에서 따라갈 수 있도록 강의 영상, 노트, 논문 읽기, 구현 과제를 묶은 자기주도 커리큘럼임
- 중간 표현, 데이터 흐름, 고전적 최적화 같은 컴파일러 핵심 주제부터 병렬화, JIT 컴파일, 가비지 컬렉션까지 다룸
- 실습은 LLVM과 교육용 IR Bril을 사용하며, 추상 개념을 직접 구현해 보는 오픈소스 해킹 과제로 이어짐
- 자기주도 버전은 마감 기한을 무시할 수 있지만, 실제 수업의 Zulip 토론과 학기말 프로젝트에는 참여할 수 없음
- 자료는 GitHub에 오픈소스로 공개되어 있어 문제를 제보할 수 있고, 수료 후에는 피드백 폼을 작성할 수 있음
수강 방식과 다루는 범위
- CS 6120은 Cornell CS의 Adrian Sampson이 만든 프로그래밍 언어 구현 과목임
- 강좌 범위는 컴파일러 구현의 공통 기반과 연구 지향 주제를 함께 포함함
- 중간 표현
- 데이터 흐름
- “고전적” 최적화
- 병렬화
- JIT 컴파일
- 가비지 컬렉션
- 학습은 논문 읽기와 오픈소스 해킹 과제로 진행됨
- 자기주도 커리큘럼은 “상상 속 대학”에서 4학점짜리 미채점 과목을 듣는 형식으로 정리되어 있음
- 강의는 선형 순서로 배열됨
- 각 레슨에는 영상과 글 노트가 있음
- 일부 레슨에는 구현 과제가 포함됨
- 영상 시청과 논문 읽기를 섞어 진행하도록 권장 순서가 잡혀 있음
실제 수업과 다른 점
- 자기주도 수강자는 과제 마감 기한을 무시할 수 있음
- 실제 수업의 Zulip 토론에는 참여할 수 없음
- 실제 CS 6120에는 학기말 프로젝트가 있음
- 자기주도 버전의 학기말 과제는 “컴파일러의 마법으로 세상을 바꾸는 것”임
- 강의 제작 품질은 특히 초기 레슨에서 낮을 수 있음
- CS 6120 자료는 GitHub에 오픈소스로 공개되어 있으며, 문제를 발견하면 버그를 제보할 수 있음
- 수료 후에는 피드백 폼을 작성할 수 있음
레슨과 읽기 자료
- Lesson 1: Welcome & Overview
- Lesson 2: Representing Programs
- Lesson 3: Local Analysis & Optimization
- Lesson 4: Data Flow
- Lesson 5: Global Analysis
- Lesson 6: Static Single Assignment
- Lesson 7: LLVM
- Lesson 8: Loop Optimization
- Lesson 9: Interprocedural Analysis
- Lesson 10: Alias Analysis
- video
- A Unified Theory of Garbage Collection, OOPSLA 2004
- Fast Conservative Garbage Collection, OOPSLA 2014
- Lesson 11: Memory Management
- Lesson 12: Dynamic Compilers
- Lesson 13: Program Synthesis
- Lesson 14: Concurrency & Parallelism
댓글과 토론
Hacker News 의견들
-
학부를 마치며 첫 정규직을 찾을 때, 이 강의 덕분에 MANGA(Meta, Apple, NVIDIA, Google, Amazon)의 컴파일러 엔지니어링 팀 면접을 통과할 수 있었음
University of Waterloo의 저수준 컴퓨팅 시스템 커리큘럼도 훌륭했고 오픈소스 컴파일러 프로젝트에도 기여하고 있었지만, 면접에서 가장 어려운 질문들에 답하는 데는 이 강의가 정말 큰 도움이 됐음- “par excellent”가 아니라 par excellence이고, 그 문장 구조에서도 어색함
더 자연스럽게 쓰려면 “my university has the low level computing systems curriculum par excellence” 정도가 나았을 것 같음
- “par excellent”가 아니라 par excellence이고, 그 문장 구조에서도 어색함
-
컴파일러를 작성하기 전에는 컴퓨터 구조를 이해하고, 가장 효율적인 기계어 코드를 만들려면 컴파일러가 무엇을 생성해야 하는지 아는 게 먼저라고 봄
하지만 경험상 학교와 대학은 컴퓨터 구조, 심지어 시스템 프로그래밍까지 점점 우선순위에서 밀어내는 듯하고, 아마 너무 기술적이라고 보기 때문인 것 같음
그래도 그 지식은 업계에서 좋은 일자리를 얻는 데 매우 중요함- 대학들이 시스템 프로그래밍의 우선순위를 낮추고 있다는 말은 맞지만, 이유는 “너무 기술적이라서”가 아님
대학과 일하면서 느낀 근본 문제는 제한된 수업 시간 안에 다뤄야 할 잠재적 내용이 너무 많다는 것임
우리 분야에서 알아야 할 정보량은 시간이 갈수록 기하급수적으로 늘고 이미 한계를 넘었기 때문에, 일반 트랙에서 시스템 프로그래밍 수업 시간이 줄어드는 건 매년 더 많은 학생에게 관련성이 낮아지기 때문이고 합리적임 - 업계에서 말하는 좋은 일자리가 무엇이고, 왜 그렇게 보는지 더 설명해줄 수 있음?
- 이런 수준의 저수준 세부사항 없이도 컴파일러를 사용할 수 있게 된 것이 업계의 큰 발전 중 하나라고 봄
컴파일러 수준에서 해야 할 일은 여전히 많지만, 그중 상당수는 컴퓨터의 마이크로아키텍처 수준까지 신경 쓸 필요가 없어야 함 - GPU 관련 작업은 여전히 컴퓨터 구조와 컴파일러 역량을 많이 요구함
x86이나 MIPS를 공부할 필요는 없더라도, CUDA는 그것들보다 더 이상한 구조를 보여줌 - 경험상 아무도 저수준 세부사항을 “너무 기술적”이라고 보는 것 같지는 않음
저수준 내용을 강조하지 않는 보통의 이유는 구현별로 달라지고, 금방 낡으며, 일반화하기 어렵기 때문임
덧붙이면 “시스템 프로그래머” 유형과 잘 맞지 않는 편인데, 이런 극도로 구체적인 잡지식을 자기 직업적 정체성 전체로 삼는 경향이 있어서 어셈블리는 쓸 수 있지만 펑터가 뭔지는 모르는 사람도 생김
- 대학들이 시스템 프로그래밍의 우선순위를 낮추고 있다는 말은 맞지만, 이유는 “너무 기술적이라서”가 아님
-
고급 컴파일러 최적화를 깊게 다루는 좋은 학술 자료가 없는 것 같음
많이 찾아봤지만 대부분의 강의가 입문 수준이고, 실제로 흥미로운 기법은 인기 있는 오픈소스 컴파일러의 소스 코드로 깊이 들어가야 해서 꽤 놀랐음- 대부분의 학술 강의는 파싱에 과하게 맞춰져 있고, 나머지는 표면적으로만 가르치는 것처럼 보임
-
컴파일러는 약 30년 동안 크게 발전하지 않은 분야 중 하나라고 봄
2004~2006년에 Perugia University에서 강의를 했을 때도 15~25년 된 자료를 별문제 없이 쓸 수 있었음
최근에는 상황이 바뀐 것 같음- 그건 사실이 아님
2004~2006년에 새 내용으로 가르칠 수 있었지만 아마 다루지 않았을 것들만 봐도 SSA 구성, SLP 벡터화, 자동 피프홀 초최적화가 있고, 이것들은 즉석에서 떠올린 것뿐임
변하지 않은 건 컴파일러 교재들임. 파서 생성기를 만드는 법에 지나치게 집중하고 실제로 컴파일러를 어떻게 설계하는지, 현대 컴퓨터 구조 설계는 말할 것도 없이 거의 다루지 않음. 이 불만은 수십 년 전부터 있었음 - 동의하지 않음
지난 10년 동안 지형은 증분 컴파일 기법 쪽으로 크게 진화했음
이론적 발전은 주로 파서에 갇혀 있지만, 실제 구현은 전체 파이프라인에 걸쳐 전역 프로그램 최적화와 코드 생성까지 적용됨 - 그 이후로 컴파일러 테스트는 상당히 바뀌었고, 대량 무작위 테스트가 유행하게 됨
- 컴파일러 설계나 구현에 정통하진 않지만, 컴파일러의 대상인 기계어와 어셈블리는 시간이 지나며 크게 변한 것 같음
새 프로세서 세대마다 명령어와 옵션이 늘어나면서 컴파일러가 활용할 수 있는 새로운 최적화나 조합이 생기는 듯함 - 아마 대부분의 프로그래밍 언어가 명령형, 반복문, 광범위한 부작용 같은 면에서 크게 변하지 않았기 때문일 것임
순수 함수형 언어용 컴파일러를 작성하려면 확실히 새로운 자료가 필요할 것임
- 그건 사실이 아님
-
이런 강의가 있어서 기쁨
이제 고급 주제를 안내받으며 내 속도로 따라갈 수 있음
늘 컴파일러 엔지니어 커리어를 원했지만, 내가 사는 곳은 교육과 일자리 기회가 많지 않음
미국을 보면 채용 시장 경쟁이 압도적으로 치열하고, 솔직히 어떻게 진입해야 할지 모르겠음
가진 경험은 학부 때 들은 강의 하나뿐인데, 그 과정은 정말 전부 좋았음- 이 분야는 많은 사람이 넘지 못하는 가혹한 학습 곡선이 있음
다른 코드를 조작하는 코드를 작성해야 하고, 보통 의미론과 동작 목표가 꽤 다르기 때문인 것 같음. 여기에 구전 지식과 잡음도 많음
그래서 컴파일러 팀은 이미 오랫동안 컴파일러를 만들어온 사람을 특히 선호함. 하지만 당연히 부트스트래핑 문제가 있으니 큰 팀들은 그 곡선을 넘을 가능성이 있어 보이는 졸업생도 뽑고, 나도 대략 그렇게 들어갔음
전반적인 경력은 있지만 컴파일러 경험이 없다면, 익숙한 일을 하는 회사 중에 컴파일러 팀도 있는 곳, 대략 “꽤 큰 소프트웨어 회사”에 들어가서 수평 이동을 노리는 게 뚜렷한 전략임
- 이 분야는 많은 사람이 넘지 못하는 가혹한 학습 곡선이 있음
-
“A Unified Theory of Garbage Collection”도 포함돼 있어서 좋음
적어도 이 학생들은 참조 카운팅과 추적 가비지 컬렉션의 차이를 제대로 이해하게 될 것임 -
“CS 6120은 Adrian Sampson의 프로그래밍 언어 구현에 관한 Cornell CS 박사 수준 강의”라면, 꽤 고급 강의인 건가?
컴퓨터과학에서 내가 박사 수준은 아닌 것 같음- 준비 수준을 전통적인 학위 단계로 재지 않는 게 좋음
그냥 해보고, 할 수 있으면 준비된 것이고 못 하면 아직 아닌 것임 - 박사 과정이라고 해서 학부보다 더 어렵다는 뜻은 아님
그냥 한번 해보면 됨
- 준비 수준을 전통적인 학위 단계로 재지 않는 게 좋음
-
20년 전 Gerhard Goos가 진행한 일반 컴파일러 구성 강의에서 다룬 내용과 여전히 대체로 비슷해 보임
더 최신 논문도 링크되어 있으니 한번 볼 수도 있겠음
Steven Muchnick의 Advanced Compiler Design and Implementation 책을 좋아했음
18년 동안 컴파일러 소스 코드를 보지 않아서 특히 프로파일링과 경로 기반 최적화 쪽은 따라가지 못하는 느낌이고, 요즘 기계학습을 보면 더 고급 SIMD 관련 내용도 많이 나와 있을 것 같음 -
몇 해 전 여름에 이 온라인 강의를 따라갔고 정말 많이 배웠음
Bril IR의 작은 이슈에 PR을 올리고, 교수와 함께 고치는 과정이 매우 몰입감 있었음 -
이 강의의 선행 강의가 있는지 궁금함
- Stanford의 Compilers 강의를 따라가고 있는데 마음에 듦: https://www.edx.org/learn/computer-science/stanford-universi...
- CS 4120 Introduction to Compilers 같은 강의 말하는 건가?
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/