เทคนิคการสร้างอินเทอร์พรีเตอร์
(craftinginterpreters.com)- Crafting Interpreters เป็นหนังสือที่ออกแบบมาเพื่อให้ผู้อ่านที่อยากลองสร้างภาษาด้วยตนเอง สามารถทำตามการ พัฒนาภาษาสคริปต์ที่สมบูรณ์ ได้ตั้งแต่ต้นจนจบ
- ครอบคลุมเป็นลำดับเดียวตั้งแต่ แนวคิดการออกแบบภาษา เช่น การพาร์สและเซแมนติก ไปจนถึงการพัฒนาในระดับรันไทม์ เช่น การแทนค่าไบต์โค้ดและการเก็บขยะ
- ผู้อ่านจะเริ่มจาก
main()และลงมือพัฒนาภาษาที่มี dynamic typing, lexical scope, first-class function, closure, class และ inheritance ด้วยตนเอง - ให้ผู้อ่านเขียนโค้ดที่สะอาดและรวดเร็วระดับหลายพันบรรทัดทั้งหมดด้วยตัวเอง เพื่อเน้นที่ ความเข้าใจการทำงานภายใน มากกว่าผลลัพธ์ที่เสร็จสมบูรณ์
- มีให้ใช้งานในรูปแบบหนังสือพิมพ์, eBook, PDF และเว็บ โดยบนเว็บสามารถอ่านทุกบท บทความเสริม และภาพประกอบได้ฟรี
ขอบเขตการพัฒนาในหนังสือ
- Crafting Interpreters เหมาะสำหรับผู้อ่านที่อยากสร้างภาษาโปรแกรมของตัวเอง หรืออยากเข้าใจว่าภาษาถูกออกแบบและพัฒนาอย่างไร
- หนังสือครอบคลุมหัวข้อแกนหลักที่จำเป็นต่อการพัฒนา ภาษาสคริปต์แบบฟูลฟีเจอร์
- การพาร์ส
- เซแมนติก
- การแทนค่าไบต์โค้ด
- การเก็บขยะ
- การพัฒนาเริ่มต้นจาก
main()และค่อย ๆ ขยายไปสู่ภาษาที่มีความสามารถดังต่อไปนี้- ไวยากรณ์ที่หลากหลาย
- dynamic typing
- lexical scope
- first-class function
- closure
- class
- inheritance
วิธีอ่านและผลลัพธ์ที่ได้
- แทนที่จะเพียงดูโค้ดตัวอย่าง ผู้อ่านจะได้ติดตาม โครงสร้างภายในของตัวประมวลผลภาษา ด้วยการเขียนแต่ละบรรทัดด้วยตนเอง
- โค้ดสุดท้ายมีขนาดระดับหลายพันบรรทัด และถูกออกแบบโดยมุ่งเป้าไปที่การพัฒนาที่สะอาดและรวดเร็ว
- แทนที่จะแยกอธิบายแนวคิดระดับสูงกับการพัฒนาระดับล่างออกจากกัน หนังสือออกแบบมาให้เข้าใจทั้งสองส่วนไปพร้อมกันผ่านกระบวนการสร้างภาษาหนึ่งภาษาให้เสร็จสมบูรณ์
รูปแบบที่มีให้
-
ฉบับพิมพ์
- เป็นหนังสือฉบับพิมพ์ความยาว 640 หน้า พร้อมภาพประกอบวาดมือความละเอียดสูงและงานจัดวางตัวอักษรที่ผู้เขียนจัดเอง
- Amazon.com
- Barnes and Noble
- Download Sample PDF
-
eBook
- มี CSS ที่เหมาะกับเครื่องอ่าน eBook และขนาดหน้าจอ พร้อมการเน้นไวยากรณ์แบบสีเต็มรูปแบบและไฮเปอร์ลิงก์แบบใช้งานได้จริง
- Kindle Amazon.com
- Apple Books
- Play Books Google
- Nook B&N
- EPUB Smashwords
-
PDF
- จัดทำให้พกพาได้สะดวกโดยยังคงงานจัดหน้าด้วยมือและภาพประกอบที่คมชัดเหมือนฉบับพิมพ์
- Buy from Payhip
- Download Free Sample
-
เว็บ
- มีดีไซน์แบบ responsive ที่รองรับตั้งแต่เดสก์ท็อปถึงโทรศัพท์มือถือ และสามารถอ่านทุกบท บทความเสริม และภาพประกอบทั้งหมดได้ฟรี
- Read Now
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมเป็นผู้เขียนเองครับ เห็นเสียงตอบรับเชิงบวกต่อหนังสือของผมแล้วรู้สึกอบอุ่นใจมาก ผมทุ่มเวลาและความรักลงไปเยอะ และพอได้เห็นว่ามันให้ผลอย่างที่หวังไว้ก็รู้สึกคุ้มค่ามาก
แหล่งข้อมูลนี้ทำให้ผมมั่นใจขึ้นมาก และจนถึงตอนนี้ผมก็ยังจำโปรเจกต์นั้นได้ว่าเป็นหนึ่งในงานที่ชอบที่สุด
ผมก็สงสัยด้วยว่ามีความคิดจะเขียนหนังสือต่อ เช่น compiler หรือ JIT สำหรับ Lox ไหม และ lexical analygator นี่สุดยอดมาก มันโผล่ในพรีเซนต์ภายในบริษัทหลายครั้งพร้อมเครดิตแหล่งที่มา และช่วงหนึ่งยังมีแฟนอาร์ตบนไวต์บอร์ดด้วย
ผู้เขียนบางคนเหมือนรู้สึกว่าต้องทำให้สาขานี้ดูเป็นมนตร์ดำไปหมด แต่ก็อาจเป็นเพราะผมยังไม่เก่งพอจะเข้าใจ GoF design patterns ก็ได้
ตอนสร้าง Crumb(https://github.com/liam-ilan/crumb) ผมอ่าน Crafting Interpreters และโดยเฉพาะส่วนเรื่อง scope กับ local variables นั้นจำเป็นมาก
มันสมดุลดีระหว่างการ implement เชิงเทคนิคกับ insight เชิงแนวคิด จึงช่วยได้มากแม้ตอนที่ผมพยายามออกนอกเส้นทางที่หนังสือกำหนดไว้ งานเขียนเชิงเทคนิคแบบนี้เป็นแหล่งข้อมูลคุณภาพสูงระดับที่ควรยึดเป็นเป้าหมาย
เอกสารก็ดี โปรเจกต์ก็เจ๋ง
ส่วนที่ผมชอบที่สุดในหนังสือเล่มนี้คือ มันพาให้เราเขียน interpreter สองตัวที่ต่างกัน สำหรับภาษาเดียวกัน
ทำให้เข้าใจส่วนที่ซับซ้อนและละเอียดอ่อนกว่าของกระบวนการสร้างภาษาโปรแกรมได้ดี ในครึ่งแรกของหนังสือ เราได้สัมผัสไอเดียใหญ่ ๆ ก่อนและเริ่มคุ้นเคยกับมัน จากนั้นเมื่อเจออีกครั้งใน interpreter ตัวที่สอง ก็ซึมซับส่วนที่น่าสนใจได้อย่างเต็มที่ เป็นหนังสือที่น่าทึ่งจริง ๆ
พูดถึงแหล่งข้อมูลเรื่อง compiler อื่น ๆ แม้ผมยังดูไม่จบ แต่วิดีโอของ Immo Landwerth ที่สร้าง compiler ด้วย C# พร้อมสร้าง IL และ debug symbols ฯลฯ ก็ดีเหมือนกัน
เป็นเนื้อหาประมาณ 5 ปีก่อน เลยไม่ใช่ syntax C# รุ่นล่าสุด และน่าจะเป็นช่วงราว ๆ .NET Core 3 แต่สำหรับงานส่วนใหญ่คงไม่มีปัญหาใหญ่ แต่อาจมี warning เรื่อง nullable reference types เยอะ
https://www.youtube.com/playlist?list=PLRAdsfhKI4OWNOSfS7EUu...
ผมรู้สึกว่าโปรแกรมเมอร์ส่วนใหญ่ควรลองทำตามหนังสือเล่มนี้จนจบสักครั้งในชีวิต พอทำแบบนั้นแล้ว ผมเข้าใจขึ้นมากว่า compiler หรือเครื่องมือภาษาเบื้องหลังทำงานจริง ๆ อย่างไร
ในบรรดาไกด์เชิงเทคนิคที่ผมเคยทำตามมา เล่มนี้เป็นหนึ่งในงานที่เขียนได้ดีที่สุด และช่วยให้ผมทำความเข้าใจแนวคิดจนเป็นของตัวเองได้มาก แนวคิดเหล่านั้นมีประโยชน์ในหลายที่ ไม่ใช่แค่ compiler
ข้อดีรอง ๆ แต่บางทีอาจสำคัญพอ ๆ กันของหนังสือเล่มนี้คือ มันสอนเรื่อง ความชัดเจน
ทั้งเนื้อหา โค้ด โครงสร้าง และจังหวะการเล่า ล้วนชัดเจนและตรงประเด็น คำว่า “Crafting” เหมาะมาก เพราะรู้สึกเหมือนเป็นหนังสือที่ช่างฝีมือเขียนให้ช่างฝีมืออ่าน
ผมคิดว่าหนังสือเล่มนี้ควรเป็นขั้นที่สองหรือสามในเส้นทางการเรียนรู้ compiler สำหรับภาษาโปรแกรม
ขั้นแรกคือ ตอนยังไม่รู้อะไรเลยเกี่ยวกับ interpreter หรือการออกแบบภาษา ให้ลองเขียน interpreter สำหรับภาษาง่าย ๆ ที่สร้างเองด้วยตัวเอง ขั้นที่สองคือเขียนมันใหม่โดยลดความผิดพลาดลง
ถ้าไม่ทำแบบนี้ ก็ยากที่จะซาบซึ้งกับความละเอียดอ่อนของหัวข้อนี้อย่างแท้จริง และจะเผลอข้ามแนวคิดที่ดูเหมือนไม่สำคัญไป
ไม่จำเป็นต้องคิดค้นทุกเทคนิคขึ้นมาใหม่ด้วยตัวเองตั้งแต่แรกก็ได้ การยืนบนไหล่ยักษ์เป็นเรื่องธรรมชาติ
ถ้าไม่ได้อ่านอะไรอย่าง CI ก่อน ผมคงไม่ลองเขียน interpreter เอง และคงไปไม่ถึงขั้นที่สาม
ไม่มี recursion ใช้วิธี push/pop stack เอง ปัญหาคือผมไม่เข้าใจ parsing อย่างถูกต้อง เลย implement ภาษาส่วนใหญ่ด้วย string.split กับ string.replace และอย่างที่คาด ก็มีแนวคิดหลายอย่างที่ซ้อนกันไม่ได้ เสียดายที่ไม่ได้เก็บ source code ไว้
ผ่านไปไม่กี่วัน ผมเจอ bug มากมายจนเริ่มมีท่าทีเชิงวิชาการมากขึ้นและเริ่มอ่านหนังสือ ถึงอย่างนั้นมันก็เป็นขั้นแรกที่ยอดเยี่ยม เพราะถ้าไม่มีความพยายามแบบนั้น ผมอาจไม่รู้ด้วยซ้ำว่านี่เป็นหัวข้อที่ต้องใช้หนังสือทั้งเล่ม
ผมนับถือคนที่มีความทุ่มเทแบบนั้น และทุกคนที่คอยดูแลโครงสร้างพื้นฐานสำหรับการพัฒนาอย่างมาก แต่ก็รู้สึกโล่งใจที่ช่วง “อยากสร้างภาษาเอง” ของผมจบลงเป็นแค่ความสนใจชั่วคราว
ปริมาณงานมันมหาศาลจริง ๆ
อยากรู้ว่ามีแหล่งข้อมูลดี ๆ สำหรับสร้าง ภาษาที่มีชนิดแบบสแตติก ที่มีสิ่งอย่างพาราเมตริกพอลิมอร์ฟิซึมและการอนุมานชนิดพื้นฐานหรือไม่
ใน Crafting Interpreters ผมรู้สึกว่าสามารถสร้างภาษาขนาดเล็กที่จบในตัวเอง ซึ่งใส่แนวคิดแทบทั้งหมดที่อยากสอนได้ เช่น สโคปของตัวแปร ฟังก์ชัน คลอเชอร์ คลาสกับไดนามิกดิสแพตช์ และโฟลว์ควบคุม
แต่ในระบบชนิดมีทางแยกในพื้นที่ออกแบบมากเกินไป และไม่มีเส้นทาง “ที่ดีที่สุด” ที่ชัดเจน ตัวเลือกอย่างมี subtyping หรือไม่, generics ถูกลบออกหรือถูกทำให้เป็นรูปธรรม, โค้ด generic ถูก specialize ตอนคอมไพล์หรือไม่, การอนุมานชนิดเป็นแบบ local หรือ Hindley-Milner ล้วนเป็นทางแยกทั้งนั้น
ไม่ว่าจะเลือกทางไหน ก็จะพลาดเนื้อหาสำคัญของกิ่งที่ไม่ได้เลือก และอาจทำให้ผู้อ่านที่คาดหวังอีกเส้นทางหนึ่งผิดหวัง บางทีหนังสือแบบ ภาพรวม ที่กว้างกว่าอย่าง Types and Programming Languages อาจเหมาะกว่า แต่แบบนั้นก็จะเสียความสนุกของการค่อย ๆ สร้างสิ่งที่สอดคล้องเป็นหนึ่งเดียวไป
หนังสือเล่มเดียวกันมีฉบับ C และ Java ด้วย แต่ผมมองว่าด้อยกว่า ใช้คู่กับฉบับ ML น่าจะดีกว่า
ผมเห็นว่า implementation ที่ https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... เป็นสไตล์เก่ามาก จึงปรับให้ทันสมัยและจัดระเบียบจนได้ https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... จากนั้นก็ตั้งใจ “ทำให้พัง” หลายส่วนเพื่อดูว่าอัลกอริทึมพังอย่างไร
ขอแนะนำอย่างยิ่งให้ลองทำงานด้านวิทยาการคอมพิวเตอร์สักอย่างที่เคยคิดว่ามีแต่นักเวทเท่านั้นที่ทำได้ ในรูปแบบที่เข้าถึงได้ พอทำสำเร็จไปหนึ่งหรือสองอย่างแล้ว จะรู้ว่าถึงจะยาก แต่โดยรวมก็เป็นงานที่ค่อย ๆ ฝืนดันไปทีละขั้นได้ และจะมั่นใจขึ้นมาก ใครอยากเดินเส้นทางนี้ติดต่อได้ที่ zellyn@(most things)
เพิ่งอ่านจบภาค 2 และเป็นหนังสือที่ดีมาก การ ลองทำโจทย์ที่เสนอไว้ในแต่ละบทเองสักหนึ่งหรือสองข้อ ช่วยให้เข้าใจเนื้อหาได้มาก