إرلانج (لغة برمجة)

إرلانج ( تُلفظ / ˈɜːrlæŋ / UR - lang ) هي لغة برمجة عامة الأغراض ، متزامنة ، وظيفية ، وعالية المستوى ، ونظام تشغيل مزود بخاصية جمع البيانات المهملة . يُستخدم مصطلح إرلانج بشكل متبادل مع إرلانج/OTP، أو منصة الاتصالات المفتوحة (OTP)، والتي تتكون من نظام تشغيل إرلانج ، والعديد من المكونات الجاهزة للاستخدام (OTP) المكتوبة بشكل أساسي بلغة إرلانج، ومجموعة من مبادئ تصميم برامج إرلانج. [ 5 ]

تم تصميم نظام تشغيل إرلانج للأنظمة التي تتميز بهذه الخصائص:

تتضمن لغة البرمجة إرلانج البيانات، ومطابقة الأنماط ، والبرمجة الوظيفية . [ 7 ] يدعم الجزء التسلسلي من لغة إرلانج التقييم الفوري ، والتخصيص الفردي ، والكتابة الديناميكية .

يتم بناء تطبيق Erlang العادي من مئات العمليات الصغيرة المكتوبة بلغة Erlang.

كان في الأصل برنامجًا احتكاريًا داخل شركة إريكسون ، تم تطويره بواسطة جو أرمسترونج وروبرت فيردينج ومايك ويليامز في عام 1986، [ 8 ] ولكن تم إصداره كبرنامج مجاني ومفتوح المصدر في عام 1998. [ 9 ] [ 10 ] يتم دعم Erlang/OTP وصيانته بواسطة وحدة منتجات منصة الاتصالات المفتوحة (OTP) في شركة إريكسون .

تاريخ

يُعتقد أن اسم إرلانج ، المنسوب إلى بيارن داكر، مشتق من اسم عالم الرياضيات والمهندس الدنماركي أغنر كراروب إرلانج ، وهو اختصار مقطعي لعبارة "لغة إريكسون". [ 8 ] [ 11 ] [ 12 ] صُممت إرلانج بهدف تحسين تطوير تطبيقات الاتصالات الهاتفية. [ 13 ] طُبقت النسخة الأولى من إرلانج بلغة برولوج ، وتأثرت بلغة البرمجة بليكس المستخدمة في مقاسم إريكسون السابقة. بحلول عام 1988، أثبتت إرلانج ملاءمتها لإنشاء نماذج أولية لمقاسم الهاتف، إلا أن مترجم برولوج كان بطيئًا للغاية. وقدّرت إحدى المجموعات داخل إريكسون أن سرعة الترجمة ستكون أعلى بأربعين ضعفًا لتكون مناسبة للاستخدام في الإنتاج. في عام ١٩٩٢، بدأ العمل على الآلة الافتراضية BEAM ، التي تُترجم لغة إرلانج إلى لغة C باستخدام مزيج من التعليمات البرمجية المُترجمة أصلاً والتعليمات البرمجية متعددة الخيوط لتحقيق التوازن بين الأداء ومساحة القرص. [ ١٤ ] ووفقًا للمخترع المشارك جو أرمسترونج، انتقلت اللغة من منتج مختبري إلى تطبيقات حقيقية بعد انهيار مقسم الهاتف AXE-N من الجيل التالي في عام ١٩٩٥. ونتيجة لذلك، تم اختيار إرلانج لمقسم AXD التالي الذي يعمل بتقنية نقل البيانات غير المتزامن (ATM) . [ ٨ ]

روبرت فيردينغ وجو أرمسترونغ، 2013

في فبراير 1998، حظرت شركة إريكسون لأنظمة الراديو استخدام لغة إرلانج داخليًا في منتجاتها الجديدة، مُعللةً ذلك بتفضيلها للغات غير الاحتكارية. [ 15 ] دفع هذا الحظر أرمسترونج وآخرين إلى التخطيط لمغادرة إريكسون. [ 16 ] في مارس 1998، أعلنت إريكسون عن مُبدِّل AXD301، [ 8 ] الذي يحتوي على أكثر من مليون سطر من لغة إرلانج، وأفادت الشركة بتحقيقه مستوى توافر عالٍ يصل إلى تسع تسعات . [ 17 ] في ديسمبر 1998، تم نشر تطبيق إرلانج كمصدر مفتوح، واستقال معظم فريق إرلانج لتأسيس شركة جديدة، هي بلوتيل إيه بي. [ 8 ] في نهاية المطاف، خففت إريكسون الحظر وأعادت توظيف أرمسترونج في عام 2004. [ 16 ]

في عام 2006، تمت إضافة دعم المعالجة المتعددة المتناظرة الأصلية إلى نظام وقت التشغيل والآلة الافتراضية. [ 8 ]

العمليات

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

