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

[مراجعة غير مفحوصة][نسخة منشورة]
تم حذف المحتوى تمت إضافة المحتوى
تنقيح اللغة
وسوم: تمت إضافة وسم nowiki تعديلات طويلة تحرير مرئي
تنسيق وتنقيح لغوي
وسمان: تعديلات طويلة تحرير مرئي
سطر 153:
 
=== دعم البرمجة المهيكلة ===
قامت بعض المُجمعات بإدماج عناصر [[برمجة مهيكلة|البرمجة المهيكلة]] من أجل تكويد 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 أعجبت العديد من المبرمجين الذين عملوا بها وكتبوا بها برامج بالفعل.
 
وقد ظهرت الحاجة والطلب إلى مترجمات أكثر تعقيدا بعد أن انحدر تطوير البرمجيات باستخدام لغات التجميع على نطاق واسع. وعلى الرغم من ذلك، فإن تلك المُجمعات لا تزال تستخدم في بعض الحالات، والتي تحوي قيودا مفروضة على الموارد -وقت، نفقات..الخ- أو أن الخصوصيات Peculiarities المتعلقة بهندسة النظام -الخاص بالتطبيق الجاري تطويره- تمنع الاستخدام الكفؤ للغات البرمجة عالية المستوى.
سطر 247:
* عند الحاجة لبرنامج تنفيذي ثنائي Binary قائم بذاته Stand-Alone، بمعنى: برنامج يجب أن يتم تنفيذه بدون اللجوء إلى مكونات Components أو [[مكتبة برمجية|مكتبات]] مرتبطة بلغة برمجة عالية المستوى أثناء [[وقت التنفيذ]]؛ وربما يكون هذا الوضع هو الأكثر شيوعا.وهذه أنواع مدمجة Embedded من البرامج، والتي تقوم بتخزين جزء صغير فقط من الذاكرة ويقوم الجهاز Device بتنفيذ مهام ذات غرض واحد Single Purpose. من تلك الأمثلة، تجد: الهواتف، أنظمة الوقود/إشعال الوقود في السيارات، أنظمة التحكم في تكييف الهواء، أنظمة الأمن وأجهزة الاستشعار.
* التفاعل المباشر مع العتاد، وعلى سبيل المثال في مشغلات الأجهزة Drivers ومعالجات الاعتراضات Interrupt Handlers.
* استخدام تعليمات خاصة بالمعالج Processor-Specific، غير متوفرة للمترجم Compiler.ومن الأمثلة الشائعة على ذلك، تعليمة الدوران في اتجاه البت Bitwise Rotation، والتي تستخدم في العديد من خوارزميات التشفير Algorithms.
* عند الحاجة لتحسين شديد Extreme Optimization، ومثال على ذلك: في دوارة داخلية Inner Loop في خوارزمية تستهلك المعالج بشكل كثيف. ويستفيد مبرمجو الألعاب من الإمكانيات الخاصة بخصائص [[عتاد الحاسوب|العتاد]] في تلك الأنظمة، مما يمكن ألعابهم لتعمل بشكل أسرع.
* في حالة وجود نظام ذو قيود شديدة على الموارد Resource Constraints (مثال: [[نظام مضمن|الأنظمة المضمنة]])، لذلك وجب استخدام كود مكتوب يدويا لتحقيق الاستفادة القصوى من الموارد المحدودة، ولكن ذلك يصبح أقل شيوعا مع انخفاض أسعار المعالجات وتحسن مستوى الأداء/السرعة.
* في حالة عدم وجود لغة عالية المستوى -على سبيل المثال: على معالج Processor خاص أو جديد-.
* في كتابة برمجيات من نوع "الزمن الحقيقي" Real-Time والتي تحتاج توقيتا دقيقا واستجابات دقيقة Responses، مثل برامج [[محاكاة بالحاسوب|المحاكاة]]، نظم الملاحة الجوية والمعدات الطبية. وعلى سبيل المثال، في نظام التحكم في الطيران من نوع Fly-by-Wire، يجب ترجمة القياس عن بعد Telemetry واتخاذ إجراءات على أساس هذا القياس في ظل قيود زمنية صارمة -في أجزاء ضئيلة جدا من الوحدات الزمنية-. ويجب على تلك الأنظمة أن تتخلص من أي تأخيرات لا يمكن التنبؤ بها والتي قد تنشأ عبر لغات البرمجة المترجمة Interpreted، أو عبر الجمع الآلي للقمامة Garbage Collection، عمليات الـ Paging، أو تعدد المهام بشكل وقائي Preemptive Multitasking. وعلى الرغم من ذلك، فإن بعض لغات البرمجة عالية المستوى تقوم بإدماج مكونات من نوع Run-Time وإدماج واجهات لنظم التشغيل OS Interfaces والتي يمكنها أن تسبب مثل هذا التأخير. وهنا يعتبر اختيار لغة التجميع أو أي لغة منخفضة المستوى Lower-Level اختيارا جيدا مما يعطي المبرمج وضوح Visibility أكبر وسيطرة أفضل على تفاصيل المعالجة Processing.
* في حالة الحاجة إلى تحكم كامل في البيئة المحيطة Environment، في المواقف التي تتطلب اجراءات أمنية مشددة حيث لا يمكن أخذ أمر على أنه مفروغا منه Taken for Granted.
سطر 267:
وتقوم معظم [[محول برمجي|المترجمات]] بمعالجة لغات عالية المستوى إلى لغة تجميع أولا قبل الترجمة النهائية، وبذلك تتيح لكود التجميع التعرض لعمليات [[تصحيح برمجي|التصحيح]] والتحسين Optimization. وتوفر لغات البرمجة منخفضة المستوى نسبيا، مثل لغة السي C، بناء لغويا خاصا [[نحو (برمجة)|(تركيب نحوي)]] لدمج الكود المكتوب بلغة التجميع مباشرة في كود المصدر الخاص بها. ويمكن للبرامج التي تستخدم مثل هذه التسيهلات، كـ [[نواة لينكس]] على سبيل المثال، أن تبني تجريديات Abstractions عبر استخدام عدة لغات تجميع على كل منصة عتادة مختلفة Hardware Platform.ويمكن للكود النقال Portable الخاص بالنظام أن يستخدم المكونات الخاصة بكل معالج -للعمل مع مختلف المنصات- خلال [[واجهة (حوسبة)|واجهة]] موحدة.
 
