من أجل لغات برمجة عربية

نشر موقع النظام العربي، مقالين مهمين عن بناء لغات البرمجة، يرجى الاطّلاع عليها في
كيف يمكنني تصميم لغة البرمجة الخاصة بى ؟
مقدمة :

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

ماذا سأتعلم ؟ 
فى هذا الدليل ستتعلم طريقة تصميم لغة برمجة خطوة بخطوة وكل خطوة من خطوات تصميم لغة برمجة

كيف ستقوم بتقديم الدليل ؟
على عدة حلقات ان شاء الله 

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

  • المعلومات وتخزينها
  • الأوامر وتنظيم سيرها
  •  التصميم الخاص

السلام عليكم ورحمه الله وبركاته نأتى اليوم الى اول دروسنا العملية لتصميم لغة البرمجة الخاصة بنا وسوف نعتمد ان شاء الله على سهولة اللغة وبساطتها ويمكن لكل شخص ان يزيد عليها ويطورها اكثر لكننى سأترك الكلام النظرى وسوف أدل على مراجع لدراسته واركز اكثر على الجانب العملى واخراج النتائج 

ما هو الطريق الذى سنسير علية فى هذه السلسة ؟

1- سنقوم ببناء  Lexical Analysis باستخدام اداة Flex وهى متواجدة اساسا  فى نظام اللينكس واما لمستخدمى نظام الويندوز فيمكنهم تحميلها عن طريق cgwin وهذا ما سأعتمد عليه لآننى من مستخدمين الويندوز أثناء السلسلة

2- سنقوم بعمل Semantic Parsing باستخدام أداة Bison وهى كالاداة السابقة أثناء تنصيبها او عن طريق cgwin 
3- سنقوم بترجمة اللغة وعمل بيئة بسيطة للتعامل معها 
4- سنقوم بعمل Assembling  للAST  باستخدام LLVM
5- سنقوم ببناء اللغة كاملة ان شاء الله
6- خاتمة السلسلة ونصائح لاستكمال التطوير


هذه ان شاء الله ستكون الخطوات التى سنسير عليها ان شاء الله فى السلسلة


ما المقصود بالمترجمات وما هى لغات البرمجة ؟


