3 คะแนน โดย GN⁺ 2024-07-13 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-07-13
ความคิดเห็นจาก Hacker News
  • ผมเป็นผู้เขียนเองครับ เห็นเสียงตอบรับเชิงบวกต่อหนังสือของผมแล้วรู้สึกอบอุ่นใจมาก ผมทุ่มเวลาและความรักลงไปเยอะ และพอได้เห็นว่ามันให้ผลอย่างที่หวังไว้ก็รู้สึกคุ้มค่ามาก

    • ผมเป็นวิศวกรซอฟต์แวร์ที่เรียนด้วยตัวเอง และเพิ่งเริ่มเขียนโปรแกรมตอนอายุ 21 ในงานแรก ผมได้รับมอบหมายให้สร้าง ภาษา query แบบง่าย กับ interpreter ของมัน ผมไม่รู้เลยว่า interpreter คืออะไร แต่ในปี 2017 ผมเจอหนังสือเล่มนี้ออนไลน์ แล้วภายใน 3–4 วันก็ทำต้นแบบที่รันได้ และอีก 1–2 สัปดาห์ถัดมาก็ทำเป็นผลิตภัณฑ์จริงได้
      แหล่งข้อมูลนี้ทำให้ผมมั่นใจขึ้นมาก และจนถึงตอนนี้ผมก็ยังจำโปรเจกต์นั้นได้ว่าเป็นหนึ่งในงานที่ชอบที่สุด
    • ขอบคุณที่เขียนหนังสือเล่มนี้ ตอนนี้ผมใกล้จบภาค 1 แล้ว และลองทำตามด้วย Haskell เพราะแค่อยากลอง ทุกบททำให้ผมรู้ตัวว่า “ทริกฉลาด ๆ” ที่ผมคิดขึ้นมาเองนั้น พอเจอกับข้อกำหนดในบทถัด ๆ ไปแล้วไม่ได้ฉลาดนัก
      ผมก็สงสัยด้วยว่ามีความคิดจะเขียนหนังสือต่อ เช่น compiler หรือ JIT สำหรับ Lox ไหม และ lexical analygator นี่สุดยอดมาก มันโผล่ในพรีเซนต์ภายในบริษัทหลายครั้งพร้อมเครดิตแหล่งที่มา และช่วงหนึ่งยังมีแฟนอาร์ตบนไวต์บอร์ดด้วย
    • Game Programming Patterns ก็ยอดเยี่ยมเหมือนกัน หนังสือทั้งสองเล่มให้ความรู้สึกว่าสำนวนตรงไปตรงมาและจริงใจ
      ผู้เขียนบางคนเหมือนรู้สึกว่าต้องทำให้สาขานี้ดูเป็นมนตร์ดำไปหมด แต่ก็อาจเป็นเพราะผมยังไม่เก่งพอจะเข้าใจ GoF design patterns ก็ได้
    • ผมยังอ่านหนังสือไม่จบ แต่ขอบคุณจริง ๆ ที่เปิดให้อ่านออนไลน์แบบ ฟรี ผมซื้อทั้งฉบับกระดาษ, PDF และ Kindle แล้ว และก็แนะนำคนอื่น ๆ ให้สนับสนุนผู้เขียนแบบนั้นด้วย
    • หนังสือเล่มนี้กับ Writing An Interpreter In Go เป็นหนังสือที่ผมอยากอ่านให้ได้เมื่อมีเวลามากขึ้น ผมมีไอเดียอยู่พอสมควรว่าอยากลองทำภาษา typesetting พื้นฐานสักตัว
  • ตอนสร้าง Crumb(https://github.com/liam-ilan/crumb) ผมอ่าน Crafting Interpreters และโดยเฉพาะส่วนเรื่อง scope กับ local variables นั้นจำเป็นมาก
    มันสมดุลดีระหว่างการ implement เชิงเทคนิคกับ insight เชิงแนวคิด จึงช่วยได้มากแม้ตอนที่ผมพยายามออกนอกเส้นทางที่หนังสือกำหนดไว้ งานเขียนเชิงเทคนิคแบบนี้เป็นแหล่งข้อมูลคุณภาพสูงระดับที่ควรยึดเป็นเป้าหมาย

    • คุณบอกว่าเป็น “วิศวกรที่ใฝ่ฝันจะเป็น” แต่ดูจากการที่สร้าง Crumb แล้ว ผมมีข่าวดีมาบอก
    • เรียกตัวเองว่าวิศวกรได้แล้ว ไม่ต้องถ่อมตัวหรอก และไม่จำเป็นต้องเรียนจบ ปริญญาวิทยาการคอมพิวเตอร์ ก่อนถึงจะเป็นวิศวกร
      เอกสารก็ดี โปรเจกต์ก็เจ๋ง
    • ดูเจ๋งดี อยากรู้ว่าตัดสินใจอย่างไรว่าจะใส่ ชนิดข้อมูล อะไรบ้าง
  • ส่วนที่ผมชอบที่สุดในหนังสือเล่มนี้คือ มันพาให้เราเขียน 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

    • อยากรู้ว่ามีประโยชน์ตรงไหนนอกจาก compiler บ้าง เช่น อาจเป็นเรื่อง การ parse รูปแบบข้อมูล อะไรทำนองนั้น
  • ข้อดีรอง ๆ แต่บางทีอาจสำคัญพอ ๆ กันของหนังสือเล่มนี้คือ มันสอนเรื่อง ความชัดเจน
    ทั้งเนื้อหา โค้ด โครงสร้าง และจังหวะการเล่า ล้วนชัดเจนและตรงประเด็น คำว่า “Crafting” เหมาะมาก เพราะรู้สึกเหมือนเป็นหนังสือที่ช่างฝีมือเขียนให้ช่างฝีมืออ่าน

  • ผมคิดว่าหนังสือเล่มนี้ควรเป็นขั้นที่สองหรือสามในเส้นทางการเรียนรู้ compiler สำหรับภาษาโปรแกรม
    ขั้นแรกคือ ตอนยังไม่รู้อะไรเลยเกี่ยวกับ interpreter หรือการออกแบบภาษา ให้ลองเขียน interpreter สำหรับภาษาง่าย ๆ ที่สร้างเองด้วยตัวเอง ขั้นที่สองคือเขียนมันใหม่โดยลดความผิดพลาดลง
    ถ้าไม่ทำแบบนี้ ก็ยากที่จะซาบซึ้งกับความละเอียดอ่อนของหัวข้อนี้อย่างแท้จริง และจะเผลอข้ามแนวคิดที่ดูเหมือนไม่สำคัญไป

    • สำหรับผม หนังสือเล่มนี้ทำให้หัวข้อพวกนี้ไม่ดูเป็นเรื่องลึกลับ และกลับเป็นสิ่งที่ทำให้ผมเริ่มขั้นที่สองกับสามได้
      ไม่จำเป็นต้องคิดค้นทุกเทคนิคขึ้นมาใหม่ด้วยตัวเองตั้งแต่แรกก็ได้ การยืนบนไหล่ยักษ์เป็นเรื่องธรรมชาติ
    • ผมไม่รู้ว่าจะเริ่มจากตรงไหน และคิดว่าโปรเจกต์แบบนี้เป็นเวทมนตร์ที่เกินความสามารถของผม แต่พออ่าน Crafting Interpreters แล้วก็รู้ว่าความคิดของผมแค่ต้องการแรงผลักเล็ก ๆ เท่านั้น
      ถ้าไม่ได้อ่านอะไรอย่าง CI ก่อน ผมคงไม่ลองเขียน interpreter เอง และคงไปไม่ถึงขั้นที่สาม
    • ตอนเพิ่งเริ่มเรียน Java ผมยังจำได้ว่าอยากสร้างภาษาของตัวเอง ผม implement อัลกอริทึมลำดับความสำคัญของตัวดำเนินการ ได้โดยไม่ต้องค้นหา โดยใช้วิธีกวาดดูรายการ token แล้วหา subexpression ที่มีลำดับความสำคัญสูงสุดในแต่ละครั้ง
      ไม่มี recursion ใช้วิธี push/pop stack เอง ปัญหาคือผมไม่เข้าใจ parsing อย่างถูกต้อง เลย implement ภาษาส่วนใหญ่ด้วย string.split กับ string.replace และอย่างที่คาด ก็มีแนวคิดหลายอย่างที่ซ้อนกันไม่ได้ เสียดายที่ไม่ได้เก็บ source code ไว้
    • ผมก็ทำแบบนั้นเป๊ะ ขั้นแรกคือสร้าง ภาษาคล้าย TeX เพื่อ implement การนิยามและแทนที่ macro
      ผ่านไปไม่กี่วัน ผมเจอ bug มากมายจนเริ่มมีท่าทีเชิงวิชาการมากขึ้นและเริ่มอ่านหนังสือ ถึงอย่างนั้นมันก็เป็นขั้นแรกที่ยอดเยี่ยม เพราะถ้าไม่มีความพยายามแบบนั้น ผมอาจไม่รู้ด้วยซ้ำว่านี่เป็นหัวข้อที่ต้องใช้หนังสือทั้งเล่ม
  • ผมนับถือคนที่มีความทุ่มเทแบบนั้น และทุกคนที่คอยดูแลโครงสร้างพื้นฐานสำหรับการพัฒนาอย่างมาก แต่ก็รู้สึกโล่งใจที่ช่วง “อยากสร้างภาษาเอง” ของผมจบลงเป็นแค่ความสนใจชั่วคราว
    ปริมาณงานมันมหาศาลจริง ๆ

    • ไม่จำเป็นต้องเป็นงานมหาศาลเสมอไป ตัว Lisp-in-Lisp ในหนังสือ SICP ฉบับดั้งเดิม หรืออินเทอร์พรีเตอร์แลมบ์ดาแคลคูลัสที่เขียนด้วย Haskell ยังใส่ได้ในหน้าจอเดียว
  • อยากรู้ว่ามีแหล่งข้อมูลดี ๆ สำหรับสร้าง ภาษาที่มีชนิดแบบสแตติก ที่มีสิ่งอย่างพาราเมตริกพอลิมอร์ฟิซึมและการอนุมานชนิดพื้นฐานหรือไม่

    • มีคนขอให้เขียนหนังสือแนวนี้หลายครั้งแล้ว แต่เหตุผลใหญ่ที่ยังไม่ได้เขียนคือหัวข้อนี้เปิดกว้างเกินไป
      ใน Crafting Interpreters ผมรู้สึกว่าสามารถสร้างภาษาขนาดเล็กที่จบในตัวเอง ซึ่งใส่แนวคิดแทบทั้งหมดที่อยากสอนได้ เช่น สโคปของตัวแปร ฟังก์ชัน คลอเชอร์ คลาสกับไดนามิกดิสแพตช์ และโฟลว์ควบคุม
      แต่ในระบบชนิดมีทางแยกในพื้นที่ออกแบบมากเกินไป และไม่มีเส้นทาง “ที่ดีที่สุด” ที่ชัดเจน ตัวเลือกอย่างมี subtyping หรือไม่, generics ถูกลบออกหรือถูกทำให้เป็นรูปธรรม, โค้ด generic ถูก specialize ตอนคอมไพล์หรือไม่, การอนุมานชนิดเป็นแบบ local หรือ Hindley-Milner ล้วนเป็นทางแยกทั้งนั้น
      ไม่ว่าจะเลือกทางไหน ก็จะพลาดเนื้อหาสำคัญของกิ่งที่ไม่ได้เลือก และอาจทำให้ผู้อ่านที่คาดหวังอีกเส้นทางหนึ่งผิดหวัง บางทีหนังสือแบบ ภาพรวม ที่กว้างกว่าอย่าง Types and Programming Languages อาจเหมาะกว่า แต่แบบนั้นก็จะเสียความสนุกของการค่อย ๆ สร้างสิ่งที่สอดคล้องเป็นหนึ่งเดียวไป
    • มี Modern Compiler Implementation in ML ของ A. W. Appel
      หนังสือเล่มเดียวกันมีฉบับ C และ Java ด้วย แต่ผมมองว่าด้อยกว่า ใช้คู่กับฉบับ ML น่าจะดีกว่า
    • แก่นของพาราเมตริกพอลิมอร์ฟิซึมและการอนุมานชนิด สุดท้ายก็คือการ implement Algorithm W ลองหา toy implementation ออนไลน์แล้วลงมือแก้เล่นเองได้เลย
      ผมเห็นว่า implementation ที่ https://github.com/wh5a/Algorithm-W-Step-By-Step/blob/master... เป็นสไตล์เก่ามาก จึงปรับให้ทันสมัยและจัดระเบียบจนได้ https://gist.github.com/kccqzy/fa8a8ae12a198b41c6339e8a5c459... จากนั้นก็ตั้งใจ “ทำให้พัง” หลายส่วนเพื่อดูว่าอัลกอริทึมพังอย่างไร
    • จะออกแนวทฤษฎีกว่าเล็กน้อย แต่การค่อย ๆ เรียนตาม คอร์สคอมไพเลอร์ ของ Coursera เป็นจุดเปลี่ยนครั้งใหญ่สำหรับผม วิดีโอบางตอนต้องย้อนดูหลายรอบ
      ขอแนะนำอย่างยิ่งให้ลองทำงานด้านวิทยาการคอมพิวเตอร์สักอย่างที่เคยคิดว่ามีแต่นักเวทเท่านั้นที่ทำได้ ในรูปแบบที่เข้าถึงได้ พอทำสำเร็จไปหนึ่งหรือสองอย่างแล้ว จะรู้ว่าถึงจะยาก แต่โดยรวมก็เป็นงานที่ค่อย ๆ ฝืนดันไปทีละขั้นได้ และจะมั่นใจขึ้นมาก ใครอยากเดินเส้นทางนี้ติดต่อได้ที่ zellyn@(most things)
  • เพิ่งอ่านจบภาค 2 และเป็นหนังสือที่ดีมาก การ ลองทำโจทย์ที่เสนอไว้ในแต่ละบทเองสักหนึ่งหรือสองข้อ ช่วยให้เข้าใจเนื้อหาได้มาก