وتعد لغة التجميع شيئا ذي قيمة كبيرة مع "الهندسة العكسية"، لأن العديد من البرامج يتم تداولها في صيغة كود آلة [[لغة الآلة|Machine Code]]، وغالبا ما يكونتكون "كودترجمة لغة الآلة" سهلاسهلة في الترجمة إلى لغة التجميع ويختبر بعناية في هذا الشكل، أما تحويله إلى لغة عالية المستوى لهو أمر صعب للغاية. وتستخدم أدوات مثل "المفكك التفاعلي" Interactive Disassembler نفس التقنية على شكل واسع من أجل نفس الأهداف.
 
هناك أيضا [[دموسين|الدموسين]] والذي يجعل من استخدام لغة التجميع حقلا فريدا له. فهناك العديد من المسابقات الخاصة التي تقيد المتسابقين بتقييد إبداعاتهم -من البرامج- إلى حجم صغير جدا (أمثلة: 256 بايت, 1 كيلو بايت, 4 كيلو بايت أو 64 كيلو بايت)، وبالطبع فإن لغة التجميع هي أمثل حل لتحقيق هذا الهدف. وعندما يكون الحفاظ على الموارد Resources،الموارد، وخاصة [[وحدة معالجة مركزية|وحدة المعالجة المركزية]] للأنظمة التي تفرض قيودا على المعالجة Processing،المعالجة، مثل النماذج السابقة لأجهزة [[أميغا]] وأجهزة [[كومودور 64|Commodore 64]], هنا تصبح البرمجة بلغة التجميع أمرا لا بد منه: حيث يتم كتابة كود التجميع "يدويا" ويتم إعداد تسلسل التعليمات عبر المبرمجين في محاولة لخفض عدد دورات [[وحدة معالجة مركزية|وحدة المعالجة المركزية]] المستخدمة؛ لأن القيود المفروضة على [[وحدة معالجة مركزية|وحدة المعالجة المركزية]] غاية في الصرامة، لدرجة أن كل دورة [[وحدة معالجة مركزية|لوحدة المعالجة المركزية]] يحب وضعها في الحسبان. ومع ذلك، فإن الفضل يرجع لاستخدام مثل تلك التطبيقات والتي أتاحت نظما مثل Commodore 64 أن ينتج رسوميات ثلاثية الأبعاد 3D Graphics تعمل في نمط "الزمن الحقيقي" Real-Time، مع تأثيرات متقدمة Effects، وهو الإنجاز الذي قد يعتبر تحقيقه بعيد الاحتمال على أجهزة حديثة ومتطورة مع معالج 0.99 ميجا هيرتز.{{بحاجة لمصدر|تاريخ=سبتمبر 2009}}
 
== المصطلحات ذات الصلة ==
سطر 279:
 
* عند عمل المُجمع، فإن الخطوة الحسابية التي يقوم بها، والتي تتضمن كل عمليات معالجة الماكرو، تسمى بـ "وقت التجميع" Assembly Time.
* يرجع المسمى "تجميع" Assembly إلى السنوات الأولى لظهور الكمبيوتر (راجع. الكود القصير short code، الكود السريع speed code).
* المُجمع العابر Cross Assembler (انظر المترجم العابر Cross Compiler) تشبه وظيفته وظيفة المُجمع. لكن تم إطلاق هذا المصطلح عليه، للإشارة أن المُجمع يعمل على جهاز كمبيوتر مختلف، عن ذلك الذي سيتم تنفيذ الكود الناتج عليه: الكمبيوترالنظام المستهدف Target System.ولأنه، في الوقت الحاضر، يتم كتابة المُجمعات بشكل "متنقل" Portable وبلغات عالية المستوى مثل لغة السي C، فإن المُجمعات الحالية لا تمت لذلك الموضوع بصلة. فأهمية المُجمع العابر تظهر بشكل جلي إذا احتاج النظام المستهدف Target System إلى إمكانية تشغيل "المُجمع" بنفسه. وهذا هو الحال عادة مع [[نظام مضمن|الأنظمة المضمنة الصغيرة]]. وكذلك، فإن أهم ملمح مميز للـ "مجمع العابر" هو أنه يوفر [[واجهة (حوسبة)|واجهات]] تسهل من نقل الكود إلى المعالج المستهدف Target Processor، بمعنى: أن يكون على [[ذاكرة وميضية]] أو [[ذاكرة القراءة فقط القابلة للبرمجة والمسح]]. ويقوم بتوليد صورة ثنائية Binary Image أو ملف من نوع Intel Hex بدلا من أن يقوم بتوليد ملف مستهدف Object File.
* الـ "توجيه المُجمع" Assembler Directive، هو أمر Command يتم توجيهه إلى المُجمع. وقد تؤدي هذه الموجهات أي شيء، مثل إخبار المُجمع بأن يدمج مع البرنامج ملفات كود أخرى Source Files، أو يخبر البرنامج بتخصيص أماكن معينة في الذاكرة لتحمل بيانات ثابتة Constants.
 
== قائمة بالمُجمعات الخاصة بمعمارية الحاسبات المختلفة ==