ميراندا (لغة برمجة)
ميراندا هي لغة برمجة وظيفية بحتة ، مصممة من قبل ديفيد تيرنر كخليفة للغتي البرمجة السابقتين له SASL و KRC ، باستخدام بعض المفاهيم من لغتي ML و Hope . وقد أنتجتها شركة Research Software Ltd. في إنجلترا (التي تمتلك علامة تجارية لاسم ميراندا ) [ 3 ] ، وكانت أول لغة برمجة وظيفية بحتة تحظى بدعم تجاري.
صدرت لغة ميراندا لأول مرة عام 1985 كمترجم سريع للغة سي لأنظمة التشغيل من نوع يونكس ، مع إصدارات لاحقة في عامي 1987 و1989. وكان لها تأثير كبير على لغة هاسكل اللاحقة . [ 4 ] ذكر تيرنر أن مزايا ميراندا على هاسكل هي: "لغة أصغر، ونظام أنواع أبسط، وعمليات حسابية أبسط". [ 5 ]
في عام ٢٠٢٠، تم إصدار نسخة من برنامج ميراندا كمصدر مفتوح بموجب ترخيص BSD . تم تحديث الكود ليتوافق مع معايير لغة C الحديثة ( C11 / C18 ) وليُنتج ملفات تنفيذية ثنائية ٦٤ بت. وقد تم اختبار هذه النسخة على أنظمة تشغيل تشمل ديبيان ، وأوبونتو ، و WSL /أوبونتو، وماك أو إس ( كاتالينا ). [ ٥ ] [ ٦ ]
اسم

اسم ميراندا مأخوذ من صيغة المصدر للفعل اللاتيني miror ، [ 7 ] بمعنى "أن يكون محبوبًا".
يضم الشعار رسماً من تصميم جون ويليام ووترهاوس لشخصية ميراندا من مسرحية العاصفة لشكسبير .
ملخص
ميراندا لغة برمجة وظيفية بحتة ، تتميز بالكسل . أي أنها تخلو من التأثيرات الجانبية وخصائص البرمجة الإجرائية . برنامج ميراندا (يُسمى نصًا برمجيًا ) عبارة عن مجموعة من المعادلات التي تُعرّف دوال رياضية وأنواع بيانات جبرية متنوعة . كلمة " مجموعة" هنا مهمة: فترتيب المعادلات غير مهم عمومًا، ولا حاجة لتعريف أي كيان قبل استخدامه.
بما أن خوارزمية التحليل تستخدم التنسيق بذكاء (المسافة البادئة، عبر قاعدة التجاوز )، فنادرًا ما تكون هناك حاجة إلى عبارات الأقواس، كما أن فواصل العبارات غير ضرورية. هذه الميزة، المستوحاة من ISWIM ، تُستخدم أيضًا في لغتي أوكام وهاسكل ، وقد شاع استخدامها لاحقًا في بايثون .
تُضاف التعليقات إلى النصوص البرمجية العادية بواسطة الأحرف ||وتستمر حتى نهاية السطر نفسه. أما اصطلاح التعليق البديل فيؤثر على ملف الشفرة المصدرية بأكمله، ويُعرف باسم " النص اللفظي "، حيث يُعتبر كل سطر تعليقًا ما لم يبدأ بعلامة >.
أنواع البيانات الأساسية في ميراندا هي charو numو bool. سلسلة الأحرف هي ببساطة قائمة من char، بينما numيتم تحويلها بصمت بين شكلين أساسيين: أعداد صحيحة ذات دقة عشوائية (المعروفة أيضًا باسم الأعداد الكبيرة) بشكل افتراضي، وقيم الفاصلة العائمة العادية حسب الحاجة.
تُعدّ المجموعات المتسلسلة (Tuples) مجموعات من العناصر ذات أنواع مختلطة محتملة، بترتيب ثابت، وهي تُشبه السجلات في لغات مثل باسكال ، ولكن بحقول غير مُسماة. ويتم تحديدها بأقواس.
this_employee = ( "Folland, Mary" , 10560 , False , 35 )أما القائمة فهي بنية البيانات الأكثر استخدامًا في ميراندا. تُكتب القائمة مفصولة بأقواس مربعة، وتتكون عناصرها من فواصل، ويجب أن تكون جميعها من نفس النوع :
أيام الأسبوع = [ "الاثنين" ، "الثلاثاء" ، "الأربعاء" ، "الخميس" ، "الجمعة" ]دمج القوائم هو ++، والطرح هو --، والإنشاء هو :، وتحديد الحجم هو #، والفهرسة هي !، لذا:
أيام = أيام_الأسبوع ++ [ "السبت" ، "الأحد" ] أيام = "لا شيء" : أيام أيام ! 0 ⇒ "لا شيء" أيام = أيام -- [ "لا شيء" ] # أيام ⇒ 7هناك العديد من الاختصارات لإنشاء القوائم: ..يتم استخدامها للقوائم التي تشكل عناصرها سلسلة حسابية، مع إمكانية تحديد زيادة غير 1:
fac n = product [ 1 .. n ] odd_sum = sum [ 1 , 3 .. 100 ]يتم توفير تسهيلات بناء القوائم الأكثر عمومية وقوة من خلال " تراكيب القوائم " (المعروفة سابقًا باسم "تعبيرات ZF")، والتي تأتي في شكلين رئيسيين: تعبير يتم تطبيقه على سلسلة من المصطلحات، على سبيل المثال:
المربعات = [ ن * ن | ن <- [ 1 .. ] ](والتي تُقرأ: قائمة مربعات n حيث يتم أخذ n من قائمة جميع الأعداد الصحيحة الموجبة) ومتسلسلة يكون فيها كل حد دالة للحد السابق، على سبيل المثال:
قوى العدد 2 = [ n | n <- 1 , 2 * n .. ]كما تشير هاتان المثالان، تسمح ميراندا بقوائم تحتوي على عدد لا نهائي من العناصر، وأبسطها قائمة جميع الأعداد الصحيحة الموجبة:[1..]
إن طريقة التعبير عن تطبيق الدالة هي ببساطة وضع الدالة بجانب بعضها البعض، كما في المثال التالي sin x.
في لغة ميراندا، كما هو الحال في معظم لغات البرمجة الوظيفية البحتة الأخرى، تُعتبر الدوال عناصر أساسية ، أي يمكن تمريرها كوسائط إلى دوال أخرى، أو إرجاعها كنتائج، أو تضمينها كعناصر في هياكل البيانات. علاوة على ذلك، يمكن "تضمين" دالة ذات وسيطين أو أكثر جزئيًا، أو تطبيق تقنية "التعديل الجزئي" عليها ، وذلك بتمرير عدد أقل من الوسائط مقارنةً بالعدد الكامل للوسائط. ينتج عن ذلك دالة أخرى، تُرجع نتيجةً عند تمرير الوسائط المتبقية إليها. على سبيل المثال:
أضف a b = a + b الزيادة = أضف 1هي طريقة غير مباشرة لإنشاء دالة "زيادة" تضيف واحدًا إلى وسيطها. في الواقع، add 4 7تأخذ الدالة ذات الوسيطين add، وتطبقها 4للحصول على دالة ذات وسيط واحد تضيف أربعة إلى وسيطها، ثم تطبقها على الدالة الأخرى 7.
يمكن تحويل أي دالة ذات مُعاملين (معاملين) إلى مُعامل وسطي (على سبيل المثال، بالنظر إلى تعريف الدالة addأعلاه، فإن المصطلح $addمُكافئ تمامًا للمُعامل +)، ويمكن تحويل كل مُعامل وسطي يأخذ مُعاملين إلى دالة مُناظرة. وبالتالي:
الزيادة = ( + ) 1هي أقصر طريقة لإنشاء دالة تضيف واحدًا إلى وسيطها. وبالمثل، في
النصف = ( / 2 ) المقلوب = ( 1 / )يتم توليد دالتين بمعامل واحد. يفهم المفسر في كل حالة أيًا من معاملي عامل القسمة يتم تمريره، مما ينتج عنه دالتان تقسمان عددًا على اثنين وتعيدان مقلوبه على التوالي.
على الرغم من أن لغة ميراندا لغة برمجة ذات كتابة قوية ، إلا أنها لا تشترط تحديد أنواع البيانات بشكل صريح . فإذا لم يُحدد نوع دالة ما بشكل صريح، يستنتج المفسر نوعه من نوع مُعاملاتها وكيفية استخدامها داخل الدالة. بالإضافة إلى الأنواع الأساسية (مثل `int` و`int` charو` numint` bool)، تتضمن ميراندا نوعًا يُسمى "أي شيء" حيث لا يُهم نوع المُعامل، كما هو الحال في دالة عكس ترتيب عناصر القائمة.
المراجعة [] = [] المراجعة ( أ : x ) = المراجعة x ++ [ أ ]والتي يمكن تطبيقها على قائمة من أي نوع بيانات، والتي سيكون تعريف نوع الدالة الصريح لها كالتالي:
rev :: [ * ] -> [ * ]وأخيرًا، يحتوي على آليات لإنشاء وإدارة وحدات البرامج التي تكون وظائفها الداخلية غير مرئية للبرامج التي تستدعي تلك الوحدات.
نموذج التعليمات البرمجية
يحدد نص ميراندا التالي قائمة جميع القوائم الفرعية لقائمة معينة
القوائم الفرعية [] = [ [] ] القوائم الفرعية ( x : xs ) = [[ x ] ++ y | y <- ys ] ++ ys حيث ys = القوائم الفرعية xsوهذا نص برمجي واضح لدالة primes تُعطي قائمة بجميع الأعداد الأولية
> || قائمة لا نهائية لجميع الأعداد الأولية. تبدأ قائمة الأعداد الأولية المحتملة بجميع الأعداد الصحيحة من 2 فصاعدًا؛ مع إرجاع كل عدد أولي، فإن جميع الأعداد التالية التي يمكن أن تكون بالضبط يتم استبعاد المرشحين الذين تم تقسيمهم على هذا المعدل من قائمة المرشحين. > primes = sieve [2..] > sieve (p:x) = p : sieve [n | n <- x; n mod p ~= 0] إليكم بعض الأمثلة الإضافية
max2 :: num -> num -> num max2 a b = a , إذا كان a > b = b , خلاف ذلكmax3 :: num -> num -> num -> num max3 a b c = max2 ( max2 a b ) ( max2 a c )فاك :: الأسطوانات -> الأسطوانات فاك 0 = 1 فاك n = n * فاك ( ن - 1 )itemnumber :: [ * ] -> num itemnumber [] = 0 itemnumber ( a : x ) = 1 + itemnumber xأيام الأسبوع ::= مو | تو | نحن | ث | الاب | سا | سوisWorkDay :: weekday -> bool isWorkDay Sa = False isWorkDay Su = False isWorkDay anyday = Trueشجرة * ::= E | N ( شجرة * ) * ( شجرة * )nodecount :: tree * -> num nodecount E = 0 nodecount ( N l w r ) = nodecount l + 1 + nodecount remptycount :: tree * -> num emptycount E = 1 emptycount ( N l w r ) = emptycount l + emptycount rمثال الشجرة = N ( N ( N E 1 E ) 3 ( N E 4 E )) 5 ( N ( N E 6 E ) 8 ( N E 9 E ) ) شجرة أيام الأسبوع = N ( N ( N E Mo E ) Tu ( N E We E )) Th ( N ( N E Fr E ) Sa ( N E Su ))إدراج :: * -> stree * -> stree * إدراج x E = N E x E إدراج x ( N l w E ) = N l w x إدراج x ( N E w r ) = N x w r إدراج x ( N l w r ) = إدراج x l ، إذا كان x < w = إدراج x r ، خلاف ذلكlist2searchtree :: [ * ] -> tree * list2searchtree [] = E list2searchtree [ x ] = N E x E list2searchtree ( x : xs ) = insert x ( list2searchtree xs )maxel :: tree * -> * maxel E = error "empty" maxel ( N l w E ) = w maxel ( N l w r ) = maxel rminel :: tree * -> * minel E = خطأ "فارغ" minel ( N E w r ) = w minel ( N l w r ) = minel l|| الاجتياز : المرور على قيم الشجرة ووضعها في قائمةترتيب مسبق ، ترتيب داخلي ، ترتيب لاحق :: شجرة * -> [ * ] ترتيب داخلي E = [] ترتيب داخلي N l w r = ترتيب داخلي l ++ [ w ] ++ ترتيب داخلي rالترتيب المسبق E = [] الترتيب المسبق N l w r = [ w ] ++ الترتيب المسبق l ++ الترتيب المسبق rالترتيب اللاحق E = [] الترتيب اللاحق N l w r = الطلب اللاحق l ++ الطلب اللاحق r ++ [ w ]الارتفاع :: شجرة * -> عدد الارتفاع E = 0 الارتفاع ( N l w r ) = 1 + max2 ( الارتفاع l ) ( الارتفاع r )amount :: num -> num amount x = x , if x >= 0 amount x = x * ( - 1 ), otherwiseو :: منطقي -> منطقي -> منطقي و صحيح صحيح = صحيح و س ص = خطأ|| شجرة AVL هي شجرة لا يزيد فيها الفرق بين العقد الفرعية عن 1 || ما زلت بحاجة إلى اختبار هذاisAvl :: tree * -> bool isAvl E = True isAvl ( N l w r ) = and ( isAvl l ) ( isAvl r ), if amount (( nodecount l ) - ( nodecount r )) < 2 = False , otherwiseحذف :: * -> شجرة * -> شجرة * حذف x E = E حذف x ( N E x E ) = E حذف x ( N E x r ) = N E ( minel r ) ( حذف ( minel r ) r ) حذف x ( N l x r ) = N ( حذف ( maxel l ) l ) ( maxel l ) r حذف x ( N l w r ) = N ( حذف x l ) w ( حذف x r )مراجع
- ↑ "صفحة تنزيل ميراندا" . تم الاطلاع عليها بتاريخ 17 مايو 2024 .
- ↑ "ميراندا: نسخ" . تم الاطلاع عليه بتاريخ 17 مايو 2024 .
- ↑ تيرنر، د. أ. (سبتمبر 1985). "ميراندا: لغة وظيفية غير صارمة ذات أنواع متعددة الأشكال" (ملف PDF) . في: جوانو، جان بيير (محرر). لغات البرمجة الوظيفية وهندسة الحاسوب . سلسلة محاضرات في علوم الحاسوب. المجلد 201. برلين، هايدلبرغ: سبرينغر. الصفحات 1-16 . doi : 10.1007/3-540-15975-4_26 . ISBN 978-3-540-39677-2.
- ↑ هوداك، بول؛ هيوز، جون؛ بيتون جونز، سيمون؛ وادلر، فيليب (9 يونيو 2007). "تاريخ هاسكل: الكسل مع الفئات" . وقائع المؤتمر الثالث لجمعية ACM SIGPLAN حول تاريخ لغات البرمجة . نيويورك، نيويورك، الولايات المتحدة الأمريكية: ACM. doi : 10.1145/1238844.1238856 . ISBN 9781595937667. S2CID 52847907 .
- 1 2 تيرنر، ديفيد (22 مارس 2021). "فتح مصدر ميراندا" . كود سينك . لندن (نُشر في نوفمبر 2020) . تم الاسترجاع في 30 ديسمبر 2021 .
- ↑ "صفحة تنزيل ميراندا" . www.cs.kent.ac.uk. تاريخ الاسترجاع: 30 ديسمبر 2021 .
- ↑ "حول اسم ميراندا" . تم الاطلاع عليه بتاريخ 18-05-2024 .
روابط خارجية
- الموقع الرسمي

- النسخة الحالية مفتوحة المصدر من مترجم البروفيسور تيرنر لبرنامج ميراندا.
- مكتبة الرياضيات ذات الدقة اللانهائية ، وهي مثال كبير على البرمجة بلغة ميراندا (وهاسكل).
- لغات البرمجة التصريحية
- اللغات الوظيفية
- تاريخ الحوسبة في المملكة المتحدة
- لغات البرمجة التي تم إنشاؤها عام 1985
