إلم (لغة برمجة)
تعتمد هذه المقالة بشكل مفرط على المراجع الأولية . ( مايو 2019 ) |
تانجرام الدردار | |
| نموذج | وظيفية |
|---|---|
| عائلة | هاسكل |
| صمم بواسطة | إيفان كزابليكي |
| ظهرت لأول مرة | 30 مارس 2012 [1] |
| إصدار مستقر | 0.19.1 / 21 أكتوبر 2019 [2] |
| الانضباط في الطباعة | ثابت ، قوي ، مستنتج |
| منصة | x86-64 |
| نظام التشغيل | ماك أو إس ، ويندوز |
| رخصة | مسموح ( BSD منقح ) [3] |
| ملحقات اسم الملف | .الدردار |
| موقع إلكتروني | elm-lang.org |
| متأثر بـ | |
| Haskell ، Standard ML ، OCaml ، F# | |
| متأثر | |
| ريدوكس ، [4] روست ، [5] فيو ، [6] روك، [7] ديرو، [8] جرين [9] | |
Elm هي لغة برمجة خاصة بمجال معين لإنشاء واجهات مستخدم رسومية تعتمد على متصفح الويب . Elm هي لغة وظيفية بحتة ، وقد تم تطويرها مع التركيز على قابلية الاستخدام والأداء والمتانة . وهي تعلن عن "عدم وجود استثناءات وقت التشغيل عمليًا"، [10] وهو ما أصبح ممكنًا بفضل فحص النوع الثابت لمترجم Elm .
تاريخ
تم تصميم Elm في البداية بواسطة Evan Czaplicki كأطروحته في عام 2012. [11] جاء الإصدار الأول من Elm مع العديد من الأمثلة ومحرر عبر الإنترنت جعل من السهل تجربته في متصفح الويب . [12] انضم السيد Czaplicki إلى Prezi في عام 2013 للعمل على Elm، [13] وفي عام 2016 انتقل إلى NoRedInk كمهندس مفتوح المصدر، وبدأ أيضًا في إنشاء Elm Software Foundation. [14]
يستهدف التنفيذ الأولي لمترجم Elm لغة ترميز النص التشعبي ( HTML ) وأوراق الأنماط المتتالية (CSS) و JavaScript . [15] استمرت مجموعة الأدوات الأساسية في التوسع، لتشمل الآن حلقة القراءة والتقييم والطباعة (REPL)، [16] ومدير الحزم ، [17] ومصحح الأخطاء المسافر عبر الزمن، [18] والمثبتات لنظامي التشغيل macOS و Windows . [19] يحتوي Elm أيضًا على نظام بيئي للمكتبات التي أنشأها المجتمع ، [20] وEllie، وهو محرر متقدم عبر الإنترنت يسمح بالعمل المحفوظ وإدراج مكتبات المجتمع. [21]
سمات
تحتوي لغة Elm على مجموعة صغيرة من بنيات اللغة، بما في ذلك تعبيرات if التقليدية، وتعبيرات let لتخزين القيم المحلية، وتعبيرات case لمطابقة الأنماط . [22] كلغة وظيفية، فهي تدعم الدوال المجهولة ، والدوال كحجج، ويمكن للدوال إرجاع الدوال، وغالبًا ما تكون الأخيرة عن طريق التطبيق الجزئي للدوال المكررة. يتم استدعاء الدوال بالقيمة. تتضمن دلالاتها قيمًا ثابتة، ووظائف بدون جنسية ، والكتابة الثابتة مع استنتاج النوع. تعرض برامج Elm HTML من خلال DOM افتراضي، وقد تتفاعل مع أكواد أخرى باستخدام "JavaScript كخدمة".
ثبات
جميع القيم في Elm غير قابلة للتغيير ، مما يعني أنه لا يمكن تعديل القيمة بعد إنشائها. يستخدم Elm هياكل بيانات ثابتة لتنفيذ المصفوفات والمجموعات والقواميس في المكتبة القياسية. [23]
أنواع ثابتة
تتميز لغة Elm بنوع ثابت. وتعتبر التعليقات التوضيحية للنوع اختيارية (بسبب استدلال النوع) ولكنها مشجعة بشدة. وتوجد التعليقات التوضيحية على السطر الموجود أعلى التعريف (على عكس لغات عائلة C حيث يتم تداخل الأنواع والأسماء). وتستخدم لغة Elm علامة نقطتين مفردتين لتعني "يحتوي على نوع".
تتضمن الأنواع عناصر بدائية مثل الأعداد الصحيحة والسلاسل، وهياكل بيانات أساسية مثل القوائم والمجموعات والسجلات. تحتوي الدوال على أنواع مكتوبة بأسهم، على سبيل المثال round : Float -> Int. تسمح الأنواع المخصصة للمبرمج بإنشاء أنواع مخصصة لتمثيل البيانات بطريقة تتوافق مع مجال المشكلة. [24]
يمكن أن تشير الأنواع إلى أنواع أخرى، على سبيل المثال a List Int. يتم دائمًا كتابة الأنواع بأحرف كبيرة؛ أما الأسماء بأحرف صغيرة فهي متغيرات النوع. على سبيل المثال، a List aهي قائمة بقيم من نوع غير معروف. وهو نوع القائمة الفارغة والوسيطة إلى List.length، والتي لا ترتبط بعناصر القائمة. هناك بعض الأنواع الخاصة التي ينشئها المبرمجون للتفاعل مع وقت تشغيل Elm. على سبيل المثال، Html Msgيمثل شجرة DOM (افتراضية) تنتج جميع معالجات الأحداث فيها رسائل من النوع Msg.
بدلاً من السماح لأي قيمة بأن تكون قابلة للعدم ضمناً (مثل JavaScript undefinedأو مؤشر null )، تحدد مكتبة Elm القياسية نوعًا Maybe a. يقوم الكود الذي ينتج أو يعالج قيمة اختيارية بذلك صراحةً باستخدام هذا النوع، ويتم ضمان وجود قيمة من النوع المطلوب في جميع التعليمات البرمجية الأخرى.
يوفر Elm عددًا محدودًا من فئات الأنواع المضمنة : numberوالتي تتضمن Intو Floatلتسهيل استخدام المشغلات الرقمية مثل (+)أو (*)، comparableوالتي تتضمن أرقامًا وأحرفًا وسلاسل وقوائم من الأشياء القابلة للمقارنة ومجموعات من الأشياء القابلة للمقارنة لتسهيل استخدام مشغلات المقارنة، والتي appendableتتضمن سلاسل وقوائم لتسهيل التجميع مع (++). لا يوفر Elm آلية لتضمين أنواع مخصصة في فئات الأنواع هذه أو إنشاء فئات أنواع جديدة (انظر الحدود).
نظام الوحدات
يحتوي Elm على نظام وحدات يسمح للمستخدمين بتقسيم التعليمات البرمجية الخاصة بهم إلى أجزاء أصغر تسمى الوحدات النمطية. يمكن للوحدات النمطية إخفاء تفاصيل التنفيذ مثل الوظائف المساعدة، وتجميع التعليمات البرمجية ذات الصلة معًا. تعمل الوحدات النمطية كمساحة اسم للتعليمات البرمجية المستوردة، مثل Bitwise.and. تتكون المكتبات (أو الحزم) التابعة لجهات خارجية من وحدة نمطية واحدة أو أكثر، وهي متوفرة من مكتبة Elm العامة. يتم إصدار جميع المكتبات وفقًا لـ semver ، والذي يتم فرضه بواسطة المترجم والأدوات الأخرى. وهذا يعني أن إزالة وظيفة أو تغيير نوعها لا يمكن القيام به إلا في إصدار رئيسي.
التوافق مع HTML وCSS وJavaScript
يستخدم Elm تجريدًا يسمى المنافذ للتواصل مع JavaScript . [25] وهو يسمح بتدفق القيم داخل وخارج برامج Elm، مما يجعل التواصل بين Elm وJavaScript ممكنًا.
تحتوي Elm على مكتبة تسمى elm/html يمكن للمبرمج استخدامها لكتابة HTML وCSS داخل Elm. [26] وهي تستخدم نهج DOM الافتراضي لجعل التحديثات فعالة. [27]
الخلفية
لا يدعم Elm رسميًا تطوير جانب الخادم. لا يعتبر فريق التطوير الأساسي ذلك هدفه الأساسي ويفضل التركيز على التطوير على تحسين تجربة تطوير الواجهة الأمامية. ومع ذلك، هناك العديد من المشاريع المستقلة، التي تحاول استكشاف إمكانيات استخدام Elm للواجهة الخلفية. المشاريع عالقة بشكل أساسي في إصدار Elm 0.18.0 لأن المشاريع الأحدث لا تدعم الكود "الأصلي" وبعض الميزات الأخرى المستخدمة. هناك محاولتان لاستخدام Elm مع BEAM (آلة Erlang الافتراضية). يقوم أحد المشاريع بتنفيذ Elm مباشرة على البيئة [28] بينما يقوم مشروع آخر بتجميعه إلى Elixir. [29] أيضًا، كانت هناك محاولة لإنشاء إطار عمل خلفي لـ Elm مدعوم ببنية Node.js. [30] لا يوجد أي من المشاريع جاهز للإنتاج.
هندسة الدردار (نمط TEA)
هندسة Elm هي نمط تصميم برمجي وكنموذج TAL يسمى نمط TEA لبناء تطبيقات الويب التفاعلية. يتم إنشاء تطبيقات Elm بشكل طبيعي بهذه الطريقة، ولكن قد تجد مشاريع أخرى هذا المفهوم مفيدًا.
يتم تقسيم برنامج Elm دائمًا إلى ثلاثة أجزاء:
- النموذج - حالة التطبيق
- عرض - وظيفة تقوم بتحويل النموذج إلى HTML
- التحديث - وظيفة تقوم بتحديث النموذج بناءً على الرسائل
هذه هي جوهر هندسة الدردار.
على سبيل المثال، تخيل تطبيقًا يعرض رقمًا وزرًا يزيد الرقم عند الضغط عليه. [31] في هذه الحالة، كل ما نحتاج إلى تخزينه هو رقم واحد، لذلك يمكن أن يكون نموذجنا بسيطًا مثل type alias Model = Int. viewسيتم تعريف الوظيفة بالمكتبة Htmlوعرض الرقم والزر. لتحديث الرقم، نحتاج إلى أن نكون قادرين على إرسال رسالة إلى updateالوظيفة، والتي تتم من خلال نوع مخصص مثل type Msg = Increase. Increaseيتم إرفاق القيمة بالزر المحدد في الوظيفة viewبحيث عندما ينقر المستخدم على الزر، Increaseيتم تمريرها إلى updateالوظيفة، والتي يمكنها تحديث النموذج عن طريق زيادة الرقم.
في بنية Elm، updateيعد إرسال الرسائل إلى الطريقة الوحيدة لتغيير الحالة. في التطبيقات الأكثر تعقيدًا، قد تأتي الرسائل من مصادر مختلفة: تفاعل المستخدم، تهيئة النموذج، المكالمات الداخلية من update، الاشتراكات في الأحداث الخارجية (تغيير حجم النافذة، ساعة النظام، التفاعل مع JavaScript...) وتغييرات عناوين URL والطلبات.
الحدود
لا يدعم Elm تعدد الأشكال من النوع الأعلى ، [32] والذي توفره اللغات ذات الصلة Haskell و Scala و PureScript ، كما لا يدعم Elm إنشاء فئات النوع .
هذا يعني أنه، على سبيل المثال، لا يحتوي Elm على mapوظيفة عامة تعمل عبر هياكل بيانات متعددة مثل Listو Set. في Elm، يتم استدعاء مثل هذه الوظائف عادةً مؤهلة حسب اسم الوحدة النمطية الخاصة بها، على سبيل المثال استدعاء List.mapو Set.map. في Haskell أو PureScript، لن يكون هناك سوى وظيفة واحدة map. هذا طلب ميزة معروف موجود على خريطة الطريق الأولية للسيد Czaplicki منذ عام 2015 على الأقل. [33] من ناحية أخرى، لا تعاني تنفيذات نمط TEA في اللغات المتقدمة مثل Scala من مثل هذه القيود ويمكن أن تستفيد من فئات النوع في Scala وبنى البرمجة على مستوى النوع ومستوى النوع . [34]
النتيجة الأخرى هي كمية كبيرة من التعليمات البرمجية النمطية في المشاريع المتوسطة إلى الكبيرة الحجم كما أوضحها مؤلف كتاب "Elm in Action" في مثال تطبيق الصفحة الواحدة الخاص به [35] مع تكرار أجزاء متطابقة تقريبًا في وظائف التحديث والعرض والاشتراكات وتحليل المسار والبناء.
مثال على الكود
--هذا تعليق من سطر واحد.
{-
هذا تعليق متعدد الأسطر.
وهو قابل للتضمين. -}
-}
-- هنا نقوم بتعريف قيمة تسمى `greeting`. يتم استنتاج النوع على أنه `String`.
greeting = "Hello World!"
-- من الأفضل إضافة تعليقات النوع إلى إعلانات المستوى الأعلى.
hello : String hello = "Hi there."
-- يتم إعلان الوظائف بنفس الطريقة، مع وضع الوسائط بعد اسم الوظيفة.
إضافة x y = x + y
-- مرة أخرى، من الأفضل إضافة تعليقات النوع.
hypotenuse : Float -> Float -> Float hypotenuse a b = sqrt ( a ^ 2 + b ^ 2 )
-- يمكننا إنشاء دوال lambda باستخدام صيغة `\[arg] -> [expression]`.
hello : String -> String hello = \ s -> "Hi, " ++ s
-- قد تحتوي إعلانات الوظيفة على أسماء المعلمات المجهولة التي يتم الإشارة إليها بواسطة `_`،
-- والتي يتم مطابقتها ولكن لا يتم استخدامها في النص.
const : a -> b -> a const k _ = k
-- يتم أيضًا معالجة الوظائف؛ هنا قمنا بمعالجة
عامل الضرب -- infix باستخدام `2`
multiplyBy2 : number -> number multiplyBy2 = (*) 2
-- يتم استخدام تعبيرات If للتفرع على قيم `Bool`
absoluteValue : number -> number absoluteValue number = if number < 0 then negate number else number
-- يتم استخدام السجلات لحفظ القيم باستخدام الحقول المسماة
book : { title : String , author : String , pages : Int } book = { title = "Steppenwolf" , author = "Hesse" , pages = 237 }
-- يتم الوصول إلى السجل باستخدام `.`
title : String title = book . title
-- يمكن أيضًا استخدام تسجيل الوصول `.` كدالة
author : String author = . author book
-- يمكننا إنشاء اتحادات مُوسومة باستخدام الكلمة الأساسية `type`.
-- القيمة التالية تمثل شجرة ثنائية.
نوع الشجرة a = فارغة | العقدة a ( شجرة a ) ( شجرة a )
-- من الممكن فحص هذه الأنواع باستخدام تعبيرات الحالة.
depth : Tree a -> Int depth tree = case tree of Empty -> 0 Node _ left right -> 1 + max ( depth left ) ( depth right )
انظر أيضا
- PureScript – لغة برمجة قوية النوع وذات وظائف بحتة يتم تجميعها إلى JavaScript
- السبب – ملحق بناء الجملة وسلسلة الأدوات لـ OCaml والتي يمكنها أيضًا التحويل إلى JavaScript
مراجع
- ^ Czaplicki, Evan (30 مارس 2012). "أطروحتي اكتملت أخيرًا! "Elm: FRP متزامن لواجهات المستخدم الرسومية الوظيفية"". Reddit .
- ^ "الإصدارات: elm/Compiler". GitHub .
- ^ "elm/compiler". GitHub . 16 أكتوبر 2021.
- ^ "الفن السابق - Redux". redux.js.org .
- ^ "أنواع التفرد". مدونة Rust . تم الاسترجاع في 2016-10-08 .
أولئك الذين يعرفون أسلوب Elm قد يدركون أن رسائل --explain المحدثة تستلهم بشكل كبير من أسلوب Elm.
- ^ "مقارنة مع الأطر الأخرى — Vue.js".
- ^ "roc/roc-for-elm-programmers.md at main · roc-lang/roc". GitHub . تم الاسترجاع في 2024-02-17 .
Roc هي سليل مباشر للغة البرمجة Elm. اللغتان متشابهتان، لكنهما ليسا نفس الشيء!
- ^ "لماذا Derw: لغة شبيهة بـ Elm يتم تجميعها إلى TypeScript؟".
- ^ "تم إصدار Gren 0.1.0".
- ^ "الصفحة الرئيسية لـ Elm".
- ^ "Elm: FRP متزامن لواجهات المستخدم الرسومية الوظيفية" (PDF) .
- ^ "جرب Elm". elm-lang.org . مؤرشف من الأصل في 2017-05-21 . تم الاسترجاع في 2019-07-24 .
- ^ "elm و prezi". elm-lang.org .
- ^ "مغامرات جديدة لـ elm". elm-lang.org .
- ^ "elm/compiler". GitHub . 16 أكتوبر 2021.
- ^ "repl" .elm-lang.org .
- ^ "مدير الحزم". elm-lang.org .
- ^ "الصفحة الرئيسية". elm-lang.org .
- ^ "التثبيت". guide.elm-lang.org .
- ^ "حزم Elm". Elm-lang.org .
- ^ "إيلي". Ellie-app.com .
- ^ "syntax". elm-lang.org . مؤرشف من الأصل في 2016-03-13 . تم الاسترجاع 2013-05-31 .
- ^ "elm/core". package.elm-lang.org .
- ^ "نموذج المشكلة". إلم . تم استرجاعه في 4 مايو 2016 .
- ^ "JavaScript interop". elm-lang.org .
- ^ "elm/html" .package.elm-lang.org .
- ^ "HTML سريع للغاية". elm-lang.org .
- ^ "Kofigumbs/Elm-beam". GitHub . 24 سبتمبر 2021.
- ^ "ما هو؟". GitHub . 24 سبتمبر 2021.
- ^ "اللوحة". GitHub . 18 سبتمبر 2021.
- ^ "الأزرار · مقدمة إلى Elm". guide.elm-lang.org . تم الاسترجاع في 2020-10-15 .
- ^ "أنواع ذات رتبة أعلى غير قابلة للتعبير؟ #396". github.com/elm-lang/elm-compiler . تم الاسترجاع في 6 مارس 2015 .
- ^ "أنواع ذات أصناف أعلى غير قابلة للتعبير #396". github.com/elm-lang/elm-compiler . تم الاسترجاع في 19 نوفمبر 2019 .
- ^ "هندسة الدردار". tyrian.indigoengine.io . تم الاسترجاع في 2024-09-07 .
- ^ "Main.elm". github.com/rtfeldman/elm-spa-example . تم الاسترجاع في 30 يونيو 2020 .
روابط خارجية
- الموقع الرسمي
- Elm على GitHub
