لغة البرمجة E

لغة E هي لغة برمجة كائنية التوجه للحوسبة الموزعة الآمنة ، ابتكرها مارك إس. ميلر [ 1 ] ، ودان بورنشتاين ، ودوغلاس كروكفورد [ 2 ] ، وشيب مورنينغستار [ 3 ] ، وآخرون في شركة Electric Communities عام 1997. تُعد E مشتقة بشكل أساسي من لغة Joule المتزامنة ، ومن Original-E، وهي مجموعة من الإضافات للغة Java لبرمجة موزعة آمنة. تجمع E بين الحوسبة القائمة على الرسائل وبنية شبيهة بلغة Java . ويضمن نموذج التزامن القائم على حلقات الأحداث والوعود عدم حدوث أي حالة جمود . [ 4 ]

فلسفة

صُممت لغة E لأمن الحاسوب والحوسبة الآمنة. ويتحقق ذلك بشكل أساسي من خلال الالتزام الصارم بنموذج الحوسبة الكائنية التوجه، الذي يتميز في جوهره بخصائص تدعم الحوسبة الآمنة. وتعتمد لغة E ومكتبتها القياسية فلسفة تصميم قائمة على القدرات لمساعدة المبرمجين على بناء برامج آمنة، وتمكين مكونات البرامج من التعاون حتى في حال عدم وجود ثقة كاملة بينها. في لغة E، تُعد مراجع الكائنات بمثابة قدرات، وبالتالي لا تُضيف القدرات أي تكاليف إضافية حسابية أو مفاهيمية. صُمم بناء جملة اللغة ليسهل على المستخدمين تدقيقها بحثًا عن الثغرات الأمنية. على سبيل المثال، يحد النطاق المعجمي من كمية التعليمات البرمجية التي يجب فحصها لمعرفة تأثيرها على متغير معين. كمثال آخر، تستخدم اللغة ==عامل المقارنة `--` للمقارنة وعامل :=الإسناد `--` للإسناد؛ ولتجنب أي لبس، لا يوجد =عامل الإسناد `--`.

النموذج الحسابي

في لغة E، تُعتبر جميع القيم كائنات ، ويتم إجراء العمليات الحسابية عن طريق إرسال رسائل إلى هذه الكائنات. ينتمي كل كائن إلى وحدة معالجة (مشابهة للعملية ) . تحتوي كل وحدة معالجة على خيط تنفيذ واحد، وإطار مكدس، وقائمة انتظار للأحداث. تعتمد البرمجة الموزعة ببساطة على إرسال رسائل إلى كائنات بعيدة (كائنات في وحدات معالجة أخرى). يتم تشفير جميع الاتصالات مع الأطراف البعيدة بواسطة بيئة تشغيل E. تُوضع الرسائل الواردة في قائمة انتظار أحداث وحدة المعالجة؛ وتقوم حلقة أحداث وحدة المعالجة بمعالجة الرسائل الواردة واحدة تلو الأخرى حسب ترتيب وصولها.

تتيح لغة E طريقتين لإرسال الرسائل: الاستدعاء الفوري والإرسال النهائي . يشبه الاستدعاء الفوري استدعاء دالة أو أسلوب في لغة غير متزامنة: ينتظر المرسل حتى ينتهي المُستقبِل من عمله ويعيد قيمة. أما الإرسال النهائي، فيرسل رسالة مع إنشاء عنصر نائب للنتيجة يُسمى وعدًا . يتابع المرسل تنفيذ الوعد فورًا. لاحقًا، عندما ينتهي المُستقبِل من عمله ويعيد نتيجة، يتحقق الوعد. وبما أنه لا يُسمح إلا بالإرسال النهائي عند التواصل مع الكائنات البعيدة، فلا يمكن حدوث حالات تعطل . في الأنظمة الموزعة، تُقلل آلية الوعد أيضًا من التأخيرات الناتجة عن زمن استجابة الشبكة.

بناء الجملة والأمثلة

تتشابه بنية لغة E إلى حد كبير مع لغة Java ، مع وجود بعض أوجه الشبه بينها وبين لغتي Python و Pascal . تُعرَّف المتغيرات فيها ديناميكيًا وتُحدَّد نطاقاتها معجميًا . وعلى عكس Java أو Python، تتكون E بالكامل من تعابير . إليك برنامج E بسيط للغاية:

println ( "مرحباً بالعالم!" )

فيما يلي دالة تكرارية لحساب مضروب عدد ما، مكتوبة بلغة E. يتم تعريف الدوال باستخدام الكلمة defالمفتاحية.

دالة حساب المضروب ( n : عدد صحيح ) : عدد صحيح { إذا كان ( n == 1 ) { أرجع 1 } وإلا إذا كان ( n > 0 ) { أرجع n * مضروب ( n - 1 ) } وإلا { ارمِ ( "وسيط غير صالح لدالة حساب المضروب: " + n ) } }

