العربية  

books use assembly language

If you do not find what you're looking for, you can use more accurate words.

View more

استخدام لغة التجميع (Info)


نظرة تاريخية

تم تطوير لغة التجميع لأول مرة في الخمسينيات من القرن المنصرم، وقد تم الإشارة لتلك اللغات في هذا الحين على أنها "الجيل الثاني" من لغات البرمجة.وقد محت لغات الجيل الثاني الكثير من مشكلات منح-الأخطاء Error-Prone ومشكلات استهلاك الوقت التي اتصفت بها لغات البرمجة من "الجيل الأول" التي تعاملت مع الأجيال الأولى من أجهزة الكمبيوتر، وقد حررت اللغات الجديدة المبرمجين من الكثير من الأمور المملة مثل تذكر الرموز الرقمية وحساب عناوين الذاكرة.وقد استخدمت تلك اللغات يوما ما وبشكل واسع في جميع أنواع البرمجة.وعلى الرغم من ذلك، فإن مع الثمانينات (ومع التسعينات على الحواسب الصغيرة)، فقد استبدلت تلك اللغات بشكل واسع بلغات البرمجة عالية المستوى high-Level Languages، في البحث عن المزيد من التحسين لـ "إنتاجية" العمل البرمجي.واليوم، تستخدم لغة التجميع بشكل رئيسي في: التحكم المباشر في الأجهزة Hardware، الوصول إلى تعليمات المعالج المتخصصة Processor Instructions، أو لمعالجة مسائل حاسمة تتعلق بالسرعة/الأداء Performance.ومن الأنظمة التي تستخدم عادة لغات التجميع، تجد: مشغلات الأجهزة Device Drivers، النظم المطمرة Embedded Systems منخفضة المستوى، وأنظمة الوقت الحقيقي Real-Time.

وتاريخيا، فقد تم كتابة عدد كبير جدا من البرامج بشكل كلي باستخدام لغة التجميع.وقد تم كتابة بعض أنظمة التشغيل Operating Systems بلغة التجميع وبشكل حصري Exclusively، حتى تم انتشار لغة السي C بشكل واسع في فترة السبعينات وأوائل الثمانينات.وقد تم كتابة العديد من التطبيقات التجارية باستخدام لغة التجميع كذلك، ومنها كميات كبيرة من برمجيات تم كتابتها بواسطة شركات كبرى لتعمل على الحواسب الكبيرة Mainframes الخاصة المصنعة عبر شركة IBM.وعلى الرغم أنه -في نهاية الأمر- قامت لغات "كوبول" COBOL و"فورتران" FORTRAN باستبدال معظم هذا العمل، إلا أن عدد كبير من المنظمات/الشركات حافظت على نظمها وبنيها التحتية Infrastructure المبرمجة عبر لغة التجميع حتى التسعينات، حيث عملت طول هذه الفترة بشكل جيد.

وقد اعتمدت معظم الحواسيب الصغيرة Microcomputers على كود مكتوب يدويا باستخدام لغة التجميع، بما في ذلك نظم التشغيل Operating Systems والتطبيقات الكبيرة.وذلك لعدة أسباب: أولها أن تلك النظم حافظت على قيود شديدة على الموارد، فرضت خصوصية على الذاكرة Memory وعلى عرض بنية التطبيقات Architecture، وخفضت من نسبة الأخطاء Bugs التي تظهر أثناء عمل النظم.وربما كان الأهم من ذلك كله كانت الحاجة لوجود مترجمات للغة عالية المستوى من الدرجة الأولى First-Class، تكون مناسبة لاستخدام الحواسيب الصغيرة Microcomputers.وقد يكون هناك عاملا نفسيا قد لعب دورا أيضا: أن الجيل الأول من مبرمجي الحواسيب الصغيرة ظلوا يحتفظون بموقف الهواة Hobbyists والذي يمكن صياغته في العبارة: "الأسلاك والزرديات" Wires and Pliers -عبارة تشير إلى تمسك أولئك المبرمجين بالأسلوب "الصعب" للغة التجميع على الرغم من توافر أساليب "أسهل" مثل اللغات عالية المستوى-.

