لغة التجميع: الفرق بين النسختين

[مراجعة غير مفحوصة][مراجعة غير مفحوصة]
تم حذف المحتوى تمت إضافة المحتوى
لا ملخص تعديل
وسوم: تمت إضافة وسم nowiki تعديلات طويلة تحرير مرئي
لا ملخص تعديل
وسمان: تعديلات طويلة تحرير مرئي
سطر 54:
عادة ما يقوم أي مجمع حديث بتكوين كود غرضي/نهائى Object Code عبر ترجمة تعليمات لغة التجميع إلى شفرة تشغيل Opcode) Operation Code)، وعبر تحليل الأسماء الرمزية لمواقع تخزين البيانات بالذاكرة Memory Locations وغيرها من الكيانات. ويعتبر استخدام "الإشارات الرمزية" Symbolic References سمة أساسية من سمات المجمعات، حيث يتم حفظ حسابات طويلة ومملة، وتحديث عناوين الذاكرة بعد تعديلات البرنامج. وتحتوي معظم المجمعات على تسهيلات Facilities من نواع "ماكرو" Macro تقوم بعمليات "استبدال النصوص" Textual Substitution. على سبيل المثال، لتوليد متواليات قصيرة من التعليمات تعمل Inline بدلا من أن تعمل في [[دالة (برمجة)|دالة]].
 
وبصفة عامة، فإن كتابة المجمعات -لأن المجمع أساسا عبارة عن [[برنامج (حاسوب)|برنامج]] يتم كتابته- أسهل من كتابة [[محول برمجي|مترجمات]] اللغات عالية المستوى Compilers،المستوى، وقد ظهرت المجمعات منذ خمسينات القرن الماضي. وتقوم المجمعات، خصوصا تلك المعتمدة على بناء/هندسة حاسوبية Architecture من نوع RISC،[[حاسوب مجموعة تعليمات مخفضة|RISC]]، مثل نماذج: MIPS وSPARK من شركة "صن مايكروسيستمز"، وPA-RISC من شركة "هيوليت باكارد"، وأيضا معالجات x86(-64), بالوصول لجدولة التعليمات للدرجة المثلى، من أجل استغلال خط Pipeline [[وحدة معالجة مركزية|وحدة المعالجة المركزية]] أكفأ استغلال.
 
وهناك نوعين من المُجمعات، وتم تقسيم النوعين على أساس عدد مرات المرور Passes خلال الكود المطلوب لإنتاج الكود النهائي، أو البرنامج القابل للتنفيذ Executable بمعنى آخر.
سطر 60:
* يعرف النوع الأول بالمجمع ذو المرور الواحد، وهو المجمع الذي يمر على الكود مرة واحدة فقط، مفترضا أن تعريف كل رموز الكود (مثل أسماء المتغيرات) سبق أي تعليمات قد تشير لهذه الرموز.
* يعرف النوع الثاني بالمجمع متعدد المرور، وهو المجمع الذي يمر مرتين -أو أكثر من مرة- على الكود، ويقوم أثناء المرور الأول بتكوين جدول يضع فيه كل الرموز التي لم يتعرف عليها Unresolved، ويستخدم تلك الرموز في المرور الثاني كي يقوم بحل تلك العناوين Addresses.
أما ميزة المجمع ذو النوع الأول "مرور واحد" فهي "السرعة" بكل تأكيد والتي لم تعد مهمة كما كانت يوما ما، بعد أن تطورت سرعات وإمكانيات أجهزة الكمبيوتر.أما ميزة النوع الثاني من المجمعات التي تقوم بمرورين فيما فوق فهي أن رموز البرنامج يمكن أن تعرف في أي مكان [[شيفرة مصدرية|بالشيفرة المصدرية]] للبرنامج. وكنتيجة لذلك، فيمكن تعريف البرنامج بطريقة أكثر منطقية وذات مغزى. على سبيل المثال، يستطيع المبرمج قراءة برامج زملاءه بسهولة أكثر . مما يجعل برامج المجمع متعدد المرور أسهل في القراءة والصيانة -القيام بتعديلات عليها مثلا-.
 
