لغة برمجة منخفضة المستوى

لغة البرمجة منخفضة المستوى هي لغة برمجة لا توفر سوى القليل من التجريد، أو لا توفر أي تجريد على الإطلاق ، بين بنية مجموعة تعليمات الحاسوب ، أو ذاكرته، أو مكوناته المادية الأساسية؛ فالأوامر أو الدوال في هذه اللغة تشبه في بنيتها تعليمات المعالج. تمنح هذه اللغات المبرمج تحكمًا كاملًا في ذاكرة البرنامج وتعليمات لغة الآلة الأساسية. ونظرًا لانخفاض مستوى التجريد (ومن هنا جاء مصطلح "منخفضة المستوى") بين اللغة ولغة الآلة، تُوصف لغات البرمجة منخفضة المستوى أحيانًا بأنها "قريبة من المكونات المادية".

لغة الآلة

اللوحة الأمامية لجهاز كمبيوتر صغير من نوع PDP-8/e . يمكن استخدام صف المفاتيح الموجود في الأسفل للتبديل بين التعليمات البرمجية في لغة الآلة.

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

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

لغة التجميع

لغة التجميع ، المصنفة كلغة برمجة من الجيل الثاني ، [ 1 ] [ 2 ] توفر مستوىً من التجريد فوق لغة الآلة. البرنامج المكتوب بلغة التجميع غير قابل للنقل ، لأنه مكتوب ومُحسَّن لبنية معينة. [ 3 ] [ 4 ] [ 5 ] [ 6 ]

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

في الأيام الأولى للبرمجة على أجهزة الكمبيوتر مثل TX-0 و PDP-1 ، كان أول ما فعله مخترقو معهد ماساتشوستس للتكنولوجيا هو كتابة برامج التجميع. [ 8 ]

لغات البرمجة الموجهة للآلة

تم تطوير العديد من اللغات التي يشار إليها باسم اللغات الموجهة نحو الآلة ، أو اللغات متوسطة المستوى ، أو اللغات النصفية ، أو اللغات الربعية [ 9 ] مثل:

لغة البرمجة C

لغة البرمجة C ، وهي لغة برمجة من الجيل الثالث ، [ 1 ] [ 2 ] تُصنف أحيانًا كلغة عالية أو منخفضة المستوى، وذلك بحسب تعريفنا للمستوى العالي مقابل المستوى المنخفض. [ 13 ] يتميز تركيب لغة C بأنه أعلى مستوىً من تركيب لغة التجميع، لأن لغة التجميع تعتمد تركيبيًا على المنصة، بينما تركيب لغة C مستقل عن المنصة. تدعم لغة C البرمجة منخفضة المستوى - أي الوصول المباشر إلى مكونات الحاسوب المادية - ولكن لغات أخرى، تُعتبر أحيانًا أعلى مستوىً من C، يمكنها أيضًا الوصول المباشر إلى المكونات المادية. مع لغة C، قد يحتاج المطورون إلى التعامل مع جوانب منخفضة المستوى نسبيًا تُجرّدها لغات أخرى (توفر لها دعمًا عالي المستوى)، مثل إدارة الذاكرة وحساب المؤشرات. لكن لغة C قادرة على تضمين تجريدات تُخفي تفاصيل مثل الوصول إلى المكونات المادية وإدارة الذاكرة وحساب المؤشرات، بحيث يكون جزء من قاعدة بيانات C على الأقل عالي المستوى من الناحية المفاهيمية كما لو تم إنشاؤه بأي لغة أخرى. إن تصنيف لغة C كلغة عالية المستوى أو منخفضة المستوى أمر مثير للجدل، لكنها أعلى مستوى من لغات التجميع (خاصة من الناحية التركيبية) وأقل مستوى من العديد من اللغات الأخرى في بعض الجوانب .

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

مقارنة

فيما يلي رمز الآلة x86-64 لخوارزمية لحساب العدد النوني من متتالية فيبوناتشي ، مع القيم في التمثيل الست عشري وكل سطر يتوافق مع تعليمة واحدة:

89 f8 85 وما بعدها 74 26 83 ff 02 76 1c 89 f9 ba 01 00 00 00 be 01 00 00 00 8d 04 16 83 f9 02 74 0d 89 د6 ff c9 89 ج2 eb f0 b8 01 00 00 ج3 

