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

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

لغة الآلة

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

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

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

لغة التجميع

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

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

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

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

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

لغة البرمجة C

The C programming language, a third-generation programming language,[1][2] is sometimes classified as high or low depending on what one means by high versus low level.[13] The syntax of C is inherently higher level than that of an assembly language since an assembly language is syntactically platform-dependent whereas the C syntax is platform-independent. C does support low-level programming directly accessing computer hardware but other languages, sometimes considered higher-level than C, can also access hardware directly. With C, developers might need to handle relatively low-level aspects that other languages abstract (provide higher-level support for), such as memory management and pointer arithmetic. But C can encode abstractions that hide details such as hardware access, memory management and pointer arithmetic such that at least part of a C codebase might be as conceptually high-level as if constructed in any other language. Whether C is classified as high or low level language is contended, but it is higher level than assembly languages (especially syntactically) and is lower level than many other languages in some aspects.

Although C is not architecture independent, it can be used to write code that is cross-platform even though doing so can be technically challenging. An aspect of C that facilitates cross-platform development is the C standard library that provides “an interface to system-dependent objects that is itself relatively system independent”.[14]

Comparison

The following is x86-64 machine code for an algorithm to calculate the nth Fibonacci number, with values in hexadecimal representation and each line corresponding to one instruction:

89 f8 85 ff 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 d6 ff c9 89 c2 eb f0 b8 01 00 00 c3 

فيما يلي نفس الخوارزمية مكتوبة بلغة التجميع 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.