3 คะแนน โดย GN⁺ 2023-12-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Write Your Own Retro Compiler เป็นหนังสือ 339 หน้า ว่าด้วย คอมไพเลอร์แบบ self-hosting ที่ทำงานบน CP/M ซึ่งใช้ Z80 และสร้างโค้ดสำหรับสภาพแวดล้อมเดียวกัน พร้อมซอร์สโค้ดทั้งหมด
  • T3X/0 ซึ่งเป็นเป้าหมายของการติดตั้งใช้งาน เป็นภาษาที่เรียบง่าย มีรากฐานมาจาก Pascal และ BCPL และในหนังสือมีคู่มือฉบับเต็มความยาว 20 หน้า
  • ต้องมีความรู้เกี่ยวกับ ภาษาขั้นตอนวิธี อย่าง C หรือ Pascal และภาษาแอสเซมบลี โดยหากมีพื้นฐาน Z80 แอสเซมบลีและ CP/M จะตามได้ง่ายขึ้น
  • อธิบายการวิเคราะห์ศัพท์ การแยกวากยสัมพันธ์ การสร้างโค้ด การปรับแต่งอย่างง่าย อินเทอร์เฟซ BDOS และไลบรารีรันไทม์ ด้วยไดอะแกรม ตาราง และตัวอย่าง
  • โค้ดทั้งหมดเผยแพร่เป็น สาธารณสมบัติ และมีการเปิดเผยลิงก์สำหรับซื้อหนังสือฉบับพิมพ์และ PDF รวมถึงสารบัญ หน้าตัวอย่าง และดาวน์โหลดซอร์ส

ขอบเขตและกลุ่มผู้อ่านของหนังสือ

  • Write Your Own Retro Compiler เป็นหนังสือ 339 หน้า จาก Lulu Press ในปี 2023 มีภาพประกอบ 91 ภาพ ขนาด 6" x 9"
  • หัวข้อหลักคือคอมไพเลอร์แบบ self-hosting ที่ทำงานบน CP/M ของโปรเซสเซอร์ Z80 และสร้างโค้ดสำหรับสภาพแวดล้อมเดียวกัน
  • ออกแบบมาให้ผู้ที่ไม่มีประสบการณ์สร้างคอมไพเลอร์ก็สามารถทำตามได้
  • ภาษาในการพัฒนาที่ใช้คือ T3X/0 ซึ่งเป็นภาษาที่เรียบง่าย มีรากฐานมาจาก Pascal และ BCPL
  • ในหนังสือมีคู่มือฉบับเต็มของ T3X/0 ความยาว 20 หน้า

ความรู้ที่จำเป็น

  • ควรรู้จักอย่างน้อยหนึ่ง ภาษาโปรแกรมเชิงกระบวนวิธี
    • ยกตัวอย่าง C และ Pascal
  • ควรรู้ภาษาแอสเซมบลีอย่างน้อยหนึ่งภาษา และตามหลักแล้วควรมีความรู้แอสเซมบลีสำหรับ Z80 CPU
  • ต้องมีความรู้พื้นฐานเกี่ยวกับระบบปฏิบัติการ CP/M ด้วย
  • สำหรับผู้อ่านที่ศึกษาด้วยตนเอง มีบทแนะนำสั้น ๆ เกี่ยวกับภาษาแอสเซมบลีของ Z80 รวมอยู่ด้วย

องค์ประกอบของคอมไพเลอร์

  • อธิบายการทำงานภายในของคอมไพเลอร์ด้วย ไดอะแกรม ตาราง และตัวอย่างจำนวนมาก
  • หัวข้อที่ครอบคลุมมีดังนี้
    • การวิเคราะห์ศัพท์
    • การแยกวากยสัมพันธ์
    • การสร้างโค้ด
    • การปรับแต่งอย่างง่าย
    • อินเทอร์เฟซ BDOS

      • ไลบรารีรันไทม์

ลิงก์ที่ให้ไว้และโค้ด

