- หนังสือที่พาเรียนรู้ การออกแบบและการพัฒนาภาษาการเขียนโปรแกรม ด้วยตัวเอง พร้อมอธิบายกระบวนการสร้างภาษาสคริปต์ที่สมบูรณ์แบบ
- อธิบายเป็นลำดับขั้นตั้งแต่แนวคิดระดับสูงอย่าง parsing, semantics, bytecode, garbage collection ไปจนถึงการลงมือพัฒนาระดับล่าง
- เริ่มจากฟังก์ชัน
main() แล้วค่อย ๆ เขียนภาษาที่รองรับ dynamic typing, lexical scope, first-class functions, classes, inheritance ด้วยตัวเอง
- มีให้ใช้งานใน 4 รูปแบบ ได้แก่ ฉบับพิมพ์, eBook, PDF และเวอร์ชันเว็บ โดยบนเว็บสามารถอ่านเนื้อหาทั้งหมดได้ฟรี
- เขียนโดย Robert Nystrom ผู้พัฒนาภาษา Dart ที่ Google และเป็นแหล่งเรียนรู้เชิงปฏิบัติที่สำคัญสำหรับนักพัฒนาที่สนใจการสร้างภาษา
ภาพรวมหนังสือ
- Crafting Interpreters เป็นหนังสือว่าด้วยวิธีสร้าง ภาษาสคริปต์ที่มีประสิทธิภาพและใช้งานได้ครบถ้วน ขึ้นมาด้วยตัวเอง
- ครอบคลุมทั้ง แนวคิดระดับสูง อย่าง parsing และ semantics รวมถึง รายละเอียดการพัฒนาระดับล่าง อย่างการแทนค่าแบบ bytecode และ garbage collection
- ออกแบบมาให้ผู้อ่านลงมือเขียนโค้ดเองเพื่อทำความเข้าใจโครงสร้างของภาษาได้อย่างครบถ้วน
- ภาษาที่สร้างเสร็จจะรองรับ ไวยากรณ์ที่หลากหลาย, dynamic typing, garbage collection, lexical scope, first-class functions, closures, classes, inheritance
- ประกอบด้วย โค้ดที่กระชับและทำงานรวดเร็ว หลายพันบรรทัด ซึ่งผู้อ่านจะเป็นผู้เขียนทั้งหมดด้วยตนเอง
รูปแบบที่มีให้
- หนังสือมีให้ใน 4 รูปแบบคือ Print, eBook, PDF, Web
- Print: ความยาว 640 หน้า พร้อมภาพประกอบวาดมือความละเอียดสูงและงานจัดพิมพ์ที่ประณีต
- eBook: CSS ปรับตามขนาดหน้าจอของอุปกรณ์ และรองรับ การเน้นไวยากรณ์แบบสีและไฮเปอร์ลิงก์
- PDF: ถ่ายทอดรูปแบบการจัดหน้าและภาพประกอบจากฉบับพิมพ์ไว้อย่างครบถ้วน พร้อมพกพาได้สะดวกขึ้น
- Web: ใช้ดีไซน์แบบ responsive มีครบทุกบทและภาพประกอบ และ เปิดให้อ่านฟรีทั้งหมด
แนะนำผู้เขียน
- ผู้เขียน Robert Nystrom มีส่วนร่วมในการพัฒนา ภาษา Dart ที่ Google
- ก่อนหน้านี้เคยทำงาน พัฒนาเกมเป็นเวลา 8 ปี ที่ Electronic Arts
- เป็นผู้เขียนหนังสือขายดี Game Programming Patterns ซึ่งเปิดให้อ่านฟรีเช่นกัน
- ด้วยความหลงใหลในการสร้างภาษา เขาจึงพัฒนา โปรเจกต์ภาษางานอดิเรก (Wren, Magpie, Finch, Vigil) หลายตัว
- เขาเคลื่อนไหวผ่านบล็อกส่วนตัวและทวิตเตอร์(
@munificentbob) พร้อมดูแล เมลลิงลิสต์ ที่เกี่ยวข้องกับหนังสือ
ช่องทางการเข้าถึงและการซื้อ
- ฉบับพิมพ์สามารถซื้อได้จากร้านหนังสือหลักอย่าง Amazon, Barnes & Noble, Book Depository
- eBook มีให้บน Kindle, Apple Books, Google Play Books, Smashwords และแพลตฟอร์มอื่น ๆ
- เวอร์ชัน PDF ซื้อได้ผ่าน Payhip และมี PDF ตัวอย่างฟรี ให้ดาวน์โหลด
- เวอร์ชันเว็บเปิดให้อ่านได้ครบทั้งเล่มฟรีบนเว็บไซต์ทางการ
1 ความคิดเห็น
ความเห็นจาก Hacker News
และยังทำให้เข้าใจแนวคิด Class Hierarchy Inheritance แบบที่ไม่ต้องพึ่ง visitor อย่างถ่องแท้ด้วย
ในภาษา Newspeak สามารถมี nested class อยู่ภายในคลาสได้ และเมื่อสืบทอดคลาส nested class เหล่านั้นก็จะถูกสืบทอดไปด้วย
ฟีเจอร์นี้คือสิ่งที่ทำให้ Free Object Algebras เป็นไปได้ ซึ่งกล่าวถึงไว้ในบล็อกโพสต์นี้
อ้างอิง: บทความ Expression Problem, เว็บไซต์ทางการของ Newspeak
ในปี 2020 ได้ 777 คะแนน และในปี 2024 ได้ 607 คะแนน
เพราะได้เรียนรู้ผ่านการลงมือสร้างฟีเจอร์และแพตเทิร์นของภาษาต่าง ๆ ด้วยตัวเอง
สำหรับภาษาที่มีฟีเจอร์ซึ่ง Java ไม่มี การนำแพตเทิร์นคล้ายกันมาใช้จะยากหน่อย แต่ ความท้าทายนั้นเองก็สนุก
ชอบ สำนวนการเขียนแบบสบาย ๆ ของผู้เขียนและมุกตลกที่แทรกอยู่ตลอดมาก
อยากให้มีภาคต่ออย่าง “เพิ่ม type checker ให้ Lox”
ตอนแรกซื้อฉบับกระดาษ แต่เล่มใหญ่และหนักเกินไป สุดท้ายเลยซื้อ e-book อีกรอบ
จดโน้ตและค้นหาได้สะดวกกว่ามาก
แต่เวลาอ่านก็ยังมีบางช่วงที่ให้ความรู้สึกเหมือนหลงทางอยู่กลางภูเขา :)
และขอแนะนำหนังสืออีกเล่มของผู้เขียนคือ Game Programming Patterns ด้วย
ร้านพิมพ์ทำให้ได้ไม่ยาก และใช้งานบนโต๊ะสะดวกกว่ามาก
แต่สำหรับ Crafting Interpreters เป็นหนังสือที่ไม่มีทางทิ้งได้ เลยยังคงสภาพเดิมไว้
แค่นี้ก็บอกได้แล้วว่ามันยอดเยี่ยมแค่ไหน
แถม เวอร์ชันเว็บยังเปิดให้อ่านฟรี ซึ่งใจกว้างมากจริง ๆ
แค่เสียดายที่ เวอร์ชัน Java ค่อนข้างเก่า
อยากให้มีฉบับปรับปรุงที่สะท้อนฟีเจอร์ใหม่อย่าง sealed classes หรือ exhaustive switch
ถ้าทำแบบนั้น ก็ไม่จำเป็นต้องใช้เครื่องมือสร้างโค้ดชั่วคราวที่ผู้เขียนทำไว้
typedefของ C++ อย่างไรมีวิธีแบบแฮ็ก ๆ คือเพิ่ม context stack เข้าไปใน PEG-based parser แต่ปัญหาเรื่องการสลับไวยากรณ์ก็ยังยากอยู่ดี
คิดว่า persistent data structure หรือ transactional data structure อาจช่วยได้ แต่ก็ยังไม่เจอการนิยามเชิงรูปแบบที่ชัดเจน
วิธีคือทำให้ parser ส่งสถานะไปยัง lexer เพื่อให้ lexer รู้จักชุดของชื่อประเภท
ตัวอย่างเช่นในไลบรารีอย่าง Parsec สามารถใช้สัญกรณ์ ‘do’ เพื่อให้ผลลัพธ์ของแต่ละขั้นถูกแชร์ไปยัง parser ขั้นถัดไปได้
โชคดีที่ Rust และ Go หลีกเลี่ยงปัญหาแบบนี้ได้ และถ้าออกแบบอย่างระมัดระวังก็ป้องกันได้เพียงพอ
แนะนำให้ดู โปรเจกต์ shi และถ้าสนใจฝั่งภาษา C ก็ลองดู hacktical-c