تصميم وتنفيذ لغات البرمجة

تُنشأ لغات البرمجة عادةً من خلال تصميم شكل لتمثيل برنامج حاسوبي، وكتابة تطبيق لهذا المفهوم المُطوَّر، [ 1 ] وعادةً ما يكون مُفسِّراً أو مُجمِّعاً . صُمِّمت المُفسِّرات لقراءة البرامج، عادةً بصيغة نصية ما، وتنفيذ إجراءات بناءً على ما تقرأه، بينما تُحوِّل المُجمِّعات الشفرة إلى شكل أدنى مستوى، مثل الشفرة التنفيذية. [ 2 ]

تصميم

في تصميم لغات البرمجة، توجد عوامل عديدة يجب مراعاتها. قد تكون بعض هذه العوامل متعارضة (مثل الأمان مقابل السرعة). قد يكون من الضروري النظر فيما إذا كانت لغة البرمجة ستؤدي أداءً أفضل عند تفسيرها أو ترجمتها، وما إذا كان ينبغي أن تكون ذات كتابة ديناميكية أو ثابتة، وما إذا كان سيتم تضمين الوراثة، والبنية العامة للغة. [ 3 ] يمكن تحديد العديد من العوامل المتعلقة بتصميم اللغة بناءً على أهدافها. من المهم مراعاة الجمهور المستهدف للغة، وخصائصها الفريدة، والغرض منها. [ 4 ] من الممارسات الجيدة النظر في ما تفتقر إليه اللغات الموجودة، أو ما يصعب استخدامها، للتأكد من أن اللغة تخدم غرضًا محددًا. [ 4 ]

اقترح العديد من الخبراء مبادئ تصميم مفيدة:

  • في الفقرة الأخيرة من مقال نُشر عام 1972، قدم توني هوار بعض النصائح العامة لأي مشروع برمجي: [ 5 ]
    لذا، نصيحتي لمصممي ومطوري برامج المستقبل باختصار: لا تُقرروا ما ستفعلونه بالضبط حتى تعرفوا كيف تفعلونه؛ ولا تُقرروا كيف تفعلونه حتى تُقيّموا خطتكم وفقًا لجميع معايير الجودة المطلوبة. وإذا لم تستطيعوا فعل ذلك، فبسطوا تصميمكم حتى تتمكنوا من ذلك.
  • في ندوة SIGPLAN عام 1973، ناقش توني هوار جوانب لغوية مختلفة بتفصيلٍ ما. [ 6 ] كما حدد عددًا من أوجه القصور في لغات البرمجة السائدة آنذاك.
    "لغة البرمجة هي أداة ينبغي أن تساعد المبرمج في أصعب جوانب فنه، وهي تصميم البرامج، والتوثيق، وتصحيح الأخطاء."
    "يمكن تلخيص المعايير الموضوعية لتصميم اللغة الجيد في خمس عبارات رئيسية: البساطة، والأمان، والترجمة السريعة، وكفاءة رمز الكائن، وسهولة القراءة."
    من غير المعقول إجراء فحوصات أمنية معقدة أثناء عمليات تصحيح الأخطاء، في حين لا توجد ثقة في النتائج، ثم إزالتها في عمليات الإنتاج، حيث قد تكون النتيجة الخاطئة مكلفة أو كارثية. ماذا سنقول عن هاوٍ للإبحار يرتدي سترة النجاة أثناء التدريب على اليابسة، لكنه يخلعها بمجرد ذهابه إلى البحر؟
  • في مؤتمر الاتحاد الدولي لمعالجة المعلومات (IFIP) عام 1974، قدم نيكلاوس ويرث ، مصمم لغة باسكال ، ورقة بحثية بعنوان "حول تصميم لغات البرمجة". [ 7 ] سرد ويرث عددًا من الاقتراحات المتنافسة، أبرزها أن تكون اللغة سهلة التعلم والاستخدام، وأن تكون قابلة للاستخدام دون إضافة ميزات جديدة، وأن يُنتج المترجم شفرة فعالة، وأن يكون المترجم سريعًا، وأن تكون اللغة متوافقة مع المكتبات، والنظام الذي تعمل عليه، والبرامج المكتوبة بلغات أخرى.