قام جو أرمسترونج، المخترع المشارك لـ Erlang، بتلخيص مبادئ العمليات في أطروحته للدكتوراه: [ 18 ]

  • كل شيء عبارة عن عملية.
  • العمليات معزولة بشكل كبير.
  • إنشاء العمليات وتدميرها عملية بسيطة.
  • يُعد تبادل الرسائل الطريقة الوحيدة لتفاعل العمليات.
  • للعمليات أسماء فريدة.
  • إذا كنت تعرف اسم عملية ما، يمكنك إرسال رسالة إليها.
  • لا تتشارك العمليات في أي موارد.
  • معالجة الأخطاء غير محلية.
  • تقوم العمليات بما هو مطلوب منها أو تفشل.

قال جو أرمسترونج في مقابلة مع راك سبيس في عام 2013: "إذا كانت جافا هي ' اكتب مرة واحدة، وشغل في أي مكان '، فإن إرلانج هي 'اكتب مرة واحدة، وشغل إلى الأبد'." [ 19 ]

الاستخدام

في عام 2014، أفادت شركة إريكسون أن لغة إرلانج كانت تستخدم في عقد الدعم الخاصة بها، وفي شبكات الهاتف المحمول GPRS و 3G و LTE في جميع أنحاء العالم، وكذلك من قبل شركتي نورتل ودويتشه تيليكوم . [ 20 ]

تُستخدم لغة إرلانج في رابيت إم كيو . وكما أوضح تيم براي ، مدير تقنيات الويب في شركة صن مايكروسيستمز ، في كلمته الرئيسية في مؤتمر أورايلي للمصادر المفتوحة (OSCON) في يوليو 2008:

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

إرلانج هي لغة البرمجة المستخدمة في برمجة واتساب . [ 21 ]

وهي أيضاً اللغة المفضلة لـ Ejabberd - خادم مراسلة XMPP .

Elixir هي لغة برمجة تُترجم إلى رمز بايت BEAM (عبر تنسيق Erlang المجرد). [ 22 ]

منذ إطلاقها كمصدر مفتوح، انتشرت لغة إرلانج خارج نطاق الاتصالات، لتترسخ في أسواق رأسية أخرى مثل التكنولوجيا المالية، والألعاب، والرعاية الصحية، والسيارات، وإنترنت الأشياء ، وتقنية البلوك تشين. وبالإضافة إلى واتساب، هناك شركات أخرى تُعدّ قصص نجاح لإرلانج، منها فوكالينك (إحدى شركات ماستركارد)، وجولدمان ساكس ، ونينتندو ، وأد رول، وجريندر ، وبي تي موبايل ، وسامسونج ، وأوبن إكس ، وسيتا . [ 23 ] [ 24 ]

أمثلة على البرمجة الوظيفية

مضروب

خوارزمية حساب المضروب مُنفذة بلغة إرلانج:

- module ( fact ). % هذا هو الملف 'fact.erl'، يجب أن يتطابق اسم الوحدة مع اسم الملف. - export ([ fac / 1 ]). % هذا يُصدّر الدالة 'fac' ذات عدد المعاملات 1 (معامل واحد، بدون نوع، بدون اسم)fac ( 0 ) -> 1 ; % إذا كانت القيمة 0، فأرجع 1، وإلا (لاحظ الفاصلة المنقوطة ; التي تعني "وإلا") fac ( N ) عندما N > 0 ، is_integer ( N ) -> N * fac ( N - 1 ). % حدد القيمة بشكل متكرر، ثم أرجع النتيجة % (لاحظ النقطة . التي تعني "نهاية الشرط" أو "نهاية الدالة") %% ستتعطل هذه الدالة إذا تم إدخال أي قيمة غير عدد صحيح غير سالب. %% يوضح هذا فلسفة "دعها تتعطل" في لغة إرلانج.

متتالية فيبوناتشي

خوارزمية تكرارية ذيلية تنتج متتالية فيبوناتشي :