أما المجمعات عالية المستوى وذات الإمكانيات الأكثر تعقيدا، فتوفر تجريدا أكثر للغة Abstraction، يمكن توضيحه فيما يلي:
سطر 74:
 
=== لغة التجميع ===
ويتكون البرنامج المكتوب بلغة التجميع من سلسلة من [[مجموعة التعليمات|التعليمات]] -سهلة الحفظ Mnemonics والتي تماثل دفعة من التعليمات التنفيذية Executable، وعندما يتم ترجمة هذا الكود عبر المجمع، يمكن هنا تحميل هذا الكود إلى الذاكرة وتنفيذه.
 
وعلى سبيل المثال، فإن معالجالتعليمة التالية الخاصة بمعالج من نوع x86/IA-32 يمكنهتخبره تنفيذبنقل التعليماتقيمة التاليةمكونة والمكتوبةمن 8 بايت إلى المسجل. هذه التعليمة مكتوبة بكود ثنائي Binary يمثل [[لغة الآلة]]. (انظرالكود لغةالثنائي التجميعلهذه الخاصةالتعلية بمعالجهو x86):10110 متبوعًا بمعرّف 3 بت للمسجل المراد إستخدامه. المعرف الخاص بالمسجل AL هو 000، لذلك يقوم الكود التالي بتحميل سجل AL بالبيانات 01100001.<syntaxhighlight>10110000 01100001
</syntaxhighlight>يمكن جعل كود الكمبيوتر الثنائي السابق أكثر قابلية للقراءة من خلال التعبير عنه [[نظام عد ستة عشري|بالنظام الست عشري]] على النحو التالي.<syntaxhighlight>B0 61
</syntaxhighlight>
سطر 93:
MOV [ESI+EAX], CL ; Move the contents of CL into the byte at address ESI+EAX
MOV DS, DX ; Move the contents of DX into segment register DS</syntaxhighlight>
ويتم تحويل لغة التجميع إلى [[لغة الآلة]] عبر المجمع، وتتم العملية العكسية عبر برنامج يدعى "فك التجميع[[المفكك]]" Disassembler. وبخلاف اللغات عالية المستوى، فدائما ما يكون هناك توافق أو تناظر بين التعليمات البسيطة المكتوبة بلغة التجميع وبين التعليمات المكتوبة بلغة الآلة. إلا أنه، وفي بعض الحالات، يمكن للمجمع أن يخرج تعلميات من نوع Pseudoinstructions، والتي يتم تمثيلها عبر عدة تعليمات بلغة الآلة، من أجل القيام بوظائف يشيع الاحتياج لها. على سبيل المثال، بفرض أن هناك آلة ينقصها الأمر Branch-if-greater-or-equal "انتقل لمكان آخر إذا ساوت القيمة x أو زادت عن x" في مجموعة أوامر المجمع الخاص بها، يمكن لحل هذه المشكلة، أن يقوم المجمع بتوفير تعليمات Pseudoinstructions تجمع بين الأمرين "Set if less than" و"branch if zero" -الأمر الأخير يعمل مع ناتج الأوامر التي تسبقه-. وتوفر معظم المجمعات ذات "المميزات الكاملة" Full-Featured، لغة ماكرو ثرية (والتي يتم مناقشتها أدناه) يتم استخدامها من قبل الشركات Vendors والمبرمجين لإنتاج كود وتسلسل بيانات أكثر تعقيدا.
 