تتضمن العديد من لغات البرمجة ميزات تصميمية تهدف إلى تسهيل تنفيذ الإصدار الأولي على الأقل من المترجم أو المفسر. على سبيل المثال، تم تصميم لغات باسكال وفورث والعديد من لغات التجميع خصيصًا لدعم الترجمة في خطوة واحدة .

غالبًا ما تُصمَّم لغات البرمجة الجديدة لمعالجة المشاكل (المُتَوَصَّلة) في لغات البرمجة السابقة، وذلك عادةً بإضافة ميزات (مع أنها قد تُعقِّد المُفسِّر أو المُترجم) تُسهِّل كتابة البرامج بتلك اللغات. على سبيل المثال، اللغات التي تتضمن إدارة تلقائية للذاكرة وجمع البيانات المهملة؛ واللغات التي تتضمن مصفوفات ترابطية مُدمجة ؛ وما إلى ذلك.

من ناحية أخرى، تم تصميم عدد قليل من لغات البرمجة خصيصًا لتسهيل كتابة مترجم ذاتي الاستضافة نسبيًا ، وذلك عادةً عن طريق استبعاد الميزات التي تجعل عملية التجميع صعبة، مثل BCPL و Pascal و RPython .

تطبيق

هناك منهجان عامان لتنفيذ لغات البرمجة: [ 8 ]

بالإضافة إلى هذين النقيضين، تستخدم العديد من التطبيقات أساليب هجينة مثل الترجمة الفورية ومفسرات التعليمات البرمجية.

تتمتع المفسرات ببعض المزايا مقارنةً بالمترجمات الفورية والمترجمات المسبقة. [ 10 ] تدعم المفسرات عادةً حلقة قراءة-تقييم-طباعة ، مما يجعل تطوير البرامج الجديدة أسرع بكثير؛ بينما تجبر المترجمات المطورين على استخدام حلقة تحرير-تجميع-تشغيل-تصحيح أبطأ بكثير.

عند تجميع برنامج نموذجي باستخدام مُجمِّع مُسبق، فإنه (بعد اكتمال التجميع) سيعمل بشكل أسرع من البرنامج نفسه عند معالجته وتشغيله باستخدام مُجمِّع فوري؛ والذي بدوره قد يعمل بشكل أسرع من البرنامج نفسه عند تجميعه جزئيًا إلى لغة وسيطة من نوع p-code، مثل لغة البايت كود ، وتفسيره بواسطة آلة افتراضية للتطبيقات ؛ والذي بدوره يعمل بشكل أسرع بكثير من المفسر البحت. [ 11 ]

نظرياً، يمكن تحديد لغة البرمجة أولاً، ثم لاحقاً تنفيذ مترجمها أو مُفسِّرها (نموذج الشلال). عملياً، غالباً ما تؤثر الدروس المستفادة أثناء محاولة تنفيذ لغة ما على الإصدارات اللاحقة من مواصفات اللغة، مما يؤدي إلى دمج تصميم لغة البرمجة وتنفيذها.

عادةً ما يقوم كل من المفسرات والمترجمات بتنفيذ نوع من جداول الرموز .

مترجمون فوريون

المترجم هو برنامج يقرأ برنامجًا آخر، عادةً كنص، [ 4 ] كما هو الحال في لغات مثل بايثون . [ 2 ] يقرأ المترجم الشفرة البرمجية، وينتج النتيجة مباشرةً. [ 12 ] يقرأ المترجم الشفرة البرمجية عادةً سطرًا بسطر، ويحللها لتحويلها وتنفيذها كعمليات وإجراءات. [ 13 ]