1 ความคิดเห็น

 
GN⁺ 2023-12-11
ความคิดเห็นจาก Hacker News
  • ได้ออกหนังสือคอมไพเลอร์เล่มใหม่แล้ว ค่อนข้างเป็นฉบับขยายของ “Write Your Own Compiler” และคราวนี้พูดถึง การสร้างโค้ด CP/M สำหรับ Z80 แทน ELF ของระบบสมัยใหม่ ทำให้หลายส่วนเรียบง่ายขึ้นมาก
    จะได้เห็นว่าต้องซับซ้อนแค่ไหนถึงจะสร้างคอมไพเลอร์ที่คอมไพล์ตัวเองได้ภายใน 10 นาทีบนระบบ Z80 4MHz โค้ดฟรี แต่หนังสือมีค่าใช้จ่าย

    • ผมตั้งตารอดูเสมอว่า Nils จะทำอะไร หวังว่าเขาจะทำเรื่องแบบนี้เป็นธุรกิจที่ทำกำไรได้ด้วย และสักวันอยากซื้อทั้งหมดแล้วลองทำตามดู
      นอกจากนี้ก็อยากเห็นหนังสือเกี่ยวกับ Forth แบบไม่เยิ่นเย้อ และการตีความในสไตล์ของ Nils ด้วย
  • เมื่อเร็ว ๆ นี้ผมทำ คอมไพเลอร์ C แบบหลายพาส และแอสเซมเบลอร์สำหรับ CPU x86 รุ่นเก่าแบบนี้ด้วย TypeScript
    https://github.com/Mati365/ts-c-compiler

    • คอมไพเลอร์ในหนังสือเป็นของ Z80 ที่เก่ากว่านิดหน่อย และไม่มีแม้แต่คำสั่งคูณหรือหาร ถึงอย่างนั้นคอมไพเลอร์ตัวนี้ก็ยังเอาต์พุตโค้ดสำหรับ 8086 และ 386 ได้ด้วย
  • ผมมีหนังสือ Practical Compiler Construction ฉบับพิมพ์ครั้งที่ 2 แบบเล่มจริง และค่อนข้างชอบเลย ขอแนะนำ หนังสือของ Nils สำหรับคนที่สนใจ

  • หนังสือเล่มนี้ดูน่าสนุก แต่ผมก็ยังรอภาคต่อที่เหมาะสมของ The Dragon Book อยู่
    อยากได้หนังสือที่ครอบคลุม CPU สมัยใหม่ และถ้าเป็นไปได้ก็รวมถึงการปรับแต่งประสิทธิภาพ GPU ด้วย รวมทั้งวิธีออกแบบและเขียนเวอร์ชวลแมชชีนสมัยใหม่ที่มี garbage collector แบบ concurrent ที่รวดเร็วด้วย ในบางแง่อาจยากกว่าการเขียนคอมไพเลอร์เสียอีก

    • Building an Optimizing Compiler ของ Bob Morgan เป็นหนังสือที่มุ่งเน้นการปรับแต่งคอมไพเลอร์สมัยใหม่อย่างเต็มที่ และตีพิมพ์ในปี 1997
      ครอบคลุมตั้งแต่การสร้างกราฟควบคุมการไหล การปรับแต่งหลายแบบที่ทำได้บนกราฟนั้น การวิเคราะห์ alias รูปแบบ static single assignment การปรับแต่งโดยอิง dominator ของ CFG การจัดตารางคำสั่ง การจัดสรรเรจิสเตอร์ ไปจนถึงการสร้าง object code ไม่ได้พูดถึง lexical analysis, parsing, NFA/DFA เหมือนหนังสือคอมไพเลอร์ส่วนใหญ่
      สำหรับคนที่อยากสร้างคอมไพเลอร์ปรับแต่งประสิทธิภาพที่ต้องใช้การวิเคราะห์ขั้นสูง Static Program Analysis ก็น่าจะช่วยได้: https://cs.au.dk/~amoeller/spa/
      ส่วน garbage collection มี Garbage Collection handbook: https://gchandbook.org/
    • จำได้ว่าสมัยเป็นนักศึกษาไม่ค่อยชอบ The Dragon Book เท่าไร ตอนนี้จำเหตุผลได้ไม่ชัดแล้ว แต่น่าจะรู้สึกว่าโครงสร้างไม่ดี บางหัวข้อละเอียดเกินไป ขณะที่บางหัวข้ออธิบายไม่พอ
      ถ้ามีพื้นฐานอยู่บ้างแล้ว อาจชอบคอร์สนี้: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      โดยเฉพาะวิธีแนะนำ รูปแบบ SSA ที่ผมชอบ
      หัวข้อขั้นสูงกว่านี้อยู่ที่นี่: https://www.cs.cmu.edu/~15745/handouts.html
    • ผมเองก็รอหนังสือแบบนั้นอยู่เหมือนกัน ทุกวันนี้มันซับซ้อนเกินไปเพราะองค์ประกอบอย่าง ไมโครโค้ด/เฟิร์มแวร์ สมัยใหม่ และมีหลายอย่างที่ให้ความรู้สึกเหมือนเวทมนตร์
      เวลาอะไรสักอย่างให้ความรู้สึกเหมือน “เวทมนตร์” ผมมักมองว่าเป็นสัญญาณว่ามีใครบางคนหาทางเลี่ยงอย่างชาญฉลาดในสิ่งที่เคยคิดว่าเป็นข้อจำกัด ช่วงนี้ผมกำลังอ่านเรื่อง เบสปลอม ที่ทำให้ลำโพงขนาดเล็กดูเหมือนปล่อยเสียงทุ้มได้มากกว่าที่มันทำได้จริง วิธีที่ใช้ฮาร์มอนิกส์เพื่อหลอกสมองให้ได้ยินเสียงต่ำกว่าความจริงนั้นน่าสนใจดี
  • ดูน่าสนใจ แต่มีข้อเสียคือผู้อ่านต้องรู้หรือเรียนรู้ภาษาโปรแกรมใหม่อย่าง T3X ก่อน
    ผมยังสงสัยด้วยว่าจะสามารถเขียนและพัฒนาคอมไพเลอร์ตั้งแต่ศูนย์บนระบบ CP/M ย้อนยุคที่เชื่อมต่อกับโลกภายนอกได้แค่คีย์บอร์ดกับหน้าจอหรือไม่

    • ผมคิดเรื่องนี้เยอะมากก่อนเขียนหนังสือ สุดท้ายเลือก T3X เพราะคอมไพเลอร์ของมันเล็กกว่าคอมไพเลอร์สำหรับ subset ของ C ที่เล็กที่สุดอยู่มาก และโดยส่วนตัวผมคิดว่า T3X เรียนรู้และทำความเข้าใจได้ง่ายกว่า
      SubC มี 3815 บรรทัด ส่วน T3X/0 มี 2330 บรรทัด
      แน่นอนว่าสามารถเริ่มบน CP/M โดยไม่ใช้เครื่องมือภายนอกได้ แต่ถ้าเป็นแบบนั้นก็ต้องเขียนคอมไพเลอร์สำหรับ bootstrap ด้วย ภาษาแอสเซมบลี ใช้เวลามากแต่ทำได้แน่นอน เพียงแต่ไม่แน่ใจว่าจะน่าอ่านหรือเปล่า
    • ผมไม่เห็นว่าเป็นข้อเสีย คนที่จะเขียนคอมไพเลอร์น่าจะไม่ได้มองภาษาโปรแกรมใหม่เป็นอุปสรรคใหญ่ และ ภาษาเล่น ๆ ที่เรียบง่ายสะอาดตาอาจเหมาะกับการเรียนการสอนมากกว่า
      การใช้ไวยากรณ์แนว ALGOL แทนไวยากรณ์แนว C อาจดูแปลกนิดหน่อย แต่นั่นอาจเป็นอคติของผมเอง การจับคู่ DO กับ END ในหัวให้เป็น { กับ } ก็ไม่ได้เป็นภาระอะไรมาก
  • บทเรียนคอมไพเลอร์ ที่ไปไกลกว่าขั้น lexical analysis และ parsing นี่แทบจะเป็นครั้งแรกเลยหรือเปล่า
    พูดเล่นนะ แต่จริง ๆ แล้วแหล่งข้อมูลจำนวนมากก็หยุดอยู่ตรงนั้น ผมคิดว่าจะซื้อเล่มนี้

  • ถ้ามีหนังสือเขียน ระบบปฏิบัติการ แบบคล้าย CP/M ของตัวเองก็น่าจะสนุก

    • นั่นก็คือ Operating Systems Design and Implementation ของ Andrew Tanenbaum
      แน่นอนว่ามันแสดงวิธีสร้างระบบปฏิบัติการไมโครเคอร์เนลแนว Unix แต่ก็แค่ข้ามทุกอย่างไป ยกเว้นบทระบบไฟล์ และอย่าทำตามคำแนะนำเรื่องโครงสร้างข้อมูลแบบ tree ให้ใช้แต่ตารางแบน ๆ และไม่ต้องสนใจการทำขนาดไฟล์ให้ถูกต้องเป๊ะ เท่านี้ก็กลายเป็น CP/M แล้ว
      ส่วนตัวผมชอบฉบับพิมพ์ครั้งที่ 2 มากกว่า ฉบับที่ 3 ผมมองว่าโค้ดเดโม Minix ซับซ้อนเกินจำเป็น เพราะต้องทำให้รันบนพีซีปลายยุค 1990 แทนพีซียุค 1980
  • ไม่ได้เขียนในแง่ลบ แต่เป็นข้อสังเกตที่อาจช่วยได้
    ผมอ่านบทฟรีแล้ว และดูเหมือนบางส่วนอาจยากสำหรับคนที่มีความรู้เรื่องนี้ไม่มาก ใต้หัวข้อแต่ละอันจะอธิบายแนวคิดตั้งแต่ต้น เช่น “ไวยากรณ์ของภาษาคือ...” แต่ผ่านไปไม่กี่ประโยคก็มีหัวข้อขั้นสูงอย่าง คำสั่งแอสเซมบลี โผล่มาโดยไม่มีคำอธิบาย
    ถ้าผู้อ่านอยู่ในระดับที่ต้องเรียนรู้ความหมายของไวยากรณ์ ก็น่าจะเข้าใจประโยคถัดไปได้ยาก ดังนั้นถ้าทำให้สม่ำเสมอขึ้นอีกหน่อย หนังสือน่าจะสมบูรณ์ขึ้น

    • อย่างที่เขียนไว้ในคำแนะนำหนังสือ ไม่จำเป็นต้องมีความรู้ล่วงหน้าเกี่ยวกับการสร้างคอมไพเลอร์ แต่ผมเห็นว่าผู้อ่านควรคุ้นเคยกับภาษาเชิงกระบวนคำสั่งอย่างน้อยหนึ่งภาษา และ ภาษาแอสเซมบลี หนึ่งภาษา
      ดังนั้นผมจึงคิดว่าสามารถสมมติได้ว่าผู้อ่านรู้จักสิ่งอย่างคำสั่งแอสเซมบลีแล้ว
      ภาคผนวกของหนังสือมีบทนำสั้น ๆ เกี่ยวกับแอสเซมบลี Z80 ด้วย แต่ตรงนั้นก็สมมติว่ารู้พื้นฐานของภาษาแอสเซมบลีอยู่แล้ว
      หนังสือทุกเล่มต้องเริ่มจากที่ใดที่หนึ่ง เป็นเรื่องยากที่จะเขียนหนังสือการสร้างคอมไพเลอร์โดยสมมติว่าผู้อ่านไม่มีความรู้การเขียนโปรแกรมคอมพิวเตอร์เลย แต่ก็ไม่ได้หมายความว่าจะไม่มีคำสาปของความรู้ ผมจะจำประเด็นนี้ไว้แน่นอน
  • นอกเหนือจากเนื้อหาจริงของหนังสือแล้ว ผมชอบ ดีไซน์เว็บที่ย้อนยุคและมินิมอล พอดีตัวด้วย
    กระตุ้นความคิดถึงอย่างแรง ทำให้นึกถึงความทรงจำดี ๆ ตอนมีหนังสือหนา 6 นิ้วชื่อประมาณ “HTML 3.2 UNLEASHED!!!!” วางอยู่บนโต๊ะ แล้วสร้างเว็บเอง

    • เป็นยุคที่ดีจริง ๆ
      แต่พอพยายามใช้การเปลี่ยนแปลงแบบ global กับหน้าสแตติกสัก 1500 หน้า ความสนุกก็จบลง ตอนนี้ความเจ็บปวดยังไม่มากพอให้สร้าง CMS เอง แต่ถึงจะสร้าง ผมก็จะคงดีไซน์ไว้เหมือนเดิม
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...