وفي اطار تجاري أكثر، فإن الأسباب الرئيسية لاستخدام لغة التجميع كانت: حجم Size أقل، مشكلات Overhead أقل، سرعة أعلى واعتمادية Reliability أعلى.

وكأمثلة نموذجية لبرامج كبرى كتبت بلغة التجميع في ذاك الوقت، تجد نظام التشغيل "مايكروسوفت دوس" MS-DOS، وبرنامج IBM لمعالجة الجداول "لوتس" Lotus 1-2-3, وكذلك معظم الألعاب الشهيرة لعائلة "الأتاري" Atari 800 للحواسب المنزلية.وحتى في التسعينات، معظم ألعاب الفيديو من نوع Console تم كتابتها عبر لغة التجميع، بما في ذلك معظم ألعاب شركات Mega Drive/Gensis وشركة Super Nintendo لأنظمة الترفيه.ووفقا لبعض المطلعين داخل صناعة البرمجيات، فإن لغة التجميع كانت أفضل لغة حوسبة يمكن استخدامها من أجل أداء/سرعة عاليين لأجهزة Sega Saturn -وهي أجهزة Console كانت تشتهر في مجال تطوير وبرمجة الألعاب-.وكذلك لعبة NBA Jam والتي ظهرت عام 1993 كلعبة من نوع Arcade ونالت شعبية كبيرة، تعتبر مثالا آخر.واعتبرت لغة التجميع هي لغة التطوير الأساسية على عدة منصات لوقت طويل، منها: Commodore 64، Atari ST وكذلك حواسب المنزل من نوع ZX Spectrum.وقد تسببت عدم كفاءة لغة الـ BASIC -في ذلك الوقت- في استمرار اعتماد تلك الآلات على لغة التجميع، لقد عاب الـ BASIC سببين: لم يوفر سرعة تنفيذ عالية مع هذه النظم، لم يقدم تسهيلات كافية من أجل أفضل استخدام لإمكانيات العتاد Hardware الخاصة بتلك النظم.بعض الأنظمة، وعلى الأخص Amiga، لديها "بيئة تطوير متكاملة" IDE مع إمكانيات عالية لاكتشاف ومعالجة الأخطاء Debugging وإمكانيات "ماكرو"، مثل المجمع المجاني ASM-One، مقارنة بإمكانيات برنامج Microsoft Visual Studio (على الرغم من أن ASM-One يسبق Microsoft Visual Studio من حيث وقت الإصدار).

وقد تم كتابة المجمع VIC-20 عبر "دون فرينش" ونشرته شركة "فرينش سيلك".وقد تم كتابته في برنامج يبلغ من الحجم 1639 بايتس Bytes فقط، مما يجعل صاحبه يعتقد أنه أصغر مجمع رمزي تم كتابته في التاريخ.ويدعم المجمع نظم العنونة الرمزية والتعريفات الخاصة بسلاسل الحروف وسلاسل الرموز ذات النظام الـHexadecimal.ويسمح المجمع أيضا بتعيرات العناوين 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.ذلك مما جعل العديد من المبرمجين يتوقفون عن اعتبار سرعة تنفيذ الكود الخام أمرا مهما.

