โปรเจ็กต์ตัวแปลภาษา LISP อย่างง่ายได้จุดประกายการถกเถียงทางเทคนิคอย่างดุเดือดเกี่ยวกับ undefined behavior ในภาษาโปรแกรม Odin โดยไม่คาดคิด โปรเจ็กต์ที่เรียกว่า komplott แสดงให้เห็นการใช้งาน LISP แบบเรียบง่ายทั้งในภาษา C และ Odin แต่การอภิปรายกลับเปลี่ยนจากความงดงามและความเรียบง่ายของ LISP ไปสู่คำถามพื้นฐานเกี่ยวกับความปลอดภัยของหน่วยความจำและปรัชญาการออกแบบภาษา
การเปรียบเทียบการใช้งาน LISP
คุณสมบัติ | เวอร์ชัน C (komplott.c) | เวอร์ชัน Odin (komplodin.odin) |
---|---|---|
จำนวนบรรทัดของโค้ด | ~500 บรรทัด | ~600 บรรทัด |
จำนวนไฟล์ | ไฟล์เดียว | ไฟล์เดียว |
Garbage Collector | Copying semi-space ( Cheney's Algorithm ) | Copying semi-space ( Cheney's Algorithm ) |
Tail Call Optimization | Limited TCO | Limited TCO |
การจัดการข้อผิดพลาด | เกือบเป็นศูนย์ | เกือบเป็นศูนย์ |
Thread Safety | ไม่มี | ไม่มี |
ข้อถกเถียงเรื่อง Undefined Behavior
ข้อพิพาทหลักหมุนรอบการอ้างสิทธิ์ของ Ginger Bill ผู้สร้างภาษา Odin ที่ว่าภาษานี้ไม่มี undefined behavior นักวิจารณ์โต้แย้งว่าสิ่งนี้ทำให้เข้าใจผิด โดยชี้ไปที่ตัวอย่างที่เป็นรูปธรรมที่ Odin แสดงปัญหาความปลอดภัยของหน่วยความจำเช่นเดียวกับ C โดยเฉพาะสถานการณ์ use-after-free สมาชิกชุมชนคนหนึ่งได้แสดงให้เห็นว่าการทำลาย hash map แล้วเข้าถึงมันในภายหลังสามารถเปิดเผยเนื้อหาจาก hash map ที่แตกต่างกันโดยสิ้นเชิง ทำให้เกิดพฤติกรรมที่คาดเดาไม่ได้และอาจเป็นอันตราย
การถกเถียงนี้เน้นให้เห็นความไม่เห็นด้วยพื้นฐานเกี่ยวกับคำศัพท์ แม้ว่า Odin อาจไม่ใช้ประโยชน์จาก undefined behavior สำหรับการปรับปรุงคอมไพเลอร์เช่นที่ C ทำ แต่มันยังคงอนุญาตให้โปรแกรมเข้าสู่สถานะที่พฤติกรรมไม่ได้ถูกกำหนดโดยข้อกำหนดของภาษา การโต้แย้งเชิงความหมายนี้มีผลกระทบในทางปฏิบัติสำหรับนักพัฒนาที่อาจคาดหวังการรับประกันความปลอดภัยที่แข็งแกร่งกว่าที่ภาษาให้จริง ๆ
คุณสมบัติของภาษา Odin เทียบกับ C
- ไม่มีพฤติกรรมที่ไม่ได้กำหนดไว้ (เป็นที่ถกเถียง)
- มีประเภทข้อมูล string, dynamic array และ slice ในตัว
- มีประเภทข้อมูล map ในตัว
- การตรวจสอบขอบเขตพร้อมการตรวจจับ memory leak แบบเสริม
- Tagged unions พร้อม switch statements แบบครบถ้วน
- มี unit test framework ในตัว
- รองรับคณิตศาสตร์ 3 มิติพร้อม swizzling และการดำเนินการ matrix
- รูปแบบการกำหนดค่าหลายตัวแปร (เหมือน Python )
- แยกความแตกต่างระหว่างการกำหนดค่า (=) และการประกาศตัวแปร (:=)
ความตึงเครียดในชุมชนเผยออกมา
การอภิปรายทางเทคนิคได้เปิดเผยความกังวลที่ลึกซึ้งยิ่งขึ้นของชุมชนเกี่ยวกับรูปแบบการนำของโปรเจ็กต์ Odin ผู้เข้าร่วมหลายคนรายงานประสบการณ์เชิงลบกับแนวทางการสื่อสารของผู้สร้างภาษา โดยอธิบายการตอบสนองที่ดูถูกต่อการมีส่วนร่วมและ pull request บัญชีเหล่านี้วาดภาพของผู้ดูแลที่มีความสามารถแต่หยาบกระด่างที่อาจขัดขวางการเติบโตของชุมชนผ่านการให้ข้อเสนอแนะที่รุนแรงโดยไม่จำเป็น
ฉันจะปิด PR นี้เพราะมันจะเร็วกว่าสำหรับฉันที่จะเขียน binding ของฉันเองมากกว่าการอธิบายทุกสิ่งที่ผิดพลาดแล้วหวังว่าพวกเขาจะได้รับการแก้ไขอย่างถูกต้อง
ข้อถกเถียงขยายไปเกินกว่าปฏิสัมพันธ์ส่วนบุคคลไปสู่คำถามเกี่ยวกับการกำกับดูแลโปรเจ็กต์และประสบการณ์ของผู้มีส่วนร่วม สมาชิกชุมชนหลายคนสังเกตว่าแม้ว่างานทางเทคนิคจะน่าประทับใจ แต่พลวัตทางสังคมรอบ ๆ โปรเจ็กต์สร้างอุปสรรคสำหรับผู้มาใหม่และผู้มีส่วนร่วมที่มีศักยภาพ
เสน่ห์ที่ยั่งยืนของ LISP
แม้จะมีการถกเถียงอย่างดุเดือด แต่โปรเจ็กต์ตัวแปลภาษา LISP เดิมแสดงให้เห็นว่าทำไมภาษานี้ยังคงน่าสนใจสำหรับโปรแกรมเมอร์ การใช้งานต้องการโค้ดน้อยกว่า 500 บรรทัดใน C แสดงให้เห็นความงดงามทางคณิตศาสตร์และความต้องการหลักที่เรียบง่ายของ LISP ความเรียบง่ายเกิดจาก syntax ที่สม่ำเสมอของ LISP ที่ใช้ s-expressions และความจำเป็นของมันสำหรับ special form ที่จำเป็นเพียงสามอย่าง: quote, cond และ lambda
โปรเจ็กต์รวมถึงทั้งตัวแปลภาษา Scheme สมัยใหม่และการใช้งานที่ซื่อสัตย์ของ LISP 1.5 จากปี 1962 ที่มาพร้อมกับ copying garbage collector ที่อิงตาม Cheney's Algorithm การเชื่อมโยงทางประวัติศาสตร์นี้แสดงให้เห็นว่าแนวคิดพื้นฐานของวิทยาการคอมพิวเตอร์ยังคงมีความเกี่ยวข้องตลอดหลายทศวรรษของวิวัฒนาการทางเทคโนโลยี
ข้อถกเถียงรอบการอ้างสิทธิ์เรื่อง undefined behavior ของ Odin ทำหน้าที่เป็นการเตือนใจว่าความแม่นยำทางเทคนิคและการสื่อสารที่ชัดเจนมีความสำคัญในการพัฒนาภาษาโปรแกรม แม้ว่าการถกเถียงเชิงความหมายเกี่ยวกับคำศัพท์อาจดูเป็นเรื่องวิชาการ แต่พวกเขามีผลที่เป็นจริงต่อความคาดหวังของนักพัฒนาและความปลอดภัยของโค้ด ชุมชนโปรแกรมมิ่งยังคงต่อสู้กับการสร้างสมดุลระหว่างนวัตกรรม ความปลอดภัย และการเข้าถึงได้ในการออกแบบภาษา
อ้างอิง: komplott / komplodin