المترجمات ( Compilers ) هي برامج حاسوبية تقوم بالترجمة من لغة إلى اخرى فالمترجم يأخذ برنامج تمت كتابته بلغة المصدر ( Source Language ) كمدخلات، لينتج برنامجا مكافئاً له مكتوب بلغة الهدف ( Target Language ) كمخرجات. وغالباً ما تكون لغة المصدر هى احدى لغات البرمجة عالية المستوى ( High Level Programming Languages ) مثل لغة الـ C أو لغة الـ ++C بينما تكون اللغة المستهدفة هى لغة الآلة ( Machine Language ) الخاصة بإحدى الحواسيب.

 
    ويعتبر برنامج المترجم من البرامج المعقدة حيث تتراوح عدد سطور شفرة البرنامج ( Program Code ) الخاصة به مابين عشرة الاف إلى مليون سطر. لهذا فإن كتابة هذا النوع من البرامج أو حتى محاولة فهمها لايعد من العمليات البسيطة بل يعتبر عملية في غاية الصعوبة ولكن بسبب أهمية المترجمات بالنسبة لعدد كبير من المهام التي يقوم بها الحاسب فإنه من الضروري على جميع المشتغلين وخاصة المتخصصين في التعامل مع الحاسب أن يتعرفوا على التنظيم الاساسى واسلوب عمل مثل هذه البرامج.
    والغرض الأساسي من هذه المادة العلمية ليس فقط إعطاء المعرفة الأساسية الخاصة بالمترجمات ولكن أيضاً توضيح الأدوات الضرورية وكذلك تقديم الخبرة العلمية اللازمة لتصميم وإعداد برنامج مترجم فعلي. وللقيام بذلك فإنه من الضروري دراسة عدد من الأساليب النظرية وخاصة نظرية الاتوماتة ( Theory Automata ) وهى نظرية رياضية هامة تساعد في عملية بناء المترجم ( Compiler Construction ) وسوف نقوم في الوحدة الرابعة باستعراض هذه النظرية باسلوب مبسط دون الدخول في التفاصيل الرياضية غير اللازمة والتركيز فقط على عناصر النظرية التي تخدم عملية الترجمة.
    وفي جميع الأحوال يجب على الدارس أن يكون لديه الدراية الكافية باساليب الرياضيات المتقطعة ( Discrete Mathematics ) وهياكل البيانات ( Data Structures ) وكذلك الإلمام بمعرفة بناء الحواسيب ( Computer Architecture ) ولغة التجميع ( Assembly Language )
 ما هى البرامج المرتبطة بالمترجمات ؟
 المترجمات الفورية Interpreters
    هى ايضا مترجمات للغات البرمجة مثل باقى المترجمات ولكنها تختلف في كونها تقوم بتنفيذ برنامج المصدر ( Source Program ) مباشرة دون توليد شفرة الهدف التي يتم تنفيذها بعد الانتهاء من الترجمة بالكامل كما يحدث في حالة استخدام المترجمات المعتادة ( Compilers ) ويفضل استخدام المترجمات الفورية مع بعض لغات البرمجة مثل لغة ال BASIC وخاصة في الأغراض التعليمية وذلك لكونها تقوم بتوضيح الاخطاء الموجودة في البرنامج خطوة خطوة وأولا بأول ولكن يعاب على هذا النوع من المترجمات أنها تقوم بإعادة الترجمة في كل مرة يتم فيها تنفيذ البرنامج لذلك فإن المترجمات المعتادة يفضل استخدامها إذا كانت السرعة مطلوبة في تنفيذ البرنامج وذلك لأن تنفيذ النسخة المترجمة من البرنامج يكون أسرع من تنفيذ البرنامج المصدر بدرجة تصل إلى عشرة أضعاف وعموماً فإن كلاً من المترجمات الفورية والمترجمات المعتادة يتشابهان ويشتركان في عدد كبير من العمليات ولكننا سنركز في شرحها في تلك المادة العلمية على المترجمات المعتادة فقط.
 المجمعات Assemblers
    المجمّع هو مترجم للغة تجميع خاصة بحاسب محدد وكما ذكرنا سابقا فإن لغة التجميع هو شكل رمزى للغة الآلة الخاصة بتلك الحاسب ولذلك فإنها أسهل في الترجمة وفي بعض الاحيان تقوم المترجمات المعتادة الخاصة بلغات البرمجة بتوليد لغة التجميع المقابلة لتلك اللغات ثم يقوم المجمع بتحويلها إلى لغة الآلة.
 برامج الربط Linkers
    تحتاج كل من المترجمات والمجمعات في الغالب إلى برنامج يسمى الرابط الذي يقوم بدمج شفرات الملفات الناتجة عن عملية الترجمة أو التجميع في ملف مستهدف واحد قابل للتنفيذ مباشرة وايضا يقوم الرابط باضافة شفرة الوظائف الجاهزة ( Built-in Functions ) المستخدمة وبعض الخدمات المطلوبة من نظام التشغيل الخاص بالحاسب إلى ذلك الملف التنفيذى المستهدف وعموما فإن الدور الذي يقوم به الرابط كان في السابق ضمن وظائف المترجمات ولكن تم فصله بعد ذلك ولهذا فلن يتم شرحه في هذه المادة العلمية.
 برامج التحميل Loaders
    غالبا ما تقوم المترجمات والمجمعات بتوليد شفرة البرنامج المستهدف دون أن تحتوى على تحديد للمواقع التخزينية التي في الذاكرة بشكل مطلق بل أنها تتوقف على موقع البرنامج نفسه في الذاكرة ويتم ذلك لاعطاء الفرصة لتحميل البرنامج في أي موقع بالذاكرة بالاضافة إلى عدم الاحتياج إلى إعادة الترجمة عند نقله من موقع لآخر حيث يقوم برنامج التحميل بتحويل تلك المواقع التخزينية القابلة للنقل إلى مواقع تخزينية ثابتة عند قيامه بتحميل البرنامج إلى الذاكرة.
 برامج التحرير Editors
    إن المترجمات دائما ما تقبل برامج المصدر ( Source Programs ) المكتوبة باستخدام أحد برامج التحرير لهذا فإن عملية الترجمة غالباً ما تتم من داخل تلك البرامج لكى تكوّن بيئة تفاعلية متكاملة لتحرير البرامج وفي هذه الحالة يكون برنامج التحرير مرتبط بلغة محددة من لغات البرمجة وهى اللغة التي يتضمن البرنامج المترجم الخاص بها وعند ذلك يكون برنامج التحرير موجه لتلك اللغة ومهيكل وفقاً للصيغ النحوية الخاصة بها مما يسهل من عملية تحرير البرامج بهذه اللغة.

