سؤال

تكتب دالة، وتنظر إلى التجميع الناتج، وترى أنه يمكن تحسينها.

قد ترغب في الاحتفاظ بالوظيفة التي كتبتها، لسهولة القراءة، ولكنك ترغب في استبدال التجميع الخاص بك بالمترجم.هل هناك أي طريقة لإقامة علاقة بين وظيفة اللغة عالية المستوى لديك والتجميع الجديد؟

هل كانت مفيدة؟

المحلول

إذا كنت تنظر إلى التجميع، فمن العدل أن تفترض أن لديك فهمًا جيدًا لكيفية تجميع التعليمات البرمجية.إذا كانت لديك هذه المعرفة، فمن الممكن في بعض الأحيان إجراء "هندسة عكسية" للتغييرات مرة أخرى إلى اللغة الأصلية ولكن من الأفضل في كثير من الأحيان عدم الإزعاج.

من المحتمل أن تكون التحسينات التي تجريها صغيرة جدًا مقارنة بالوقت والجهد المطلوبين لإجراء هذه التغييرات أولاً.أود أن أقترح عليك ترك هذا النوع من العمل للمترجم والذهاب لتناول كوب من الشاي.إذا كانت التغييرات كبيرة، وكان الأداء بالغ الأهمية، (كما هو الحال في العالم المضمن)، فقد ترغب في مزج التعليمات البرمجية العادية مع المجمع بطريقة ما، ومع ذلك، في معظم أجهزة الكمبيوتر والرقائق، عادةً ما يكون الأداء كافيًا لتجنب هذا الصداع.

اذا أنت حقًا تحتاج إلى المزيد من الأداء، ثم قم بتحسين الكود وليس التجميع.

نصائح أخرى

لا شيء، على ما أعتقد.لقد رفضت عمل المترجم لصالح عملك الخاص.يمكنك أيضًا التخلص من الوظيفة التي كتبتها باللغة المترجمة، لأن كل ما لديك الآن هو المجمع الخاص بك في تلك المنصة.

أنصح بشدة بعدم الانخراط في هذا النوع من التحسين لأنه ما لم تكن متأكدًا، من خلال التوصيف والتحليل، من أنك تُحدث فرقًا حقًا.

يعتمد ذلك على اللغة التي كتبت بها وظيفتك.بعض اللغات مثل لغة C منخفضة المستوى جدًا، حيث تترجم كل استدعاء دالة أو عبارة إلى عبارات تجميع محددة.إذا كنت تستخدم لغة C، فيمكنك استبدال وظيفتك بالتجميع المضمّن لتحسين الأداء.

قد تقوم اللغات الأخرى عالية المستوى بتحويل كل عبارة إلى إجراءات ماكرو أو استدعاءات أخرى أكثر تعقيدًا من جانب التجميع.يمكن تنفيذ بعض التحسينات (مثل التكرار الخلفي، وفتح الحلقة، وما إلى ذلك) بسهولة على الجانب المصدر، ولكن قد يكون من المستحيل تنفيذ تحسينات أخرى (مثل الاستخدام الأكثر كفاءة لملف التسجيل) (مرة أخرى، اعتمادًا على اللغة والمترجم الذي تستخدمه استخدام).

من الصعب القول بوجود أي علاقة بين التجميع المعدل والمصدر الذي أنشأ النسخة غير المعدلة.من المؤكد أنه سيخلط بين أدوات تصحيح الأخطاء:لن تتطابق محتويات التسجيل مع متغيرات المصدر التي كان من المفترض أن تتوافق معها.

هناك عدد من الأماكن في كود معالجة الحزم حيث قمت بفحص التجميع الذي تم إنشاؤه وعدت لتغيير كود المصدر الأصلي لتحسين النتيجة.يمكن أن تؤدي إعادة ترتيب المصدر إلى تقليل عدد الفروع، ويمكن لوسيطات __attribute__ ووسائط المترجم محاذاة نقاط الفروع والوظائف لتقليل أخطاء I$.في الحالات اليائسة، يمكن استخدام تجميع مضمّن صغير، بحيث لا يزال من الممكن تجميع الملف الثنائي من المصدر.

شيء يمكنك تجربته هو فصل وظيفتك الأصلية في ملف خاص بها، وتوفير قاعدة إنشاء لإنشاء المجمّع من هناك.ثم قم بتحديث ملف المجمع بالإصدار المحسن الخاص بك، وقم بتوفير قاعدة إنشاء لإنشاء ملف كائن من ملف المجمع.ثم قم بتغيير قواعد الارتباط الخاصة بك لتضمين ملف الكائن هذا.

إذا قمت فقط بتغيير ملف المجمع، فسيستمر استخدامه.إذا قمت بتغيير ملف اللغة الأصلي ذي المستوى الأعلى، فسيتم إعادة إنشاء ملف المجمّع وإنشاء ملف الكائن من الإصدار الجديد (غير المحسّن).

وهذا يمنحك علاقة بين الاثنين؛ربما تريد إضافة تعليق تحذيري أعلى ملف اللغة ذي المستوى الأعلى للتحذير بشأن السلوك.سيمنحك استخدام أحد أشكال VCS القدرة على استرداد ملف المجمّع المحسّن إذا ارتكبت خطأً هنا.

إذا كنت تكتب تطبيقًا أصليًا مترجمًا في Visual C++، فهناك طريقتان:

  1. استخدم ال __asm { } قم بحظر واكتب المجمّع الخاص بك هناك.
  2. اكتب وظائفك في MASM المجمع، وقم بتجميعه إلى .obj، وربطه كمكتبة ثابتة.في كود C/C++ الخاص بك، قم بتعريف الوظيفة بـ extern "C" تصريح.

لدى مترجمي C/C++ الآخرين أساليب مماثلة.

في هذه الحالة، لديك عمومًا خياران:تحسين التعليمات البرمجية أو إعادة كتابة المترجم.لا أستطيع أن أرى أين سيكون قطع الرابط بين المصدر والمرجع هو الحل الصحيح على الإطلاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top