أوز (لغة برمجة)
أوز هي لغة برمجة متعددة الأنماط ، طُوِّرت في مختبر أنظمة البرمجة في الجامعة الكاثوليكية في لوفان ، لأغراض تعليم لغات البرمجة. ولها كتاب مرجعي أساسي بعنوان: مفاهيم وتقنيات ونماذج برمجة الحاسوب .
صُمم برنامج أوز لأول مرة على يد جيرت سمولكا وطلابه عام ١٩٩١. وفي عام ١٩٩٦، استمر تطوير أوز بالتعاون مع فريق البحث بقيادة سيف حريدي وبيتر فان روي في المعهد السويدي لعلوم الحاسوب . ومنذ عام ١٩٩٩، تولى تطوير أوز فريق دولي، هو اتحاد موزارت، الذي كان يتألف في الأصل من جامعة سارلاند ، والمعهد السويدي لعلوم الحاسوب ، والجامعة الكاثوليكية في لوفان . وفي عام ٢٠٠٥، نُقلت مسؤولية إدارة تطوير موزارت إلى فريق أساسي، هو مجلس موزارت، بهدف إتاحة تطوير موزارت لمجتمع أوسع.
يُعد نظام برمجة موزارت التطبيق الأساسي لبرنامج أوز. وهو مُرخص بموجب رخصة مفتوحة المصدر من قِبل اتحاد موزارت. وقد تم نقل موزارت إلى أنظمة يونكس ، وفري بي إس دي ، ولينكس ، وويندوز ، وماك أو إس .
خصائص اللغة
تتضمن لغة Oz [ 2 ] معظم مفاهيم نماذج البرمجة الرئيسية ، بما في ذلك البرمجة المنطقية، والوظيفية (بكل من التقييم الكسول والتقييم الفوري )، والإجرائية، والبرمجة كائنية التوجه، والبرمجة المقيدة، والبرمجة الموزعة، والبرمجة المتزامنة. تتميز Oz بدلالات رسمية بسيطة (انظر الفصل 13 من الكتاب المذكور أدناه) وتنفيذ فعال. تُعد Oz لغة موجهة نحو التزامن ، كما صاغ هذا المصطلح جو أرمسترونغ، المصمم الرئيسي للغة إرلانج . تُسهّل اللغة الموجهة نحو التزامن استخدام التزامن وتجعله أكثر كفاءة. تدعم Oz لغة واجهة المستخدم الرسومية (GUI) القياسية QTk [ 3 ] .
إلى جانب البرمجة متعددة الأنماط، تكمن نقاط القوة الرئيسية للغة Oz في برمجة القيود والبرمجة الموزعة . وبفضل تصميمها المُجزأ، تستطيع Oz تطبيق نموذج برمجة موزعة شفاف للشبكة بنجاح. يُسهّل هذا النموذج برمجة تطبيقات مفتوحة وقادرة على تحمل الأعطال ضمن اللغة. أما بالنسبة لبرمجة القيود، فتُقدّم Oz مفهوم مساحات الحساب ، التي تسمح باستراتيجيات بحث وتوزيع مُحددة من قِبل المستخدم، مُستقلة عن نطاق القيود.
نظرة عامة على اللغة
هياكل البيانات
تعتمد لغة Oz على لغة أساسية ذات أنواع بيانات قليلة جدًا يمكن توسيعها إلى أنواع بيانات أكثر عملية من خلال تحسينات نحوية .
هياكل البيانات الأساسية:
- الأرقام: أرقام عشرية أو أرقام صحيحة (عدد صحيح حقيقي)
- السجلات: لتجميع البيانات :
circle(x:0 y:1 radius:3 color:blue style:dots). هنا تسمى المصطلحات x و y ونصف القطر وما إلى ذلك بالميزات والبيانات المرتبطة بالميزات (في هذه الحالة 0 و 1 و 3 وما إلى ذلك) هي القيم. - الصفوف: سجلات ذات خصائص عددية مرتبة تصاعدياً:
circle(1:0 2:1 3:3 4:blue 5:dots). - القوائم: بنية خطية بسيطة
'|' ( 2 '|' ( 4 '|' ( 6 '|' ( 8 nil )))) % كسجل. 2 |( 4 |( 6 |( 8 | nil ))) % مع بعض التحسينات النحوية 2 | 4 | 6 | 8 | nil % المزيد من التحسينات النحوية [ 2 4 6 8 ] % المزيد من التحسينات النحويةتُعتبر هياكل البيانات هذه قيمًا (ثابتة)، من الدرجة الأولى ، ويتم التحقق من نوعها ديناميكيًا . تبدأ أسماء المتغيرات في Oz بحرف كبير لتمييزها عن القيم الحرفية [ 4 ] التي تبدأ دائمًا بحرف صغير.
الوظائف
الدوال [ 5 ] هي قيم من الدرجة الأولى، مما يسمح بالبرمجة الوظيفية من الدرجة الأعلى :
دالة { حقيقة N } إذا كان N ≤ 0 فإن 1 وإلا N * { حقيقة N - 1 } نهاية نهايةدالة { Comb N K } { Fact N } div ({ Fact K } * { Fact N - K }) % لا يمكن للأعداد الصحيحة أن تتجاوز الحد الأقصى في Oz (إلا إذا لم يتبق أي ذاكرة) نهايةدالة { SumList List } حالة List من nil ثم 0 [] H | T ثم H + { SumList T } % مطابقة الأنماط على القوائم نهاية نهايةيمكن استخدام الدوال مع كل من المتغيرات الحرة والمقيدة. يتم إيجاد قيم المتغيرات الحرة باستخدام النطاق المعجمي الثابت . [ 6 ]
البرمجة عالية المستوى
تُشبه الدوال كائنات Oz الأخرى. يمكن تمرير الدالة كخاصية إلى دوال أخرى أو يمكن إرجاعها في دالة.
دالة { مربع N } % دالة عامة N * N نهايةدالة { Map F Xs } % F دالة هنا - برمجة من الرتبة العليا حالة Xs من nil ثم nil [] X | Xr ثم { F X }|{ Map F Xr } نهاية نهاية%usage { Browse { Map Square [ 1 2 3 ]}} %browses [1 4 9]الوظائف المجهولة
على غرار العديد من لغات البرمجة الوظيفية الأخرى، تدعم لغة Oz استخدام الدوال المجهولة (أي الدوال التي ليس لها اسم) في البرمجة عالية المستوى. ويُستخدم الرمز $ للدلالة على هذه الدوال.
فيما يلي، يتم تعريف دالة المربع بشكل مجهول وتمريرها، مما يؤدي [1 4 9]إلى تصفحها.
{ تصفح { دالة الخريطة { $ N } N * N نهاية [ 1 2 3 ]}}بما أن الدوال المجهولة ليس لها أسماء، فليس من الممكن تعريف الدوال المجهولة المتكررة.
إجراءات
من المفترض أن تُعيد الدوال في لغة Oz قيمةً عند آخر عبارة تُصادفها في جسم الدالة أثناء تنفيذها. في المثال أدناه، تُعيد الدالة Ret القيمة 5 إذا كانت X > 0، والقيمة -5 في غير ذلك.
أعلن دالة { إرجاع X } إذا كان X > 0 فإن 5 وإلا ~ 5 نهاية نهايةلكن أوز توفر أيضًا آلية في حالة عدم وجوب إرجاع دالة لقيم. تُسمى هذه الدوال بالإجراءات. [ 7 ] تُعرَّف الإجراءات باستخدام البنية "proc" كما يلي
أعلن الإجراء { إرجاع X } إذا كان X > 0 ، فقم بتصفح 5 ، وإلا فقم بتصفح ~ 5. انتهى .المثال أعلاه لا يُرجع أي قيمة، بل يطبع فقط 5 أو -5 في متصفح Oz اعتمادًا على إشارة X.
متغيرات تدفق البيانات والتزامن التصريحي
عندما يواجه البرنامج متغيرًا غير مُرتبط بقيمة، فإنه ينتظر حتى يتم ربط قيمة له. على سبيل المثال، في المثال أدناه، سينتظر البرنامج حتى يتم ربط كل من X و Y بقيمة قبل عرض قيمة Z.
الخيط Z = X + Y { تصفح Z } نهاية الخيط X = 40 نهاية الخيط Y = 2 نهايةلا يمكن تغيير قيمة متغير تدفق البيانات بمجرد ربطه:
X = 1 X = 2 نسبة الخطأتسهل متغيرات تدفق البيانات إنشاء وكلاء تدفق متزامنين:
دالة { عدد صحيح N الحد الأقصى } إذا كان N يساوي الحد الأقصى، فلا شيء وإلا { تأخير 1000 } N | { عدد صحيح N + 1 الحد الأقصى } نهاية نهايةدالة { مجموع S دفق } حالة دفق من لا شيء ثم S [] H | T ثم S |{ مجموع H + S T } نهاية نهايةlocal X Y in thread X = { Ints 0 1000 } end thread Y = { Sum 0 X } end { Browse Y } endبفضل آلية عمل متغيرات تدفق البيانات، يُمكن وضع الخيوط في أي مكان في البرنامج مع ضمان الحصول على النتيجة نفسها. وهذا يُسهّل البرمجة المتزامنة للغاية. الخيوط غير مكلفة: إذ يُمكن تشغيل 100,000 خيط في وقت واحد. [ 8 ]
مثال: منخل التقسيم التجريبي
يحسب هذا المثال سلسلة من الأعداد الأولية باستخدام خوارزمية القسمة التجريبية عن طريق إنشاء عوامل تدفق متزامنة بشكل متكرر تقوم بتصفية الأعداد غير الأولية:
دالة { غربال Xs } حالة Xs من nil ثم nil [] X | Xr ثم Ys في سلسلة الرسائل Ys = { تصفية Xr دالة { $ Y } Y mod X \ = 0 نهاية } نهاية X |{ غربال Ys } نهاية نهايةالكسل
يستخدم Oz التقييم الفوري افتراضيًا، ولكن التقييم المؤجل [ 9 ] ممكن أيضًا. في المثال أدناه، تُحسب الحقيقة فقط عندما تكون قيمة X مطلوبة لحساب قيمة Y.
دالة كسولة { حقيقة N } إذا كانت N أقل من أو تساوي صفرًا ، فإن N تساوي 1، وإلا فإن N تساوي { حقيقة N - 1 } نهاية نهاية متغير محلي X Y في X = { حقيقة 100 } Y = X + 1 نهايةتتيح خاصية التقييم الكسول إمكانية تخزين هياكل بيانات لا نهائية في Oz. ويمكن ملاحظة قوة هذه الخاصية من خلال نموذج الكود التالي:
أعلن دالة lazy { دمج Xs Ys } حالة Xs # Ys من ( X | Xr ) # ( Y | Yr ) ثم إذا كان X < Y فإن X | { دمج Xr Ys } وإذا كان X > Y فإن Y | { دمج Xs Yr } وإلا X | { دمج Xr Yr } نهاية نهاية نهايةدالة كسولة { مضروبة في N Xs } حالة Xs من لا شيء ثم لا شيء [] X | Xr ثم N * X |{ مضروبة في N Xr } نهاية نهايةأعلن H = 1 | { ادمج { مرتين H } { ادمج { ثلاث مرات H } { خمس مرات H }} } { تصفح { القائمة . خذ H 6 } }يحسب الكود أعلاه جميع الأعداد المنتظمة [ 10 ] في قائمة غير منتهية بكفاءة عالية. ويتم حساب الأعداد الفعلية فقط عند الحاجة إليها.
التزامن في تمرير الرسائل
يمكن توسيع نموذج التزامن التصريحي ليشمل تمرير الرسائل عبر دلالات بسيطة:
أعلن عن منفذ محلي في المتغير Port = { NewPort Stream } { Send Port 1 } % أصبح Stream الآن 1|_ (يشير '_' إلى متغير غير مرتبط وغير مسمى) { Send Port 2 } % أصبح Stream الآن 1|2|_ ... { Send Port n } % أصبح Stream الآن 1|2| .. |n|_ endباستخدام منفذ وخيط، يمكن تعريف العوامل غير المتزامنة:
دالة { دالة تهيئة وكيل جديد } رسالة خارجة في سلسلة الرسائل { دالة تهيئة رسالة FoldL خارجة } نهاية { رسالة منفذ جديد } نهايةالدولة والأهداف
من الممكن مجدداً توسيع النموذج التصريحي لدعم البرمجة الموجهة نحو الحالة والبرمجة الموجهة نحو الكائنات بدلالات بسيطة للغاية. لإنشاء بنية بيانات جديدة قابلة للتغيير تُسمى الخلايا:
local A X in A = { NewCell 0 } A : = 1 % يغير قيمة A إلى 1 X = @ A % تُستخدم @ للوصول إلى قيمة A endبفضل هذه التغييرات الدلالية البسيطة، يمكن دعم نموذج البرمجة الكائنية بالكامل. وبقليل من التحسينات النحوية ، تصبح البرمجة الكائنية متكاملة تمامًا في أوز.
صنف العداد attr val meth init ( Value ) val := Value end meth browse { Browse @val } end meth inc ( Value ) val := @val + Value end endlocal C in C = { New Counter init ( 0 )} { C inc ( 6 )} { C browse } endسرعة التنفيذ
سرعة تنفيذ برنامج مُنتَج بواسطة مُصرّف موزارت (الإصدار 1.4.0 الذي يُطبّق Oz 3) بطيئة للغاية. في مجموعة من الاختبارات المعيارية لعام 2012 ، كان متوسط سرعته أبطأ بحوالي 50 مرة من متوسط سرعة مجموعة مُصرّفات جنو (GCC) للغة C. [ 11 ]
انظر أيضاً
- أليس (لغة برمجة) ، وهي لغة قيود وظيفية متزامنة من جامعة سارلاند
- برمجة تدفق البيانات
- لغات البرمجة المنطقية الوظيفية
- كاري (لغة برمجة)
- ميركوري (لغة برمجة)
- Visual Prolog ، لغة برمجة كائنية التوجه، وظيفية، منطقية
مراجع
- بيتر فان روي وسيف حريدي (2004). مفاهيم وتقنيات ونماذج برمجة الحاسوب . مطبعة معهد ماساتشوستس للتكنولوجيا. يتوفر لهذا الكتاب مواد داعمة عبر الإنترنت . يقدم الكتاب، وهو مدخل إلى مبادئ لغات البرمجة، أسلوب أوز كأسلوب مفضل لعرض الأمثلة.
- ↑ "معلومات ترخيص موزارت أوز" . 16 يناير 2014. تم الاطلاع عليه في 16 يناير 2014 .
- ↑ جيرت سمولكا (1995). "نموذج برمجة أوز" (ملف PDF) . علوم الحاسوب اليوم . سلسلة محاضرات في علوم الحاسوب. المجلد 1000. الصفحات 324-343 . doi : 10.1007/BFb0015252 . ISBN 978-3-540-60105-0.
- ↑ "QTk" . مؤرشف من الأصل في 20 مايو 2013. تم الاطلاع عليه في 6 أبريل 2009 .
- ↑ "3 أساسيات" .
- ↑ ليف غرونكفيست. "الدوال من الرتبة العليا". البرمجة الوظيفية المتقدمة في أوز . مؤرشف من الأصل في 3 مارس 2016. تم الاطلاع عليه في 3 نوفمبر 2014 .
- ↑ روبرت جنتلمان؛ روس إيهاكا (سبتمبر 2000). "النطاق المعجمي في الحوسبة الإحصائية" (ملف PDF) . مجلة الإحصاءات الحاسوبية والرسومية . 9 (3، الأنظمة واللغات): 491-508 . doi : 10.1080/10618600.2000.10474895 .
- ↑ "5 هياكل تحكم أساسية" .
- ↑ "دليل أوز - 8 التزامن" . مؤرشف من الأصل في 14 أغسطس 2013. تم الاطلاع عليه في 29 نوفمبر 2008 .
- ↑ بول هوداك (1989). "مفهوم لغات البرمجة الوظيفية وتطورها وتطبيقها". مجلة ACM Computing Surveys . 21 (3): 359-411 . doi : 10.1145/72551.72554 . S2CID 207637854 .
- ↑ راو، أ.س. وفارادا راجو، د. (1991). "تطبيق تقنية عدد هامينغ للكشف عن التماثل بين السلاسل الحركية والانعكاسات". نظرية الآليات والآلات . 26 (1): 55-75 . doi : 10.1016/0094-114x(91)90022-v .
- ↑ لعبة معايير لغات البرمجة
روابط خارجية
- الموقع الرسمي
- دليل أوز
- أبحاث لغات البرمجة في جامعة لندن : يُعد هذا الفريق أحد المطورين الأساسيين لبرنامج موزارت/أوز، ويجري أبحاثًا باستخدام موزارت/أوز كأداة.
- البرمجة متعددة النماذج في موزارت/أوز: وقائع مؤتمر موزارت/أوز 2004: يقدم لمحة عامة عن العمل الذي يتم إنجازه باستخدام موزارت/أوز
- البرمجة في أوز
- أساسيات أوز
- لغات البرمجة متعددة الأنماط
- لغات البرمجة المنطقية الوظيفية
- لغات البرمجة المنطقية
- لغات البرمجة ذات الكتابة الديناميكية
- لغات البرمجة القائمة على النماذج الأولية
- لغات البرمجة المتزامنة
- لغات البرمجة التعليمية
- لغات البرمجة التي تم إنشاؤها عام 1991
