1 điểm bởi GN⁺ 8 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • 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ở
    • sử dụng LLVM
    • sử dụng Bril, một IR giáo dục dùng trong giảng dạy
  • 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

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

    • Xét về mặt lịch sử, tracing đã cho thấy nó không thực tế như một nguyên lý tổ chức, nhưng tôi nghĩ đây vẫn là một khái niệm giúp mở rộng tư duy nếu học nó
      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
    • Tôi đang làm việc với torch.compile của PyTorch, và đây cũng là một tracing compiler
      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
    • JAX cũng là một trình biên dịch truy vết
      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
    • Bài báo về TraceMonkey từng nằm trong danh sách đọc cho kỳ thi điều kiện tiến sĩ của tôi, và đúng lúc đó cũng là thời điểm TraceMonkey bị gỡ khỏi SpiderMonkey
      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
    • Trace compilation không phải là ngõ cụt
      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

    • Mã số môn học khá đều đặn nên có thể tìm được khóa “compiler nhập môn” là gì: https://www.cs.cornell.edu/courses/cs4120/2026sp/?schedule
      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
    • Tôi đã đọc rất nhiều tài liệu liên quan, nhưng phần lớn không bao gồm những nội dung đó
      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 nghĩ người không chuyên thường bắt đầu từ phân tích cú pháp và nhiều khi không bao giờ chạm đến backend
      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
    • Vậy thì điều gì làm nó trở thành nâng cao? Nếu thực sự trình bày đầy đủ về loại bỏ mã chết, luồng dữ liệu, SSA, chọn lệnh và phân bổ thanh ghi thì về cơ bản đã chạm tới 98% của backend rồi
  • 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?

    • Có đến hàng chục khóa. Chỉ cần tìm với từ khóa “mooc” là được
      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?

    • Cuốn sách đó gần hơn với những gì bạn nhận được từ một khóa trình biên dịch bậc đại học, còn khóa này đi vào nội dung nâng cao hơn
      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?

    • Tôi thích cách tổ chức của Essentials of Compilation [1][2] và Writing a C Compiler [3]
      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
    • Tôi khuyên nên xem Crafting Interpreters [1]
      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
      1. https://craftinginterpreters.com/
    • Tôi chưa tự mình thử, nhưng có “the-super-tiny-compiler”:
      https://github.com/jamiebuilds/the-super-tiny-compiler
    • Dù đã cũ, tôi khuyên bắt đầu với tác phẩm kinh điển Compiler Construction for Digital Computers của David Gries
      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/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.htmlhttps://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

    • Tôi chưa từng nghe điều đó và khá chắc là không đúng. Dĩ nhiên, khái niệm “học máy” cũng khá rộ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