3 điểm bởi GN⁺ 2023-12-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Write Your Own Retro Compiler là cuốn sách dày 339 trang trình bày về một trình biên dịch tự lưu trữ chạy trên CP/M dựa trên Z80 và sinh mã cho chính môi trường đó, kèm toàn bộ mã nguồn
  • T3X/0, đối tượng được hiện thực, là một ngôn ngữ đơn giản bắt nguồn từ Pascal và BCPL, và sách có kèm bản hướng dẫn đầy đủ dài 20 trang
  • Cần có kiến thức về ngôn ngữ thủ tục như C hoặc Pascal và hợp ngữ; nếu biết thêm hợp ngữ Z80 và kiến thức cơ bản về CP/M thì sẽ dễ theo dõi hơn
  • Phân tích từ vựng, phân tích cú pháp, sinh mã, tối ưu hóa đơn giản, giao diện BDOS và thư viện thời gian chạy được giải thích bằng sơ đồ, bảng và ví dụ
  • Toàn bộ mã được phát hành dưới dạng phạm vi công cộng, đồng thời công khai liên kết mua sách giấy, PDF, mục lục, trang mẫu và tải mã nguồn

Phạm vi và đối tượng của sách

  • Write Your Own Retro Compiler là cuốn sách 339 trang, 91 hình minh họa, khổ 6" x 9", do Lulu Press xuất bản năm 2023
  • Chủ đề trung tâm là một trình biên dịch tự lưu trữ chạy trên CP/M của bộ xử lý Z80 và sinh mã nhắm tới chính môi trường đó
  • Nội dung được tổ chức để ngay cả người chưa có kinh nghiệm làm trình biên dịch cũng có thể theo dõi
  • T3X/0, ngôn ngữ hiện thực, là một ngôn ngữ đơn giản bắt nguồn từ Pascal và BCPL
  • Sách bao gồm bản hướng dẫn đầy đủ dài 20 trang về T3X/0

Kiến thức cần có

  • Cần biết ít nhất một ngôn ngữ lập trình thủ tục
    • Ví dụ được nêu là CPascal
  • Cũng cần biết ít nhất một ngôn ngữ hợp ngữ, và lý tưởng nhất là có kiến thức hợp ngữ cho CPU Z80
  • Cũng cần có kiến thức cơ bản về hệ điều hành CP/M
  • Sách có kèm phần giới thiệu ngắn về hợp ngữ Z80 dành cho độc giả tự học

Các thành phần của trình biên dịch

  • Giải thích hoạt động bên trong của trình biên dịch bằng nhiều sơ đồ, bảng và ví dụ
  • Các chủ đề được đề cập gồm:
    • Phân tích từ vựng
    • Phân tích cú pháp
    • Sinh mã
    • Tối ưu hóa đơn giản
    • Giao diện BDOS

      • Thư viện thời gian chạy

Liên kết và mã được cung cấp