يتكون المفسر من جزأين: محلل نحوي ومُقيِّم . بعد قراءة البرنامج كمدخلات بواسطة المفسر، يقوم المحلل النحوي بمعالجته. يُقسِّم المحلل النحوي البرنامج إلى مكونات لغوية لتشكيل شجرة تحليل . ثم يستخدم المُقيِّم شجرة التحليل لتنفيذ البرنامج. [ 14 ]

آلة افتراضية

الآلة الافتراضية هي نوع خاص من المفسرات التي تفسر الشفرة الوسيطة. [ 9 ] الشفرة الوسيطة هي شفرة منخفضة المستوى قابلة للنقل تشبه شفرة الآلة، على الرغم من أنها تُنفذ عادةً على آلة افتراضية بدلاً من آلة فعلية. [ 15 ] ولتحسين كفاءتها، تُترجم العديد من لغات البرمجة ، مثل جافا [ 15 ] وبايثون [ 16 ] وسي شارب [ 17 ] ، إلى شفرة وسيطة قبل تفسيرها.

مترجم فوري

تتضمن بعض الآلات الافتراضية مُترجمًا فوريًا (JIT) لتحسين كفاءة تنفيذ التعليمات البرمجية الوسيطة. أثناء تنفيذ الآلة الافتراضية للتعليمات البرمجية الوسيطة، إذا حدد المُترجم الفوري أن جزءًا منها سيُستخدم بشكل متكرر، فإنه يُترجم ذلك الجزء إلى لغة الآلة. ثم يخزن المُترجم الفوري لغة الآلة في الذاكرة ليتمكن الجهاز الافتراضي من استخدامها. تسعى مُترجمات JIT إلى تحقيق توازن بين وقت الترجمة الأطول ووقت التنفيذ الأسرع. [ 9 ]

المترجمون

يقوم المترجم بترجمة البرامج المكتوبة بلغة برمجة إلى لغة أخرى. تتكون معظم المترجمات من ثلاث مراحل: الواجهة الأمامية ، والمُحسِّن ، والواجهة الخلفية . تتولى الواجهة الأمامية مسؤولية فهم البرنامج، والتأكد من صحته، وتحويله إلى تمثيل وسيط ، وهو بنية بيانات يستخدمها المترجم لتمثيل البرنامج. يعمل المُحسِّن على تحسين التمثيل الوسيط لزيادة سرعة البرنامج أو تقليل حجم الملف التنفيذي الذي ينتجه المترجم في النهاية. أما الواجهة الخلفية، فتُحوِّل التمثيل الوسيط المُحسَّن إلى لغة الإخراج الخاصة بالمترجم. [ 18 ]

إذا أنتج مُترجم لغة برمجة عالية المستوى لغة برمجة عالية المستوى أخرى، يُطلق عليه اسم مُترجم تحويلي . يمكن استخدام المُترجمات التحويلية لتوسيع اللغات الموجودة أو لتبسيط تطوير المُترجمات من خلال الاستفادة من تطبيقات قابلة للنقل ومُحسّنة جيدًا للغات أخرى (مثل لغة C ). [ 9 ]

تتوفر العديد من تركيبات التفسير والترجمة، وتتضمن العديد من تطبيقات لغات البرمجة الحديثة عناصر من كليهما. على سبيل المثال، تُنفذ لغة البرمجة سمول توك عادةً عن طريق الترجمة إلى بايت كود ، والذي يُفسر أو يُترجم بعد ذلك بواسطة آلة افتراضية . وبما أن بايت كود سمول توك يُشغل على آلة افتراضية، فإنه قابل للنقل عبر منصات أجهزة مختلفة. [ 19 ]

تطبيقات متعددة

يمكن أن تحتوي لغات البرمجة على تطبيقات متعددة. ويمكن كتابة التطبيقات المختلفة بلغات مختلفة، كما يمكنها استخدام طرق مختلفة لتجميع أو تفسير التعليمات البرمجية. على سبيل المثال، تتضمن تطبيقات بايثون ما يلي: [ 20 ]

