3 điểm bởi GN⁺ 2024-07-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

  • eBook

  • 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

 
GN⁺ 2024-07-13
Ý 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

    • Tôi là một kỹ sư phần mềm tự học, mãi đến năm 21 tuổi mới bắt đầu lập trình. Ở công việc đầu tiên, tôi được giao làm một ngôn ngữ truy vấn đơn giản và trình thông dịch cho nó. Lúc đó tôi hoàn toàn không biết trình thông dịch là gì, nhưng năm 2017 tôi tìm thấy cuốn sách này trên mạng, và chỉ trong 3–4 ngày đã làm được một nguyên mẫu chạy được, rồi 1–2 tuần sau thì làm ra được cả sản phẩm thực tế.
      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
    • Cảm ơn vì đã viết cuốn sách này. Tôi gần xong phần 1 và đang làm theo bằng Haskell chỉ vì muốn thử thôi, nhưng qua mỗi chương tôi lại nhận ra những “mẹo lắt léo thông minh” mình nghĩ ra thực ra chẳng thông minh lắm trước các yêu cầu xuất hiện ở phần sau.
      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
    • Game Programming Patterns cũng rất xuất sắc. Cả hai cuốn sách đều có văn phong thẳng thắn, trực diện.
      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
    • Tôi vẫn chưa đọc xong hết cuốn sách, nhưng thật sự rất biết ơn vì bạn đã phát hành miễn phí nó trên mạng. Tôi đã mua cả bản in, PDF và Kindle, và cũng khuyên người khác ủng hộ tác giả theo cách đó
    • Cuốn này và Writing An Interpreter In Go là hai cuốn tôi rất muốn đọc khi có thêm thời gian. Tôi có khá nhiều ý tưởng muốn thử làm một ngôn ngữ dàn trang cơ bản
  • 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

    • Bạn nói mình là “kỹ sư đầy tham vọng”, nhưng nếu đã làm ra Crumb thì đó đã là tin tốt rồi
    • Có thể gọi bạn là kỹ sư rồi đấy. Không cần phải khiêm tốn, và cũng không phải cứ hoàn thành bằng khoa học máy tính mới trở thành kỹ sư.
      Tài liệu rất tốt và dự án cũng rất ấn tượng
    • Trông rất hay. Tôi tò mò bạn đã quyết định đưa những kiểu dữ liệu nào vào bằng cách nào
  • 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

    • Tôi tò mò ngoài compiler ra thì nó còn hữu ích ở đâu nữa. Ví dụ như phân tích cú pháp định dạng dữ liệu chẳng hạn
  • 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

    • Với tôi, cuốn sách này đã khiến những chủ đề như thế không còn mang màu sắc thần bí nữa, mà ngược lại còn giúp tôi bắt đầu được bước thứ hai và thứ ba.
      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
    • Tôi đã không biết phải bắt đầu từ đâu, và từng nghĩ những dự án kiểu này là thứ ma thuật vượt quá khả năng của mình. Nhưng sau khi đọc Crafting Interpreters, tôi nhận ra mình chỉ cần một cú hích nhỏ về mặt tư duy.
      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
    • Tôi vẫn nhớ lúc mới bắt đầu học Java, tôi đã muốn tự tạo ra một ngôn ngữ. Tôi từng tự triển khai thuật toán độ ưu tiên toán tử mà không cần tra cứu, theo kiểu duyệt qua danh sách token và mỗi lần tìm biểu thức con có ưu tiên cao nhất.
      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 đó
    • Tôi cũng đã làm đúng kiểu như vậy. Làm bước đầu tiên bằng cách tạo một ngôn ngữ kiểu TeX để triển khai định nghĩa và thay thế macro.
      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ồ

    • Không nhất thiết lúc nào cũng phải là một khối lượng công việc khổng lồ. Trình thông dịch lambda calculus viết bằng Lisp-trong-Lisp trong sách SICP hay bản viết bằng Haskell ban đầu đều gói gọn trong một màn hình
  • 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

    • Tôi đã nhiều lần được đề nghị viết một cuốn sách như vậy, nhưng lý do lớn khiến tôi դեռ chưa viết là vì đây là một chủ đề quá rộng mở
      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
    • Modern Compiler Implementation in ML của A. W. Appel
      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
    • Cốt lõi của đa hình tham số và suy luận kiểu rốt cuộc là triển khai Algorithm W. Bạn có thể tìm các bản triển khai đồ chơi trên mạng rồi tự tay nghịch thử
      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
    • Hơi thiên về lý thuyết hơn một chút, nhưng việc chậm rãi theo học khóa học trình biên dịch trên Coursera là một bước ngoặt lớn đối với tôi. Có những video tôi phải xem lại nhiều lần
      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