غني عن الذكر، أن كل بناء حاسوبي وكل معالج له لغة الآلة الخاصة به. وعلى هذا المستوى، تكون كل تعليمة Instruction ممثلة بشكل بسيط بحيث يتم تنفيذها من خلال عدد صغير نسبيا من الدوائر الإلكترونية Electronic Circuits. وتختلف أجهزة الكمبيوتر باختلاف نوع وعدد العمليات التي تدعمها. على سبيل المثال، فإن آلة جديده من نوع 64 بت تتكون من نوع مختلف من الدوائر التي تمتلكها آلة من نوع 32 بت. وقد يختلفان أيضا في أحجام وأعداد [[سجل المعالج|المسجلات]] في كل منهما، وقد يختلفان أيضا في تمثيل البيانات داخل مخازن البيانات -المخازن مثل: الذاكرة Memory، المسجلات Registers-. وفي حين أن معظم أجهزة الكمبيوتر التي تستخدم في الأغراض العامة قادرة على تنفيذ نفس الوظائف، فإن طريقة أداء كل جهاز تختلف عن بقية الأجهزة؛ وتعكس لغات التجميع الخاصة بكل منهم هذا الاختلاف.
سطر 123:
وتوفر معظم المجمعات إدارة مرنة للرموز، بحيث تتيح للمبرمجين: إدارة مساحات إسمية مختلفة Namespaces، حساب [[حيد (حاسوب)|الإزاحات]] بشكل آلي داخل هياكل البيانات Data Structures، وتحديد تسميات/علامات Labels تشير إلى قيم حرفية أو إلى ناتج حسابات بسيطة تؤدى عبر المجمع.وتستخدم التسميات/العلامات Labels أيضا لتهيئة الثوابت Constants [[متغير (علم الحاسوب)|والمتغيرات]] مع عناوين قابلة للإعادة التعيين Relocatable Addresses.
 
ومثلها مثل معظم [[لغة برمجة|لغات الكمبيوترالبرمجة]] الأخرى، تسمح لغات التجميع بإضافة "[[تعليق (برمجة)|تعليقات"]] Commentsإلى إلى[[شيفرة كودمصدرية|الشيفرة المصدر،المصدرية]]، وتتم تجاهل هذه التعليقات عن طريق "المجمع" -أي لا تتم ترجمتها للغة الآلة بالطبع-. ويعد استخدام التعليقات بشكل جيد مع كودشيفرة لغة التجميع أكثر أهمية من استخدام التعليقات مع اللغات عالية المستوى، لأنه من الصعب استنباط معنى ومغزى سلسلة تعليمات لغة التجميع عبر قراءة الكودالشيفرة فقط -دون تعليقات توضحه-توضحها.
 
ويمكن لحسن استخدام تلك التسهيلات Facilities أن يبسط جدا من مشكلات عمليات التكويد والصيانة الخاصة بكود اللغات منخضفة المستوى Low-Level. وإذا دعت الحاجة لتغييره فإن من الصعب جدا قراءة كود لغة التجميع الخام Raw - والذيالذي يتم توليده عبر مترجمات[[محول Compilersبرمجي|المترجمات]] أو [[المفكك|برامج فك التجميع Disassembler-]]، حيث يتكون من مجموعة تعليمات متراصة، بدون أي تعليقات، بدون أي رموز لها مغزى، وبدون أي تعريفات للبيانات.
 
=== وحدات الماكرو ===
سطر 154:
ولتجنب هذا الأمر، تعلم مستخدمو "معالجة الماكرو" أن يقوموا بحصر المعاملات داخل تعريفات الماكرو Macro Definitions، ثم يكون على المناديين Callers أن يفعلوا المثل مع معاملاتهم "الحقيقية" Actual Parameters.
 
وقد قدمت لغات الـ PL/I و<nowiki/>[[سي (لغة برمجة)|C]] ميزة الماكرو، لكن تلكهذه التسهيلة Facilityالميزة كانت خطرة ولم تستخدم بشكل كافي لأنها لم تكن تعالج سوى النصوص. ومن ناحية أخرى، حافظ لغات الذكاء الصناعي Homoiconic مثل [[ليسب|Lisp]] و<nowiki/>[[برولوغ|Prolog]] و<nowiki/>[[فورث (لغة برمجة)|Forth]] على إمكانيات ماكروهات Macros لغات التجميعات خاصتها، لأنهم جميعا قادرين على معالجة الكود الخاص بهم مثلهم مثل البيانات.
 
