مقدمة
مرحبًا بالجميع. أهلًا بكم في ديسمبر. أتمنى أن تكونوا بخير.
كان أكتوبر شهرًا مزدحمًا للغاية. أطلقنا للتو تحسينًا كبيرًا على حلول المجتمع. نقوم الآن بإزالة التكرار منها، بحيث لا تظهر الحلول المتشابهة إلا مرة واحدة، وأضفنا خيارات جديدة للترتيب، وإمكانية البحث بالكود، وإذا اطّلعت على مسار C#، سترى أننا أضفنا أيضًا إمكانية التصفية حسب مفاهيم برمجية مختلفة. لتتمكن من البحث عن حلول تستخدم إزاحة البتات، أو الاستدعاء الذاتي، أو أي شيء آخر يعجبك. سنطرح ذلك على مسارات أخرى خلال أسبوع المجتمع.
لكن لنركّز الآن على #12in23. كان نوفمبر شهرًا مثيرًا للاهتمام، إذ استكشفنا لغات التجميع، لكننا هذا الشهر نتجه إلى مجموعة متنوعة جدًا من اللغات، تحديدًا ColdFusion وGroovy وLua وVimScript وWren. وكالمعتاد، سيشرح لنا Erik ما يجعل هذه اللغات مثيرة للاهتمام وفريدة.
الشارات
كما هو الحال دائمًا، يمكنك الحصول على شارة تسليات ديسمبر بإكمال أي 5 تمارين في هذه اللغات. لدينا أيضًا شارة العام الكامل التي أعلم أن كثيرًا منكم يسعون إليها. ولأجل ذلك لدينا 5 تمارين مختارة لتكملها. وهي:
- كل قواعدك: حوّل عددًا، ممثلًا كسلسلة من الأرقام، إلى أساس آخر.
- تسطيح المصفوفة: خذ مجموعة متداخلة وأرجع مجموعة واحدة غير متداخلة.
- هجوم الملكات: حدّد ما إذا كانت ملكتان على رقعة شطرنج قادرتين على مهاجمة بعضهما.
- شخصية D&D: أنشئ شخصيات Dungeons & Dragons عشوائيًا.
- ترميز طول التكرار: طبّق ترميز طول التكرار وفكّه.
لمحات عامة
ColdFusion
- أُنشئت عام 1995 على يد شركة Allaire، التي اشترتها Macromedia عام 2001، ثم اشترتها Adobe بدورها عام 2005.
- صُمّمت كمنصة سريعة لتطوير الويب
- تعمل على آلة Java الافتراضية (JVM)
- هناك صيغتان منفصلتان تختلفان في الشكل لكنهما متطابقتان دلاليًا:
- الصيغة الأقدم، القائمة على الوسوم، التي توسّع HTML لعرض محتوى ديناميكي.
- الصيغة الأحدث، الشبيهة بـ ECMAScript، يمكن استخدامها حيث تُستخدم الصيغة القائمة على الوسوم، وأيضًا في ملفات سكربت منفصلة. كان الهدف نقل منطق العمل من الوسوم إلى ملف سكربت منفصل
- CFScript لغة عامة الأغراض تعمل على JVM، وهكذا يستخدمها Exercism. وعمليًا، لم تبتعد كثيرًا عن جذورها في خوادم الويب.
- ColdFusion منتج مدفوع، لكن مؤسسة Lucee (منظمة غير ربحية مقرها سويسرا) لا تزال تطوّر بنشاط خادم ColdFusion مفتوح المصدر الخاص بها، ونحن نستخدم خادم Lucee الخاص بها لمسار Exercism.
- لا تزال قيد التطوير النشط
- تُستخدم أساسًا في برمجيات المؤسسات؛ ومن عملائها Apple وAdobe وGeneral Motors وغيرها
Groovy
- طوّرها James Strachan بدءًا من عام 2003. وتبنّت مؤسسة Apache المشروع عام 2015.
- كان الهدف تطوير لغة ذات أنواع ديناميكية على JVM (على النقيض من Java ذات الأنواع الساكنة) تقلّل أيضًا من الكود المتكرر
- وفي حين أن معظم كود Java صالح أيضًا ككود Groovy، فهناك اختلافات كثيرة (مثلًا، تتيح Groovy الأنواع الديناميكية والبرمجة الفوقية المتقدمة). تأثرت اللغة أيضًا كثيرًا بـ Python وRuby.
- تُستخدم في كتابة السكربتات، وأدوات البناء (Gradle)، والتكامل المستمر (Jenkins)، وتطبيقات الويب (Grails)، والاختبار (Spock). وهناك إضافة شائعة من طرف ثالث لأدوات Atlassian تتيح كتابة سكربتات groovy.
Lua
- أُنشئت Lua عام 1993 على يد Roberto Lerusalimschy وLuiz Henrique de Figueiredo وWaldemar Celes في الجامعة الكاثوليكية البابوية في ريو دي جانيرو، بالبرازيل.
- يُلفظ الاسم LOO-ah، ويعني «القمر» بالبرتغالية، وهو إشارة إلى لغة Sol التي استلهمتها جزئيًا، والتي تعني «الشمس» بالبرتغالية
- صُمّمت أساسًا للتضمين، مع التركيز على السرعة وقابلية النقل وقابلية التوسّع وسهولة الاستخدام أثناء التطوير.
- تأثرت بـ Modula وCLU وC++ وSNOBOL وAWK. وكما امتلكت LISP وScheme آلية واحدة شاملة لبنية البيانات (القائمة)، تمتلك Lua ذلك بجدولها.
- تُفسَّر عبر البايت كود، عادةً أثناء التشغيل، لكن يمكن القيام بذلك مسبقًا.
- تُستخدم أساسًا لأغراض كتابة السكربتات، مثلًا في ألعاب مثل World of Warcraft وDota 2 وCrysis، أو تطبيقات مثل Adobe Lightroom وبعض برمجيات نظام FreeBSD. وتُستخدم كثيرًا أيضًا لإضافة قابلية التوسّع، مثلًا في Redis وNeovim وNginx.
VimScript
- VimScript (وتُسمى أيضًا Vim Script (بمسافة) أو VimL اختصارًا لـ Vim Language) هي لغة السكربتات المستخدمة في محرر النصوص Vim.
- مشتقة من ex، المحرر المرئي الموجّه بالأسطر الذي سبق Vi
- ليست لغة عامة الأغراض، بل لغة متخصصة توفّر بيئة سكربتات فعّالة ومحسّنة لتوسيع وظائف Vim وتخصيصها عبر الإضافات والإعدادات والماكرو والدوال.
- وبينما كُتب Vim أساسًا بلغة C، تتيح Vimscript للمستخدمين تخصيص Vim وتوسيعه عبر لغة سكربتات عالية المستوى.
- تُستخدم في Vim طبعًا، وأيضًا في NeoVim، وهو تفرّع من Vim
Wren
- كُتبت عام 2016 على يد Bob Nystrom، مؤلف كتاب Crafting Interpreters
- الأهداف: صغيرة، بسيطة، سريعة.
- صُمّمت لتُضمَّن في تطبيقات أخرى. رأى مؤلفها أن الخيارات الموجودة (مثل Lua وTCL) قاصرة، وأراد لغة بسيطة قابلة للتضمين تبدو طبيعية لمن لديه خلفية في البرمجة كائنية التوجه
- تُستخدم في:
- TIC-80 - حاسوب خيالي لصناعة الألعاب الصغيرة ولعبها ومشاركتها (شبيه بـ PICO8)
- DOME - إطار عمل متعدد المنصات لصناعة الألعاب.
- luxe - محرك ألعاب متعدد المنصات وسريع التطوير لصناعة الألعاب.
- Wren Console - واجهة REPL وواجهة سطر أوامر لـ Wren مكتوبة في معظمها بـ Wren نفسها على يد Josh Goebel، أحد مساهمي Exercism القدامى، ونحن نستخدمها لمسار Wren
ومن منظور برمجي، كيف تختلف هذه اللغات؟
ColdFusion
- ذات أنواع ديناميكية
- متعددة الأنماط، كائنية التوجه أساسًا لكنها تتجه أكثر نحو البرمجة الوظيفية.
Groovy
- عادةً ذات أنواع ديناميكية، لكنها قد تكون ذات أنواع ساكنة أيضًا (وأنواع تدريجية)
- يمكن تفسيرها وتصريفها معًا (من الإصدار 2). ولهذا السبب غالبًا ما تُستخدم في السكربتات
- متعددة الأنماط: كائنية التوجه أساسًا، لكنها أيضًا أمرية ووظيفية وتصريحية
Lua
- ذات أنواع ديناميكية وتُفسَّر عادةً، لكن يمكن تصريفها مسبقًا
- متعددة الأنماط: إجرائية، وكائنية التوجه (وإن بطريقة مختلفة قليلًا)، ووظيفية ومعتمدة على البيانات
VimScript
- ذات أنواع ديناميكية وتُفسَّر
- متعددة الأنماط: أمرية ووظيفية وشكل بسيط من البرمجة كائنية التوجه
Wren
- ذات أنواع ديناميكية، لكنها محددة ساكنًا؛ وهذا يتيح للمصرّف أن يكون سريعًا جدًا.
- لغة كائنية التوجه أساسًا، لكنها أيضًا أمرية وفيها قليل من البرمجة الوظيفية
ما الذي يجعل هذه اللغات رائعة؟
ColdFusion
- فصل ممتاز بين إدارة الخادم وإنشاء التطبيقات. فلوحة الإدارة تُعدّ اتصالات قاعدة البيانات ومراقبة الخادم (وأي شيء آخر)، ولا يحتاج منشئو التطبيقات سوى إلى اسم مصدر بيانات (كائن CF يضم الطرق اللازمة، متصل مسبقًا بالأجزاء المناسبة من نظام إدارة قواعد البيانات)، إضافةً إلى صلاحية الكتابة في مجلد ملفات التطبيق.
- الاستفادة من قوة JVM ومنظومة Java، بما يشمل إمكانية استيراد أي مكتبة Java واستخدامها داخل CF
Groovy
- عامة الأغراض: يمكن استخدامها في أي عبء عمل تقريبًا، بما يشمل التطبيقات والمواقع.
- ولأنها تعمل على JVM، تنطبق عليها كل مزاياه: آلة افتراضية ناضجة وعالية الأداء وعدد هائل من المكتبات المتاحة. وتتفاعل جيدًا مع Java
- تخفّف كثيرًا من المشكلات التي قد يواجهها الناس مع Java، مثل الاستثناءات المُتحقَّق منها،
- أمان
null، والإطالة، وغياب البرمجة الفوقية المتقدمة - لغة حديثة: استنتاج متقدم للأنواع، وإغلاقات، وبنية مدمجة للتعبيرات النمطية، وتوليد تلقائي لـ getters وsetters
- دعم رائع للبرمجة الوظيفية: الإغلاقات (مثل كتل Ruby)، والكاريّة (التطبيق الجزئي)، والتقييم الكسول، والثبات، وأكثر
Lua
- عامة الأغراض: تُستخدم في الأنظمة المضمّنة، وللنمذجة الأولية، وكتابة السكربتات، وتطوير الألعاب والويب وBackend.
- بسيطة: نحو قليل نسبيًا، ما يجعل اللغة سهلة التعلّم. مجرد نوعين من البيانات الذرّية ونوع مركّب مدمج واحد: الجدول. وتُجمع الذاكرة المهملة تلقائيًا
- قابلة للنقل: المفسّر مكتوب بلغة ANSI C، التي يتوفر لها مصرّف على أي منصة تقريبًا
VimScript
- بسيطة: بنية خفيفة يسهل تعلّمها واستخدامها.
- قابلية التفاعل: الوصول بسهولة إلى الملفات والأصداف والبرامج الأخرى. كل قوة الأدوات الخارجية دون مغادرة Vim.
- معبّرة: أنجز الكثير بالقليل. اكتب سكربتات مدمجة عالية الوضوح.
- محرك تعبيرات نمطية قوي: تنفيذ Vimscript للتعبيرات النمطية مستوحى من تنفيذ Emacs Lisp، ما يوفّر أداة قوية لمعالجة النصوص.
Wren
- صغيرة: الآلة الافتراضية منفّذة في أقل من 4000 سطر من الكود
- مثال يُحتذى: تنفيذ الآلة الافتراضية مشروح بتعليقات غنية، ومكتوب بلغة C، وليس بالغ الصعوبة في القراءة. طريقة رائعة لتعلّم كيفية بناء لغة. ومعظم المكتبة القياسية منفّذة بـ Wren، فيمكنك رؤية كيفية تنفيذها أيضًا.
- مألوفة: بنيتها تجعلك تكتسب السرعة بسرعة. إذا كنت على دراية بـ Java أو C++، فستشعر فيها كأنك في بيتك. وتتيح تحميل الطرق الزائد حسب عدد الوسائط
- توثيق جيد جدًا: وثائق اللغة والمكتبة القياسية سهلة القراءة وموسّعة وفيها أمثلة كثيرة.
- مكتبة قياسية صغيرة لكنها مكتملة بشكل مفاجئ.
أبرز المزايا
ColdFusion
- كل ما تحتاجه مضمّن: أشياء كثيرة مدمجة: العمل مع PDF وZIP وExcel وXML وJSON، وإنشاء API، والبريد الإلكتروني، وتكامل S3، والكثير من قواعد البيانات المختلفة… دون تثبيت حزم إضافية. رائع لتقليل تعارضات الإصدارات
- قابلة للتوسّع وآمنة، رائعة لبرمجيات المؤسسات
- برمجة بسيطة وبديهية تعني أن المبتدئين يمكنهم تشغيل صفحات ويب معقّدة معتمدة على البيانات بسرعة كبيرة. وتكامل DreamWeaver ممتاز.
Groovy
- بنية مرنة: يمكن حذف النقاط والأقواس الهلالية، ما يتيح إنشاء لغات خاصة بمجال معين جميلة جدًا
- البرمجة الفوقية: تدعم البرمجة الفوقية وقت التشغيل ووقت التصريف. على سبيل المثال، تعليق
@ToStringيولّد تنفيذًا لـ ToString وقت التصريف، وتغيير الصنف الفوقي لكائن وقت التشغيل يتيح القيام بالتعديل الديناميكي. - أدوات البناء (Builders): تعامل مع JSON وXML وHTML وابنِها بسرعة عبر كود أنيق. وابنِ باستخدام Swing للتطوير السريع لواجهات الاستخدام الرسومية.
- السمات (Traits): تتيح لك سمات Groovy تركيب السلوكيات والخصائص في قطع قابلة لإعادة الاستخدام. شبيهة بـ mixins في Ruby.
Lua
- قابلة للتضمين: صُمّمت لتسهيل تضمينها. ولديها API بسيط نسبيًا بلغة C يتيح تضمينها بسهولة. والحجم ليس مشكلة: المفسّر المرجعي الكامل لا يتجاوز 247 كيلوبايت!
- قابلة للتوسيع: أُبقيت اللغة الأساسية صغيرة نسبيًا عن قصد، لكن ما تتيحه هو توسيع اللغة بسهولة. وهذا يجعل اللغة أبسط في التعلّم، وأخفّ في التضمين، ومرنة جدًا
- سريعة: غالبًا ما تكون Lua إحدى أسرع اللغات الديناميكية، خصوصًا عند استخدام مفسّر LuaJit
VimScript
- قابلية التوسّع: تتيح لك Vimscript توسيع محررك بوظائف جديدة
- قابلة للتخصيص: خصّص محررك ليعمل بالطريقة التي تحبها تمامًا (إضافات Vimscript نفسها مكتوبة أساسًا بـ Vimscript)
- مدفوعة بالأحداث: تنفيذ تلقائي للكود بناءً على أحداث أو شروط معينة مثل فتح الملفات أو حفظ المخازن المؤقتة.
- استفد من قوة Vim: وصول مدمج إلى مزايا Vim وواجهات API الخاصة به، ما يتيح للسكربتات التلاعب بالنصوص والمخازن المؤقتة والنوافذ وأكثر.
Wren
- سريعة: أداء رائع بالنسبة للغة ديناميكية
- قابلة للتضمين: يسهل تضمينها في البرمجيات الأخرى. كان مبتكر اللغة مطوّر ألعاب سابقًا: أراد القدرة على إضافة إمكانات السكربتات إلى الألعاب. وواجهة API بلغة C نظيفة وبسيطة إلى حد كبير.
- متزامنة: تزامن سهل وإجراءات مشتركة عبر الألياف، وهي بنية خفيفة جدًا (مثل goroutines أو عمليات Erlang)، ويمكنها التواصل مع بعضها بسهولة
أيّها تختار
- إذا أردت بناء تطبيقات ويب، فإن ColdFusion وGroovy خياران جيدان
- إذا كنت مهتمًا بلغة قابلة للتضمين، فإن Lua وWren هما الخياران الأساسيان، لكن قد يستحق Groovy نظرة أيضًا
- وإذا أردت كتابة سكربتات عامة الأغراض، فإن اللغات الثلاث نفسها، Lua وWren وGroovy، منطقية أيضًا
- إذا كنت تعمل على JVM، فإن ColdFusion وGroovy خياران طبيعيان
- إذا كنت تقدّر الأداء، فغالبًا ما تكون Lua وWren أفضل خياراتك
- إذا كان محررك الأساسي Vim أو NeoVim، فمن الواضح أن VimScript خيار ممتاز
- إذا كنت مهتمًا بتعلّم المصرّفات والآلات الافتراضية أو ببنائها، فإن Wren مثالية لك
- إذا كانت لديك خلفية في البرمجة كائنية التوجه، فغالبًا ما تكون Wren أسهل لغة تعلّمًا
- إذا أعجبتك بنية LISP الواحدة الشاملة لبنى البيانات، فجرّب Lua
- إذا أردت تجربة البرمجة المدفوعة بالأحداث، فاطّلع على VimScript