Kỹ thuật xây dựng trình thông dịch
(craftinginterpreters.com)- Crafting Interpreters là cuốn sách được cấu trúc để người đọc muốn tự tạo ngôn ngữ có thể theo dõi việc triển khai một ngôn ngữ kịch bản hoàn chỉnh từ đầu đến cuối
- Sách trình bày xuyên suốt từ các khái niệm thiết kế ngôn ngữ như phân tích cú pháp và ngữ nghĩa cho đến phần triển khai thực thi như biểu diễn bytecode và thu gom rác
- Người đọc sẽ bắt đầu từ
main()và tự tay triển khai một ngôn ngữ có kiểu động, phạm vi từ vựng, hàm hạng nhất, closure, lớp và kế thừa - Cuốn sách yêu cầu người đọc tự viết toàn bộ vài nghìn dòng mã sạch và nhanh, nhờ đó tập trung vào hiểu cách hoạt động bên trong hơn là chỉ vào kết quả hoàn chỉnh
- Có các định dạng bản in, eBook, PDF và web; trên web có thể đọc miễn phí mọi chương, bài viết bổ sung và hình minh họa
Phạm vi triển khai của cuốn sách
- Crafting Interpreters dành cho người đọc muốn tự tạo ngôn ngữ lập trình của riêng mình hoặc muốn hiểu ngôn ngữ được thiết kế và triển khai như thế nào
- Cuốn sách cùng lúc đề cập đến các chủ đề cốt lõi cần thiết để triển khai một ngôn ngữ kịch bản đầy đủ tính năng
- Phân tích cú pháp
- Ngữ nghĩa
- Biểu diễn bytecode
- Thu gom rác
- Việc triển khai bắt đầu từ
main()và cuối cùng mở rộng thành một ngôn ngữ có các tính năng sau- Cú pháp phong phú
- Kiểu động
- Phạm vi từ vựng
- Hàm hạng nhất
- Closure
- Lớp
- Kế thừa
Cách đọc và thành quả
- Thay vì chỉ xem mã ví dụ, người đọc sẽ tự viết từng dòng để lần theo cấu trúc bên trong của bộ xử lý ngôn ngữ
- Mã cuối cùng có quy mô vài nghìn dòng và được xây dựng với mục tiêu hướng đến một triển khai sạch và nhanh
- Thay vì tách riêng các khái niệm cấp cao và phần hiện thực mức thấp, sách được thiết kế để người đọc hiểu chúng cùng nhau trong quá trình hoàn thiện một ngôn ngữ
Các định dạng cung cấp
-
Bản in
- Đây là bản in 640 trang, cung cấp hình minh họa vẽ tay độ phân giải cao và kiểu chữ do chính tác giả tự dàn trang
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- Cung cấp CSS phù hợp với máy đọc sách điện tử và nhiều kích thước màn hình, tô sáng cú pháp đầy đủ màu sắc và các siêu liên kết trực tiếp
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- Được cung cấp theo cách dễ mang theo, đồng thời giữ nguyên phần dàn trang thủ công và hình minh họa sắc nét của bản in
- Buy from Payhip
- Download Free Sample
-
Web
- Được cung cấp với thiết kế đáp ứng từ máy tính để bàn đến điện thoại, và có thể đọc miễn phí mọi chương, bài viết bổ sung và hình minh họa
- Read Now
1 bình luận
Ý kiến trên Hacker News
Tôi là tác giả. Thấy cuốn sách của mình nhận được phản hồi tích cực thật sự khiến tôi rất ấm lòng. Tôi đã dành rất nhiều thời gian và tâm huyết cho nó, nên thật đáng giá khi thấy nó mang lại đúng hiệu quả mình kỳ vọng
Nhờ tài liệu này mà tôi tự tin lên rất nhiều, và đến giờ vẫn nhớ đó là một trong những dự án mình thích nhất
Tôi cũng tò mò không biết bạn có định viết sách tiếp theo như trình biên dịch hoặc JIT cho Lox không. Ngoài ra lexical analygator là tuyệt vời nhất, đến mức nó đã nhiều lần xuất hiện trong các buổi trình bày nội bộ ở công ty tôi kèm ghi nguồn, và có thời còn có cả fanart trên bảng trắng
Có cảm giác như một số tác giả khác muốn làm ra vẻ rằng lĩnh vực này toàn là hắc thuật, dù cũng có thể là do tôi chưa đủ trình để hiểu các mẫu thiết kế GoF
Khi làm Crumb(https://github.com/liam-ilan/crumb), tôi đã đọc Crafting Interpreters, và đặc biệt phần về phạm vi và biến cục bộ là cực kỳ thiết yếu.
Nó cân bằng rất tốt giữa triển khai kỹ thuật và góc nhìn khái niệm, nên ngay cả khi bạn muốn đi chệch khỏi lộ trình định sẵn của sách thì nó vẫn giúp ích rất nhiều. Đây là kiểu bài viết kỹ thuật chất lượng cao đến mức có thể xem như hình mẫu để noi theo
Tài liệu rất tốt và dự án cũng rất ấn tượng
Phần tôi thích nhất ở cuốn sách này là nó dẫn dắt bạn viết hai trình thông dịch khác nhau cho cùng một ngôn ngữ.
Nhờ vậy bạn hiểu rõ hơn những phần phức tạp và tinh tế hơn của quá trình tạo ra một ngôn ngữ lập trình. Khi ở nửa đầu cuốn sách bạn được tiếp xúc trước với các ý tưởng lớn và trở nên quen thuộc với chúng, rồi gặp lại chúng trong trình thông dịch thứ hai, bạn sẽ hấp thụ được những phần thú vị một cách trọn vẹn. Thật sự là một cuốn sách đáng kinh ngạc
Nhân nói về các tài liệu khác về compiler, tôi vẫn chưa xem hết nhưng loạt video của Immo Landwerth về việc tạo compiler bằng C#, sinh IL và symbol debug cũng rất hay.
Tài liệu này có lẽ từ khoảng 5 năm trước nên không dùng cú pháp C# mới nhất, chắc là thời .NET Core 3, nhưng với phần lớn công việc thì không thành vấn đề. Chỉ là có thể sẽ xuất hiện khá nhiều cảnh báo liên quan đến nullable kiểu tham chiếu.
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
Tôi thấy hầu hết lập trình viên nên có lúc nào đó làm theo trọn vẹn cuốn sách này. Làm như vậy giúp hiểu sâu hơn rất nhiều về chuyện thực sự diễn ra bên trong compiler hay các công cụ ngôn ngữ.
Đây là một trong những hướng dẫn kỹ thuật được viết hay nhất mà tôi từng theo, và nó giúp tôi thật sự biến các khái niệm thành của mình. Những khái niệm đó không chỉ hữu ích cho compiler mà còn dùng được ở nhiều nơi khác
Một ưu điểm phụ nhưng có lẽ quan trọng ngang ngửa của cuốn sách này là nó dạy sự rõ ràng.
Văn bản, mã nguồn, cấu trúc và nhịp độ đều rõ ràng, súc tích và đi vào trọng tâm. Từ “Crafting” thật sự rất đúng, như thể đây là cuốn sách do một người thợ lành nghề viết cho những người thợ lành nghề khác
Tôi nghĩ cuốn sách này nên là bước thứ hai hoặc thứ ba trong hành trình làm compiler cho ngôn ngữ lập trình.
Bước đầu tiên là khi chưa biết gì về trình thông dịch hay thiết kế ngôn ngữ, hãy tự mình viết thử một trình thông dịch cho một ngôn ngữ đơn giản do chính bạn nghĩ ra. Bước thứ hai là viết lại nó và mắc ít sai lầm hơn.
Nếu không làm vậy thì rất khó để thật sự cảm được những nét tinh tế của chủ đề này, và bạn sẽ dễ bỏ qua những khái niệm trông có vẻ không quan trọng
Không sao cả nếu bạn không tự mình phát minh lại mọi kỹ thuật từ đầu. Đứng trên vai người khổng lồ là điều hoàn toàn tự nhiên
Nếu không đọc thứ như CI trước, có lẽ tôi đã chẳng bao giờ thử tự viết một trình thông dịch, và cũng không thể đi đến bước thứ ba
Không có đệ quy, mà là tự đẩy vào rồi lấy ra khỏi stack. Vấn đề là tôi chưa thực sự hiểu parsing, nên phần lớn ngôn ngữ lại được cài bằng string.split và string.replace, và đúng như dự đoán, xuất hiện những khái niệm không thể lồng nhau. Tôi tiếc là mình đã không giữ lại mã nguồn đó
Chỉ vài ngày sau, gặp quá nhiều lỗi nên tôi bắt đầu tiếp cận theo hướng bài bản hơn và đọc sách. Dù vậy, đó vẫn là một bước đầu tiên tuyệt vời, vì nếu không có lần thử đó thì có khi tôi còn chẳng biết đây là một chủ đề đủ để viết thành cả một cuốn sách dài
Tôi thật sự rất kính trọng những người có sự tận tâm như vậy và tất cả những ai duy trì hạ tầng phát triển, nhưng cũng thấy may vì giai đoạn “muốn tạo ra một ngôn ngữ” của tôi đã kết thúc chỉ như một mối hứng thú thoáng qua
Khối lượng công việc thực sự khổng lồ
Tôi muốn biết có tài liệu nào hay về việc tạo ra một ngôn ngữ định kiểu tĩnh có đa hình tham số và suy luận kiểu cơ bản hay không
Trong Crafting Interpreters, tôi cảm thấy có thể tạo ra một ngôn ngữ nhỏ, khép kín, nhưng vẫn chứa gần như mọi khái niệm tôi muốn dạy như phạm vi biến, hàm, closure, class và dynamic dispatch, điều khiển luồng, v.v.
Ngược lại, với hệ thống kiểu thì có quá nhiều ngã rẽ trong không gian thiết kế và không hề có một con đường “tốt nhất” rõ ràng. Có subtyping hay không, generic bị xóa hay được cụ thể hóa, mã generic có được chuyên biệt hóa tại thời điểm biên dịch hay không, suy luận kiểu là cục bộ hay kiểu Hindley-Milner — tất cả đều là những ngã rẽ
Dù chọn thế nào thì cũng sẽ bỏ lỡ những nội dung quan trọng ở các nhánh không chọn, và có thể làm những độc giả mong chờ một hướng khác thất vọng. Có lẽ một cuốn sách tổng quan rộng hơn như Types and Programming Languages sẽ phù hợp hơn, nhưng như vậy lại mất đi niềm vui khi xây dựng một thứ gì đó nhất quán
Cũng có bản C và bản Java của cùng cuốn sách, nhưng tôi thấy chúng kém hơn. Tốt hơn là nên dùng cùng với bản ML
Tôi thấy bản triển khai ở https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... mang phong cách rất cũ, nên đã hiện đại hóa và sắp xếp lại thành https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459.... Sau đó tôi còn cố tình “phá hỏng” nhiều phần để xem thuật toán sụp đổ như thế nào
Tôi rất khuyến khích việc thử làm một công việc khoa học máy tính mà bạn từng nghĩ chỉ “pháp sư” mới làm được, theo một cách dễ tiếp cận. Sau khi làm được một hai việc, bạn sẽ nhận ra rằng tuy khó thật nhưng phần lớn chỉ là cứ lì lợm đẩy tiếp từng bước, và điều đó sẽ mang lại sự tự tin rất lớn. Ai muốn đi theo con đường này có thể liên hệ qua zellyn@(most things)
Tôi vừa đọc xong phần 2, và đây thực sự là một cuốn sách rất hay. Tự tay làm một hoặc hai bài tập được gợi ý ở mỗi chương sẽ giúp ích rất nhiều cho việc hiểu nội dung