فيما يلي نفس الخوارزمية مكتوبة بلغة التجميع x86-64 باستخدام صيغة Intel . يتم تسمية سجلات معالج x86-64 ومعالجتها مباشرةً. تقوم الدالة بتحميل وسيطها ذي 64 بت من السجل rdiوفقًا لواجهة System V الثنائية للتطبيقات x86-64، وتُجري حساباتها بمعالجة القيم في السجلات raxو rcxو rsiو rdiحتى تنتهي وتُعيد القيمة. لاحظ أنه في لغة التجميع هذه، لا يوجد مفهوم لإرجاع قيمة. بعد تخزين النتيجة في السجل rax، وفقًا لواجهة System V الثنائية للتطبيقات، retتقوم التعليمة ببساطة بإزالة العنصر العلوي ذي 64 بت من المكدس ، مما يؤدي إلى جلب التعليمة التالية من ذلك الموقع (عادةً ما تكون هذه التعليمة هي التعليمة التي تلي مباشرةً التعليمة التي استدعت هذه الدالة)، مع تخزين نتيجة الدالة في السجل rax. لا تفرض لغة التجميع x86-64 أي معيار لتمرير القيم إلى دالة أو إرجاع القيم منها (وفي الواقع، ليس لديها مفهوم للدالة). يتم تعريفها بواسطة واجهة ثنائية للتطبيق (ABI)، مثل واجهة System V ABI لمجموعة تعليمات معينة.

fib: mov rax , rdi ; يتم تخزين الوسيط في rdi، ضعه في rax test rdi , rdi ; هل الوسيط صفر؟ je.return_from_fib ; نعم - أرجع 0 ، وهو موجود بالفعل في rax cmp rdi , 2 ; لا - قارن الوسيط بـ 2 jbe.return_1_from_fib ; إذا كان أقل من أو يساوي 2، أرجع 1 mov rcx , rdi ; وإلا، ضعه في rcx، لاستخدامه كعداد mov rdx , 1 ; يبدأ الرقم السابق الأول بـ 1، ضعه في rdx mov rsi , 1 ; يبدأ الرقم السابق الثاني أيضًا بـ 1، ضعه في rsi .fib_loop: lea rax , [ rsi + rdx ] ; ضع مجموع العددين السابقين في rax cmp rcx , 2 ; هل العداد يساوي 2؟ je .return_from_fib ; نعم - يحتوي rax على النتيجة mov rsi , rdx ; لا - اجعل العدد السابق الأول هو العدد السابق الثاني dec rcx ; إنقاص العداد mov rdx , rax ; اجعل العدد الحالي هو العدد السابق الأول jmp .fib_loop ; استمر .return_1_from_fib: mov rax , 1 ; اضبط قيمة الإرجاع على 1 .return_from_fib: ret ; إرجاع

فيما يلي نفس الخوارزمية مرة أخرى، ولكن بلغة C. وهي مشابهة في بنيتها لمثال التجميع، ولكن هناك اختلافات كبيرة في التجريد:

  • المدخل (المعامل n) هو تجريد لا يُحدد أي موقع تخزين على الجهاز. عمليًا، يتبع مُترجم لغة C أحد اصطلاحات الاستدعاء العديدة الممكنة لتحديد موقع تخزين المدخل.
  • المتغيرات المحلية f_nminus2هي تجريدات لا تحدد أي موقع تخزين محدد على الجهاز. يحدد مُصرّف لغة C كيفية تخزينها فعليًا وفقًا لبنية الجهاز المستهدف f_nminus1.f_n
  • تحدد دالة الإرجاع القيمة المراد إرجاعها، لكنها لا تُملي كيفية إرجاعها. يُنفذ مُترجم لغة C لأي بنية معمارية مُحددة آلية قياسية لإرجاع القيمة. عادةً (ولكن ليس دائمًا) ما تستخدم مُترجمات بنية x86-64 المُسجل لإرجاع القيمة، كما هو الحال في مثال لغة التجميع ( اختارrax مُؤلف مثال لغة التجميع استخدام واجهة System V الثنائية للتطبيقات الخاصة بـ x86-64، لكن لغة التجميع لا تتطلب ذلك).

هذه التجريدات تجعل كود C قابلاً للترجمة دون تعديل لأي بنية مدعومة بواسطة مترجم C؛ في حين أن كود التجميع أعلاه يعمل فقط على المعالجات التي تستخدم بنية x86-64.

دالة ` fib` ( عدد صحيح غير مُوقّع n ) { إذا لم يكن n صحيحًا ، فأرجع 0 ؛ } وإلا إذا كان n أقل من أو يساوي 2 ، فأرجع 1 ؛ } وإلا { عدد صحيح غير مُوقّع f_nminus2 ، f_nminus1 ، f_n ؛ من أجل ( f_nminus2 = f_nminus1 = 1 ، f_n = 0 ؛ -- n ) { f_n = f_nminus2 + f_nminus1 ؛ إذا كان n أقل من أو يساوي 2 ، فأرجع f_n ؛ } f_nminus2 = f_nminus1 ؛ f_nminus1 = f_n ؛ } } }