في السطر الأول، :intيوجد شرط يقيد وسيط الدالة ونتيجتها. الشرط ليس تمامًا كتعريف النوع؛ فالشروط اختيارية ويمكنها تحديد قيود. :intيضمن الشرط الأول أن جسم الدالة سيتعامل فقط مع وسيط عددي صحيح. بدون الشرط الثاني :int، لن تتمكن الدالة من إرجاع قيمة. إن القدرة على رؤية المعلومات التي تتسرب من الدالة مسبقًا مفيدة لتدقيق الأمان.

بما أن لغة E مصممة لدعم التعاون الآمن، فإن المثال النموذجي لبرامجها هو نظام سك العملة، وهو نظام نقدي إلكتروني بسيط مكتوب ببضعة أسطر فقط من لغة E. يُعرّف الكود التالي دالةً تُنشئ أنظمة سك العملة، حيث يمتلك كل نظام عملته الخاصة. يستطيع كل نظام سك عملة إنشاء محافظ لحفظ عملته، ويمكن لأي حامل لمحفظتين من نفس العملة تحويل الأموال بينهما بأمان. من خلال فحص سريع للكود المصدري، يستطيع مبرمج لغة E التحقق بسهولة من أن أنظمة سك العملة فقط هي التي يمكنها تغيير كمية الأموال المتداولة، وأن الأموال تُنشأ فقط ولا تُفنى، وأن أنظمة سك العملة لا يمكنها إنشاء إلا عملتها الخاصة، وأن حامل المحفظة فقط هو من يستطيع تغيير رصيدها.

دالة makeMint ( الاسم ) : أي { دالة [ sealer ، unsealer ] := makeBrandPair ( الاسم ) دالة mint { to makePurse ( متغير balance : ( عدد صحيح >= 0 )) : أي { دالة decr ( المبلغ : ( 0 .. الرصيد )) : لا شيء { الرصيد -= المبلغ } دالة wallet { to getBalance () : عدد صحيح { إرجاع الرصيد } to sprout () : أي شيء { إرجاع mint.makePurse ( 0 ) } to getDecr ( ) : أي شيء { إرجاع sealer.seal ( decr ) } to deposit ( المبلغ : عدد صحيح ، المصدر ) : لا شيء { unsealer.unseal ( المصدر . getDecr ( ) )( المبلغ ) الرصيد + = المبلغ } } إرجاع wallet } } إرجاع mint }

تُعرَّف الكائنات في E باستخدام defالكلمة المفتاحية، وضمن تعريف الكائن، toتبدأ الكلمة المفتاحية كل دالة. توضح تعابير الحماية في هذا المثال كيفية تحديد قيد قيمة (كما في :(int >= 0)أو :(0..balance)).

يستخدم مثال دار سك العملة آلية مدمجة تُسمى " الختم" . تُنشئ هذه الوظيفة makeBrandPairعنصرين مرتبطين، هما "الختم" و"فك الختم"، بحيث يُمكن للختم إغلاق عنصر داخل صندوق، بينما يكون فك الختم هو العنصر الوحيد القادر على استخراج محتويات الصندوق. راجع موقع E الإلكتروني لمزيد من التفاصيل حول هذا المثال المتعلق بالعملات. [ 5 ]

انظر أيضاً

مراجع

  1. هاندي، أليكس (14 نوفمبر 2016). "مستقبل أمن البرمجيات" . إس دي تايمز .
  2. سيبل، بيتر (21 ديسمبر 2009). المبرمجون في العمل: تأملات في فن البرمجة . أبريس. ص 95-96 . ISBN  9781430219491.
  3. "تاريخ إي" . www.erights.org .
  4. ميلر، مارك س.؛ تريبل، إي. دين؛ شابيرو، جوناثان (2005). "التزامن بين الغرباء" (ملف PDF) . الحوسبة العالمية الموثوقة . سلسلة محاضرات في علوم الحاسوب. 3705 : 195-229 . Bibcode : 2005LNCS.3705..195M . doi : 10.1007/11580850_12 . ISBN 978-3-540-30007-6أُرشف من النسخة الأصلية (PDF) بتاريخ 31 مارس 2022. تم الاطلاع عليه بتاريخ 5 مارس 2021 .
  5. ريس، جوناثان؛ ميلر، مارك (2001). " من الأشياء إلى القدرات - النقود البسيطة" . erights.org . ERights . تم الاطلاع عليه في 8 يوليو 2014. قبل عرض المثال البسيط التالي للنقود القائمة على القدرات، يجب أن نحاول تبديد الالتباس الذي يسببه هذا المثال مرارًا وتكرارًا. نحن لا نقترح في الواقع تطبيق النقود بهذه الطريقة! يجب أن يوفر نظام النقود المرغوب فيه أيضًا...