%% يجب أن يتطابق تعريف الوحدة مع اسم الملف "series.erl" - module ( series ).%% تحتوي عبارة التصدير على قائمة بجميع الدوال التي تُشكّل %% واجهة برمجة التطبيقات العامة للوحدة. في هذه الحالة، تُعرّض هذه الوحدة دالة واحدة %% تُسمى fib تأخذ وسيطًا واحدًا (أي أن عدد وسائطها يساوي 1). %% الصيغة العامة لـ -export هي قائمة تحتوي على اسم %% وعدد وسائط كل دالة عامة - export ([ fib / 1 ]).%% --------------------------------------------------------------------- %% واجهة برمجة التطبيقات العامة %% ---------------------------------------------------------------------%% معالجة الحالات التي تتلقى فيها fib/1 قيمًا محددة %% يُعد ترتيب تعريف توقيعات هذه الدوال جزءًا حيويًا %% من وظائف هذه الوحدةإذا استقبلت الدالة fib/1 عددًا سالبًا، فأرجع قيمة الخطأ err_neg_val . عادةً، يُنصح بتجنب هذا النوع من البرمجة الدفاعية نظرًا لفلسفة إرلانج "دعها تتعطل"، ولكن في هذه الحالة ستكون النتيجة حلقة لا نهائية. fib ( N ) when N < 0 -> err_neg_val ;%% إذا تم تمرير العدد الصحيح 0 بالضبط إلى fib/1، فسيتم إرجاع 0 fib ( 0 ) -> 0 ;%% بالنسبة لجميع القيم الأخرى، قم باستدعاء الدالة الخاصة fib_int/3 لإجراء %% الحساب fib ( N ) -> fib_int ( N - 1 , 0 , 1 ).%% --------------------------------------------------------------------- %% واجهة برمجة تطبيقات خاصة %% ---------------------------------------------------------------------إذا استقبلت الدالة fib_int/3 القيمة 0 كمعامل أول، فقد انتهينا، لذا تُرجع الدالة القيمة الموجودة في المعامل B. يُشار إلى المعامل الثاني بـ _ لتجاهل قيمته. fib_int ( 0 , _, B ) -> B ;%% بالنسبة لجميع تركيبات الوسائط الأخرى، قم باستدعاء fib_int/3 بشكل متكرر %% حيث يقوم كل استدعاء بما يلي: %% - إنقاص العداد N %% - تمرير الوسيط الثالث كمعامل ثانٍ جديد %% - تمرير مجموع الوسيطين الثاني والثالث كمعامل ثالث جديد %% fib_int ( N , A , B ) -> fib_int ( N - 1 , B , A + B ).

يؤدي حذف التعليقات إلى برنامج أقصر بكثير.

- وحدة ( سلسلة ). - تصدير ([ فيبوناتشي / 1 ]).fib ( N ) when N < 0 -> err_neg_val ; fib ( 0 ) -> 0 ; fib ( N ) -> fib_int ( N - 1 , 0 , 1 ).fib_int ( 0 , _, B ) -> B ; fib_int ( N , A , B ) -> fib_int ( N - 1 , B , A + B ).

فرز سريع

خوارزمية الفرز السريع في لغة إرلانج، باستخدام فهم القوائم : [ 25 ]

%% qsort:qsort(List) %% فرز قائمة من العناصر - وحدة ( qsort ). % هذا هو الملف 'qsort.erl' - تصدير ([ qsort / 1 ]). % تم تصدير دالة 'qsort' بمعامل واحد (بدون نوع، بدون اسم)qsort ([]) -> []; % إذا كانت القائمة [] فارغة، فأرجع قائمة فارغة (لا يوجد شيء للفرز) qsort ([ Pivot | Rest ]) -> % قم بتكوين قائمة بشكل متكرر مع 'Front' لجميع العناصر التي يجب أن تكون قبل 'Pivot' % ثم 'Pivot' ثم 'Back' لجميع العناصر التي يجب أن تكون بعد 'Pivot' qsort ([ Front || Front <- Rest , Front < Pivot ]) ++ [ Pivot ] ++ qsort ([ Back || Back <- Rest , Back >= Pivot ]).

يستدعي المثال أعلاه الدالة بشكل متكرر qsortحتى لا يتبقى شيء لفرزه. التعبير [Front || Front <- Rest, Front < Pivot]هو عبارة عن فهم قائمة ، ويعني "إنشاء قائمة من العناصر Frontبحيث Frontيكون العنصر `a` عضوًا في `a` Rest، ويكون `a` Frontأصغر من Pivot`a`" ++. `a` هو عامل دمج القوائم.

يمكن استخدام دالة المقارنة للهياكل الأكثر تعقيدًا من أجل سهولة القراءة.

الكود التالي سيقوم بترتيب القوائم حسب طولها:

% هذا هو الملف 'listsort.erl' (تم تصميم المُصرّف بهذه الطريقة) - وحدة ( listsort ). % تصدير 'by_length' بمعامل واحد (لا يهم النوع والاسم) - تصدير ([ by_length / 1 ]).by_length ( Lists ) -> % استخدم 'qsort/2' وقدم دالة مجهولة كمعامل qsort ( Lists , fun ( A , B ) -> length ( A ) < length ( B ) end ).qsort ([], _) -> []; % إذا كانت القائمة فارغة، تُرجع قائمة فارغة (تجاهل المعامل الثاني) qsort ([ Pivot | Rest ], Smaller ) -> % قسّم القائمة بحيث تكون العناصر 'Smaller' أمام 'Pivot' والعناصر غير 'Smaller' % بعد 'Pivot' ورتّب القوائم الفرعية. qsort ([ X || X <- Rest , Smaller ( X , Pivot )], Smaller ) ++ [ Pivot ] ++ qsort ([ Y || Y <- Rest , not ( Smaller ( Y , Pivot ))], Smaller ).

يتم أخذ A Pivotمن المعامل الأول المُعطى لـ، ويتم تسمية qsort()باقي المعامل بـ . لاحظ أن التعبيرListsRest