مراحل المترجم Compiler Stages
    يتكون المترجم من مجموعة من الخطوات أو المراحل التي تقوم بانجاز عدد من العمليات المختلفة ومن الأفضل أن نفكر في تلك المراحل على أنها أجزاءً منفصلة داخل المترجم على الرغم من كونها من الناحية العملية يكونوا وحدة واحدة
وهم ما يلى
 
 محلل المفردات Lexical Analyzer
إن محلل المفردات أو مايطلق علية أحيانا الماسح ( Scanner ) هو الذي يقوم بالقراءة الفعلية لبرنامج المصدر على هيئة سلسلة متتابعة من الحروف حيث يقوم بتجميع سلاسل الحروف التي تكون وحدات ذات معنى تكون مفردات ( Tokens ) لغة البرمجة وبالتالي فإن دور محلل المفردات هو تمييز مفردات اللغة فعلى سبيل المثال بفرض سطر الشفرة التالي المكتوب بلغة السى:
a [index] = 4 + 2
هذا السطر يتكون من 12 حرفاً وبحذف المسافات تكون 8 مفردات كالاتى:
a           identifier معرف                          
[           left bracket (قوس ايسر (فتحة قوس
index identifier معرف                      
    ]          right bracket ( قوس ايمن (اغلاق قوس 
=          assignment sign رمز التخصيص       
4          number عدد                               
+          plus sign رمز الجمع                    
2         number عدد                            
وكل مفردة من المفردات السابقة تتكون من حرف واحد أو أكثر يتم تجميعها في وحدة واحدة قبل القيام بالمراحل التالية ومحلل المفردات قد يقوم بعمليات أخرى بالإضافة إلى تمييز المفردات مثل إضافة المعرفات إلى جدول الرموز وإضافة الثوابت إلى جدول الثوابت.
2.4. محلل الصيغ النحوية Syntax Analyzer
إن مرحلة تحليل الصيغ النحوية أو ما يطلق عليها أحياناً مرحلة الإعراب ( Parsing ) تتلقى شفرة المصدر في شكل مفردات من محلل المفردات ليقوم بتحليل الصيغ النحوية لتحديد هيكل البرنامج وذلك مثل تحليل القواعد لجملة من جمل اللغات الطبيعية ونتيجة لهذه المرحلة يتم إنشاء شجرة الإعراب ( Parse Tree ) أو شجرة النحو ( Syntax Tree ) وكمثال على ذلك بفرض سطر الشفرة السابق المكتوب بلغة السى فإنه عبارة عن تعبير ( Expression ) يمثل الهيكل الخاص بأمر التخصيص في تلك اللغة
 
 
    حيث يلاحظ أن العقد الداخلية من شجرة الإعراب معنونة بأسماء التراكيب التي يمثلها بينما أوراق شجرة الإعراب تمثل تتابع المفردات من المدخلات.
    وأحيانا يتم انشاء شجرة النحو بدلا من شجرة الإعراب حيث تختصر شجرة النحو بعض المعلومات المعروضة في شجرة الإعراب لانها أكثر منها تجريداً.
 
 
 محلل الدلالات Semantic Analyzer
    إن دلالات البرنامج هى المعنى الخاص في مقابلة صيغه النحوية ويتم تحديد دلالات أي برنامج من خلال سلوكه أثناء التشغيل ولكن معظم لغات البرمجة لديها بعض الصفات التي يمكن تحديدها قبل البدء في التشغيل ولكن تلك الصفات لا يستطيع وصفها أو تحليلها بواسطة محلل الصيغ النحوية ويطلق على هذه الصفات لقب الدلالات الثابتة (Static Semantics) ومهمة محلل الدلالات هو تحليل هذا النوع من الدلالات التي تشمل بشكل أساسي التعريفات (Declarations) واختبار الأنواع (Type Checking) والمعلومات الإضافية التي تعكس هذه الدلالات تسمى خصائص (Attributes) ويتم تحديدها أثناء المرحلة الحالية وغالباً ما تتم إضافتها كحواشي لشجرة الإعراب أو شجرة النحو وقد تضاف أيضا لجدول الرموز. ففي مثال أمر التخصيص السابق نجد أن المعلومات الاساسية الخاصة بالنوع والتي يجب تجميعها قبل البدء في تحليل الدلالات الخاصة بهذا الأمر هي ان المتغير a عبارة عن مصفوفة للقيم الصحيحة (Integers) وأن مدى الفهرس الخاص بتلك المصفوفة يجب أن يكون من القيم الصحيحة ايضا وبالفعل المتغير Index هو متغير صحيح ثم يقوم محلل الدلالات باضافة تلك الخصائص كحواشي لشجرة النحو
 
وبعد الانتهاء من ذلك يتم التأكد من أن أمر التخصيص يمكن أن يتم بالنسبة لهذا النوع من البيانات فإذا كان ذلك صحيح كما في المثال فإن محلل الدلالات يعلن توافق أنواع البيانات في الأمر وإلا فانه يعطى رسالة خطأ تفيد عدم وجود هذا التوافق.
 محسن شفرة المصدر Source Code Optimizer
    إن المترجمات عادة ما تشتمل على عدد من الخطوات الخاصة بتحسين شفرة البرنامج وفي أغلب الأحوال تكون الخطوة الأولى منها بعد الانتهاء من تحليل الدلالات حيث يكون هناك إمكانية لمثل هذا التحسين ولكنه مرتبط فقط بشفرة المصدر الذي يظهر كمرحلة منفصلة من مراحل الترجمة و عموماً فإن المترجمات المتعددة تختلف فيما بينها ليس فقط في نوع التحسين الذي يتم ولكن أيضا في موقع ذلك التحسين ضمن مراحل الترجمة.
ففي مثالنا السابق هناك فرصة لهذا التحسين على مستوى برنامج المصدر يتمثل في التعبير 2 + 4 حيث يمكن حسابه في هذه المرحلة واستبداله بالناتج 6 وهذا التحسين يمكن أن يتم مباشرة في شجرة النحو ذات الحواشي عن طريق دمج الجانب الأيمن من الشجرة ليعبر فقط عن قيمة ثابتة
 
ويوجد تحسينات متعددة يمكن إجراءها مباشرة على الشجرة ولكن في أغلب الحالات يكون ذلك أسهل تنفيذه على الشكل الخطي للشجرة الذي يكون قريباً من شفرة لغة التجميع وهي ما تسمى بالشفرة الوسيطة (Intermediate Code) وذلك في إشارة إلى كون هذه الشفرة تقع بين شفرة المصدر وشفرة الهدف والتي تعتبر تمثيل داخلي لبرنامج المصدر يستخدم فقط بواسطة المترجم وعلى هذا فإن شجرة النحو يمكن أيضاً اعتبارها شفرة وسيطة ولذلك فإن الشفرة الوسيطة يشار إليها في بعض الأحيان بكونها تمثيل وسيط (Intermediate Representation) وليس مجرد شفرة.
 مولد الشفرة Code Generator
    مولد الشفرة يأخذ كمدخلات الشفرة أو التمثيل الوسيط ليقوم بتوليد شفرة خاصة بالآلة المستهدفة والتي هي شفرة الهدف وفي هذه المرحلة من الترجمة فإن خصائص الآلة (الحاسب) المستهدفة يكون لها التأثير الأساسي وهذا ليس فقط من حيث ضرورة استخدام الأوامر الموجودة في الآلة المستهدفة ولكن أيضا عند اتخاذ القرارات الخاصة بتمثيل البيانات والتي يتم فيها تحديد المساحة التي يشغلها كل بيان في الذاكرة .
 محسّن شفرة الهدف Object Code Optimizer
    في هذه المرحلة يحاول المترجم إجراء التحسينات في شفرة الهدف التي تم توليدها في المرحلة السابقة وهذه التحسينات تشمل اختيار أسلوب العنونة (Addressing Mode) المناسب الذي يزيد من سرعة تنفيذ البرنامج واستبدال الأوامر البطيئة بأوامر أسرع وكذلك حذف العمليات المتكررة غير الضرورية.
    وبنهاية هذه المرحلة ينتهي الوصف المختصر لمراحل المترجم مع ضرورة التأكيد أن هذا الوصف يوضح فقط وظيفة كل مرحلة وليس من الضروري أن يعكس التنظيم الفعلي للمترجمات والتي تختلف كثيراً عن بعضها البعض في تفاصيلها التنظيمية ولكن مع ذلك فإن المراحل التي تم استعراضها موجودة في أغلب المترجمات. هذا وقد تمت الإشارة في هذا الجزء لعدد من تراكيب البيانات (Data Structures) اللازمة للاحتفاظ بالمعلومات التي تحتاجها كل مرحلة من مراحل المترجم مثل شجرة النحو والشفرة الوسيطة وجدول الثوابت وأيضاً جدول الرموز والتي سنخصص الجزء التالي لتقديم عرض مبسط لتراكيب البيانات الأساسية التي يستخدمها المترجم.

Comments on: "كيف يمكننى تصميم لغة البرمجة الخاصة بى ؟" (18)

  1. ممتاز

    اهم شي العزيمه والاصرار

  2. شكرا لنقل المقالتين من مدونتي
    الى هنا وتحياتي لكم ان شاء الله وبلتوفيق

    محمد ابراهيم محرر مدونة النظام العربي

  3. احمد صالح said:

    قادمة قريبا
    برنامج برمجة-عربي
    لغة واضح

    قريبا

  4. احمد صالح said:

    بحمد الله

    تم الانتهاء من تصليح البرنامج من بعض الاخطاء زائد عمل شرح ودروس للغة

    برنامج برمجة-عربي
    الذي يستخدم لغة واضح العربية

    يحتوي الملف علي دروس و امثلة للغة
    زائد شرح لكل اوامر اللغة مع اختلافاتها

    يمكنم التحميل من هنا الاصدار 1.1
    http://www.mediafire.com/?0yrg6vxghddglgc

    تحياتي

  5. إلى صاحب هذه المدونة كم أنت عظيم وعلينا جميعاً دعم أي لغة برمجة عربية حتى ننتج لغة ذات نواحٍ تجارية وهذا المهم
    لقد شجعتني لغة برمجة “ج” على دعم اللغات العربية نظرا لمدى سهولتها ومتعتها وفهمها السريع

  6. بسم الله الرحمن الرحيم

    جزاكم الله تعالى خير الجزاء وان شا ءالله ابذل ما بوسعى لنشر هذه اللغات بين
    المجتمع العربى على شبكة الويب بكافة الوسائل المتاحة فإن شباب الغرب ليسوا بأفضل منا
    ونحن أمة النبى صلى الله عليه وسلم…..

  7. السلام عليكم
    أنا طالبة بكلاريوس وأتمنى أن تساعدوني في عمل compilerللغة الc++فأنا أبحث عن الأكواد ةولم أجدها ومن ضمنها مرحلة (token-lexical-…….)

  8. الكتاب لا يمكن تحميله
    ولم أجد أكواد وإن وجدتها فهي لا تتنفذ

  9. مهندس مبتدئ said:

    شكرا على هذا الشرح و نطلب المزيد لفهم المترجمات أكثر

  10. محمد بلخيرية said:

    قادمة قريبا

    لغة إقرأ للبرمجة العربية بإذن الله
    اللّغة الشّبيهة بلغة جافا
    قريبا

  11. سيكون من العظيم لو تعاون المبرمجون العرب علي لغة برمجة عربية تكون متطورة جدا حتي تصل الي مراحل اللغات الاجنبية

  12. فلماذا لا نحاول ان نصنع لغة خاصة بالعرب

  13. باقلاب هاشم said:

    مقالين و ليس مقالاين … البعض من هذه الأخطاء يفقد المصداقية مع مرور الزمن ….

اترك رداً على سعيد شعبان إلغاء الرد