=== دعم البرمجة المهيكلة ===
قامت بعض المجمعات بإدماج عناصر [[برمجة مهيكلة|البرمجة المهيكلة]] من أجل تكويد Encode تدفق التنفيذ Execution Flow. وأقرب مثال لهذا النهج كانت مجموعة ماكرو المسماة 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، المسجلات Registers، ومراجع الذاكرة References؛ ولكنها أدرجت جملا تعبيرية Expression Syntax للإشارة إلى ترتيب التنفيذ. وقد قامت: الأقواس Parentheses، والرموز الخاصة الأخرى، بجانب الـ Constructs الخاصة بالبرمجة المهيكلة المعتمدة على بلوكات Blocks، قام كل ذلك بالتحكم في تتابع توليد التعليمات Instructions.وقد تم بناء لغة A-Natural لتصبح [[محول برمجي|مترجما]] خاص بلغة الـ C، أكثر من بنائها لكي يتم استخدامها في البرمجة اليدوية، لكن جملها المنطقية Syntax أعجبت العديد من المبرمجين الذين عملوا بها وكتبوا بها برامج بالفعل.
سطر 173:
وفي اطار تجاري أكثر، فإن الأسباب الرئيسية لاستخدام لغة التجميع كانت: حجم Size أقل، مشكلات Overhead أقل، سرعة أعلى واعتمادية Reliability أعلى.
 
وكأمثلة نموذجية لبرامج كبرى كتبت بلغة التجميع في ذاك الوقت، تجد نظام التشغيل [[دوس (نظام تشغيل)|مايكروسوفت دوس]]، وبرنامج آي بي إم لمعالجة الجداول [[لوتس 1-2-3]], وكذلك معظم الألعاب الشهيرة لعائلة "[[آتاري|الأتاري]]" Atari 800 للحواسب المنزلية. وحتى في التسعينات، معظم ألعاب الفيديو من نوع Console تم كتابتها عبر لغة التجميع، بما في ذلك معظم ألعاب شركات Mega Drive/Gensis وشركة [[سوبر نينتندو إنترتينمنت سيستم|Super Nintendo]] لأنظمة الترفيه. ووفقا لبعض المطلعين داخل صناعة البرمجيات، فإن لغة التجميع كانت أفضل لغة حوسبة يمكن استخدامها من أجل أداء/سرعة عاليين لأجهزة [[سيغا ساترن|Sega Saturn]] -وهي أجهزة Console كانت تشتهر في مجال تطوير وبرمجة الألعاب-. وكذلك لعبة NBA Jam والتي ظهرت عام 1993 كلعبة من نوع [[ألعاب آركيد|Arcade]] ونالت شعبية كبيرة، تعتبر مثالا آخر. واعتبرت لغة التجميع هي لغة التطوير الأساسية على عدة منصات لوقت طويل، منها: [[كومودور 64|Commodore 64]]، [[أتاري إس تي|Atari ST]] وكذلك حواسب المنزل من نوع [[زد إكس سبكتروم|ZXإكس Spectrumسبكتروم]]. وقد تسببت عدم كفاءة لغة [[بيسيك|البيسيك]] -في ذلك الوقت- في استمرار اعتماد تلك الآلات على لغة التجميع، لقد عاب البيسيك سببين: لم يوفر سرعة تنفيذ عالية مع هذه النظم، لم يقدم تسهيلات كافية من أجل أفضل استخدام لإمكانيات [[عتاد الحاسوب|العتاد]] الخاصة بتلك النظم. بعض الأنظمة، وعلى الأخص [[أميغا|Amiga]]، لديها "[[بيئة تطوير متكاملة" IDE]] مع إمكانيات عالية لاكتشاف و [[تصحيح برمجي|معالجة الأخطاء]] وإمكانيات "ماكرو"، مثل المجمع المجاني ASM-One، مقارنة بإمكانيات برنامج [[مايكروسوفت فيجوال ستوديو]] (على الرغم من أن ASM-One يسبق [[مايكروسوفت فيجوال ستوديو]] من حيث وقت الإصدار).
 
