3P by GN⁺ | ★ favorite | 댓글 1개
  • Cornell CS의 박사 수준 과목 CS 6120을 온라인에서 따라갈 수 있도록 강의 영상, 노트, 논문 읽기, 구현 과제를 묶은 자기주도 커리큘럼임
  • 중간 표현, 데이터 흐름, 고전적 최적화 같은 컴파일러 핵심 주제부터 병렬화, JIT 컴파일, 가비지 컬렉션까지 다룸
  • 실습은 LLVM과 교육용 IR Bril을 사용하며, 추상 개념을 직접 구현해 보는 오픈소스 해킹 과제로 이어짐
  • 자기주도 버전은 마감 기한을 무시할 수 있지만, 실제 수업의 Zulip 토론과 학기말 프로젝트에는 참여할 수 없음
  • 자료는 GitHub에 오픈소스로 공개되어 있어 문제를 제보할 수 있고, 수료 후에는 피드백 폼을 작성할 수 있음

수강 방식과 다루는 범위

  • CS 6120Cornell CSAdrian Sampson이 만든 프로그래밍 언어 구현 과목임
  • 강좌 범위는 컴파일러 구현의 공통 기반과 연구 지향 주제를 함께 포함함
    • 중간 표현
    • 데이터 흐름
    • “고전적” 최적화
    • 병렬화
    • JIT 컴파일
    • 가비지 컬렉션
  • 학습은 논문 읽기와 오픈소스 해킹 과제로 진행됨
    • 실습에는 LLVM과 수업용 교육 IR인 Bril을 사용함
  • 자기주도 커리큘럼은 “상상 속 대학”에서 4학점짜리 미채점 과목을 듣는 형식으로 정리되어 있음
    • 강의는 선형 순서로 배열됨
    • 각 레슨에는 영상과 글 노트가 있음
    • 일부 레슨에는 구현 과제가 포함됨
    • 영상 시청과 논문 읽기를 섞어 진행하도록 권장 순서가 잡혀 있음

실제 수업과 다른 점

  • 자기주도 수강자는 과제 마감 기한을 무시할 수 있음
  • 실제 수업의 Zulip 토론에는 참여할 수 없음
  • 실제 CS 6120에는 학기말 프로젝트가 있음
    • 자기주도 버전의 학기말 과제는 “컴파일러의 마법으로 세상을 바꾸는 것”임
  • 강의 제작 품질은 특히 초기 레슨에서 낮을 수 있음
  • CS 6120 자료는 GitHub에 오픈소스로 공개되어 있으며, 문제를 발견하면 버그를 제보할 수 있음
  • 수료 후에는 피드백 폼을 작성할 수 있음

레슨과 읽기 자료

댓글과 토론

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” 정도가 나았을 것 같음
  • 컴파일러를 작성하기 전에는 컴퓨터 구조를 이해하고, 가장 효율적인 기계어 코드를 만들려면 컴파일러가 무엇을 생성해야 하는지 아는 게 먼저라고 봄
    하지만 경험상 학교와 대학은 컴퓨터 구조, 심지어 시스템 프로그래밍까지 점점 우선순위에서 밀어내는 듯하고, 아마 너무 기술적이라고 보기 때문인 것 같음
    그래도 그 지식은 업계에서 좋은 일자리를 얻는 데 매우 중요함

    • 대학들이 시스템 프로그래밍의 우선순위를 낮추고 있다는 말은 맞지만, 이유는 “너무 기술적이라서”가 아님
      대학과 일하면서 느낀 근본 문제는 제한된 수업 시간 안에 다뤄야 할 잠재적 내용이 너무 많다는 것임
      우리 분야에서 알아야 할 정보량은 시간이 갈수록 기하급수적으로 늘고 이미 한계를 넘었기 때문에, 일반 트랙에서 시스템 프로그래밍 수업 시간이 줄어드는 건 매년 더 많은 학생에게 관련성이 낮아지기 때문이고 합리적임
    • 업계에서 말하는 좋은 일자리가 무엇이고, 왜 그렇게 보는지 더 설명해줄 수 있음?
    • 이런 수준의 저수준 세부사항 없이도 컴파일러를 사용할 수 있게 된 것이 업계의 큰 발전 중 하나라고 봄
      컴파일러 수준에서 해야 할 일은 여전히 많지만, 그중 상당수는 컴퓨터의 마이크로아키텍처 수준까지 신경 쓸 필요가 없어야 함
    • 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을 올리고, 교수와 함께 고치는 과정이 매우 몰입감 있었음

  • 이 강의의 선행 강의가 있는지 궁금함