hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
لغة التجميع تركيب لغة التجميع
تستخدم لغة التجميع أسلوب ذاكري (مُعتمد على الذاكرة بشكل كبير) لتمثيل كل من التعليمات أو كود التشغيل المنخفض المستوى للآلة، وأيضًا كل سجل معماري وحقل البت [Bit field][الإنجليزية] وما إلى ذلك، تتطلب العديد من العمليات معاملًا واحدًا أو أكثر من أجل تكوين تعليمات كاملة، تسمح معظم المُجمعات بالثوابت والسجلات والتسميات (Labels)[الإنجليزية] المُسماة لمواقع البرامج والذاكرة، ويمكنها حساب التعبيرات (Expressions)[الإنجليزية] للمعاملات. وبالتالي، يُحَرَّر المبرمجين من الحسابات المتكررة المملة وتكون برامج المجمّع أكثر قابلية للقراءة من لغة الآلة، اعتمادًا على المعمارية، يمكن أيضًا دمج هذه العناصر للحصول على تعليمات محددة أو أوضاع التوجيه باستخدام إزاحات أو بيانات أخرى بالإضافة إلى العناوين الثابتة، تقدم العديد من المُجمعات آليات إضافية لتسهيل تطوير البرنامج، والتحكم في عملية التجميع، والمساعدة في تصحيح الأخطاء.
لغة التجميع المصطلح
عادة ما يقوم أي مُجمع حديث بتكوين كود غرضي/نهائي (Object Code) عبر ترجمة تعليمات لغة التجميع إلى شفرة تشغيل Opcode) Operation Code)، وعبر تحليل الأسماء الرمزية لمواقع تخزين البيانات بالذاكرة (Memory Locations) وغيرها من الكيانات، ويعتبر استخدام الإشارات الرمزية (Symbolic References) سمة أساسية من سمات المُجمعات، حيث يتم حفظ حسابات طويلة ومملة، وتحديث عناوين الذاكرة بعد تعديلات البرنامج. وتحتوي معظم المُجمعات على تسهيلات من نوع ماكرو تستبدل النصوص (Textual Substitution). على سبيل المثال، لتوليد متواليات قصيرة من التعليمات تعمل ضمنيا بدلا من أن تعمل في دالة.
لغة التجميع المصطلح
وبصفة عامة، فإن كتابة المُجمعات -لأن المُجمع أساسا عبارة عن برنامج يُكْتَب- أسهل من كتابة مترجمات اللغات عالية المستوى، وقد ظهرت المُجمعات منذ خمسينات القرن الماضي. وتقوم المُجمعات، خصوصًا تلك المعتمدة على معمارية/هندسة حاسوبية من نوع RISC، مثل نماذج مبس (MIPS) وسبارك (SPARK) من شركة صن مايكروسيستمز وPA-RISC من شركة هيوليت باكارد ومعالجات (x86-64) بالوصول لجدولة التعليمات للدرجة المثلى، من أجل استغلال وحدة المعالجة المركزية أكفأ استغلال.
وهناك نوعين من المُجمعات، وقُسِّم النوعين على أساس عدد مرات المرور خلال الكود المطلوب لإنتاج الكود النهائي، أو البرنامج القابل للتنفيذ بمعنى آخر.
يعرف النوع الثاني بالمُجمع متعدد المرور، وهو المُجمع الذي يمر مرتين -أو أكثر من مرة- على الكود، ويقوم أثناء المرور الأول بتكوين جدول يضع فيه كل الرموز التي لم يتعرف عليها (Unresolved)، ويستخدم تلك الرموز في المرور الثاني كي يقوم بحل تلك العناوين.
لغة التجميع المصطلح
أما ميزة المُجمع ذو النوع الأول «مرور واحد» فهي السرعة والتي لم تعد مهمة كما كانت يوما ما، بعد أن تطورت سرعات وإمكانيات أجهزة الكمبيوتر. أما ميزة النوع الثاني من المُجمعات التي تقوم بمرورين فيما فوق فهي أن رموز البرنامج يمكن أن تعرف في أي مكان بالشيفرة المصدرية للبرنامج. وكنتيجة لذلك، فيمكن تعريف البرنامج بطريقة أكثر منطقية وذات مغزى. على سبيل المثال، يستطيع المبرمج قراءة برامج زملائه بسهولة أكثر. مما يجعل برامج المُجمع متعدد المرور أسهل في القراءة والصيانة -القيام بتعديلات عليها مثلا-.
أما المُجمعات عالية المستوى وذات الإمكانيات الأكثر تعقيدا، فتوفر تجريدًا أكثر للغة، يمكن توضيحه فيما يلي:
لاحظ أنه في حالة الاستخدام المهني العادي، يُسْتَخْدَم اللفظ مُجمع بشكل غامض، فكثيراً ما يُسْتَخْدَم للإشارة للغة التجميع نفسها، بدلا من الإشارة لـ «أداة التجميع». وبالتالي، فإن عبارة «إن نموذج CP/CMS تم كتابته بلغة التجميع Assembler ذو الاسم S/360» تختلف عن العبارة «إن نموذج ASM-H لهو مجمع تم استخدامه على نطاق واسع مع S/370».
لغة التجميع المصطلح
ويتكون البرنامج المكتوب بلغة التجميع من سلسلة من التعليمات -سهلة الحفظ (Mnemonics) والتي تماثل دفعة من التعليمات التنفيذية (Executable)، وعندما يتم ترجمة هذا الكود عبر المُجمع، يمكن تحميل هذا الكود إلى الذاكرة وتنفيذه.
على سبيل المثال، فإن التعليمة التالية الخاصة بمعالج من نوع x86/IA-32 تخبره بنقل قيمة مكونة من ثمانية بايت إلى المسجل. هذه التعليمة مكتوبة بكود ثنائي يمثل لغة الآلة. الكود الثنائي لهذه التعلية هو 10110 متبوعًا بمعرّف 3 بت للمسجل المراد إستخدامه. المعرف الخاص بالمسجل AL هو 000، لذلك يقوم الكود التالي بتحميل سجل AL بالبيانات 01100001.
يمكن جعل كود الكمبيوتر الثنائي السابق أكثر قابلية للقراءة من خلال التعبير عنه بالنظام الست عشري على النحو التالي.
ومع قرائتك للسطر التالي تشعر بأن تمثيل الكود عبر لغة التجميع أسهل للقراءة وللتذكر (مثال باستخدام تراكيب شركة إنتل)، انظر استذكار
لغة التجميع المصطلح
انقل القيمة 61h (والتي تعني بالنظام العشري القيمة "97"؛ حيث تعني اللاحقة "h" النظام الست-عشري؛ وتعني علامة الهاش "#" أن يتم نقل القيمة 97 ولا تعني أن يتم نقل القيمة المخزنة في عنوان الذاكرة رقم 97) إلى سجل المعالج ذو الاسم "AL".
الأمر "mov" يكتب بكود التشغيل بالشكل 1011، ويقوم بنقل القيمة المذكورة بمعامل Operand الأمر الثاني، إلى السجل المذكور عبر المعامل الأول. وقد اختار «مصمم مجموعة التعليمات» تلك الحروف الثلاثة mov لتمثيل الأمر، مما يجعل الأمر سهلا على المبرمج لتذكر واستخدام الأمر. ويتم الفصل بين مجموعة معامل (برمجة حاسوب)[الإنجليزية] والمعطيات التي تتبع شفرة التشغيل عبر فاصلة "،"؛ إن ما سبق هو نموذج جيد لجملة من جمل لغة التجميع.
لغة التجميع المصطلح
وأثناء الممارسة يقوم العديد من المبرمجين بإسقاط الكلمة Mnemonic (أمر سهل التذكر) وإطلاق وصف «كود تشغيلي» Opcode على اللفظة "mov"، وذلك خطأ تقني بكل تأكيد. فعندما يفعلون ذلك، فهم يشيرون إلى الكود الثنائي والذي تمثله لغة التجميع. ولتوضيح الأمر بشكل آخر، إن الأمر سهل التذكر مثل الأمر mov ليس كودا تشغيليا Opcode، لكنه يمثل أو يرمز إلى الكود التشغيلي، لذلك فعندما يشير أحدهم إلى «الكود التشغيلي للأمر mov» فهو يقصد إلى الإشارة للكود التشغيلي الثنائي ولا يشير إلى الأمر المكتوب بلغة التجميع. وحاليا، يوجد عدد محدود من المبرمجين الذين يحتاجون للتعامل مع النماذج الثنائية التي تمثل كود التشغيل الخاص بتعليمات معينة، فهذا التمييز لم يعد يحتاجه أحد بين المبرمجين -لم تعد عملية البرمجة التي تطورت إمكانياتها تحتاجه-، لكنه مطلوبا جدا في أوساط مصممي المعالجات Processor Designers.
يمكن أن يكون بناء جملة MOV أكثر تعقيدًا كما تظهر الأمثلة التالية
لغة التجميع المصطلح
وتُحَوَّل لغة التجميع إلى لغة الآلة عبر المُجمع، وتتم العملية العكسية عبر برنامج يدعى المفكك. وبخلاف اللغات عالية المستوى، فدائما ما يكون هناك توافق أو تناظر بين التعليمات البسيطة المكتوبة بلغة التجميع وبين التعليمات المكتوبة بلغة الآلة. إلا أنه، وفي بعض الحالات، يمكن للمجمع أن يخرج تعلميات من نوع Pseudoinstructions، والتي يتم تمثيلها عبر عدة تعليمات بلغة الآلة، من أجل القيام بوظائف يشيع الاحتياج لها. على سبيل المثال، بفرض أن هناك آلة ينقصها الأمر Branch-if-greater-or-equal «انتقل لمكان آخر إذا ساوت القيمة x أو زادت عن x» في مجموعة أوامر المُجمع الخاص بها، يمكن لحل هذه المشكلة، أن يقوم المُجمع بتوفير تعليمات Pseudoinstructions تجمع بين الأمرين "Set if less than" و"branch if zero" -الأمر الأخير يعمل مع ناتج الأوامر التي تسبقه-. وتوفر معظم المُجمعات ذات «المميزات الكاملة» Full-Featured، لغة ماكرو ثرية (والتي يتم مناقشتها أدناه) يتم استخدامها من قبل الشركات Vendors والمبرمجين لإنتاج كود وتسلسل بيانات أكثر تعقيدا.
غني عن الذكر، أن كل بناء حاسوبي وكل معالج له لغة الآلة الخاصة به. وعلى هذا المستوى، تكون كل تعليمة ممثلة بشكل بسيط بحيث يتم تنفيذها من خلال عدد صغير نسبيا من الدوائر الإلكترونية Electronic Circuits. وتختلف أجهزة الكمبيوتر باختلاف نوع وعدد العمليات التي تدعمها. على سبيل المثال، فإن آلة جديده من نوع 64 بت تتكون من نوع مختلف من الدوائر التي تمتلكها آلة من نوع 32 بت. وقد يختلفان أيضا في أحجام وأعداد المسجلات في كل منهما، وقد يختلفان أيضا في تمثيل البيانات داخل مخازن البيانات -المخازن مثل: الذاكرة والمسجلات-. وفي حين أن معظم أجهزة الكمبيوتر التي تستخدم في الأغراض العامة قادرة على تنفيذ نفس الوظائف، فإن طريقة أداء كل جهاز تختلف عن بقية الأجهزة؛ وتعكس لغات التجميع الخاصة بكل منهم هذا الاختلاف.
وقد تحتوي مجموعة واحدة من أوامر لغة التجميع "Instruction Set" مجموعات متعددة من التراكيب اللغوية التي تستخدم في كتابة الأوامر Mnemonics. وفي مثل هذه الحالات، فإن المجموعة الأكثر استخداما هي تلك التي توفرها الشركة المصنعة -للنظام الحاسوبي- وتستخدمها في وثائق منتجها Documentation.
لغة التجميع تصميم اللغة
تتكون أي لغة تجميع من 3 أنواع من جمل التعليمات والتي تستخدم في تعريف عمليات البرنامج:
عادة ما تكون التعليمات (الجمل) في لغة التجميع بسيطة للغاية، بعكس تلك الموجودة في لغات البرمجة عالية المستوى. بصفة عامة، فإن "كود التشغيل" هو اسم رمزي لتعليمة تنفيذية واحدة مكتوبة بلغة الآلة، ويوجد على الأقل أمر واحد من الكود التنفيذي محدد لكل تعليمة مكتوبة بلغة الآلة. وكل تعليمة تتكون عادة من "عملي أحد Byte، مكودة داخل التعليمة نفسها)، ويمكن أن تكون "غير مباشرة" وتشير إلى عنوان الذاكرة الذي يتم تخزين البيانات فيه. ويتحدد ذلك عبر البنية الأساسية للمعالج Architecture: فالمُجمع يعبر عن كيفية عمل هذه البنية فحسب.
هناك تعليمات تستخدم في تحديد عناصر البيانات Data Elements التي تحمل البيانات وتحمل المتغيرات. وتحدد تلك العناصر: نوعية البيانات، طول البيانات، وموائمة البيانات Alignment.ويمكن لتلك التعليمات أيضا أن تحدد إذا ما كانت تلك البيانات متاحة لبرامج خارجية Outside Programs (برامج يتم تجميعها بشكل منفصل عن البرنامج الذي يحتوي البيانات)، أو أنها متاحة فقط للبرنامج الذي يحمل قسما يحتوي تعريف تلك البيانات.
لغة التجميع تصميم اللغة
«توجيهات لغة التجميع» Assembly Directives هي تعليمات يتم تنفيذها عن طريق المُجمع أثناء وقت التجميع Assembly Time، ولا يتم تنفيذها عبر وحدة المعالجة المركزية في وقت تنفيذ البرنامج.ويمكن لتلك التوجيهات أن تجعل لغة التجميع الخاصة بالبرنامج تعتمد على «معامل» يتم إدخاله عبر المبرمج، بحيث يمكن تجميع البرنامج الواحد بأكثر من طريقة، وربما من أجل تطبيقات مختلفة -لكل نسخة مجمعة مختلفة-.ويمكن أن تستخدم «التوجيهات» Directives أيضا للتلاعب Manipulate بطريقة عرض البرنامج Presentation، مما يجعل البرنامج أسهل في القراءة والصيانة من ناحية المبرمج.
وتدعم بعض المُجمعات أيضا تعليمات من نوع Pseudo-Instructions، والتي تقوم بتوليد تعليمتين أو أكثر من تعليمات الجهاز Machine Instructions.
لغة التجميع تصميم اللغة
وتسمح المُجمعات الرمزية Symbolic للمبرمجين بتحديد أسماء من اختيارهم (علامات أو رموز) لمواقع الذاكرة Memory Locations. وعادة ما يتم إعطاء كل متغير وكل ثابت Constant أسماء، بحيث يمكن الإشارة لتلك العناصر داخل التعليمات بأسمائها، وبالتالي يساعد المبرمج نفسه في توثيق الكود الذي يكتبه Self-Documenting.وفي الكود القابل للتنفيذ، يتم ربط اسم كل «روتين فرعي» Subroutine بـ نقطة دخوله Entry Point، بحيث يتم استدعاء الروتين الفرعي عبر استخدام اسمه. وداخل الروتينات الفرعية، يتم إعطاء علامات Labels لوجهات الأمر GOTO. وتدعم بعض المُجمعات «رموزا محلية» Local Symbols والتي تختلف مفرداتها عن الرموز العادية (مثال: استخدام التركيب "10$" كوجهة للأمر GOTO).
لغة التجميع تصميم اللغة
وتوفر معظم المُجمعات إدارة مرنة للرموز، بحيث تتيح للمبرمجين: إدارة مساحات إسمية مختلفة Namespaces، حساب الإزاحات بشكل آلي داخل هياكل البيانات Data Structures، وتحديد تسميات/علامات Labels تشير إلى قيم حرفية أو إلى ناتج حسابات بسيطة تؤدى عبر المُجمع. وتستخدم التسميات/العلامات Labels أيضا لتهيئة الثوابت Constants والمتغيرات مع عناوين قابلة للإعادة التعيين Relocatable Addresses.
لغة التجميع تصميم اللغة
تدعم العديد من المُجمعات وحدات الماكرو (بالإنجليزية: Macros)، وهي عبارة عن رموز مُعرفة عن طريق المبرمج وتحوي مجموعة من سطور النص المتسلسلة. هذا التسلسل للسطور النصية، قد يحوي سلسلة من التعليمات، أو سلسلة من تعليمات Pseudo-Ops خاصة بالبيانات. وطالما تم تعريف الماكرو عبر استخدام الـ Pseudo-Op المناسب، فإنه من الممكن استخدام اسمه، مثلما يتم استخدام أسماء الأوامر Mnemonic تماما. وعندما يقوم المُجمع بمعالجة جملة من تلك النوعية، فإنه يقوم باستبدال الجملة التي تحوي اسم الماكرو بالسطور النصية المرتبطة بذلك الماكرو. بعد ذلك، يقوم بمعالجة تلك السطور كما لو أنها قد ظهرت في ملف الشيفرة المصدرية (متضمنا، كما يحدث في بعض المُجمعات، محتويات أي ماكرو قد يظهر في السطور المُستبدلة -ماكرو داخل ماكرو-).
لغة التجميع تصميم اللغة
وبما أن وحدات الماكرو يمكن أن تحمل أسماء قصيرة يتم توسعتها إلى سطور طويلة من الكود، فإن وحدات الماكرو يمكن أن تستخدم لتجعل البرامج المكتوبة بلغة التجميع تبدو وكأنها أقصر (بمعنى أن يتطلب بناء التطبيق عددا أقل من سطور الكود، كما هو الحال مع لغات البرمجة عالية المستوى). ويمكن أيضا أن يتم استخدامها لإضافة هياكل Structures عالية المستوى إلى البرامج المكتوبة بلغة التجميع، ويمكن أن تقدم -بشكل اختياري- كود يستخدم لإدارة وإصلاح الأخطاء البرمجية بشكل ضمني، عبر المعاملات وعبر خصائص أخرى.
معظم المُجمعات تمتلك وحدات ماكرو مدمجة Built-in من أجل الاستدعائات عبر النظام System Calls ومن أجل بعض تسلسلات الكود الخاصة.
لغة التجميع تصميم اللغة
وغالبا ما تسمح المُجمعات لوحدات ماكرو بأن تمتلك معاملات. وبعض المُجمعات تمتلك لغة ماكرو معقدة جدا، وتقوم بدمج عناصر هذه اللغة عالية المستوى للقيام بوظائف متعددة: معاملات اختيارية Optional Parameters، متغيرات رمزية، جمل شرطية، معالجة لسلاسل الحرفية Strings، عمل عمليات حسابية، وجميع تلك الأشياء يمكن إعادة استخدامها أثناء تنفيذ وحدات ماكرو بعينها، وتسمح -تلك المُجمعات- لوحدات الماكرو بحفظ السياق Context أو تبادل المعلومات بين بعضها البعض. ولذلك، فإن الماكرو يمكنه توليد عدد ضخم من تعليمات لغة التجميع أو من تعريفات البيانات، استنادا إلى معاملات الماكرو Arguments. ويمكن استخدام ذلك لتوليد هياكل بيانات ذات شكل «سجلي» Record-Style، ويمكن استخدام ذلك أيضا لتولييد دوارات مبسوطة Unrolled Loops، على سبيل المثال، ويمكن أيضا استخدام نفس التقنية في توليد خوارزميات كاملة تستند على معاملات معقدة. ويمكن اعتبار مؤسسة تستخدم هذه النوعية من لغات التجميع والتي تم تمديد قدراتها بشكل مكثف عبر استخدام مجموعة وحدات الماكرو، يمكن اعتبارها وكأنها تستخدم لغة برمجة عالية المستوى، حيث أن مبرمجي الشركة لا يعملون مع عناصر الكمبيوتر المفاهيمية ذات المستوى المنخفض (مثال: لا يعملون مع المسجلات).
لغة التجميع تصميم اللغة
وقد تم استخدام وحدات الماكرو في عهد الحاسبات الكبيرة من أجل تخصيص Customize نظم برمجية واسعة النطاق Large Scale لتلبية طلبات محددة لعملاء معينين، واستخدت أيضا عبر فريق عمل أحد العملاء من أجل تلبية احتياجات موظفيه عبر بناء نسخ محددة من نظم تشغيل مصنع الكمبيوترات Manufacturer-الذي قد اشتراها هذا العميل-. وعلى سبيل المثال، فقد سبق فعل ذلك، مع مبرمجي النظم الذين كانوا يعملون لشركة آي بي إم، وبشكل أكثر تحديدا، كانوا يعملون على نظام مراقبة المحادثات/ النظام الافتراضي CMS/VM، وعلى نظام «معالجة المعاملات بشكل لحظي Real Time»، وعلى نظام «التحكم في بيانات العملاء»، وعلى ACP/TPF، وهو نظام مالي إداري -خاص بخطوط الطيران- بدأ في السبعينات وما زال يقوم بتشغيل نظم عالمية كبرى للتوزيع GDS ونظم بطاقات الائتمان حتى يومنا هذا.
لغة التجميع تصميم اللغة
وكان من الممكن أيضا أن يتم استخدام قدرات الماكرو المعالجة Processing فقط بحيث يقوم المُجمع بتوليد كود مكتوب بلغات مختلفة تماما، وعلى سبيل المثال، يمكن استخدام تلك التقنية في توليد نسخة من البرنامج مكتوبة بلغة كوبول عبر استخدام مجمع مزود ببرنامج ماكرو يحتوي على سطور من كود الكوبول، وأثناء وقت التجميع يمكن لمعاملات Operators أن توجه المُجمع لتوليد الكود بشكل تحكمي Arbitrary.
لغة التجميع تصميم اللغة
ويرجع سبب ذلك، كما تم إدراكه في السبعينات، أن مفهوم «معالجة الماكرو» Macro Processing يختلف عن مفهوم التجميع، حيث يشير المصطلح الأول في لغتنا الحاسوبية الحديثة إلى إمكانيات في برامج معالجة الكلمات، معالجة النصوص، أكثر من إشارته إلى توليد الكود. وحقيقة، فإن مفهوم «معالجة الماكرو» قد ظهر -وما زال يظهر- في لغة البرمجة «سي» C، حيث تدعم «تعليمات ما قبل المعالجة» Preprocessor Instructions من أجل تحديد قيم المتغيرات Set Variables. لاحظ أنه على عكس الأنواع المحددة لمعالجات الماكرو التي تم ذكرها والتي تعمل داخل المُجمعات، فإن المعالج القبيل للغة الـ C لم يكن Turing-Complete (متكامل مع معايير تورنغ) لنقص إمكانية «الدوارات» Loops أو الذهاب إلى تعليمة محددة عبر أمر Go To.
وبالرغم من قوة معالجة الماكرو، فقد تم إهمالها في اللغات عالية المستوى، بينما تظل مهمة وموجودة في المُجمعات Assemblers.
وذلك يرجع إلى الحيرة والارتباك التي وقع فيهما العديد من المبرمجين، حيث شكل لهم «تعويض معاملات» الماكرو مشكلة، ولم يستطيعوا فك الخلط بين معالجة الماكرو أثناء التجميع وأثناء التنفيذ.
لغة التجميع تصميم اللغة
ويتم استبدال معاملات الماكرو Parameter Substitution بشكل صارم عبر الاسم فقط: في وقت معالجة الماكرو، يتم استبدال قيمة المعامل باسم المعامل نصيا.وينتج أشهر صنف من الأخطاء Bugs عبر استخدام المعامل والذي كان يعبر -نفسه- عن Expression وليس عن اسم بسيط، في حين أن كاتب الماكرو يتوقع اسما Name.وفي الماكرو :
foo: macro a