[ X || X <- Rest , Smaller ( X , Pivot )]

لا يختلف شكله عن

[ أمامي || أمامي <- راحة ، أمامي < محور ]

(في المثال السابق) باستثناء استخدام دالة مقارنة في الجزء الأخير، والتي تنص على "إنشاء قائمة من العناصر Xبحيث Xيكون العنصر عضوًا في Rest، ويكون Smallerصحيحًا"، مع Smallerتعريف العنصر سابقًا على النحو التالي:

دالة ( أ ، ب ) -> طول ( أ ) < طول ( ب ) نهاية

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

أنواع البيانات

تحتوي لغة إرلانج على ثمانية أنواع بيانات أساسية :

الأعداد الصحيحة
تُكتب الأعداد الصحيحة على شكل سلاسل من الأرقام العشرية، على سبيل المثال، 12 و12375 و-23427 هي أعداد صحيحة. تتميز العمليات الحسابية على الأعداد الصحيحة بالدقة التامة، ولا يحدها سوى سعة الذاكرة المتاحة على الجهاز. (يُطلق على هذا النوع من العمليات الحسابية اسم العمليات الحسابية ذات الدقة العشوائية ).
الذرات
تُستخدم الذرات داخل البرنامج للدلالة على القيم المميزة. تُكتب الذرات كسلاسل من الأحرف والأرقام المتتالية، ويكون الحرف الأول صغيرًا. يمكن أن تحتوي الذرات على أي حرف إذا وُضعت بين علامتي اقتباس مفردتين، وكان هناك اصطلاح هروب يسمح باستخدام أي حرف داخل الذرة. لا تُجمع الذرات من الذاكرة، لذا يجب استخدامها بحذر، خاصةً عند استخدام توليد الذرات الديناميكي.
عوامات
تستخدم الأرقام ذات الفاصلة العائمة تمثيل IEEE 754 ذو 64 بت .
مراجع
المراجع عبارة عن رموز فريدة عالميًا، وخاصيتها الوحيدة هي إمكانية مقارنتها للتأكد من تساويها. يتم إنشاؤها عن طريق تقييم الدالة الأساسية في لغة إرلانج make_ref().
ثنائي
الملف الثنائي عبارة عن سلسلة من البايتات. توفر الملفات الثنائية طريقة فعالة من حيث المساحة لتخزين البيانات الثنائية. توجد في لغة إرلانج دوال أساسية لتكوين الملفات الثنائية وتفكيكها، ولإدخالها وإخراجها بكفاءة.
أرقام تعريف المستخدمين
Pid هو اختصار لمعرف العملية - يتم إنشاء Pid بواسطة عنصر Erlang الأساسي. Pids هي مراجع لعمليات Erlang. spawn(...)
الموانئ
تُستخدم المنافذ للتواصل مع العالم الخارجي. تُنشأ المنافذ باستخدام الدالة المدمجة open_port. يمكن إرسال الرسائل إلى المنافذ واستقبالها منها، ولكن يجب أن تلتزم هذه الرسائل بما يُسمى "بروتوكول المنفذ".
مرح
الدوال هي إغلاقات للدوال . يتم إنشاء الدوال بواسطة تعبيرات من الشكل التالي fun(...) -> ... end:

وثلاثة أنواع من البيانات المركبة:

المجموعات
تُعدّ المجموعات (Tuples) حاويات لعدد ثابت من أنواع بيانات إرلانج. {D1,D2,...,Dn}يشير التركيب إلى مجموعة وسيطاتها هي: D1, D2, ... Dn.يمكن أن تكون هذه الوسيطات من أنواع البيانات الأولية أو المركبة. يمكن الوصول إلى أي عنصر من عناصر المجموعة في وقت ثابت.
القوائم
القوائم عبارة عن حاويات لعدد متغير من أنواع بيانات إرلانج. [Dh|Dt]يشير التركيب إلى قائمة يكون عنصرها الأول هو Dh، وعناصرها المتبقية هي القائمة Dt. يشير التركيب []إلى قائمة فارغة. التركيب [D1,D2,..,Dn]هو اختصار لـ [D1|[D2|..|[Dn|[]]]]. يمكن الوصول إلى العنصر الأول من القائمة في وقت ثابت. يُسمى العنصر الأول من القائمة رأس القائمة. يُسمى ما تبقى من القائمة بعد إزالة رأسها ذيل القائمة.
خرائط
تحتوي الخرائط على عدد متغير من علاقات المفتاح والقيمة. الصيغة هي #{Key1=>Value1,...,KeyN=>ValueN}:

يتم توفير شكلين من أشكال السكر التركيبي :

الأوتار
تُكتب السلاسل النصية على شكل قوائم من الأحرف بين علامتي اقتباس مزدوجتين. هذا اختصارٌ لقائمة رموز يونيكود الصحيحة للأحرف في السلسلة. على سبيل المثال، السلسلة "cat" هي اختصار لـ [99,97,116]. [ 26 ]
سجلات
تُوفّر السجلات طريقةً مُلائمةً لربط وسمٍ بكل عنصرٍ من عناصر المجموعة. وهذا يُتيح الإشارة إلى عنصرٍ من عناصر المجموعة بالاسم وليس بموقعه. يقوم المُترجم المُسبق بأخذ تعريف السجل واستبداله بمرجع المجموعة المُناسب.

أسلوب البرمجة "دعها تنهار".

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

أشجار الإشراف

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

في شجرة الإشراف، تتولى جميع عمليات الإشراف مسؤولية إدارة دورة حياة عملياتها الفرعية، بما في ذلك معالجة حالات تعطل هذه العمليات الفرعية. يمكن لأي عملية أن تصبح مشرفة من خلال إنشاء عملية فرعية أولاً، ثم استدعاء erlang:monitor/2تلك العملية. إذا تعطلت العملية الخاضعة للمراقبة، فسيتلقى المشرف رسالة تحتوي على مجموعة بيانات يكون أول عنصر فيها هو الذرة 'DOWN'. يتولى المشرف مسؤولية الاستماع إلى هذه الرسائل واتخاذ الإجراء المناسب لتصحيح حالة الخطأ.

التوجه نحو التزامن والتوزيع

تكمن قوة إرلانج الرئيسية في دعمها للتزامن . فهي تمتلك مجموعة صغيرة لكنها فعّالة من الأدوات الأساسية لإنشاء العمليات والتواصل فيما بينها. تشبه إرلانج لغة أوكام من حيث المفهوم ، إلا أنها تعيد صياغة فكرة التواصل بين العمليات المتسلسلة (CSP) ضمن إطار وظيفي، وتستخدم تمرير الرسائل غير المتزامن. [ 29 ] تُعدّ العمليات الوسيلة الأساسية لهيكلة تطبيقات إرلانج. وهي ليست عمليات نظام تشغيل ولا خيوط معالجة ، بل عمليات خفيفة الوزن تُجدول بواسطة BEAM. ومثل عمليات نظام التشغيل (ولكن على عكس خيوط المعالجة)، لا تتشارك هذه العمليات أي حالة مع بعضها البعض. ويُقدّر الحد الأدنى من الحمل الزائد لكل عملية بـ 300 كلمة . [ 30 ] وبالتالي، يُمكن إنشاء العديد من العمليات دون التأثير سلبًا على الأداء. في عام 2005، أُجري اختبار معياري ناجح باستخدام 20 مليون عملية مع إرلانج 64 بت على جهاز مزود بذاكرة وصول عشوائي (RAM) سعتها 16 جيجابايت (بإجمالي 800 بايت لكل عملية). [ 31 ] يدعم Erlang المعالجة المتعددة المتناظرة منذ الإصدار R11B في مايو 2006.

بينما تحتاج الخيوط إلى دعم مكتبات خارجية في معظم اللغات، توفر لغة إرلانج ميزات على مستوى اللغة لإنشاء العمليات وإدارتها بهدف تبسيط البرمجة المتزامنة. على الرغم من أن التزامن واضح تمامًا في إرلانج، إلا أن العمليات تتواصل باستخدام تمرير الرسائل بدلًا من المتغيرات المشتركة، مما يلغي الحاجة إلى الأقفال الصريحة (لا تزال الآلة الافتراضية تستخدم نظام قفل داخليًا). [ 32 ]

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

يوضح مثال الكود أدناه الدعم المدمج للعمليات الموزعة:

% إنشاء عملية واستدعاء الدالة web:start_server(Port, MaxConnections) ServerProcess = spawn ( web , start_server , [ Port , MaxConnections ]),% إنشاء عملية عن بُعد واستدعاء الدالة % web:start_server(Port, MaxConnections) على الجهاز RemoteNode RemoteProcess = spawn ( RemoteNode , web , start_server , [ Port , MaxConnections ]),% إرسال رسالة إلى ServerProcess (بشكل غير متزامن). تتكون الرسالة من زوج مرتب % يحتوي على العنصر "pause" والرقم "10". ServerProcess ! { pause , 10 },% استلام الرسائل المرسلة إلى هذه العملية receive a_message -> do_something ; { data , DataContent } -> handle ( DataContent ); { hello , Text } -> io : format ( "تم استلام رسالة الترحيب: ~s " , [ Text ]); { goodbye , Text } -> io : format ( "تم استلام رسالة الوداع: ~s " , [ Text ]) end .

كما يوضح المثال، يمكن إنشاء العمليات على العقد البعيدة، ويكون الاتصال بها شفافًا بمعنى أن الاتصال بالعمليات البعيدة يعمل تمامًا مثل الاتصال بالعمليات المحلية.

يدعم التزامن الطريقة الأساسية لمعالجة الأخطاء في لغة إرلانج. فعندما يتعطل أحد العمليات، يتوقف تلقائيًا ويرسل رسالة إلى العملية المتحكمة التي يمكنها بدورها اتخاذ إجراء، مثل بدء عملية جديدة تتولى مهمة العملية القديمة. [ 33 ] [ 34 ]

تطبيق

يستخدم تطبيق إرلانج المرجعي الرسمي برنامج BEAM . [ 35 ] يُضمّن BEAM في التوزيعة الرسمية لإرلانج، المسماة إرلانج/OTP. يُنفّذ BEAM الشفرة الوسيطة التي تُحوّل إلى شفرة متعددة الخيوط عند التحميل. كما يتضمن مُصرّفًا للشفرة الأصلية على معظم المنصات، طُوّر بواسطة مشروع إرلانج عالي الأداء (HiPE) في جامعة أوبسالا . منذ أكتوبر 2001، أصبح نظام HiPE مُدمجًا بالكامل في نظام إرلانج/OTP مفتوح المصدر من إريكسون. [ 36 ] كما يدعم التفسير، مباشرةً من الشفرة المصدرية عبر شجرة بناء الجملة المجردة ، عبر البرنامج النصي بدءًا من إصدار R11B-5 من إرلانج.

تحميل التعليمات البرمجية الساخنة والوحدات النمطية

يدعم إرلانج تحديث البرامج الديناميكي على مستوى اللغة . ولتنفيذ ذلك، يتم تحميل التعليمات البرمجية وإدارتها كوحدات "موديول"؛ والوحدة الموديولية هي وحدة تجميع . يمكن للنظام الاحتفاظ بنسختين من الوحدة الموديولية في الذاكرة في الوقت نفسه، ويمكن للعمليات تشغيل التعليمات البرمجية من كل منهما بالتزامن. يُشار إلى النسختين باسم "الجديدة" و"القديمة". لن تنتقل العملية إلى النسخة الجديدة إلا بعد استدعاء وحدتها الموديولية خارجيًا.

مثال على آلية تحميل التعليمات البرمجية الساخنة:

%% عملية وظيفتها الوحيدة هي الاحتفاظ بعداد. %% الإصدار الأول - وحدة ( العداد ). - تصدير ([ البداية / 0 ، تبديل الكود / 1 ]).start () -> loop ( 0 ).loop ( Sum ) -> receive { increment , Count } -> loop ( Sum + Count ); { counter , Pid } -> Pid ! { counter , Sum }, loop ( Sum ); code_switch -> ? MODULE : codeswitch ( Sum ) % فرض استخدام 'codeswitch/1' من أحدث إصدار من MODULE end .codeswitch ( Sum ) -> loop ( Sum ).

أما بالنسبة للإصدار الثاني، فقد أضفنا إمكانية إعادة ضبط العد إلى الصفر.

