• مقدّمة
كثير من المعاهد والكليات تفرض على طلابها في السنوات المتقدمة أن يصمموا لغة برمجة جديدة، لتكون تطبيقًا عمليًا لمادة المترجمات (Compiler design)؛ لذا فليس الأمر صعبًا أو يحتاج معارفَ نادرةً كما يتصور البعض.
• الإملاء
لكل لغة بشريّة محكيّة قواعدُ إملائيّةٌ معيّنة، وهذه القواعد كثيرة ولكنها في الغالب بسيطة؛ ففي لغتنا العربية مثلًا نضع نقطتين ( : ) بعد أفعال القول، ونرسم حركة إعرابيّة في أخر الكلمة لتمييزها عن غيرها؛ فلو قرأتَ عبارة مثل: (ذهب جميل) فإنّك لا تدري ما المقصود بكلمة (ذهب)، أهو المعدن النفيس؟ أم فعلُ الانصراف؟ وكذلك، يضع مؤلّف اللغة البرمجية القواعد الإملائيّة والنحوية للّغة الجديدة؛ لإزالة الغموض وتفادي حالات اللبس (اللّبس هو إمكانية تفسير الجملة الواحدة بأكثر من طريقة).
• اللاعبون
علينا أن نفرّق بين ثلاثة لاعبين أساسيّين: مصمّم اللغة البرمجية، المُبرمج، والمُستخدم النهائي. يكتب مؤلّف اللغة البرمجية القواعد الإملائيّةSyntax الخاصّة باللغة التي ألّفها، بعد ذلك يأتي المُبرمج ويتعلّم هذه القواعد ويتقن المهارات الأساسيّة الضروريّة التي لا بدّ لكلّ لغة برمجيّة أن تتضمّنها.
• معلوم من البرمجة بالضرورة!
العديد من الأدبيّات في البرمجة تقرّر أنّه لا بدّ لأي لغة برمجية أن تتيحَ للمبرمج القيام بخمس عمليّاتٍ أساسية:
1- Testing: أن يختبر شرطًا (هل 4*5 أكبر من 3*7؟). // العلامة * تعني مضروبا في.
2- assignment: أن يخزّن بعض المعطيات في وحدة التخزين مع إعطائها أسماءً مميّزة؛ فمثلًاy = 3 معناها: خزّن الرقم 3 في الذاكرة بعنوان اسمهy .
3- Reading: أن يستقبلَ المدخلات؛ فمثلًا عندما تكتب تعليقًا على أحد المنشورات وتضغط زرّ الإدخال في لوحة المفاتيح يتم سحبُ تعليقك وإسناده assignment إلى عنوان في الذاكرة؛ لتجرى عليه بعض العمليّات.
4- Writing (printing): أن يكتب المعلومات؛ في الحقيقة، إن كلّ ما تراه على الشاشة -حتى هذا المنشور- لم يكن ليظهر لولا أنّ المُبرمجَ قام باستخدام سمة برمجيّة مفادها أن تتمّ كتابةُ هذه الكلمات في هذا المكان.
5- Looping: أن يكرّر مجموعة تعليمات، فعلى سبيل المثال يحتفظ فيسبوك بجميع التعليقات الخاصة بأحد المنشورات في جدول، ثمّ يمر على أسطر هذا الجدول سطرًا سطرًا من خلال حلقة تكراريّة loop وفي كل تكرار يسحب تعليقًا
ويكتبه في مكانه.
• النحو Syntax
إن المهارة الأساسيّة التي يجب التدرّب عليها لتأليف لغة برمجة هي مهارة التعبير عن عدد لا نهائي من التعليمات البرمجيّة بعدد منتهٍ من القواعد النحويّة!! ولتوضيح المعنى نضرب المثال البسيط التالي؛ في اللغة العربية عندنا قاعدة تعبّر عن الجملة الفعليّة بالشكل التالي: (الجملة = فعل + فاعل + مفعول به). هذه قاعدة واحدة يمكن لنا أن نشتقّ منها عددًا هائلًا من الجُمَل مثل (كتب الولد الدرس، أكل أخي التفاحة، حمل أحمد الحقيبة… إلخ). ويمكننا التعبير عن الجملة الفعلية أيضًا بالشكل التالي: (الجملة = فعل + فاعل + حرف جر + اسم مجرور) و نقوم باشتقاق الكثير من العبارات من هذه الجملة مثل (صعد الطفل إلى الحافلة، كتب الأستاذُ على السبورة.. الخ). وبنفس الطريقة تمامًا، على مؤلّف اللغة البرمجيّة أن يكتب عددًا محدودًا من القواعد النحوية للغته البرمجية بحيث تستوعبُ هذه القواعد أي كودٍ برمجي صحيح قد يكتبه المبرمج في المستقبل. يقوم مصمّم اللغة باستخدام أداة، مثل JavaCC، لتقوم بقراءة الكود البرمجي وتختبر ملائمة هذا الكود للقواعد الإملائيّة والنحوية التي ألفها مصمم اللغة، فإن نجح الكود في هذا الاختبار فإنّه يعتبر جاهزًا لتشغيله على مختلف الأجهزة.
• ألا تكفينا لغة برمجة واحدة؟
بمجرّد الانتهاء من كتابة قواعد اللغة البرمجية (الإملائية والنحوية) فإن تعديل هذه القواعد هو أمرٌ بالغُ الصعوبة وأحيانًا يكادُ يكون مستحيلًا! كذلك علينا أن نعلمَ أن تصميم لغة برمجية لا يكونُ عبثًا أبدًا، وإنّما يتم تصميم اللغة البرمجية لحاجة وهدف محدد؛ فعندما ظهرت لغة FORTRAN عام 1954، لم يكن هناك إنترنت ولا حتى ألعاب 3D، وبالتالي فإننا نحتاج إلى لغة برمجة جديدة لتطوير تطبيقات وبرمجيات في تلك المجالات الجديدة.
الآن مثلًا لدينا في مجال معالجة البيانات الإحصائيّة ونمذجة خوارزميات التعلّم التلقائي نجد لغة R ولبرمجة صفحات الانترنت نجد لغة javaScript وفي البحث العلمي (معالجة الإشارة والصور…) تجد لغةMATLAB ، في مجال التعلّم التلقائي أيضًا تجد لغة python ، ولبرمجة المخدّمات (السيرفرات) نجد لغة PHP وللتعامل مع قواعد البيانات نجد لغة SQL ولبرمجة تطبيقات الموبايل (أندرويد مثلًا) تجد لغة java وللألعاب تجد لغةC++ ومكتبة openGL و كلّ ما سبقَ على سبيل المثال لا الحصر! ولربط الأفكار مع بعضها نذكّر بأنّ كلّ هذه اللغات وغيرها الكثير، تتيح للمبرمج أن ينفّذ العمليات الأساسية التي ذكرناها تحت عنوان “معلوم من البرمجة بالضرورة”.
• خلاصة
سبقَ أن أشرنا في مقدّمة البحث إلى أن الكثير من كليات علوم الحاسب والمعاهد تكلّف طلابها بتصميم لغة برمجيّة يقوم المهندسون برسم الخطوط العريضة لها وبالتالي فإن المسألة ليست تعجيزيّة! وأشرنا كذلك إلى أن المهارة الإضافيّة التي يجب على مصمّم اللغة أن يتعلّمها هي مهارة كتابة القواعد الإملائيةّ و القواعد النحوية للغة واختبار هذه القواعد. ذلك ننبّه إلى أنّه من الصعوبة بمكانٍ (بل محالٌ) أنّ يتمكّن أحدٌ من تصميم لغة برمجيّة وهو غير متقنٍ أصلًا لأيّ لغة برمجيّة! فما دامت الفئة المستهدفة من تصميم لغة البرمجة هي فئة المبرمجين فكيفَ يتصوّر أنّ أحدًا يمكنه أن يؤلّف لغة برمجة ولا يعرف شيئًا عن البرمجة؟!
• المراجع
Basics of Compiler Design [pdf]
Compiler Construction Using Java، JavaCC، and Yacc [pdf]
Compilers Principles Techniques and Tools [pdf]