وقد تم كتابة المجمع VIC-20 عبر "دون فرينش" ونشرته شركة "فرينش سيلك".وقد تم كتابته في برنامج يبلغ من الحجم 1639 بايت فقط، مما يجعل صاحبه يعتقد أنه أصغر مجمع رمزي تم كتابته في التاريخ. ويدعم المجمع نظم العنونة الرمزية والتعريفات الخاصة بسلاسل الحروف وسلاسل الرموز ذات النظام الـ<nowiki/>[[نظام عد ستة عشري|ست عشري]]. ويسمح المجمع أيضا بتعيرات العناوين Address Expressions والتي يمكن توحيدها Combined مع عمليات: [[جمع|الجمع]]، [[طرح|الطرح]]، [[ضرب|الضرب]]، [[قسمة (رياضيات)|القسمة]]، Logical AND, Logical OR والمعاملات الأسية Exponentiation&nbsp;Operators.
سطر 188:
* في حالة وجود نظام ذو قيود شديدة على الموارد Resource Constraints (مثال: [[نظام مضمن|الأنظمة المضمنة]])، لذلك وجب استخدام كود مكتوب يدويا لتحقيق الاستفادة القصوى من الموارد المحدودة، ولكن ذلك يصبح أقل شيوعا مع انخفاض أسعار المعالجات وتحسن مستوى الأداء/السرعة.
* في حالة عدم وجود لغة عالية المستوى -على سبيل المثال: على معالج Processor خاص أو جديد-.
* في كتابة برمجيات من نوع "الزمن الحقيقي" Real-Time والتي تحتاج توقيتا دقيقا واستجابات دقيقة Responses، مثل برامج المحاكاة[[محاكاة Simulation،بالحاسوب|المحاكاة]]، نظم الملاحة الجوية والمعدات الطبية. وعلى سبيل المثال، في نظام التحكم في الطيران من نوع Fly-by-Wire، يجب ترجمة القياس عن بعد Telemetry واتخاذ إجراءات على أساس هذا القياس في ظل قيود زمنية صارمة -في أجزاء ضئيلة جدا من الوحدات الزمنية-. ويجب على تلك الأنظمة أن تتخلص من أي تأخيرات لا يمكن التنبؤ بها والتي قد تنشأ عبر لغات البرمجة المترجمة Interpreted، أو عبر الجمع الآلي للقمامة Garbage Collection، عمليات الـ Paging، أو تعدد المهام بشكل وقائي Preemptive Multitasking. وعلى الرغم من ذلك، فإن بعض لغات البرمجة عالية المستوى تقوم بإدماج مكونات من نوع Run-Time وإدماج واجهات لنظم التشغيل OS Interfaces والتي يمكنها أن تسبب مثل هذا التأخير Delay. وهنا يعتبر اختيار لغة التجميع أو أي لغة منخفضة المستوى Lower-Level اختيارا جيدا مما يعطي المبرمج وضوح Visibility أكبر وسيطرة أفضل على تفاصيل المعالجة Processing.
* في حالة الحاجة إلى تحكم كامل في البيئة المحيطة Environment، في المواقف التي تتطلب اجراءات أمنية مشددة حيث لا يمكن أخذ أمر على أنه مفروغا منه Taken for Granted.
* لكتابة [[فيروس الحاسوب|فيروسات الحاسوب]]، برامج من نوع Bootloaders، مشغلات لأجهزة بعينها، أو لأشياء أخرى تعمل بشكل قريب من [[عتاد الحاسوب|العتاد]] أو من [[نظام تشغيل]] مكتوب بلغة منخفضة المستوى.
سطر 213:
 
:
::ملاحظة: إطلاق اسم "مجمع" Assembler على "اللغة" هو بالطبع أمر مربك وغامض، لأن "المجمع" هو البرنامج الذي يقوم بتحويل الكود المكتوب بلغة التجميع إلى كود الآلة Machine Code.وقد يرى البعض هذا الأمر على أنه خطأ، وينقصه الدقة. وعلى الرغم من ذلك، فإن ذلك اللفظ شاع استخدامه بين المتخصصين والكتاب على مدى عقود. وبشكل مشابه، قام مصمموا بعض أجهزة الكمبيوتر بإطلاق اسم "المجمع" Assembler على "برنامج التجميع" الخاص بهم Assembly Program.
 
* عند عمل المجمع، فإن الخطوة الحسابية التي يقوم بها، والتي تتضمن كل عمليات معالجة الماكرو، تسمى بـ "وقت التجميع" Assembly Time.
سطر 328:
 
* [[محول برمجي]]
* [[المفكك|مفكك]]
* [[كمبيوتر الرجل الصغير]]- عبارة عن نموذج لحاسب تعليمي مزود بلغة تجميع ذات قاعدة عشرية Base-10.
* [[المجمع الدقيق]]