%% الإصدار الثاني - وحدة ( عداد ). - تصدير ([ بداية / 0 ، مفتاح الترميز / 1 ]).start () -> loop ( 0 ).حلقة ( المجموع ) -> استقبال { زيادة ، عدد } -> حلقة ( المجموع + عدد إعادة ضبط -> حلقة ( 0 { عداد ، معرف العملية } -> معرف العملية ! { عداد ، مجموع حلقة ( المجموع تبديل_الرمز -> ؟ وحدة نمطية : تبديل_الرمز ( المجموع ) نهاية .codeswitch ( Sum ) -> loop ( Sum ).

code_switchلن تُنفّذ الحلقة استدعاءً خارجيًا للدالة codeswitch/1 ( ?MODULEوهي ماكرو مُعالِج مُسبق للوحدة الحالية) إلا عند استلام رسالة تتضمن الذرة . إذا وُجد إصدار جديد من وحدة العداد في الذاكرة، فسيتم استدعاء دالة codeswitch/1 الخاصة به. تُمكّن ممارسة وجود نقطة دخول مُحددة إلى الإصدار الجديد المُبرمج من تحويل الحالة إلى ما هو مطلوب في الإصدار الأحدث. في المثال، تُحفظ الحالة كعدد صحيح.

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

توزيع

في عام ١٩٩٨، أطلقت إريكسون لغة إرلانج كبرنامج مجاني ومفتوح المصدر لضمان استقلاليتها عن أي جهة مانحة ولزيادة الوعي بها. تشكل إرلانج، إلى جانب المكتبات وقاعدة البيانات الموزعة في الوقت الفعلي منزيا ، مجموعة مكتبات OTP. وتدعم إريكسون وعدد قليل من الشركات الأخرى لغة إرلانج تجاريًا.

منذ إطلاقها كمصدر مفتوح، استُخدمت لغة إرلانج من قِبل العديد من الشركات حول العالم، بما في ذلك نورتل ودويتشه تيليكوم . [ 37 ] على الرغم من أن إرلانج صُممت لتلبية حاجة مُحددة وظلت لغة غير معروفة على نطاق واسع طوال معظم تاريخها، إلا أن شعبيتها تتزايد بسبب الطلب على الخدمات المتزامنة. [ 38 ] [ 39 ] وقد وجدت إرلانج بعض الاستخدامات في تشغيل خوادم ألعاب تقمص الأدوار الجماعية عبر الإنترنت (MMORPG). [ 40 ]

انظر أيضاً

مراجع

  1. "الإصدار 29.0.3" . 2 يوليو 2026. تم الاطلاع عليه في 3 يوليو 2026 .
  2. المؤتمرات، المركز الوطني للتصميم (4 يونيو 2014). "جو أرمسترونج - البرمجة الوظيفية: الطريق الطويل إلى التنوير: سرد تاريخي وشخصي" . فيميو.
  3. "كلوجر: مزيج بين لغة ليسب ولغة جافا، مع لمسة من لغة إرلانج - أورايلي رادار" . radar.oreilly.com .
  4. "التأثيرات - مرجع الصدأ" . مرجع الصدأ . تم الاطلاع عليه بتاريخ 18 أبريل 2023 .
  5. "إرلانج - مقدمة" . erlang.org . مؤرشف من الأصل في 8 سبتمبر 2019. تم الاطلاع عليه في 6 فبراير 2017 .
  6. أرمسترونغ، جو؛ داكر، بيارن؛ ليندغرين، توماس؛ ميلروث، هاكان. "إرلانج مفتوحة المصدر - ورقة بيضاء" . مؤرشفة من الأصل في 25 أكتوبر 2011. تم الاطلاع عليها في 31 يوليو 2011 .
  7. جولة المسافر على متن قطار BEAM – روبرت فيردينغ http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
  8. 1 2 3 4 5 6 أرمسترونغ، جو (2007). تاريخ إرلانج . HOPL III: وقائع المؤتمر الثالث لجمعية ACM SIGPLAN حول تاريخ لغات البرمجة . ISBN 978-1-59593-766-7.
  9. "كيف تنشر شركات التكنولوجيا العملاقة حب البرمجة مفتوحة المصدر - CIO.com" . 8 يناير 2016. مؤرشف من الأصل في 22 فبراير 2019. تم الاطلاع عليه في 5 سبتمبر 2016 .
  10. "تم إصدار Erlang/OTP كمصدر مفتوح، 1998-12-08" . مؤرشف من الأصل في 9 أكتوبر 1999.
  11. "إرلانغ، عالم الرياضيات؟" . فبراير 1999.
  12. "قاموس الحوسبة المجاني على الإنترنت: إرلانج" .
  13. "تاريخ إرلانج" . Erlang.org .
  14. أرمسترونغ، جو (أغسطس 1997). "تطوير إرلانج". وقائع المؤتمر الدولي الثاني لجمعية ACM SIGPLAN حول البرمجة الوظيفية . المجلد 32. الصفحات 196-203 . doi : 10.1145/258948.258967 . ISBN   0897919181. S2CID 6821037 . {{cite book}}تم |journal=تجاهله ( مساعدة )
  15. داكر، بيارن (أكتوبر 2000). البرمجة الوظيفية المتزامنة للاتصالات: دراسة حالة لمقدمة التكنولوجيا (ملف PDF) (أطروحة). المعهد الملكي للتكنولوجيا. ص 37. 
  16. 1 2 "سؤال حول مستقبل إرلانغ" . 6 يوليو 2010.
  17. "البرمجة الموجهة بالتزامن في إرلانج" (ملف PDF) . 9 نوفمبر 2002.
  18. أرمسترونغ، جو (20 نوفمبر 2003). بناء أنظمة موزعة موثوقة في ظل وجود أخطاء برمجية (أطروحة دكتوراه في التكنولوجيا). ستوكهولم، السويد: المعهد الملكي للتكنولوجيا.
  19. ماكجريجور، دنكان (26 مارس 2013). راك سبيس تلقي نظرة على لغة برمجة إرلانج للحوسبة الموزعة (فيديو). استوديوهات راك سبيس، سان فرانسيسكو. مؤرشف من الأصل في 11 ديسمبر 2021. تم الاطلاع عليه في 24 أبريل 2019 .
  20. "إريكسون" . Ericsson.com . 4 ديسمبر 2014. تم الاطلاع عليه في 7 أبريل 2018 .
  21. "داخل إرلانج، لغة البرمجة النادرة وراء نجاح واتساب" . fastcompany.com . 21 فبراير 2014. تم الاطلاع عليه بتاريخ 12 نوفمبر 2019 .
  22. "قواعد لغة إرلانج/إليكسير: دورة مكثفة" . elixir-lang.github.com . تم الاطلاع عليه بتاريخ 10 أكتوبر 2022 .
  23. "ما هي الشركات التي تستخدم إرلانج، ولماذا؟ #MyTopdogStatus" . erlang-solutions.com . ١١ سبتمبر ٢٠١٩. تم الاطلاع عليه بتاريخ ١٥ مارس ٢٠٢٠ .
  24. "ما هي الشركات الجديدة التي تستخدم إرلانج وإلكسير؟ #MyTopdogStatus" . erlang-solutions.com . 2 مارس 2020. تم الاطلاع عليه بتاريخ 24 يونيو 2020 .
  25. "Erlang – List Comprehensions" . erlang.org .
  26. "السلاسل النصية والقيم الحرفية" . تم الاطلاع عليه بتاريخ 2 مايو 2015 .
  27. 1 2 فيرايس، ماتياس (9 ديسمبر 2014). "دعها تتحطم" . مدونة ماتياس فيرايس . تم الاطلاع عليه في 10 فبراير 2021 .
  28. "أنماط التصميم التفاعلي —" . www.reactivedesignpatterns.com . تم الاطلاع عليه بتاريخ 10 فبراير 2021 .
  29. أرمسترونغ، جو (سبتمبر 2010). "إرلانج" . اتصالات رابطة آلات الحوسبة . 53 (9): 68-75 . doi : 10.1145/1810891.1810910 . تتشابه لغة إرلانج من حيث المفهوم مع لغة برمجة أوكام، على الرغم من أنها تعيد صياغة أفكار CSP في إطار وظيفي وتستخدم تمرير الرسائل غير المتزامن.
  30. "دليل كفاءة إرلانج - العمليات" . مؤرشف من الأصل في 27 فبراير 2015.
  31. ويجر، أولف (14 نوفمبر 2005). "اختبار الإجهاد في إرلانج" . comp.lang.functional.misc . تم الاطلاع عليه في 25 أغسطس 2006 .
  32. "قائمة انتظار الرسائل بدون قفل" . مؤرشف من الأصل بتاريخ 24 ديسمبر 2013. تم الاطلاع عليه بتاريخ 23 ديسمبر 2013 .
  33. أرمسترونغ، جو. "متانة إرلانج" . مؤرشف من الأصل في 23 أبريل 2015. تم الاسترجاع في 15 يوليو 2010 .
  34. "مبادئ الإشراف على إيرلانغ" . مؤرشف من الأصل في 6 فبراير 2015. تم الاطلاع عليه في 15 يوليو 2010 .
  35. "إرلانج - التجميع وتحميل الكود" . erlang.org . تم الاطلاع عليه بتاريخ 21 ديسمبر 2017 .
  36. "إرلانج عالية الأداء" . تم الاطلاع عليه بتاريخ 26 مارس 2011 .
  37. "من يستخدم إرلانج لتطوير المنتجات؟" . أسئلة شائعة حول إرلانج . تم الاطلاع عليه بتاريخ 16 يوليو 2007. أكبر مستخدم لإرلانج (مفاجأة!) هي شركة إريكسون. تستخدمها إريكسون لكتابة برامج تُستخدم في أنظمة الاتصالات. وقد استُخدمت في عشرات المشاريع، ومن أبرزها محول AXD301 ATM القابل للتوسع بشكل كبير. ومن بين المستخدمين التجاريين الآخرين المذكورين في الأسئلة الشائعة: نورتل، وهيئة مراقبة الحركة الجوية الألمانية (Deutsche Flugsicherung )، وتي موبايل.
  38. "برمجة إرلانج" . تم الاطلاع عليه بتاريخ 13 ديسمبر 2008. تستخدم جميع لغات البرمجة تقريبًا التزامن في الحالة المشتركة . وهذا أمر بالغ الصعوبة ويؤدي إلى مشاكل جسيمة عند التعامل مع الأعطال وتوسيع نطاق النظام... وقد تبنت بعض الشركات الناشئة سريعة النمو في القطاع المالي لغة إرلانج؛ على سبيل المثال، موقع www.kreditor.se السويدي.
  39. "إرلانج، جافا القادمة" . مؤرشف من الأصل في 11 أكتوبر 2007. تم الاطلاع عليه في 8 أكتوبر 2008. لا أعتقد أن اللغات الأخرى ستتمكن من اللحاق بإرلانج في أي وقت قريب . سيكون من السهل عليها إضافة ميزات لغوية تُضاهي إرلانج. سيستغرق الأمر وقتًا طويلاً لبناء آلة افتراضية عالية الجودة ومكتبات ناضجة للتزامن والموثوقية. لذا، فإن إرلانج مهيأة للنجاح. إذا كنت ترغب في بناء تطبيق متعدد النوى في السنوات القليلة القادمة، فعليك النظر في إرلانج.
  40. كلارك، جافين (5 فبراير 2011). "مطلوب قدامى محاربي باتلستار جالاكتيكا للعب الأدوار عبر الإنترنت" . الموسيقى والإعلام . ذا ريج . تم الاسترجاع في 8 فبراير 2011 .

للمزيد من القراءة