عملية

قد تختلف عمليات إنشاء لغة برمجة من مطور لآخر؛ ومع ذلك، إليك عملية عامة لكيفية إنشاء لغة برمجة، والتي تتضمن مفاهيم مشتركة:

  • التصميم: تُؤخذ جوانب التصميم في الاعتبار، مثل الأنواع، والنحو، والدلالات، واستخدام المكتبات، وذلك لتطوير لغة برمجة. [ 21 ]
  • الاعتبارات: تُؤخذ في الحسبان بنية اللغة، والتنفيذ، وعوامل أخرى. لغات مثل بايثون تُفسر التعليمات البرمجية في وقت التشغيل، بينما تتبع لغات مثل سي++ نهجًا يعتمد على مُترجم لغة سي في بناء مُترجمها. [ 22 ]
  • إنشاء تطبيق: يتم كتابة تطبيق أولي. ستقوم المترجمات بتحويله إلى تنسيقات أخرى، وعادةً ما ينتهي الأمر بمستوى منخفض مثل لغة التجميع، وحتى إلى التنسيق الثنائي. [ 23 ]
  • حسّن تطبيقك: يجب تحسين التطبيقات. وسّع لغة البرمجة، بحيث تمتلك وظائف كافية للتشغيل الذاتي ، حيث تكون لغة البرمجة قادرة على كتابة تطبيقها الخاص.
  • التمهيد: عند استخدام مُصرّف، قد يلجأ المطور إلى عملية التمهيد، حيث يُعاد كتابة مُصرّف لغة البرمجة باستخدام لغة البرمجة نفسها. [ 24 ] يُعدّ هذا مفيدًا للتحقق من الأخطاء وإثبات كفاءة المُصرّف. [ 25 ] كما يُتيح التمهيد ميزة إضافية تتمثل في الاكتفاء ببرمجة لغة البرمجة نفسها فقط بعد ذلك.