load a*b القصد هنا هو أن يقوم المنادي Caller بتوفير اسم للمتغير، ويتم ضرب المتغير «العالمي» Global أو الثابت "b" في "a".إذا تم استدعاء foo مع المعامل a-c، سيقوم الماكرو بالتوسع بشكل غير متوقع.
ولتجنب هذا الأمر، تعلم مستخدمو «معالجة الماكرو» أن يقوموا بحصر المعاملات داخل تعريفات الماكرو Macro Definitions، ثم يكون على المناديين Callers أن يفعلوا المثل مع معاملاتهم «الحقيقية» Actual Parameters.
وقد قدمت لغات الـ PL/I وC ميزة الماكرو، لكن هذه الميزة كانت خطرة ولم تستخدم بشكل كافي لأنها لم تكن تعالج سوى النصوص. ومن ناحية أخرى، حافظ لغات الذكاء الصناعي Homoiconic مثل Lisp وProlog وForth على إمكانيات ماكروهات لغات التجميعات خاصتها، لأنهم جميعا قادرين على معالجة الكود الخاص بهم مثلهم مثل البيانات.
قامت بعض المُجمعات بإدماج عناصر البرمجة المهيكلة من أجل تكويد Encode تدفق التنفيذ. وأقرب مثال لهذا النهج كانت مجموعة ماكرو المسماة Concept-14, والتي اقترحت لأول مرة عن طريق الدكتور هـ.د.ميلز (مارس 1970), وتم تنفيذها عبر مارفين كيسلر في قسم الأنظمة الفيدرالية بـ آي بي إم، والتي مددت إمكانيات مجمع الماكرو من نوع S/360 بـ IF/ELSE/ENDIF وبلوكات أخرى للتحكم في التدفق Flow Control. وقد كانت تلك طريقة لخفض أو إزالة استخدام عمليات GOTO في كود التجميع، حيث أن عمليات الـ GOTO من العوامل الرئيسية التي تسبب في ما يسمى بـ «كود الإسباجتي» -الكود المتشابك والمتعقد- في لغة التجميع. وقد كانت هذه الطريقة مستخدمة ومقبولة على نطاق واسع في أوائل الثمانينات (والتي شكلت الأيام الأخيرة لاستخدام لغة التجميع على نطاق واسع، لم يعد الأمر كذلك الآن).
وقد تم تقديم تصميم غريب سمى A-Natural، وهو عبارة عن مجمع من نوع Stream-Oriented يعمل مع معالجات 8080/Z80 وصممته شركة Whitesmiths Ltd. (تلك الشركة التي طورت نظام التشغيل الشبيهة بيونيكس والمسمى Idris، والذي وصف بأنه أول مترجم تجاري للغة السي C). وقد صنفت اللغة كمجمع، لأنها كانت تعمل مع عناصر الماكينة «الخام» Machine Elements مثل كود التنفيذ Opcodes، المسجلات، ومراجع الذاكرة References؛ ولكنها أدرجت جملا تعبيرية Expression Syntax للإشارة إلى ترتيب التنفيذ. وقد قامت: الأقواس Parentheses، والرموز الخاصة الأخرى، بجانب الـ Constructs الخاصة بالبرمجة المهيكلة المعتمدة على بلوكات Blocks، قام كل ذلك بالتحكم في تتابع توليد التعليمات Instructions.وقد تم بناء لغة A-Natural لتصبح مترجما خاص بلغة الـ C، أكثر من بنائها لكي يتم استخدامها في البرمجة اليدوية، لكن جملها المنطقية Syntax أعجبت العديد من المبرمجين الذين عملوا بها وكتبوا بها برامج بالفعل.
وقد ظهرت الحاجة والطلب إلى مترجمات أكثر تعقيدا بعد أن انحدر تطوير البرمجيات باستخدام لغات التجميع على نطاق واسع. وعلى الرغم من ذلك، فإن تلك المُجمعات لا تزال تستخدم في بعض الحالات، والتي تحوي قيودا مفروضة على الموارد -وقت، نفقات..الخ- أو أن الخصوصيات Peculiarities المتعلقة بهندسة النظام -الخاص بالتطبيق الجاري تطويره- تمنع الاستخدام الكفؤ للغات البرمجة عالية المستوى.
لغة التجميع التركيب النحوي
يتبع كل أمر من أوامر لغة التجميع التنسيق التالي:
فيما يلي يصف هذا الدليل بعض التعليمات الخاصة بلغة التجميع لحاسوب انتل 32 بت x86
ومثلها مثل معظم لغات البرمجة الأخرى، تسمح لغات التجميع بإضافة تعليقات إلى الشيفرة المصدرية، وتتم تجاهل هذه التعليقات عن طريق «المُجمع» -أي لا تتم ترجمتها للغة الآلة-. تبدأ تعليقات لغة التجميع بالفاصلة المنقوطة "؛". ويعد استخدام التعليقات بشكل جيد مع شيفرة لغة التجميع أكثر أهمية من استخدام التعليقات مع اللغات عالية المستوى، لأنه من الصعب استنباط معنى ومغزى سلسلة تعليمات لغة التجميع عبر قراءة الشيفرة فقط دون تعليقات توضحها.
ويمكن لحسن استخدام تلك التسهيلات Facilities أن يبسط جدا من مشكلات عمليات التكويد والصيانة الخاصة بكود اللغات منخضفة المستوى وإذا دعت الحاجة لتغييره فإن من الصعب جدا قراءة كود لغة التجميع الخام الذي يتم توليده عبر المترجمات أو برامج فك التجميع، حيث يتكون من مجموعة تعليمات متراصة، بدون أي تعليقات، بدون أي رموز لها مغزى، وبدون أي تعريفات للبيانات.
برنامج "Hello World" بلغة التجميع (من موقع tutorialspoint)
لغة التجميع استخدام لغة التجميع
تم تطوير لغة التجميع لأول مرة في الخمسينيات من القرن المنصرم، وقد تم الإشارة لتلك اللغات في هذا الحين على أنها «الجيل الثاني» من لغات البرمجة. وقد محت لغات الجيل الثاني الكثير من مشكلات منح الأخطاء Error-Prone ومشكلات استهلاك الوقت التي اتصفت بها لغات البرمجة من «الجيل الأول» التي تعاملت مع الأجيال الأولى من أجهزة الكمبيوتر. وقد حررت اللغات الجديدة المبرمجين من الكثير من الأمور المملة مثل تذكر الرموز الرقمية وحساب عناوين الذاكرة. وقد استخدمت تلك اللغات يوما ما وبشكل واسع في جميع أنواع البرمجة. وعلى الرغم من ذلك فقد استبدلت تلك اللغات بشكل واسع بلغات البرمجة عالية المستوى، في البحث عن المزيد من التحسين لـ «إنتاجية» العمل البرمجي. واليوم، تستخدم لغة التجميع بشكل رئيسي في: التحكم المباشر في العتاد، الوصول إلى تعليمات المعالج المتخصصة Processor Instructions، أو لمعالجة مسائل حاسمة تتعلق بالسرعة/الأداء Performance. ومن الأنظمة التي تستخدم عادة لغات التجميع، تجد: مشغلات الأجهزة Device Drivers، النظم المضمنة منخفضة المستوى، وأنظمة الوقت الحقيقي Real-Time.
لغة التجميع استخدام لغة التجميع
وتاريخيا، فقد تم كتابة عدد كبير جدا من البرامج بشكل كلي باستخدام لغة التجميع. وقد تم كتابة بعض أنظمة التشغيل بلغة التجميع وبشكل حصري، حتى تم انتشار لغة السي C بشكل واسع في فترة السبعينات وأوائل الثمانينات. وتم كتابة العديد من التطبيقات التجارية باستخدام لغة التجميع كذلك، ومنها كميات كبيرة من برمجيات تم كتابتها بواسطة شركات كبرى لتعمل على الحواسب الكبيرة الخاصة المصنعة عبر شركة آي بي إم. وعلى الرغم أنه -في نهاية الأمر- قامت لغات كوبول وفورتران باستبدال معظم هذا العمل، إلا أن عدد كبير من المنظمات/الشركات حافظت على نظمها وبنيها التحتية المبرمجة عبر لغة التجميع حتى التسعينات، حيث عملت طول هذه الفترة بشكل جيد.
لغة التجميع استخدام لغة التجميع
وقد اعتمدت معظم الحاسبات الدقيقة على كود مكتوب يدويا باستخدام لغة التجميع، بما في ذلك نظم التشغيل والتطبيقات الكبيرة وذلك لعدة أسباب. أولها أن تلك النظم حافظت على قيود شديدة على الموارد، فرضت خصوصية على الذاكرة Memory وعلى عرض بنية التطبيقات Architecture، وخفضت من نسبة الأخطاء Bugs التي تظهر أثناء عمل النظم. وربما كان الأهم من ذلك كله كانت الحاجة لوجود مترجمات للغة عالية المستوى من الدرجة الأولى First-Class، تكون مناسبة لاستخدام الحواسيب الدقيقة. وقد يكون هناك عاملا نفسيا قد لعب دورا أيضا: أن الجيل الأول من مبرمجي الحواسيب الصغيرة ظلوا يحتفظون بموقف الهواة Hobbyists والذي يمكن صياغته في العبارة: «الأسلاك والزرديات» Wires and Pliers -عبارة تشير إلى تمسك أولئك المبرمجين بالأسلوب الصعب للغة التجميع على الرغم من توافر أساليب أسهل مثل اللغات عالية المستوى-.
وفي اطار تجاري أكثر، فإن الأسباب الرئيسية لاستخدام لغة التجميع كانت: حجم Size أقل، مشكلات Overhead أقل، سرعة أعلى واعتمادية Reliability أعلى.
لغة التجميع استخدام لغة التجميع
وكأمثلة نموذجية لبرامج كبرى كتبت بلغة التجميع في ذاك الوقت، تجد نظام التشغيل مايكروسوفت دوس، وبرنامج آي بي إم لمعالجة الجداول لوتس 1-2-3, وكذلك معظم الألعاب الشهيرة لعائلة الأتاري Atari 800 للحواسب المنزلية. وحتى في التسعينات، معظم ألعاب الفيديو من نوع Console تم كتابتها عبر لغة التجميع، بما في ذلك معظم ألعاب شركات Mega Drive/Gensis وشركة Super Nintendo لأنظمة الترفيه. ووفقا لبعض المطلعين داخل صناعة البرمجيات، فإن لغة التجميع كانت أفضل لغة حوسبة يمكن استخدامها من أجل أداء/سرعة عاليين لأجهزة سيغا ساترن -وهي أجهزة Console كانت تشتهر في مجال تطوير وبرمجة الألعاب-. وكذلك لعبة NBA Jam والتي ظهرت عام 1993 كلعبة من نوع Arcade ونالت شعبية كبيرة، تعتبر مثالا آخر. واعتبرت لغة التجميع هي لغة التطوير الأساسية على عدة منصات لوقت طويل، منها: كومودور 64، أتاري إس تي وكذلك حواسب المنزل من نوع إكس سبكتروم. وقد تسببت عدم كفاءة لغة البيسيك -في ذلك الوقت- في استمرار اعتماد تلك الآلات على لغة التجميع، لقد عاب البيسيك سببين: لم يوفر سرعة تنفيذ عالية مع هذه النظم، ولم يقدم تسهيلات كافية من أجل استخدام أفضل لإمكانيات العتاد الخاصة بتلك النظم. بعض الأنظمة، وعلى الأخص أميغا، لديها "بيئة تطوير متكاملة مع إمكانيات عالية لاكتشاف ومعالجة الأخطاء وإمكانيات "ماكرو"، مثل المُجمع المجاني ASM-One، مقارنة بإمكانيات برنامج مايكروسوفت فيجوال ستوديو (على الرغم من أن ASM-One يسبق مايكروسوفت فيجوال ستوديو من حيث وقت الإصدار).
لغة التجميع استخدام لغة التجميع
وقد تم كتابة المُجمع VIC-20 عبر «دون فرينش» ونشرته شركة «فرينش سيلك».وقد تم كتابته في برنامج يبلغ من الحجم 1639 بايت فقط، مما يجعل صاحبه يعتقد أنه أصغر مجمع رمزي تم كتابته في التاريخ. ويدعم المُجمع نظم العنونة الرمزية والتعريفات الخاصة بسلاسل الحروف وسلاسل الرموز ذات النظام الـست عشري. ويسمح المُجمع أيضا بتعيرات العناوين Address Expressions والتي يمكن توحيدها Combined مع عمليات: الجمع، الطرح، الضرب، القسمة، Logical AND, Logical OR والمعاملات الأسية Exponentiation Operators.
لغة التجميع استخدام لغة التجميع
دائما ما كان هناك جدل حول فائدة وأداء لغة التجميع بالمقارنة بلغات البرمجة عالية المستوى. ومعروف أن لغة التجميع لها اطار محدد Niche تظهر فيه أهميتها؛ انظر أدناه. ولكن بصفة عامة، تدعي المترجمات Compilers الحديثة المثلى Optimized أنها تستطيع معالجة كود لغات البرمجة عالية المستوى وتستطيع تنفيذه Run بنفس سرعة تنفيذ الكود المكتوب يدويا بلغة التجميع، على الرغم من بعض الأمثلة العكسية Counter-Examples التي يمكن أن تنشأ. وتشكل زيادة تعقيد المعالجات الحديثة صعوبات متزايدة في كتابة كود فعال محسن يدويا Hand-Optimized.وعلاوة على ذلك، ولاستياء عشاق الكفاءة Efficiency، فإن زيادة أداء/سرعة المعالج تعني أن معظم وحدات المعالجة المركزية CPUs تظل خاملة Idle معظم الوقت، بسبب التأخيرات الناجمة عن اختناقات Bottlenecks يمكن التنبؤ بها Predictable مثل عمليات الإدخال/الإخراج I/O وعمليات الـ Paging.ذلك مما جعل العديد من المبرمجين يتوقفون عن اعتبار سرعة تنفيذ الكود الخام أمرا مهما.
وهناك بعض الحالات التي قد يختار فيها الممارسون استخدام لغة التجميع، مثل الحالات التالية: