CS 6120: Khóa học online tự học về trình biên dịch nâng cao
(cs.cornell.edu)- Đây là chương trình tự học gồm video bài giảng, ghi chú, bài đọc luận văn và bài tập triển khai, giúp bạn theo học online môn CS 6120 ở cấp độ tiến sĩ của Cornell CS
- Bao quát từ các chủ đề cốt lõi của trình biên dịch như biểu diễn trung gian, luồng dữ liệu, tối ưu hóa “cổ điển” đến song song hóa, biên dịch JIT và garbage collection
- Phần thực hành dùng LLVM và IR dùng cho giảng dạy Bril, dẫn đến các bài tập hack mã nguồn mở để trực tiếp triển khai các khái niệm trừu tượng
- Phiên bản tự học có thể bỏ qua hạn nộp bài, nhưng không thể tham gia thảo luận Zulip của lớp học thực tế và dự án cuối kỳ
- Tài liệu được công khai mã nguồn mở trên GitHub nên có thể báo cáo vấn đề; sau khi hoàn thành có thể điền biểu mẫu phản hồi
Cách học và phạm vi nội dung
- CS 6120 là môn học về triển khai ngôn ngữ lập trình do Adrian Sampson của Cornell CS tạo ra
- Phạm vi khóa học bao gồm cả nền tảng chung của việc triển khai trình biên dịch lẫn các chủ đề định hướng nghiên cứu
- Biểu diễn trung gian
- Luồng dữ liệu
- Tối ưu hóa “cổ điển”
- Song song hóa
- Biên dịch JIT
- Garbage collection
- Việc học diễn ra thông qua đọc luận văn và các bài tập hack mã nguồn mở
- Chương trình tự học được sắp xếp theo hình thức học một môn 4 tín chỉ không chấm điểm tại một “trường đại học tưởng tượng”
- Các bài giảng được sắp xếp theo thứ tự tuyến tính
- Mỗi bài có video và ghi chú dạng văn bản
- Một số bài có bài tập triển khai
- Có thứ tự khuyến nghị để kết hợp xem video và đọc luận văn
Khác biệt so với lớp học thực tế
- Người học tự học có thể bỏ qua hạn nộp bài tập
- Không thể tham gia thảo luận Zulip của lớp học thực tế
- CS 6120 thực tế có dự án cuối kỳ
- Bài tập cuối kỳ của phiên bản tự học là “thay đổi thế giới bằng phép màu của trình biên dịch”
- Chất lượng sản xuất bài giảng có thể thấp, đặc biệt ở các bài đầu
- Tài liệu CS 6120 được công khai mã nguồn mở trên GitHub, và nếu phát hiện vấn đề, bạn có thể báo lỗi
- Sau khi hoàn thành, bạn có thể điền biểu mẫu phản hồi
Bài học và tài liệu đọc
- 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
1 bình luận
Ý kiến trên Hacker News
Khi sắp tốt nghiệp đại học và tìm công việc toàn thời gian đầu tiên, khóa học này đã giúp tôi vượt qua phỏng vấn vào các đội kỹ thuật trình biên dịch của MANGA(Meta, Apple, NVIDIA, Google, Amazon)
Chương trình về hệ thống tính toán mức thấp của University of Waterloo cũng rất xuất sắc và tôi cũng đang đóng góp cho các dự án trình biên dịch mã nguồn mở, nhưng chính khóa học này đã thực sự giúp ích rất nhiều để trả lời những câu hỏi khó nhất trong phỏng vấn
Nếu viết tự nhiên hơn thì có lẽ kiểu như “my university has the low level computing systems curriculum par excellence” sẽ ổn hơn
Theo tôi, trước khi viết trình biên dịch thì trước hết cần hiểu kiến trúc máy tính và biết trình biên dịch phải tạo ra cái gì để sinh mã máy hiệu quả nhất
Nhưng theo kinh nghiệm của tôi, trường học và đại học dường như ngày càng hạ thấp mức ưu tiên của kiến trúc máy tính, thậm chí cả lập trình hệ thống, có lẽ vì họ cho là quá thiên về kỹ thuật
Dù vậy, kiến thức đó cực kỳ quan trọng để có được những công việc tốt trong ngành
Vấn đề cốt lõi tôi nhận ra khi làm việc với các trường đại học là có quá nhiều nội dung tiềm năng phải bao quát trong quỹ thời gian giảng dạy hữu hạn
Lượng thông tin cần biết trong lĩnh vực của chúng ta tăng theo cấp số nhân qua thời gian và đã vượt quá ngưỡng từ lâu, nên việc giảm thời lượng các môn lập trình hệ thống trong lộ trình phổ thông là hợp lý vì mỗi năm chúng lại ít liên quan hơn với nhiều sinh viên
Ở cấp độ trình biên dịch vẫn còn rất nhiều việc phải làm, nhưng phần lớn trong số đó không nên đòi hỏi phải bận tâm tới tận mức vi kiến trúc của máy tính
Có thể không cần học x86 hay MIPS, nhưng CUDA cho thấy một cấu trúc còn kỳ quặc hơn cả chúng
Lý do thông thường khiến người ta không nhấn mạnh nội dung tầng thấp là vì chúng khác nhau theo từng cách hiện thực, nhanh lỗi thời và khó khái quát hóa
Nói thêm thì tôi cũng không quá hợp với kiểu “lập trình viên hệ thống”, những người có xu hướng lấy cả đống kiến thức vụn vặt siêu cụ thể đó làm toàn bộ bản sắc nghề nghiệp của mình, nên có những người viết được assembly nhưng lại không biết functor là gì
Có vẻ như không có nhiều tài liệu học thuật tốt đi sâu vào tối ưu hóa trình biên dịch nâng cao
Tôi đã tìm khá nhiều nhưng phần lớn các khóa học đều ở mức nhập môn, và khá ngạc nhiên khi thấy muốn học các kỹ thuật thực sự thú vị thì phải đào rất sâu vào mã nguồn của các trình biên dịch mã nguồn mở phổ biến
Tôi thấy trình biên dịch là một trong những lĩnh vực không thay đổi quá nhiều trong khoảng 30 năm qua
Khi tôi giảng dạy tại Perugia University vào giai đoạn 2004~2006, tôi vẫn có thể dùng tài liệu cũ 15~25 năm mà gần như không vấn đề gì
Gần đây có vẻ tình hình đã khác
Ngay cả chỉ xét những thứ mà vào giai đoạn 2004~2006 bạn đã có thể dạy như nội dung mới nhưng có lẽ đã không đề cập, đã có xây dựng SSA, vector hóa SLP và siêu tối ưu hóa peephole tự động, đây mới chỉ là những gì tôi nghĩ ra ngay lúc này
Thứ không thay đổi là các giáo trình trình biên dịch. Chúng tập trung quá mức vào cách làm trình sinh parser và hầu như không nói về cách thật sự thiết kế trình biên dịch, chưa kể đến thiết kế kiến trúc máy tính hiện đại. Lời phàn nàn này đã có từ hàng chục năm trước
Trong 10 năm qua, cục diện đã tiến hóa rất mạnh về phía các kỹ thuật biên dịch gia tăng
Các tiến bộ lý thuyết chủ yếu vẫn mắc kẹt trong parser, nhưng các triển khai thực tế thì đã áp dụng cho toàn bộ pipeline, từ tối ưu hóa chương trình toàn cục đến sinh mã
Mỗi thế hệ bộ xử lý mới lại thêm lệnh và tùy chọn, tạo ra những tối ưu hóa hay tổ hợp mới mà trình biên dịch có thể tận dụng
Nếu viết trình biên dịch cho ngôn ngữ hàm thuần túy thì chắc chắn sẽ cần tài liệu mới hơn
Tôi mừng vì có những khóa học như thế này
Giờ tôi có thể được dẫn dắt qua các chủ đề nâng cao và theo học với tốc độ của riêng mình
Tôi luôn muốn theo đuổi sự nghiệp kỹ sư trình biên dịch, nhưng nơi tôi sống không có nhiều cơ hội học tập và việc làm
Nhìn sang Mỹ thì thị trường tuyển dụng cạnh tranh đến mức choáng ngợp, và thật lòng tôi không biết phải bắt đầu từ đâu
Kinh nghiệm tôi có chỉ là một khóa học thời đại học, nhưng khóa đó thực sự rất tuyệt từ đầu đến cuối
Có lẽ vì bạn phải viết mã để thao tác với mã khác, trong khi ngữ nghĩa và mục tiêu hành vi thường khá khác biệt. Thêm vào đó còn có nhiều tri thức truyền miệng và nhiễu
Vì vậy các đội trình biên dịch đặc biệt thích những người đã làm trình biên dịch từ lâu. Nhưng tất nhiên có bài toán khởi đầu, nên các đội lớn vẫn tuyển những sinh viên mới ra trường có vẻ có khả năng vượt qua đường cong đó, và tôi cũng vào ngành đại khái theo cách như vậy
Nếu bạn có kinh nghiệm nghề nghiệp nói chung nhưng không có kinh nghiệm về trình biên dịch, thì một chiến lược khá rõ ràng là vào một công ty làm những việc bạn đã quen mà cũng có đội trình biên dịch, kiểu như “một công ty phần mềm khá lớn”, rồi tìm cách chuyển ngang
Thật tốt khi còn có cả “A Unified Theory of Garbage Collection”
Ít nhất thì các sinh viên này sẽ hiểu đúng sự khác biệt giữa đếm tham chiếu và garbage collection truy vết
Nếu “CS 6120 là khóa học cấp tiến sĩ của Cornell CS về hiện thực ngôn ngữ lập trình do Adrian Sampson phụ trách”, vậy đây là một khóa học khá nâng cao đúng không?
Tôi không nghĩ mình ở mức cấp tiến sĩ trong khoa học máy tính
Cứ thử đi, nếu làm được thì tức là bạn đã sẵn sàng, còn nếu không thì là chưa
Cứ thử một lần là được
Nó trông vẫn phần lớn giống với nội dung được dạy trong khóa học chung về xây dựng trình biên dịch mà Gerhard Goos giảng cách đây 20 năm
Cũng có liên kết tới các bài báo mới hơn nên có thể sẽ xem thử
Tôi rất thích cuốn Advanced Compiler Design and Implementation của Steven Muchnick
Vì đã 18 năm không nhìn vào mã nguồn trình biên dịch nên tôi có cảm giác mình không còn theo kịp, nhất là ở phần profiling và tối ưu hóa dựa trên đường đi, và nhìn vào machine learning hiện nay thì có lẽ cũng có nhiều nội dung SIMD nâng cao hơn nữa
Tôi đã theo khóa học trực tuyến này vào mùa hè vài năm trước và học được rất nhiều
Việc gửi PR cho một vấn đề nhỏ của Bril IR rồi cùng giáo sư sửa nó là một trải nghiệm cực kỳ cuốn hút
Tôi tò mò không biết có khóa học tiên quyết nào cho khóa này không
[1] https://www.cs.cornell.edu/courses/cs4120/2022sp/