وهناك بعض الحالات التي قد يختار فيها الممارسون استخدام لغة التجميع، مثل الحالات التالية:

  • عند الحاجة لبرنامج تنفيذي ثنائي Binary قائم بذاته Stand-Alone، بمعنى: برنامج يجب أن يتم تنفيذه بدون اللجوء إلى مكونات Components أو مكتبات Libraries مرتبطة بلغة برمجة عالية المستوى أثناء وقت التنفيذ Run-Time؛ وربما يكون هذا الوضع هو الأكثر شيوعا.وهذه أنواع مدمجة Embedded من البرامج، والتي تقوم بتخزين جزء صغير فقط من الذاكرة ويقوم الجهاز Device بتنفيذ مهام ذات غرض واحد Single Purpose.من تلك الأمثلة، تجد: الهواتف، أنظمة الوقود/إشعال الوقود في السيارات، أنظمة التحكم في تكييف الهواء، أنظمة الأمن وأجهزة الاستشعار.
  • التفاعل المباشر مع الأجهزة Hardware، وعلى سبيل المثال في مشغلات الأجهزة Drivers ومعالجات الاعتراضات Interrupt Handlers.
  • استخدام تعليمات خاصة بالمعالج Processor-Specific، غير متوفرة للمترجم Compiler.ومن الأمثلة الشائعة على ذلك، تعليمة الدوران في اتجاه البت Bitwise Rotation، والتي تستخدم في العديد من خوارزميات التشفير Algorithms.
  • عند الحاجة لتحسين شديد Extreme Optimization، ومثال على ذلك: في دوارة داخلية Inner Loop في خوارزمية تستهلك المعالج بشكل كثيف.ويستفيد مبرمجو الألعاب من الإمكانيات الخاصة بخصائص العتاد Hardware في تلك الأنظمة، مما يمكن ألعابهم لتعمل بشكل أسرع.
  • في حالة وجود نظام ذو قيود شديدة على الموارد Resource Constraints (مثال: الأنظمة المطمرة Embedded Systems)، لذلك وجب استخدام كود مكتوب يدويا لتحقيق الاستفادة القصوى من الموارد المحدودة، ولكن ذلك يصبح أقل شيوعا مع انخفاض أسعار المعالجات وتحسن مستوى الأداء/السرعة.
  • في حالة عدم وجود لغة عالية المستوى -على سبيل المثال: على معالج 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، مشغلات لأجهزة بعينها، أو لأشياء أخرى تعمل بشكل قريب من العتاد Hardware أو من نظام تشغيل مكتوب بلغة منخفضة المستوى.
  • لعمل هندسة عكسية Reverse-Engineering لأكواد ثنائية موجودة، والتي قد تكون أو قد لاتكون كتبت بشكل أصلي عبر لغة برمجة عالية المستوى، وعلى سبيل المثال: في حالة اختراق Cracking حماية النسخة الخاصة ببرنامج محمي وله حقوق ملكية Proprietary Software.
  • عمل هندسة عكسية وتعديل ألعاب الفيديو (معروف أيضا باسم ROM Hacking)، والذي يمكن عمله عبر عدة تقنيات.والطريقة الأكثر استعمالا هي تبديل كود البرنامج على مستوى لغة التجميع.
  • كتابة كود يقوم بتعديل نفسه Selfmodifying، وتبرع لغة التجميع في مثل هذا الأمر.
  • كتابة برامج الألعاب والتطبيقات الأخرى التي تتضن حسابات رسومية Graphing.
  • كتابة برنامج لمترجم Compiler يقوم بتوليد كود تجميعي، وبالطبع سيكون كاتب (كتاب) هذا البرنامج من المتخصصين في البرمجة بلغة التجميع.

ومع ذلك، فإنه يتم تدريس لغة التجميع حتى يومنا هذا في معظم مناهج الهندسة الإلكترونية وعلوم الحاسب.على الرغم من أن هناك قلة قليلة من المبرمجين اليوم يعملون بشكل منتظم مع لغة التجميع بوصفها أداة تطوير، فإن المفاهيم المرتبطة بلغة التجميع لا تزال مهمة جدا.ومن تلك المواضيع الأساسية: الحساب الثنائي Binary Arithmetic، تخصيص الذاكرة Allocation، معالجة المكدس Stack، تكويد مجموعة الأحرف Character Set، معالجة المقاطعات Interrupts، وتصميم المترجمات Compilers، كل تلك الأشياء سيكون من الصعب جدا فهمها دون فهم كيفية عمل الكمبيوتر على مستوى العتاد Hardware.ولأن سلوك الكمبيوتر يمكن تعريفه عبر مجموعة التعليمات Instruction Set الخاصة به، فإن الطريقة المنطقية لتعلم مجموعة المفاهيم المرتبطة بهذا "السلوك" هي دراسة لغة التجميع.وتمتلك معظم الأجهزة الحديثة مجموعة تعليمات مماثلة.ولذلك، فإن دراسة لغة تجميع واحدة تكفي لتعلم الآتي: (1) المفاهيم الرئيسية, (2) للتعرف على المواقف التي يكون فيها من المناسب استخدام لغة التجميع, (3) لمعرفة كيف يمكن توليد كود تنفيذي كفؤ من اللغات عالية المستوى.

التطبيقات العملية

