← กลับไปยังบทความทั้งหมด

ภาษาโปรแกรม E ภาษาเพื่อการคำนวณแบบกระจายที่ปลอดภัย

สรุปใจความสำคัญ

  • สร้างขึ้นในปี 1997 โดย Mark S. Miller และคณะ เพื่อการคำนวณแบบกระจายที่ปลอดภัย
  • ใช้ปรัชญา Capability-based design โดยให้การอ้างอิงวัตถุทำหน้าที่เป็นสิทธิ์ในการเข้าถึง (Capabilities)
  • ป้องกันการเกิด Deadlock ในระบบกระจายโดยบังคับให้การสื่อสารระยะไกลใช้ Eventual Send และ Promise
  • ใช้ Guard เพื่อกำหนดข้อจำกัดของข้อมูล ซึ่งช่วยให้การตรวจสอบความปลอดภัย (Security Auditing) ทำได้ง่ายขึ้น

ภาษา E เป็นภาษาโปรแกรมเชิงวัตถุ (Object-Oriented Programming) ที่ถูกออกแบบมาเพื่อการคำนวณแบบกระจาย (Distributed Computing) ที่มีความปลอดภัยสูง พัฒนาขึ้นในปี 1997 โดย Mark S. Miller, Dan Bornstein, Douglas Crockford, Chip Morningstar และทีมงานที่ Electric Communities

ภาษา E มีรากฐานมาจากภาษา Joule และ Original-E ซึ่งเป็นส่วนขยายของ Java สำหรับการโปรแกรมแบบกระจาย โดย E ได้ผสมผสานการคำนวณแบบส่งข้อความ (Message-based computation) เข้ากับไวยากรณ์ที่คล้ายคลึงกับ Java พร้อมทั้งใช้โมเดลการทำงานแบบ Event Loops และ Promises เพื่อให้มั่นใจว่าระบบจะไม่เกิดสภาวะ Deadlock

ปรัชญาการออกแบบ

เป้าหมายหลักของภาษา E คือความปลอดภัยของคอมพิวเตอร์ โดยยึดหลักการทำงานเชิงวัตถุอย่างเคร่งครัด และใช้ปรัชญาการออกแบบที่เรียกว่า Capability-based design เพื่อช่วยให้โปรแกรมเมอร์สร้างซอฟต์แวร์ที่ปลอดภัย และอนุญาตให้ส่วนประกอบต่างๆ ของซอฟต์แวร์ทำงานร่วมกันได้แม้ว่าจะไม่มีความไว้วางใจต่อกันอย่างเต็มที่

  • Object References as Capabilities: ในภาษา E การอ้างอิงวัตถุทำหน้าที่เป็น Capability ซึ่งทำให้ไม่มีค่าใช้จ่ายเพิ่มเติมในด้านการคำนวณหรือแนวคิด
  • การตรวจสอบความปลอดภัย: ไวยากรณ์ของภาษาถูกออกแบบมาให้ตรวจสอบหาช่องโหว่ด้านความปลอดภัยได้ง่าย เช่น การใช้ Lexical Scoping เพื่อจำกัดขอบเขตของโค้ดที่ต้องตรวจสอบ
  • การป้องกันความสับสน: ภาษา E ใช้ตัวดำเนินการ == สำหรับการเปรียบเทียบ และ := สำหรับการกำหนดค่า โดยไม่มีการใช้ตัวดำเนินการ = เพื่อป้องกันความสับสนระหว่างการเปรียบเทียบและการกำหนดค่า

โมเดลการคำนวณ

ในภาษา E ทุกค่าคือวัตถุ และการคำนวณเกิดขึ้นจากการส่งข้อความไปยังวัตถุเหล่านั้น โดยมีโครงสร้างการทำงานดังนี้:

  • Vat: วัตถุแต่ละชิ้นจะสังกัดอยู่ใน "Vat" (เปรียบได้กับ Process) ซึ่งแต่ละ Vat จะมีเธรดการทำงานเดียว, Stack frame และ Event queue
  • การสื่อสารแบบกระจาย: การโปรแกรมแบบกระจายทำได้โดยการส่งข้อความไปยังวัตถุที่อยู่ใน Vat อื่น โดยการสื่อสารทั้งหมดจะถูกเข้ารหัสโดย E runtime
  • Event Loop: ข้อความที่ส่งมาจะถูกจัดเรียงใน Event queue และถูกประมวลผลทีละข้อความตามลำดับการมาถึง