البرمجة منخفضة المستوى بلغات عالية المستوى

تستطيع بعض لغات البرمجة عالية المستوى ، مثل PL/S و BLISS و BCPL و ALGOL الموسعة و NEWP ولغة C، الوصول إلى لغات البرمجة منخفضة المستوى. إحدى طرق القيام بذلك هي التجميع المضمن ، حيث يُدمج كود التجميع في كود لغة البرمجة عالية المستوى. كما تسمح بعض هذه اللغات بتوجيهات تحسين المُصرّف المعتمدة على بنية المعالج لتعديل طريقة استخدام المُصرّف لبنية المعالج المستهدف.

توضح كتلة كود C التالية من مُترجم GNU C (GCC) ميزة التجميع المضمنة. [ 15 ]

int src = 1 ; int dst ;asm ( "mov %1, %0 \n\t " "add $1, %0" : "=r" ( dst ) : "r" ( src ));printf ( "%d \n " , dst );

مراجع

  1. 1 2 3 "جيل لغات البرمجة" . GeeksforGeeks . 22-10-2017 . تم الاطلاع عليه بتاريخ 27-04-2024 .
  2. 1 2 3 "ما هي لغات الجيل؟" . www.computerhope.com . تم الاطلاع عليه بتاريخ 27-04-2024 .
  3. 1 2 "3.1: بنية البرامج منخفضة المستوى" . Workforce LibreTexts . 2021-03-05 . تم الاسترجاع في 2023-04-03 .
  4. "ما هي لغة البرمجة منخفضة المستوى؟" . GeeksforGeeks . 19-11-2023 . تم الاطلاع عليه بتاريخ 27-04-2024 .
  5. "لغة برمجة منخفضة المستوى؟ ما تحتاج لمعرفته | لينوفو الولايات المتحدة" . www.lenovo.com . مؤرشف من الأصل بتاريخ 24-07-2024 . تم الاطلاع عليه بتاريخ 27-04-2024 .
  6. "لغات البرمجة منخفضة المستوى - تصنيف لغات البرمجة والمترجمات - AQA - مراجعة علوم الحاسوب لشهادة الثانوية العامة - AQA" . BBC Bitesize . تاريخ الاسترجاع: 27 أبريل 2024 .
  7. "لغة الآلة/لغة التجميع/لغة عالية المستوى" . www.cs.mtsu.edu . مؤرشف من الأصل بتاريخ 14 ديسمبر 2024. تم الاطلاع عليه بتاريخ 27 أبريل 2024 .
  8. ليفي، ستيفن (1994). المخترقون: أبطال ثورة الحاسوب . دار بنغوين للنشر. ص 32. ISBN  0-14-100051-1.
  9. ساميت، جان (أكتوبر 1971). "مسح موجز للغات المستخدمة في تنفيذ الأنظمة" . إشعارات ACM SIGPLAN . 6 (9): 1-19 . doi : 10.1145/942596.807055 .
  10. هاي، ر. إي.؛ روليفسون، ج. ف. MOL940: المواصفات الأولية للغة برمجة موجهة نحو الآلة تشبه لغة ALGOL لجهاز SDS 940 (ملف PDF) (تقرير فني). معهد ستانفورد للأبحاث .
  11. Wichmann, BA (19 يناير 1999). "PL516، لغة تجميع تشبه لغة Algol لجهاز DDP-516" (PDF) .
  12. سابر، جيرد ر. (1971). "لغة البرمجة PS440 كأداة لتنفيذ نظام المشاركة الزمنية". وقائع ندوة SIGPLAN حول لغات تنفيذ الأنظمة . نيويورك، نيويورك، الولايات المتحدة الأمريكية: رابطة آلات الحوسبة. doi : 10.1145/800234.807058 .
  13. جيندال، ج.؛ خورانا، ب.؛ جويل، ت. (يناير 2013). "دراسة مقارنة للغات البرمجة C وObjective-C وC++". المجلة الدولية للاتجاهات المتقدمة في علوم وهندسة الحاسوب . 2 (1): 203.
  14. كيرنيغان، بريتشي، د. (1988). لغة البرمجة سي، الطبعة الثانية . ص 163. 
  15. "Extended Asm (Using the GNU Compiler Collection (GCC))" . gcc.gnu.org . تم الاطلاع عليه بتاريخ 27-04-2024 .

فهرس

  • جيركوف، إيغور (2017). البرمجة منخفضة المستوى: لغة سي، ولغة التجميع، وتنفيذ البرامج على معمارية إنتل 64. كاليفورنيا: أبريس. ISBN 978-1-4842-2402-1.