الجمعة، 4 يناير، 2013

لماذا وكيف نستخدم لغة التجميع assembly language



الاستخدام الحالي
دائما ما كان هناك جدلا حول فائدة وأداء لغة التجميع بالمقارنة بلغات البرمجة عالية المستوى.ومعروف أن لغة التجميع لها اطار محدد 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) لمعرفة كيف يمكن توليد كود تنفيذي كفؤ من اللغات عالية المستوى

ليست هناك تعليقات:

إرسال تعليق