การเปรียบเทียบอย่างละเอียดระหว่างภาษาโปรแกรมมิ่ง Ada และ Rust ได้จุดประกายการอภิปรายในชุมชนนักพัฒนาเกี่ยวกับคุณสมบัติด้านความปลอดภัยที่เป็นเอกลักษณ์ของ Ada โดยเฉพาะความสามารถในการสร้างประเภทตัวเลขที่มีข้อจำกัดช่วงค่าในตัว ความสามารถนี้ซึ่งป้องกันค่าต่างๆ จากการเกินขอบเขตที่กำหนดไว้ล่วงหน้าโดยอัตโนมัติ กำลังดึงดูดความสนใจจากนักพัฒนาที่หงุดหงิดกับแนวทางที่ยอมรับทุกอย่างของการโปรแกรมสมัยใหม่ต่อความปลอดภัยของซอฟต์แวร์
Range Types ของ Ada มอบความปลอดภัยในระยะ Compile-Time
Ada อนุญาตให้นักพัฒนากำหนดประเภทตัวเลขแบบกำหนดเองที่มีช่วงค่าเฉพาะ เช่น การสร้างประเภท Age ที่รับเฉพาะค่าระหว่าง 0 ถึง 200 เมื่อโค้ดพยายามกำหนดค่าที่ไม่ถูกต้อง โปรแกรมจะล้มเหลวในระยะ compile time หรือเกิด runtime exception ซึ่งป้องกันไม่ให้บั๊กแบบเงียบๆ แพร่กระจายไปทั่วระบบ คุณสมบัตินี้มีต้นกำเนิดมาจาก Pascal และ Modula-2 แต่พบการใช้งานที่สมบูรณ์ที่สุดใน Ada ซึ่งมันผสานรวมเข้ากับปรัชญาความปลอดภัยที่กว้างขวางของภาษาได้อย่างลงตัว
การอภิปรายในชุมชนเผยให้เห็นความชื่นชมอย่างมากต่อแนวทางนี้ โดยนักพัฒนาหลายคนสังเกตว่า range-restricted types ช่วยขจัดบั๊กทั้งหมวดหมู่ได้ ต่างจากฟังก์ชันตรวจสอบความถูกต้องที่ต้องเรียกใช้ด้วยตนเอง range types ของ Ada บังคับใช้ข้อจำกัดโดยอัตโนมัติตลอดการทำงานของโปรแกรม ทำให้เกือบเป็นไปไม่ได้ที่จะใช้ค่าที่ไม่ถูกต้องโดยบังเอิญ
ภาษาโปรแกรมที่รองรับ Range-Restricted Types
- Ada: รองรับโดยธรรมชาติด้วยการประกาศ
subtype
พร้อมการตรวจสอบ runtime อัตโนมัติ - Pascal/Turbo Pascal: การใช้งานต้นฉบับด้วยคำสั่ง
{$R+}
สำหรับการตรวจสอบช่วงค่า - Modula-2: สืบทอดมาจาก Pascal และมีอิทธิพลต่อการออกแบบของ Ada
- F: มีหน่วยการวัดและ constrained types ให้ใช้งาน
- Nim: Range types พร้อมการตรวจสอบ compile-time:
type Age = range[0..200]
- C++: เป็นไปได้ผ่าน templates แต่ไม่ค่อยได้ใช้ในทางปฏิบัติ
- Rust: คุณสมบัติ "pattern types" ที่อยู่ในช่วงทดลอง ยังไม่เปิดให้ผู้ใช้งานทั่วไป
ภาษาสมัยใหม่ประสบปัญหากับคุณสมบัติที่คล้ายกัน
ในขณะที่ Rust กำลังสำรวจ pattern types เพื่อให้ฟังก์ชันการทำงานที่คล้ายกัน คุณสมบัตินี้ยังคงอยู่ในระยะทดลองและไม่สามารถใช้งานได้สำหรับผู้ใช้ทั่วไป ภาษาอื่นๆ เช่น F# และ Nim มีความสามารถที่เทียบเคียงได้ แต่ไม่มีภาษาใดที่ผสานการตรวจสอบช่วงค่าได้อย่างเป็นธรรมชาติเหมือน Ada การอภิปรายนี้เน้นย้ำถึงความหงุดหงิดที่กว้างขวางในชุมชนนักพัฒนาเกี่ยวกับการคิดค้นคุณสมบัติความปลอดภัยซ้ำแล้วซ้ำเล่าที่ได้รับการแก้ไขมาแล้วเมื่อหลายทศวรรษก่อน
Ada มีแนวคิดที่ดีจริงๆ ซึ่งน่าเสียดายที่ไม่เคยได้รับความนิยมหรือถูกใช้งานนอกเหนือจากชุมชนที่มีความสำคัญต่อความปลอดภัยที่ส่วนใหญ่ใช้มัน ความสามารถในการสร้างประเภทตัวเลขที่จำกัดในช่วงของมันนั้นมีประโยชน์จริงๆ สำหรับบั๊กบางประเภท
นักพัฒนาหลายคนชี้ให้เห็นว่า C++ สามารถใช้งาน range-restricted types ที่คล้ายกันผ่าน templates ได้ แต่ความสามารถนี้ยังคงไม่ค่อยได้รับการใช้งานในทางปฏิบัติ ช่องว่างระหว่างสิ่งที่ภาษาสมัยใหม่สามารถทำได้ในทางทฤษฎีและสิ่งที่นักพัฒนาใช้งานจริงในโค้ดที่ใช้ในการผลิตยังคงขยายกว้างขึ้น
การเปรียบเทียบฟีเจอร์ระหว่าง Ada กับ Rust
ฟีเจอร์ | Ada | Rust | หมายเหตุ |
---|---|---|---|
ประเภทข้อมูลที่จำกัดช่วงค่า | รองรับแบบ Native | ทดลอง (pattern types) | Ada อนุญาตให้ใช้ subtype Age is Integer range 0..200 |
ความปลอดภัยของหน่วยความจำ | การตรวจสอบ Runtime + การวิเคราะห์ของ compiler | ระบบ ownership ณ เวลา Compile | แนวทางที่แตกต่างกันในการรับประกันความปลอดภัย |
ข้อกำหนดเชิงรูปแบบ | ใช่ (มาตรฐาน ISO) | เพิ่งเพิ่มเข้ามา (การบริจาค Ferrocene) | Ada มีข้อกำหนดเชิงรูปแบบมานานหลายทศวรรษ |
การรับรองความปลอดภัย | DO-178C, EN 50128, ISO 26262 | จำกัด (Ferrocene ให้ compiler ที่ได้รับการรับรong) | Ada ถูกใช้อย่างแพร่หลายในระบบที่ต้องการความปลอดภัยสูง |
อุตสาหกรรมที่มีความสำคัญต่อความปลอดภัยเป็นผู้นำทาง
อุตสาหกรรมการบิน นิวเคลียร์ และอุปกรณ์ทางการแพทย์ได้พึ่งพาคุณสมบัติความปลอดภัยของ Ada มาอย่างยาวนาน โดยภาษานี้ตอบสนองข้อกำหนดการรับรองที่เข้มงวดเช่น DO-178C สำหรับซอฟต์แวร์อากาศยาน โดเมนเหล่านี้แสดงให้เห็นว่าแนวทางของ Ada ในการป้องกันข้อผิดพลาด runtime ไม่ใช่แค่ทฤษฎี แต่ได้รับการพิสูจน์แล้วในระบบที่ความล้มเหลวหมายถึงการสูญเสียชีวิต
อย่างไรก็ตาม อุตสาหกรรมซอฟต์แวร์โดยรวมส่วนใหญ่ได้เพิกเฉยต่อบทเรียนเหล่านี้ โดยให้ความสำคัญกับการพัฒนาอย่างรวดเร็วมากกว่าการจัดการข้อผิดพลาดที่แข็งแกร่ง การอภิปรายในปัจจุบันชี้ให้เห็นการรับรู้ที่เพิ่มขึ้นว่าการแลกเปลี่ยนนี้อาจไปไกลเกินไปแล้ว โดยเฉพาะเมื่อซอฟต์แวร์ควบคุมโครงสร้างพื้นฐานและบริการที่สำคัญมากขึ้น
การเปรียบเทียบระหว่าง Ada และ Rust เผยให้เห็นแนวทางที่แตกต่างกันสองแบบต่อความปลอดภัย: Ada มุ่งเน้นการป้องกันสถานะที่ไม่ถูกต้องผ่านข้อจำกัดของระบบประเภท ในขณะที่ Rust เน้นความปลอดภัยของหน่วยความจำผ่าน ownership และ borrowing ภาษาทั้งสองมีบทเรียนที่มีค่าสำหรับนักพัฒนาที่ต้องการสร้างซอฟต์แวร์ที่เชื่อถือได้มากขึ้น แม้ว่าความสำเร็จที่ได้รับการพิสูจน์แล้วหลายทศวรรษของ Ada ในแอปพลิเคชันที่มีความสำคัญต่อความปลอดภัยจะทำให้มันมีตำแหน่งที่เป็นเอกลักษณ์ในการอภิปรายเหล่านี้
อ้างอิง: A Comparison of Ada and Rust, using solutions to the Advent of Code