วิธีการส่งข้อความ

ภาษา E มีวิธีการส่งข้อความสองรูปแบบหลัก:

  1. Immediate Call: คล้ายกับการเรียกฟังก์ชันปกติในภาษาทั่วไป โดยผู้ส่งจะรอจนกว่าผู้รับจะประมวลผลเสร็จและส่งค่ากลับมา
  2. Eventual Send: เป็นการส่งข้อความพร้อมกับสร้างตัวแทนผลลัพธ์ที่เรียกว่า Promise ผู้ส่งสามารถทำงานอื่นต่อไปได้ทันที และเมื่อผู้รับประมวลผลเสร็จ Promise จะถูกเปลี่ยนเป็นผลลัพธ์จริง

เนื่องจากการสื่อสารกับวัตถุระยะไกล (Remote Objects) จะอนุญาตให้ใช้เพียง Eventual Send เท่านั้น จึงทำให้ไม่เกิดสภาวะ Deadlock และช่วยลดความล่าช้าที่เกิดจาก Network Latency ในระบบกระจาย

ไวยากรณ์และตัวอย่าง

ไวยากรณ์ของ E มีความคล้ายคลึงกับ Java, Python และ Pascal โดยตัวแปรจะเป็นแบบ Dynamic typing และ Lexical scoping ที่สำคัญคือ E ประกอบด้วย Expression ทั้งหมด

การใช้ Guard

ในภาษา E มีการใช้ Guard (เช่น :int) เพื่อกำหนดข้อจำกัดของอาร์กิวเมนต์และผลลัพธ์ของฟังก์ชัน Guard ไม่ใช่การประกาศชนิดข้อมูล (Type declaration) แต่เป็นตัวช่วยในการตรวจสอบความปลอดภัย ทำให้ผู้ตรวจสอบโค้ดทราบได้ทันทีว่าข้อมูลใดบ้างที่สามารถไหลออกจากฟังก์ชันได้

ตัวอย่างระบบ Mint (โรงกษาปณ์อิเล็กทรอนิกส์)

ตัวอย่างคลาสสิกของภาษา E คือระบบ Mint ซึ่งเป็นระบบเงินอิเล็กทรอนิกส์ที่แสดงให้เห็นถึงความปลอดภัย โดยมีคุณสมบัติดังนี้:

  • เฉพาะ Mint เท่านั้นที่สามารถเปลี่ยนแปลงจำนวนเงินในระบบได้
  • เงินสามารถถูกสร้างขึ้นได้แต่ไม่สามารถถูกทำลายได้
  • Mint สามารถสร้างเงินได้เฉพาะสกุลเงินของตนเองเท่านั้น
  • เฉพาะผู้ถือกระเป๋าเงิน (Purse) เท่านั้นที่สามารถเปลี่ยนยอดเงินในกระเป๋าของตนได้

นอกจากนี้ E ยังมีกลไก Sealer ซึ่งใช้สร้างคู่ของ Sealer และ Unsealer เพื่อให้ Sealer สามารถบรรจุวัตถุไว้ในกล่อง และมีเพียง Unsealer เท่านั้นที่สามารถนำวัตถุนั้นออกมาได้ ซึ่งช่วยเพิ่มระดับความปลอดภัยในการจัดการข้อมูลสำคัญ

คำถามที่พบบ่อย

ภาษา E แตกต่างจาก Java อย่างไร?

แม้จะมีไวยากรณ์คล้ายกัน แต่ E เน้นที่ความปลอดภัยแบบ Capability-based และใช้โมเดลการคำนวณแบบ Vat พร้อม Event loops และ Promises เพื่อรองรับการคำนวณแบบกระจายโดยปราศจาก Deadlock

Promise ในภาษา E คืออะไร?

Promise คือตัวแทนของผลลัพธ์ที่จะเกิดขึ้นในอนาคตจากการส่งข้อความแบบ Eventual Send ช่วยให้โปรแกรมทำงานต่อไปได้โดยไม่ต้องรอการตอบกลับจากวัตถุระยะไกล ลดผลกระทบจากความล่าช้าของเครือข่าย

ทำไมภาษา E ถึงไม่มีตัวดำเนินการ '='?

เพื่อป้องกันความสับสนระหว่างการเปรียบเทียบค่าและการกำหนดค่า โดยภาษา E ใช้ '==' สำหรับการเปรียบเทียบ และ ':=' สำหรับการกำหนดค่าแทน