غالبا ما يتم استخدام الكود المكتوب بلغة التجميع في نظام ROM عند تحميل النظام (BIOS على نظم PC المتوافقة مع IBM) - كلمة BIOS اختصارا لـ Basic Input Output System-.ويستخدم هذا الكود المكتوب بلغة منخفضة المستوى، مع أشياء أخرى، في تهيئة واختبار العتاد Hardware قبل تحميل نظام التشغيل OS، ويخزن ذلك الكود في الذاكرة من نوع القراءة فقط ROM -اختصار Read Only Memory-. وحالما تم الوصول لمستوى معين من تهيئة الجهاز، يتم الانتقال إلى تنفيذ كود آخر، وغالبا ما يكون مكتوبا بلغة عالية المستوى؛ لكن الكود الذي يتم تشغيله بعد الضغط على زر تشغيل الكمبيوتر Power Button غالبا ما يكون مكتوب بلغة التجميع.ونطبق نفس الشئ على معظم برامج التحميل Boot Loaders.

وتقوم معظم المترجمات Compilers بمعالجة لغات عالية المستوى إلى لغة تجميع أولا قبل الترجمة النهائية، وبذلك تتيح كود التجميع ليتعرض لعمليات التصحيح Debugging والتحسين Optimization.وتوفر لغات البرمجة منخفضة المستوى نسبيا، مثل لغة السي C، بناء لغويا خاصا Syntax لدمج الكود المكتوب بلغة التجميع مباشرة في كود المصدر الخاص بها.ويمكن للبرامج التي تستخدم مثل هذه التسيهلات، كـ Linux Kernel (نواة لينكس) على سبيل المثال، أن تبني تجريديات Abstractions عبر استخدام عدة لغات تجميع على كل منصة عتادة مختلفة Hardware Platform.ويمكن للكود النقال Portable الخاص بالنظام أن يستخدم المكونات الخاصة بكل معالج -للعمل مع مختلف المنصات- خلال واجهة Interface موحدة.

وتعد لغة التجميع شيئا ذي قيمة كبيرة مع "الهندسة العكسية" Reverse Engineering، لأن العديد من البرامج يتم تداولها في صيغة كود آلة Machine Code، وغالبا ما يكون "كود الآلة" سهلا في الترجمة إلى لغة التجميع ويختبر بعناية في هذا الشكل، أما تحويله إلى لغة عالية المستوى لهو أمر صعب للغاية.وتستخدم أدوات مثل "المفكك التفاعلي" Interactive Disassembler نفس التقنية على شكل واسع من أجل نفس الأهداف.

هناك أيضا الدموسين والذي يجعل من استخدام لغة التجميع حقلا فريدا له.فهناك العديد من المسابقات الخاصة التي تقيد المتسابقين بتقييد إبداعاتهم -من البرامج- إلى حجم صغير جدا (أمثلة: 256 بايت, 1 كيلو بايت, 4 كيلو بايت أو 64 كيلو بايت)، وبالطبع فإن لغة التجميع هي أمثل حل لتحقيق هذا الهدف.وعندما يكون الحفاظ على الموارد Resources، وخاصة وحدة المعالجة المركزية CPU للأنظمة التي تفرض قيودا على المعالجة Processing، مثل النماذج السابقة لأجهزة Amiga وأجهزة Commodore 64, هنا تصبح البرمجة بلغة التجميع أمرا لا بد منه: حيث يتم كتابة كود التجميع "يدويا" ويتم إعداد تسلسل التعليمات عبر المبرمجين في محاولة لخفض عدد دورات الـ CPU المستخدمة؛ لأن القيود المفروضة على الـ CPU غاية في الصرامة، لدرجة أن كل دورة للـ CPU يحب وضعها في الحسبان.ومع ذلك، فإن الفضل يرجع لاستخدام مثل تلك التطبيقات والتي أتاحت نظما مثل Commodore 64 أن ينتج رسوميات ثلاثية الأبعاد 3D Graphics تعمل في نمط "الزمن الحقيقي" Real-Time، مع تأثيرات متقدمة Effects، وهو الإنجاز الذي قد يعتبر تحقيقه بعيد الاحتمال على أجهزة حديثة ومتطورة مع معالج 0.99 ميجا هيرتز.

Source: wikipedia.org
 
(1)
Assembly 2

Assembly 2