مراجع

  1. توماسيتي، فيديريكو (8 مايو 2019). "كيف يمكنني إنشاء لغة برمجة؟" . سترومينتا . تم الاطلاع عليه في 3 مارس 2023 .
  2. 1 2 "المترجم مقابل المفسر" . جيكس فور جيكس . 17 يناير 2022. تم الاطلاع عليه في 3 مارس 2023 .
  3. "لغات البرمجة والتعلم" . واشنطن إيديو . جامعة واشنطن . تم الاطلاع عليه في 2 مارس 2023 .
  4. 1 2 3 "كيف تُنشأ لغات البرمجة؟" . GoNoCode . 8 ديسمبر 2021. تم الاطلاع عليه في 2 مارس 2023 .
  5. هوار، سي. أ. ر. (1972). "جودة البرمجيات" . البرمجيات: الممارسة والخبرة . 2 (2): 103-105 . doi : 10.1002/spe.4380020202 . S2CID 62662609 . 
  6. "تلميحات حول تصميم لغات البرمجة" (ملف PDF) . 1973. تم الاطلاع عليه في 7 مارس 2023 .
  7. "حول تصميم لغات البرمجة" (ملف PDF) . 1974. تم الاطلاع عليه في 9 مارس 2023 .
  8. رانتا، آرني (6 فبراير 2012). تطبيق لغات البرمجة (ملف PDF) . منشورات الكلية. الصفحات 16-18 . ISBN  9781848900646تمت أرشفة الملف (PDF) من النسخة الأصلية في 7 نوفمبر 2020. تم الاطلاع عليه في 22 مارس 2020 .
  9. 1 2 3 4 5 بيكر، جريج. "تطبيقات اللغة" . علوم الحاسوب - جامعة سيمون فريزر . مؤرشف من الأصل في 8 مارس 2019. تم الاسترجاع في 22 مارس 2020 .
  10. KernelTrap. "مفسرات بايت كود أكثر كفاءة بدلاً من الترجمة في الوقت المناسب" .
  11. لاري فيش. "القصة وراء Apex/XPL0 ومجموعة 6502" .
  12. دايفر، لورانس (7 ديسمبر 2021). "نُشر في 7 ديسمبر 2021: تفسير قواعد البرمجة: الأداء، والفعالية، والإنتاج" . تقرير قانون الحوسبة الصادر عن معهد ماساتشوستس للتكنولوجيا .
  13. راثي، موكول (31 مارس 2017). "كيف كتبت لغة برمجة "حقيقية" خاصة بي" . mukulrathi . تم الاطلاع عليه في 2 مارس 2023 .
  14. إيفانز، ديفيد (19 أغسطس 2011). مقدمة في الحوسبة (ملف PDF) . جامعة فرجينيا. ص 211. تم الاطلاع عليه بتاريخ 22 مارس 2020 . 
  15. 1 2 سريدهار، جاي (29 أغسطس 2017). "لماذا تساعد آلة جافا الافتراضية في تحسين أداء التعليمات البرمجية الخاصة بك" . MakeUseOf . تم الاسترجاع في 22 مارس 2020 .
  16. بينيت، جيمس (23 أبريل 2018). "مقدمة إلى بايت كود بايثون" . Opensource.com . تم الاطلاع عليه بتاريخ 22 مارس 2020 .
  17. علي، ميرزا ​​فاروق (12 أكتوبر 2017). "بيئة تشغيل اللغة المشتركة (CLR) دوت نت" . ميديوم . تم الاطلاع عليه بتاريخ 22 مارس 2020 .
  18. كوبر، كيث؛ توركزون، ليندا (7 فبراير 2011). هندسة المترجم ( الطبعة الثانية). مورغان كوفمان. الصفحات 6-9 . ISBN   9780120884780.
  19. لويس، سيمون (11 مايو 1995). فن وعلم المحادثات القصيرة (ملف PDF) . برنتيس هول. الصفحات 20-21 . ISBN  9780133713459تم الاطلاع عليه بتاريخ 23 مارس 2020 .
  20. "تطبيقات بايثون البديلة" . Python.org . تم الاطلاع عليه بتاريخ 23 مارس 2020 .
  21. تشوشانيان، فيك. "لغات البرمجة" . جامعة ولاية كاليفورنيا، نورثريدج . تم الاطلاع عليه في 2 مارس 2023 .
  22. ستروستروب، بيارن. "تاريخ لغة C++ : 1979-1991" (ملف PDF) . مؤرشف (ملف PDF) من الأصل في 2 فبراير 2019. تم الاطلاع عليه في 18 يوليو 2013 . 
  23. فيرغسون، أندرو. "تاريخ لغات برمجة الحاسوب" . جامعة براون . تم الاطلاع عليه في 2 مارس 2023 .
  24. غلوك، روبرت (2012). "بناء مولدات المترجمات من المُقيِّمات الجزئية". في: كلارك، إدموند؛ فيربيتسكايت، إيرينا؛ فورونكوف، أندريه (محررون). آفاق معلوماتية النظم: المؤتمر الدولي الثامن لإحياء ذكرى أندريه إرشوف، PSI 2011، نوفوسيبيرسك، روسيا، 27 يونيو - 1 يوليو 2011، أوراق مختارة منقحة . سلسلة محاضرات في علوم الحاسوب. المجلد 7162. سبرينغر. الصفحات 125-141 . doi : 10.1007/978-3-642-29709-0_13 . تُطرح عند البدء مشكلة "البيضة والدجاجة" المألوفة في بناء المترجمات: إذ يحتاج المرء إلى مترجم لبناء مترجم آخر، وبناء مولدات المترجمات ليس استثناءً.  
  25. "تثبيت GCC: البناء" . مشروع جنو - مؤسسة البرمجيات الحرة (FSF) .
  • شعار ويكيميديا ​​كومنزالوسائط المتعلقة بالتجميع والربط في ويكيميديا ​​كومنز