- CS 6120, một học phần trình độ tiến sĩ của Cornell CS, mang đến một lộ trình xuyên suốt từ biểu diễn trung gian, luồng dữ liệu, tối ưu hóa, song song hóa, JIT đến garbage collection cho những ai muốn học một cách hệ thống về trình biên dịch và hiện thực ngôn ngữ lập trình
- Phiên bản tự học có hình thức tham gia như một môn học 4 tín chỉ không chấm điểm tại một trường đại học giả định, với lịch học tuyến tính gồm video, ghi chú, đọc bài báo và bài tập hiện thực
- Phần thực hành sử dụng LLVM và IR giáo dục Bril để người học kiểm chứng các khái niệm trình biên dịch trừu tượng bằng việc viết mã thực tế
- Khác với lớp học Cornell thực tế, người học có thể bỏ qua hạn nộp bài nhưng không thể tham gia thảo luận trên Zulip, và thay cho dự án cuối kỳ sẽ có một bài tập cuối dành riêng cho phiên bản tự học
- Tài liệu khóa học được công bố mã nguồn mở trên GitHub, có thể báo lỗi, và sau khi hoàn thành người học có thể gửi góp ý cải thiện qua biểu mẫu phản hồi
Cấu trúc khóa học và cách tham gia
- CS 6120 là khóa học về hiện thực ngôn ngữ lập trình do Adrian Sampson của Cornell CS xây dựng
- Khóa học bao gồm cả các chủ đề nền tảng của trình biên dịch phổ dụng lẫn các chủ đề mang tính 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 tiếp nối bằng đọc bài báo và các bài tập hack mã nguồn mở
- Chương trình tự học được tổ chức theo lịch tuyến tính kết hợp xem video và đọc bài báo
- Một số bài học có kèm bài tập hiện thực, giúp nắm các khái niệm trừu tượng thông qua việc viết mã theo hướng mở
- Có khác biệt giữa CS 6120 thực tế và phiên bản tự học
- có thể bỏ qua hạn nộp bài
- không thể tham gia các luồng thảo luận trên Zulip
- lớp học 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”
- Khóa học được công bố mã nguồn mở trên GitHub, nên nếu có vấn đề thì có thể báo lỗi
- Sau khi hoàn thành có thể điền biểu mẫu phản hồi
Dòng chảy bài học và tài liệu đọc
-
Nhập môn và biểu diễn chương trình
-
Nền tảng của phân tích và tối ưu hóa
-
LLVM và tối ưu hóa vòng lặp, phân tích liên thủ tục
-
Quản lý bộ nhớ và trình biên dịch động
-
Tính song song và trình biên dịch nhanh
- Lesson 13: Concurrency & Parallelism
- Lesson 14: Fast Compilers
- chỉ có tiêu đề được liệt kê
1 bình luận
Ý kiến trên Hacker News
Phần về trình biên dịch động gần như toàn bộ là nội dung về trace compilation. Nói chung, trace compilation từng là một ngõ cụt và đã nhiều lần bị loại bỏ
Theo tôi, các khái niệm quan trọng hơn ở đây là type feedback, thực thi suy đoán và deoptimization, trình biên dịch nhanh và phân tầng
Nhìn chung khóa học có vẻ tốt, và việc công khai nhiều tài liệu như vậy trên mạng cũng rất đáng khen
Như bạn nói, tôi muốn có thêm bối cảnh về những gì thực sự hoạt động tốt trong ngành
Tuy nhiên, lĩnh vực này có thể khá hẹp và cũng rất khác với trình biên dịch truyền thống, nên nếu nhìn vào một phần những gì chúng tôi làm thì có lẽ bạn sẽ thấy khá khó chịu
Tất nhiên, tôi biết không gian bài toán của nó cực kỳ khác so với TraceMonkey hay LuaJIT
Tôi đã nói chuyện với một trong các lập trình viên thời đó, hình như là Jason Orendorff, và anh ấy nói tracing không vận hành tốt lắm, dù có thể khả thi trong những điều kiện hạn chế
Nhưng điều kiện cụ thể là gì thì tôi đã quên hoàn toàn rồi
LuaJIT hoạt động tốt cả với các chương trình lớn lẫn trên hàng trăm triệu máy chủ và thiết bị
Thật đáng buồn khi ngay cả giới học thuật cũng cứ lặp đi lặp lại câu chuyện sáo mòn này. Đúng là không biết thì lại thành ra tự tin
Các bài liên quan trước đây:
CS 6120: Advanced Compilers: The Self-Guided Online Course - https://news.ycombinator.com/item?id=39577878 - tháng 3 năm 2024, 102 bình luận
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=35130975 - tháng 3 năm 2023, 82 bình luận
Advanced Compilers: Self-Guided Online Course - https://news.ycombinator.com/item?id=25386756 - tháng 12 năm 2020, 232 bình luận
Tôi hơi bối rối không hiểu vì sao khóa này được gọi là nâng cao. Phần lớn chủ đề, chẳng hạn như loại bỏ mã chết, luồng dữ liệu, phân tích dominator, dạng SSA, có vẻ như đều sẽ xuất hiện trong khóa học đầu tiên về trình biên dịch
Nói ngắn gọn thì trình biên dịch thực chất được chia thành hai học phần, và học phần đầu tiên đề cập đến các thành phần tối thiểu để xây dựng một trình biên dịch như phân tích từ vựng, phân tích cú pháp, sinh mã và phân bổ thanh ghi
Học phần thứ hai tương ứng với cách xây dựng một trình biên dịch tối ưu hóa
Trên thực tế, dù là trình biên dịch hay trình thông dịch thì phần backend gần như luôn bị để lại thành “bài tập cho người đọc”
Khó mà hình dung còn bao nhiêu thứ phải tự tìm ra như cách tạo closure, cách theo dõi môi trường, pattern matching, biểu diễn bộ nhớ, v.v.
Mọi thứ thú vị đều phải tự mình lần mò
Tái bút: đây mới chỉ là lượng tài liệu của một năm trong số đó: https://gist.githubusercontent.com/mamcx/e1743571b9a1ea163a7...
Tôi đã đọc hai cuốn sách về trình thông dịch và trình biên dịch, nhưng chúng không nói nhiều về backend
Có lẽ đây gần giống một khóa nhập môn về backend hơn
Có khóa khoa học máy tính cấp đại học học trực tuyến theo kiểu tự chủ nào khác như thế này không?
Một số giảng viên còn công khai bài giảng và bài tập ngoài khuôn khổ “mooc”
Tôi từng hỏi trong phần bình luận và cũng có giáo sư trả lời. Internet đôi khi vẫn còn rất tuyệt
So với Writing a C compiler của Nora Sandler, người đọc sẽ nhận được lợi ích khác nhau như thế nào?
Nếu là người mới bắt đầu hoặc chỉ tìm hiểu vì sở thích, tốt hơn nên bắt đầu bằng cuốn sách đó hoặc tài liệu ở mức tương tự, rồi sau đó thử khóa học này để lấp các khoảng trống
Trước khi bước vào mức nâng cao, có khóa học tự học nào về trình biên dịch cơ bản đáng xem không?
Nếu muốn bắt đầu từ trình thông dịch, Essentials of Programming Languages [4] là lựa chọn tốt
Tôi công nhận Crafting Interpreters rất được ưa chuộng ở trang này và nhiều nơi khác, nhưng cá nhân tôi không thích lắm. Dù vậy, nhiều người khác thích nó, nên vẫn đáng thử và có thể xem miễn phí
EOC và EOPL có phần thiên về học thuật, nhưng trừ những ai cảm thấy không thoải mái với Scheme và Racket thì tôi thấy chúng khá dễ tiếp cận. Phiên bản Python của EOC giúp giảm bớt vấn đề đó
Sau đó, các sách về trình biên dịch chuyên sâu và hàn lâm hơn sẽ trở nên dễ tiếp cận hơn nhiều
[1] https://mitpress.mit.edu/9780262047760/essentials-of-compila... - bản Racket, có bản open access
[2] https://mitpress.mit.edu/9780262048248/essentials-of-compila... - bản Python, có bản open access
[3] https://nostarch.com/writing-c-compiler - có thể chọn ngôn ngữ triển khai
[4] https://mitpress.mit.edu/9780262062794/essentials-of-program... - dùng Scheme nhưng có thể sử dụng trên Racket
Nó gồm hai phần; phần đầu xây dựng một trình thông dịch duyệt cây bằng Java, rồi tiến xa hơn với phiên bản viết bằng C
https://github.com/jamiebuilds/the-super-tiny-compiler
Kết hợp với vài cuốn sách hiện đại được đề xuất ở đây thì là quá đủ
David Gries - https://www.cs.cornell.edu/gries/ và https://en.wikipedia.org/wiki/David_Gries
Nhà khoa học máy tính người Hà Lan Dick Grune đã viết về Compiler Construction for Digital Computers rằng “nhiều thế hệ người làm trình biên dịch đã trưởng thành cùng cuốn sách này, và họ không hề hối tiếc”
Bản thân Dick Grune cũng nổi tiếng với các sách về trình biên dịch và ngôn ngữ lập trình - https://dickgrune.com/index.html và https://en.wikipedia.org/wiki/Dick_Grune
Tôi nghe một podcast nói về trình biên dịch Rust, và hình như ở một giai đoạn nào đó có dùng thuật toán học máy để xác định liệu đoạn mã có thể làm sập hệ thống hay không
Bạn có nguồn nào không?
Tôi thật sự tò mò không biết dạo này alexia massalin đang làm gì ngoài việc nhận tiền bản quyền bằng sáng chế microunity