مقدمة
مرحبًا بالجميع! أتمنى أن تكونوا بخير.
كان لدينا أغسطس حافل في Exercism. فقد دمجنا Premium وInsiders، وأضفنا تغذية راجعة آلية مباشرة داخل المحرر، وأطلقنا جوائز المسار، وأجرينا الكثير من التحسينات الصغيرة على الموقع أيضًا! إن لم تكن قد تحققت من مساراتك بعد لترى الجوائز التي حصلت عليها، فافعل ذلك بالتأكيد. وقد أرسلنا بريدًا إلكترونيًا إلى كل من حصل على جائزة واحدة أو أكثر، فترقّبوه أيضًا. خلال أغسطس استمتعنا كثيرًا أيضًا في #12in23، حيث استكشفنا لغات يستخدمها الناس عادةً لإنشاء التطبيقات.
هذا الشهر هو Slimline September، وفيه نستكشف لغات تميل إلى أن تكون موجزة ومقتضبة جدًا في صياغتها. وعلى وجه التحديد، ننظر في 8th (سليل لغة Forth)، وAWK، وBash، وjq، وPerl، وRaku (التي كانت تُعرف سابقًا باسم Perl 6).
الشارات
للحصول على شارة Slimline September، عليك إكمال أي خمسة تمارين بإحدى تلك اللغات خلال سبتمبر.
وهناك أيضًا شارة 12in23 التي تمتد على مدار العام. وللحصول عليها، عليك حل خمسة من تماريننا المميزة في اللغة.
- Gigasecond: العمل مع التواريخ
- Atbash Cipher: العمل مع السلاسل النصية
- Darts: العمل مع الأعداد والشروط
- Luhn: العمل مع السلاسل النصية والشروط والأعداد
- Series: العمل مع السلاسل النصية والمتتاليات
يمكن العثور على هذه التمارين وتمارين الأشهر السابقة جميعًا في صفحة #12in23.
نظرة عامة
لنغصّ في التفاصيل ونستكشف اللغات من خلال نظرة عامة على كل منها.
8th
- طوّرها Ron Aaron.
- اسمها تلاعب لفظي على لغة Forth، وهي مصدر إلهامها الأساسي. لكن هناك اختلافات كثيرة عن Forth:
- ذات أنواع صارمة
- تعمل على منصات متعددة
- أمان محسّن (لا وصول مباشر إلى الذاكرة ولا مُجمّع مدمج)
- توفّر نسخة مجانية وأخرى تجارية، والأخيرة توفّر مزايا أكثر.
- مغلقة المصدر، لكن يمكن الاطلاع على الكود المصدري بعد شراء ترخيص للمؤسسات
AWK
- أُنشئت AWK في مختبرات Bell في سبعينيات القرن العشرين على يد Alfred Aho وPeter Weinberger وBrian Kernighan. والاسم اختصار لأحرف عائلات مؤلفيها.
- إنها لغة خاصة بمجال معيّن، صُمّمت لمعالجة النصوص، لكن يمكن استخدامها لأغراض أخرى أيضًا
- AWK مرشّح Unix، مثل sed وgrep، مُعدّ للاستخدام ضمن خط أنابيب
- تفرض كل من مواصفة Single UNIX Specification ومواصفة Linux Standard Base تضمينها في أي تنفيذ، ولهذا فهي متاحة على معظم أنظمة *nix
- تنفيذات مختلفة للغة AWK:
- awk (أو oawk اختصارًا لـ AWK الأصلية): التنفيذ الأصلي
- GNU AWK (gawk)، صدر عام 1988 وأجرى مراجعة وتوسيعًا كبيرين للغة
- BWK AWK (المعروف أيضًا بـ nawk)، صدر في أواخر التسعينيات
- mawk: تنفيذ مفسّر سريع للكود البايتي
- في العديد من أنظمة *nix، يكون الأمر
awkرابطًا رمزيًا إلىgawkأوnawk
Bash
- Bash صدفة Unix طوّرها Brian Fox وصدرت عام 1989.
- صُمّمت كبديل مجاني لصدفة Bourne وأصبحت صدفة تسجيل الدخول الافتراضية لمعظم توزيعات Linux. وهي مجموعة شاملة لأوامر صدفة Bourne، مما يسهّل الانتقال إليها
- توسّع صدفة Bourne من جوانب عديدة: توسيع الأقواس المعقوفة، وإكمال سطر الأوامر، ومعالجة الإشارات وغير ذلك
jq
- طوّرها Stephen Dolan وصدرت عام 2012
- صُمّمت لتسهيل الاستعلام عن مستندات JSON وتحويلها ومعالجتها («sed الخاصة بـ JSON»)
- أداة
jq(التي تنفّذ اللغة) كُتبت في الأصل بلغة Haskell، ثم نُقلت لاحقًا إلى C. وهناك أيضًا نسخ منقولة مبنية على Go وRust
Perl
- طوّر Larry Wall لغة Perl في أواخر الثمانينيات وصدرت أول مرة عام 1987.
- صُمّمت كلغة برمجة نصية عامة الغرض لتسهيل معالجة التقارير
- ذات تأثير كبير، لا سيما دعمها للتعبيرات النمطية (سنعود إلى ذلك لاحقًا)
Raku
- صمّمها Larry Wall (منشئ Perl) وصدرت عام 2015
- كانت تُعرف في الأصل باسم Perl 6، وكان الهدف منها تنقية اللغة وإزالة بعض الميزات التي اعتُبرت قليلة الفائدة أو مربكة (اقتباس طريف: «في Perl 6، قررنا أنه من الأفضل إصلاح اللغة بدلًا من إصلاح المستخدم»، Larry Wall). وانتهى الأمر بأن Perl 6 لم تكن متوافقة على مستوى الكود المصدري مع Perl 5، فأُعيدت تسميتها إلى Raku
- تتمحور فلسفة تصميمها حول جعل البرمجة ممتعة ومُنتِجة مع توفير مجموعة واسعة من الأدوات لمواجهة تنوّع من تحديات البرمجة (عامة الغرض)
- بما أن Raku مواصفة، يمكن أن يكون لها (ولها فعلًا) عدة تنفيذات. والتنفيذ الوحيد الذي يُطوَّر بنشاط حاليًا هو Rakudo، لكن هناك تنفيذات أقدم مثل Pugs (المكتوب بلغة Haskell)، وv6-KindaPerl6، وNiecza (الموجّه إلى CLR)
أين تُستخدم هذه اللغات؟
8th
- للأسف، لم نتمكن من العثور على أماكن تُستخدم فيها
AWK
- تُستخدم لاستخراج البيانات وإعداد التقارير، وللبرمجة النصية عمومًا
Bash
- تُستخدم بشكل أساسي لإدارة الأنظمة، ولكن أيضًا لتوفير أدوات واجهة سطر الأوامر أو أغلفة حول أدوات أخرى. وقد استخدمناها كثيرًا للعمل بكميات كبيرة على مستودعات Exercism
jq
- تُستخدم للاستعلام عن مستندات JSON وتحويلها ومعالجتها، وغالبًا في صورة سكربتات صدفة.
Perl
- تُستخدم لمعالجة البيانات وتحليل الملفات وبرمجة الويب ومهام إدارة الأنظمة. وقد اكتسبت شعبيتها في أيام الويب الأولى بفضل قدراتها على معالجة السلاسل النصية ومنظومتها الواسعة من الوحدات.
Raku
- تُستخدم لمعالجة النصوص وإدارة الأنظمة وغير ذلك
ما الذي يجعل هذه اللغات مثيرة للاهتمام من منظور البرمجة؟
معظم هذه اللغات ذات أنواع ديناميكية ومفسّرة، وهو ما يتلاءم جيدًا مع طبيعتها النصية. ومع ذلك، هناك بعض الاستثناءات، خاصة في الأنماط البرمجية التي تدعمها.
8th
- ذات أنواع صارمة
- متعددة الأنماط: إجرائية، ولكن الأكثر إثارة للاهتمام أنها قائمة على المكدس (نموذج تنفيذ قائم على المكدس)، وتأمّلية (القدرة على فحص بنيتها وسلوكها وتعديلهما)، وتراكبية (كل التعبيرات دوال، وتجاور الدوال يعني تركيب الدوال)
- تُترجم إلى كود أصلي، ولكن يمكن أيضًا تفسيرها في REPL
AWK
- ذات أنواع ديناميكية، وغالبًا مفسّرة (يعتمد ذلك على التنفيذ المستخدم)
- نمطها الأساسي قائم على البيانات، حيث تصف البرنامج كعبارات تحدّد البيانات المطلوب مطابقتها والمعالجة المطلوبة، بدلًا من تعريف سلسلة من الخطوات بشكل صريح. ومع ذلك، تدعم AWK البرمجة الإجرائية
Bash
- لغة ديناميكية ومفسّرة
- تدعم البرمجة الأمرية والإجرائية
jq
- لغة ديناميكية ومفسّرة
- لغة وظيفية بحتة (كل القيم غير قابلة للتغيير)، مع تركيز على «خطوط الأنابيب». ولها طابع Unix واضح
Perl
- ذات أنواع ديناميكية ومفسّرة
- متعددة الأنماط، تدعم البرمجة الوظيفية والكائنية التوجه والأمرية
Raku
- ذات أنواع ديناميكية، لكنها تدعم الأنواع التدريجية، حيث يمكن إضافة الأنواع الساكنة عند الحاجة (لغة Perl ديناميكية)
- لغة متعددة الأنماط: أمرية وإجرائية وكائنية التوجه ووظيفية
ما الذي يجعلها لغات رائعة؟
8th
- الصياغة القليلة جدًا تجعل اللغة أسهل في التعلّم والفهم. وهي تستخدم JSON لوصف البيانات (مثل الكائنات والمصفوفات). كما تدعم حاويات أخرى مثل المكدسات والطوابير والأكوام
- لا توجد كلمات مفتاحية محجوزة. وتُسمّى الروتينات الفرعية «كلمات»، ويمكن تعريف كلمات جديدة بسهولة. ويمكن إعادة تعريف جميع الكلمات أثناء التشغيل، سواء كانت مدمجة أو معرّفة من المستخدم
- تعمل على منصات متعددة. يمكنك بسهولة إنشاء ملف تنفيذي لأي منصة مدعومة
- آمنة. ميزات أمان مدمجة تمنع مجموعة واسعة من مشاكل Bug (لا وصول مباشر إلى الذاكرة، ولا يرتبط وقت التشغيل بمكتبات ديناميكية)
AWK
- صياغة بسيطة مع بنية متسقة جدًا لكود AWK، مما يسهّل تعلّم كود AWK وقراءته. وبنى بياناتها أيضًا بسيطة ومرنة
- ذات قدرة تعبيرية عالية، حيث يمكنك إنجاز الكثير بأقل قدر من الكود. مثالية للأوامر المكوّنة من سطر واحد
- مثبّتة على معظم أنظمة *nix، ما يعني أنه يمكنك استخدام مهاراتك في AWK في أماكن كثيرة (فهي مع /bin/sh اللغة النصية الوحيدة في Unix القياسي)
- تعمل بشكل ممتاز في خطوط الأنابيب وسكربتات صدفة، حيث تعالج AWK مخرجات أدوات أخرى أو العكس
Bash
- يمكن استخدامها على معظم المنصات. وهي مثبّتة على جميع أنظمة *nix تقريبًا، بما في ذلك macOS. ومع Windows Subsystem for Linux (WSL)، أصبح bash متاحًا الآن لأنظمة Windows أيضًا.
- تُستخدم كـ RE(P)L حيث تشغّل أوامر فردية، أو تقرأ كودًا من ملفات وتنفّذه (تُعرف بسكربتات صدفة). إن كنت قد استخدمت طرفية Linux، فمن المرجح أنك كتبت كود bash، لأن الطرفية عادةً ما تكون RE(P)L لـ bash
- تُستخدم Bash وسكربتات صدفة على نطاق واسع في إدارة الأنظمة وDevOps وتشغيل الحواسيب.
- متعددة الاستخدامات ومرنة للغاية
- قدرات قوية على معالجة السلاسل النصية، بما في ذلك إقحام السلاسل النصية بطريقة مباشرة جدًا
jq
- صياغة بسيطة وقصيرة للعمل مع JSON، مما يجعلها سهلة التعلّم
- تتيح تعريف دوال مخصّصة لعمليات أكثر تعقيدًا.
- تدعم تحسين الاستدعاء الذاتي الذَّيلي، وهو أمر رائع لمعالجة البيانات بشكل تكراري
- تُوزَّع أداة jq كملف ثنائي واحد بحجم 30 كيلوبايت تقريبًا فقط
- تلتفّ أداة
yqحولjqلتتيح استخدام الصياغة نفسها لمعالجة ملفات XML وTOML وYAML (فهي تحوّل تلك الأنواع من البيانات إلى JSON في الخلفية) - يدعم التنفيذان C وGo كليهما التضمين في تطبيقات أخرى
Perl
- تعمل على معظم المنصات. وممتازة لكتابة سكربتات تعمل على منصات متعددة
- المرونة حجر الأساس في فلسفة تصميم Perl. وشعارها الشهير هو: «هناك أكثر من طريقة واحدة لفعل ذلك» (TMTOWTDI). ويمكن استخدام أساليب مختلفة حسب المهمة التي بين يديك
- مجتمع قوي وإرث من المشاريع المؤثرة. فقد طُوّرت كثير من السكربتات والأدوات والتطبيقات باستخدام Perl. ووُصفت ذات مرة بأنها: «الشريط اللاصق الذي يمسك الإنترنت متماسكًا»
- منظومة غنية من الوحدات والمكتبات، متاحة عبر Comprehensive Perl Archive Network (CPAN)
Raku
- كبيرة ومعقّدة وقوية، لكنها مصمّمة أيضًا لتكون لغة لا يلزمك تعلّمها كلها دفعة واحدة. سهلة البداية، ويمكنك الغوص في الميزات الأقوى لاحقًا
- نظام أنواع قوي وقابل للتوسّع يتضمن الأنواع التدريجية. وهذا يعني أنه يمكنك تحديد مستوى التحقق من الأنواع الذي تريده، بما يتيح توازنًا بين الأنواع الديناميكية والساكنة
- تدعم الإرسال المتعدد، مما يتيح لك استخدام تعدد الأشكال دون وراثة
- Unicode مواطن من الدرجة الأولى في Raku. وتوفّر دعمًا أصليًا للتعامل مع مختلف ترميزات المحارف
- توفّر ميزات متقدمة للتزامن والتوازي. وتتضمن دعمًا مدمجًا للبرمجة غير المتزامنة والبرمجة التفاعلية والتنفيذ المتوازي
ما هي أبرز ميزاتها؟
8th
- تتطلب طريقة تفكير مختلفة. فمزيجها الفريد من الأنماط مختلف جدًا عن اللغات الأخرى، ويتحدّاك للتوصل إلى طرق مختلفة لمقاربة الأمور
- الصياغة القائمة على المكدس والترميز البولندي المعكوس (RPN) توفّر نموذجًا ذهنيًا بسيطًا جدًا لتنفيذ البرنامج. تُوضع القيم على المكدس، وتُعرّف معظم الكلمات من حيث تأثيرها على المكدس
AWK
- النمط القائم على البيانات قوي جدًا. وهو يتطلب طريقة تفكير مختلفة، إذ تُعرّف البرامج كمجموعة من أزواج الشرط/الإجراء، ويُقسَّم النص إلى سجلات (عادةً سطر واحد لكل سجل)، ويُقسَّم كل سجل إلى حقول (مثل حقول CSV أو كلمة واحدة لكل حقل). وبمجرد أن تعتاد على ذلك، ستقدّر أناقة هذا الأسلوب وقدرته التعبيرية، وستبدأ في رؤية استخدامات له في كل مكان
- مثالية للعمل مع النصوص. سواء كان ذلك تحليل النصوص أو تحويلها أو إعداد التقارير، فإن AWK تغطي احتياجاتك. في مهام مثل طباعة صدفة كل مستخدم على النظام أو جمع عمود من CSV، ستُدهش من قلة الكود الذي تحتاجه
Bash
- مثالية للأتمتة. فسكربتات صدفة ممتازة لأتمتة المهام المتكررة.
- تستخدم سكربتات bash خطوط الأنابيب وتتيح لك ربط برامج أخرى بسهولة. فمن السهل جدًا إنشاء سكربت يمرّر مخرجات أمر إلى أمر آخر، أو سكربت يفشل بمجرد فشل أي من الأوامر المنفّذة.
- قوية. فسهولة استخدام أدوات أخرى تجعل bash أداة قوية للغاية
jq
- رائعة لاستخراج بيانات JSON ومعالجتها بسهولة ونظافة (ولدينا منها الكثير اليوم). وقد أصبحت الأداة المعتمدة فعليًا لتحويل بيانات JSON. بل يمكنك حتى إنشاء بيانات JSON باستخدام jq
- تدعم تدفّق البيانات، مما يعني أنه يمكنك العمل مع بيانات «لا نهائية» دون مشاكل في الذاكرة
- سيكون التركيز على خطوط الأنابيب سهل الاستيعاب لأي شخص معتاد على التدفقات، مثل أدوات Unix. كما أنه يجعل كود jq سهل الفهم إلى حد كبير
Perl
- تشتهر بإيجازها وقدرتها التعبيرية. فأنت تحتاج إلى قدر ضئيل جدًا من الكود لإنجاز الكثير
- مناسبة بشكل خاص للعمل مع النصوص، ويعود ذلك في جزء كبير منه إلى دعمها القوي للتعبيرات النمطية. وقد قدّمت Perl 5 على وجه الخصوص الكثير من الميزات الجديدة (مثل المراجع الخلفية ومجموعات الالتقاط المسمّاة والمكمّمات الكسولة). وقد بنى Philip Hazel مكتبة PCRE (تعبيرات نمطية متوافقة مع Perl)، وهي مكتبة بلغة C تنفّذ محرّك تعبيرات نمطية متوافقًا مع Perl 5. وحتى اللغات التي لا تُبنى على PCRE غالبًا ما تصمّم دعمها للتعبيرات النمطية ليكون متوافقًا مع PCRE (وبالتالي تستخدم صياغة Perl 5)
Raku
- تدعم وصلات الخيوط التلقائية، التي تساعد على جعل العمل مع التوازي أسهل بكثير
- تدعم التقييم الكسول، مما يتيح لك العمل مع قوائم ومتتاليات لا نهائية دون الوقوع في مشاكل الذاكرة. وهذا مفيد بشكل خاص عند التعامل مع مجموعات بيانات كبيرة أو عند العمل بخوارزميات تتضمن تدفقات لا نهائية من البيانات
- رائعة لمعالجة النصوص، إذ توفّر صياغة تعبيرات نمطية أبسط وأكثر قابلية للقراءة وأقوى
- دعم مدمج لتعريف لغات خاصة بمجال معيّن (DSLs) باستخدام القواعد النحوية. وهذا يتيح لك إنشاء محلّلات لصيغ بيانات أو لغات محدّدة، مما يسهّل العمل مع بيانات نصية معقّدة
أيّها تجرّب؟
- إذا كنت تستخدم نظام Unix بشكل أساسي أو تعمل في DevOps، فإن Bash لغة لا تُقدّر بثمن لتعلّمها. ويمكن أن يكون تعلّم AWK أو Perl أو Raku مفيدًا حقًا أيضًا، علمًا أن الأوليين مثبّتتان مسبقًا على أنظمة كثيرة
- إذا كنت تعمل مع JSON (أو XML/YAML/TOML)، فإن jq خيار واضح
- إذا كنت تريد معالجة النصوص، فإن AWK وPerl وRaku هي الخيارات الواضحة.
- إذا كنت ترغب في تجربة شيء مختلف قليلًا، فإن 8th خيار رائع