1 bình luận

 
GN⁺ 2023-12-11
Ý kiến trên Hacker News
  • Vừa xuất bản một cuốn sách mới về trình biên dịch. Nó gần như là bản mở rộng của “Write Your Own Compiler”, nhưng lần này xử lý sinh mã CP/M cho Z80 thay vì ELF của hệ thống hiện đại nên nhiều phần đơn giản hơn hẳn
    Có thể thấy cần mức độ phức tạp đến đâu để làm ra một trình biên dịch có thể tự biên dịch chính nó trong chưa đến 10 phút trên hệ Z80 4MHz. Mã nguồn miễn phí nhưng sách thì có phí

    • Lúc nào cũng háo hức xem Nils sẽ làm gì tiếp theo. Mong là anh ấy cũng có thể biến những việc như thế này thành một công việc kinh doanh có lãi, và một ngày nào đó tôi muốn mua hết rồi làm theo thử
      Nhân tiện, tôi cũng muốn xem một cuốn sách gọn gàng, không rườm rà về Forth cùng cách diễn giải kiểu Nils
  • Gần đây tôi đã làm một trình biên dịch C đa lượt và assembler cho các CPU x86 đời cũ bằng TypeScript
    https://github.com/Mati365/ts-c-compiler

    • Trình biên dịch trong sách dành cho Z80 còn cũ hơn một chút, thậm chí không có cả lệnh nhân hay chia. Dù vậy, trình biên dịch này vẫn có thể xuất mã cho 8086 và 386
  • Tôi có bản in Practical Compiler Construction bản 2 và khá thích nó. Với ai quan tâm thì tôi khuyên đọc các cuốn sách của Nils

  • Cuốn sách này có vẻ thú vị. Tuy vậy tôi vẫn đang chờ một hậu duệ xứng đáng của The Dragon Book
    Sẽ hay nếu có một cuốn nói về CPU hiện đại và nếu được thì cả tối ưu hóa GPU, đồng thời hướng dẫn cách thiết kế và viết một máy ảo hiện đại có bộ gom rác đồng thời tốc độ cao. Ở một số khía cạnh, chuyện này có khi còn khó hơn viết trình biên dịch

    • Building an Optimizing Compiler của Bob Morgan là cuốn sách tập trung hoàn toàn vào tối ưu hóa trình biên dịch hiện đại và được xuất bản năm 1997
      Nó đề cập đến xây dựng đồ thị luồng điều khiển, nhiều kiểu tối ưu hóa có thể làm trên đó, phân tích bí danh, static single assignment, tối ưu hóa dựa trên dominator của CFG, lập lịch lệnh, phân bổ thanh ghi và sinh mã đích. Giống phần lớn sách về trình biên dịch, nó không nói về phân tích từ vựng, phân tích cú pháp hay NFA/DFA
      Nếu muốn làm một trình biên dịch tối ưu hóa cần phân tích nâng cao thì Static Program Analysis cũng có thể hữu ích: https://cs.au.dk/~amoeller/spa/
      Về gom rác thì có Garbage Collection handbook: https://gchandbook.org/
    • Tôi nhớ là hồi còn là sinh viên mình không thích The Dragon Book lắm. Giờ không còn nhớ rõ lý do, nhưng có lẽ vì tôi thấy cấu trúc của nó không tốt, có chủ đề thì quá chi tiết trong khi chủ đề khác lại giải thích chưa đủ
      Nếu đã có chút kiến thức nền thì có thể bạn sẽ thích khóa học này: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      Tôi đặc biệt thích cách nó giới thiệu dạng SSA
      Các chủ đề nâng cao hơn có ở đây: https://www.cs.cmu.edu/~15745/handouts.html
    • Tôi cũng đã chờ một cuốn như vậy từ lâu. Dạo này mọi thứ trở nên quá phức tạp vì những yếu tố như microcode/firmware hiện đại, và có quá nhiều thứ mang cảm giác như phép thuật
      Khi một thứ gì đó cho cảm giác như “phép thuật”, tôi xem đó là dấu hiệu cho thấy có ai đó đã khéo léo vượt qua điều từng bị cho là giới hạn. Gần đây tôi đang đọc về âm trầm giả, kiểu như một chiếc loa nhỏ dường như phát ra dải trầm lớn hơn khả năng thực tế của nó; cách dùng họa âm để đánh lừa não bộ nghe như thể âm thấp hơn thực tế thật sự rất thú vị
  • Trông có vẻ hấp dẫn, nhưng có nhược điểm là người đọc phải biết hoặc học trước T3X, một ngôn ngữ lập trình mới
    Tôi cũng tò mò không biết có thể viết và phát triển một trình biên dịch từ đầu trên một hệ CP/M retro chỉ có bàn phím và màn hình để giao tiếp với bên ngoài hay không

    • Tôi đã suy nghĩ rất nhiều về điểm này trước khi viết sách. Cuối cùng tôi chọn T3X vì trình biên dịch đó nhỏ hơn đáng kể so với trình biên dịch cho tập con C nhỏ nhất, và cá nhân tôi thấy T3X dễ học và dễ hiểu hơn
      SubC dài 3815 dòng còn T3X/0 là 2330 dòng
      Tất nhiên cũng có thể bắt đầu trên CP/M mà không cần công cụ bên ngoài, nhưng khi đó phải viết trình biên dịch bootstrap bằng assembly. Việc này tốn nhiều thời gian nhưng hoàn toàn khả thi. Chỉ là tôi không chắc nó có thú vị để đọc hay không
    • Tôi không thấy đó là nhược điểm. Với người định viết trình biên dịch thì một ngôn ngữ lập trình mới có lẽ không phải rào cản lớn, và một ngôn ngữ đồ chơi đơn giản, gọn gàng có thể còn tốt hơn cho mục đích giáo dục
      Việc dùng cú pháp kiểu ALGOL thay vì cú pháp kiểu C thì hơi bất ngờ một chút, nhưng có thể đó là thiên kiến của tôi. Việc ánh xạ DOEND sang {} trong đầu không phải gánh nặng gì lớn
  • Một tutorial về trình biên dịch mà đi xa hơn cả bước phân tích từ vựng và phân tích cú pháp, chắc gần như là đầu tiên tôi thấy
    Nói đùa vậy thôi nhưng thực sự rất nhiều tài liệu dừng ở đó. Tôi đang tính mua cuốn này

  • Sẽ thú vị nếu cũng có một cuốn sách về cách viết một hệ điều hành kiểu giống CP/M của riêng mình

    • Đó là Operating Systems Design and Implementation của Andrew Tanenbaum
      Dĩ nhiên nó chỉ cách làm một hệ điều hành microkernel kiểu Unix, nhưng bạn chỉ cần bỏ qua toàn bộ trừ chương hệ thống tệp. Và đừng làm theo lời khuyên về cấu trúc dữ liệu cây, cứ dùng bảng phẳng thôi, cũng đừng quá bận tâm chuyện cài đặt kích thước tệp chính xác. Là sẽ ra CP/M
      Cá nhân tôi thích bản 2 hơn. Tôi thấy bản 3 bị phức tạp hóa không cần thiết chỉ để đoạn mã Minix minh họa chạy được trên PC cuối thập niên 1990 thay vì PC thập niên 1980
  • Tôi không nói theo hướng tiêu cực đâu, chỉ là một nhận xét có thể hữu ích
    Tôi đã đọc chương miễn phí và cảm giác là một số phần có thể hơi khó với người chưa có nhiều kiến thức về chủ đề này. Dưới mỗi tiêu đề thì sách bắt đầu giải thích khái niệm từ đầu kiểu như “ngữ pháp của ngôn ngữ là...”, nhưng chỉ vài câu sau đã xuất hiện những chủ đề nâng cao như lệnh assembly mà không có giải thích
    Nếu người đọc đang ở mức cần học cả ý nghĩa của ngữ pháp thì có thể sẽ khó hiểu những câu ngay sau đó. Vì vậy nếu tăng độ nhất quán hơn một chút thì cuốn sách có lẽ sẽ hoàn thiện hơn

    • Như tôi đã viết trong phần giới thiệu sách, không cần kiến thức trước về xây dựng trình biên dịch, nhưng tôi cho rằng người đọc nên quen thuộc ít nhất với một ngôn ngữ thủ tục và một ngôn ngữ assembly
      Vì thế tôi thấy có thể giả định người đọc đã biết những thứ như lệnh assembly
      Phụ lục của sách cũng có một phần nhập môn ngắn về assembly Z80, nhưng phần đó cũng giả định là bạn đã biết những điều cơ bản của assembly
      Mọi cuốn sách đều phải bắt đầu từ đâu đó. Rất khó để viết một cuốn sách về xây dựng trình biên dịch mà lại giả định người đọc hoàn toàn không có kiến thức lập trình máy tính. Dù vậy, điều đó không có nghĩa là tôi không thể mắc “lời nguyền của tri thức”, nên tôi chắc chắn sẽ lưu ý điểm này
  • Ngoài nội dung cuốn sách, tôi cũng thích phần thiết kế web retro và tối giản rất đúng chất
    Nó gợi cảm giác hoài niệm mạnh mẽ. Tôi nhớ lại những ngày vui khi tự làm website, trên bàn là một cuốn dày cộp 6 inch với kiểu tiêu đề như “HTML 3.2 UNLEASHED!!!!”

    • Đúng là thời đẹp đẽ
      Chỉ có điều khi phải áp dụng một thay đổi toàn cục cho khoảng 1500 trang tĩnh thì niềm vui chấm dứt. Nỗi đau đó vẫn chưa đủ lớn để tôi tự làm CMS, nhưng kể cả có làm thì tôi vẫn sẽ giữ nguyên thiết kế
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...