การพัฒนาตัวแปลภาษา Scheme ที่มีขนาดกะทัดรัดได้ดึงดูดความสนใจจากชุมชนโปรแกรมเมอร์ โดยแสดงให้เห็นว่าภาษาที่มีลักษณะคล้าย Lisp เชิงฟังก์ชันสามารถสร้างขึ้นได้ด้วยโค้ดที่น้อยมาก การพัฒนาแบบ heap-based นี้แสดงให้เห็นแนวคิดพื้นฐานของการออกแบบภาษาในขณะที่ทำให้เกิดคำถามเกี่ยวกับความสามารถในการใช้งานจริงและแนวทางการ bootstrapping
ข้อมูลจำเพาะทางเทคนิค:
- การใช้งาน Scheme machine แบบ heap-based
- ประมาณ 250 บรรทัดของโค้ด C
- ใช้ token buffer ขนาด 1024 ไบต์
- Heap array ของ 250 คู่
- รองรับการดำเนินการ Lisp พื้นฐาน: cons, car, cdr
- รวมโครงสร้าง read-eval-print loop
ปัญหาการพัฒนาและข้อผิดพลาดที่เกิดขึ้น
สมาชิกในชุมชนได้ระบุปัญหาทางเทคนิคหลายประการในโค้ดอย่างรวดเร็ว การพัฒนานี้ประสบปัญหาจาก undefined behavior เนื่องจากลำดับการประเมินผลอาร์กิวเมนต์ของฟังก์ชัน โดยเฉพาะในกรณีที่การเรียกใช้ฟังก์ชันหนึ่งขึ้นอยู่กับผลลัพธ์ของอีกฟังก์ชันหนึ่ง นอกจากนี้ ผู้ใช้ยังรายงานความล้มเหลวของ assertion ที่เกี่ยวข้องกับการเปรียบเทียบ pointer ซึ่งอาจละเมิดมาตรฐานของภาษา ปัญหาเหล่านี้เน้นย้ำถึงลักษณะที่ละเอียดอ่อนของการพัฒนาภาษาในระดับต่ำ ซึ่งการดำเนินการที่ดูเหมือนง่ายๆ สามารถซ่อนความท้าทายทางเทคนิคที่ซับซ้อนได้
ข้อจำกัดด้านฟังก์ชันการทำงานของตัวแปลกลายเป็นที่ชัดเจนระหว่างการทดสอบ โดยมีรายงานว่าการดำเนินการพื้นฐานเช่นการบวกตัวเลขไม่ได้รับการสนับสนุน ข้อจำกัดนี้ทำให้การใช้งานจริงมีข้อจำกัดอย่างมาก แต่ก็ตอบสนองวัตถุประสงค์ทางการศึกษาในการแสดงกลไกหลักของภาษา
ปัญหาที่ทราบแล้ว:
- พฤติกรรมที่ไม่ได้กำหนดไว้เนื่องจากลำดับการประเมินอาร์กิวเมนต์ของฟังก์ชัน
- ความล้มเหลวของ assertion ในการเปรียบเทียบพอยน์เตอร์
istext
- การดำเนินการทางคณิตศาสตร์ที่จำกัด (ไม่สามารถบวกตัวเลขได้)
- ขาดการจัดการสภาพแวดล้อมระดับบนสุด
- การใช้งานที่ไม่สมบูรณ์ของฟังก์ชันที่ประกาศไว้หลายตัว
ข้อมูลเชิงลึกเกี่ยวกับการเพิ่มประสิทธิภาพ
การอภิปรายเผยให้เห็นแนวทางที่น่าสนใจในการปรับปรุงประสิทธิภาพของตัวแปล ข้อเสนอแนะหนึ่งเกี่ยวข้องกับการแทนที่การเปรียบเทียบสตริงด้วยการเปรียบเทียบ pointer โดยการแสดง language atoms เป็นตัวแปรส่วนกลางแทนที่จะเป็น string literals เทคนิคนี้สามารถขจัดการดำเนินการเปรียบเทียบสตริงที่มีค่าใช้จ่ายสูงระหว่างรันไทม์ แม้ว่าจะต้องมีการจัดการอย่างระมัดระวังเพื่อรักษาความถูกต้อง
การสนทนายังได้สัมผัสกับกลยุทธ์การเพิ่มประสิทธิภาพที่ซับซ้อนมากขึ้นที่ใช้ในการพัฒนา Scheme เชิงผลิตภัณฑ์เช่น Chez Scheme ซึ่งมีประสิทธิภาพเหนือกว่าการพัฒนาอื่นๆ ในเกณฑ์มาตรฐานอย่างสม่ำเสมอ ความแตกต่างระหว่างตัวแปลขนาดเล็กนี้และระบบที่ได้รับการเพิ่มประสิทธิภาพสูงแสดงให้เห็นสเปกตรัมที่กว้างขวางของแนวทางการพัฒนาภาษา
การใช้งานที่เกี่ยวข้อง:
- Chez Scheme: การใช้งานที่มีประสิทธิภาพสูงโดย Kent Dybvig
- MIT Scheme: มีคุณสมบัติ native code compiler และ C backend
- Racket: เพิ่งถูกเขียนใหม่เพื่อใช้ Chez Scheme เป็นฐาน
- GNU Mes: Scheme ขั้นต่ำสำหรับการ bootstrapping (bootloader ขนาด 357 ไบต์)
- Chicken Scheme: การใช้งานทางเลือกที่มีการสนับสนุน SRFI
Bootstrapping และคุณค่าทางการศึกษา
สมาชิกในชุมชนได้สำรวจศักยภาพในการใช้ตัวแปลขนาดเล็กดังกล่าวในสถานการณ์ compiler bootstrapping แนวคิดนี้เกี่ยวข้องกับการใช้ตัวแปลขนาดเล็กเพื่อคอมไพล์ native compiler ที่ซับซ้อนมากขึ้นที่เขียนด้วยภาษาเดียวกัน โดยสร้างระบบ self-hosting แนวทางนี้มีแบบอย่างทางประวัติศาสตร์และยังคงมีอิทธิพลต่อการพัฒนาภาษาสมัยใหม่
คุณสามารถใช้ตัวแปลภาษา Scheme ขนาดเล็กที่เขียนแบบนี้เพื่อ bootstrap แกนหลักของ native Scheme compiler ของคุณ เพื่อให้เวอร์ชันที่แปลแล้วสามารถคอมไพล์ตัวเองเป็น native binary ได้
ด้านการศึกษาได้รับการตอบสนองอย่างแข็งแกร่งจากอดีตนักเรียนของ Kent Dybvig ผู้สร้าง Chez Scheme ซึ่งแบ่งปันประสบการณ์เชิงบวกในการเรียนรู้แนวคิดพื้นฐานของวิทยาการคอมพิวเตอร์ผ่านหลักสูตรที่ใช้ Scheme ลักษณะแบบเรียกซ้ำของภาษา Lisp ทำให้เหมาะสำหรับการสอนแนวคิดการเขียนโปรแกรมและการสร้าง compiler เป็นพิเศษ
บริบทการพัฒนาสมัยใหม่
การอภิปรายขยายไปถึงแนวทางการพัฒนาร่วมสมัย รวมถึงแนวทางของโครงการ GNU Mes ในการสร้างซอฟต์แวร์สแต็กที่สมบูรณ์จากส่วนประกอบขนาดเล็ก ความพยายามนี้แสดงให้เห็นว่าตัวแปลง่ายๆ สามารถทำหน้าที่เป็นก้าวสู่สภาพแวดล้อมการพัฒนาที่สมบูรณ์ โดยลดการพึ่งพา binary artifacts
ในขณะที่สมาชิกในชุมชนบางคนตั้งคำถามเกี่ยวกับคุณค่าในทางปฏิบัติของการแปลง assembly ด้วยตนเองเมื่อมี compiler อยู่แล้ว คนอื่นๆ ก็ชื่นชมด้านการศึกษาและการทดลองในการทำความเข้าใจรายละเอียดการพัฒนาระดับต่ำ การสนทนาสะท้อนความสนใจอย่างต่อเนื่องในการทำความเข้าใจแนวคิดพื้นฐานของการคำนวณแม้จะมีเครื่องมือพัฒนาที่ซับซ้อนให้ใช้งาน
อ้างอิง: heap-lisp.c