سؤال

ما هي الاعتبارات التي يجب أن أضعها إذا كنت أريد أن يعمل الكود الخاص بي بشكل صحيح على كلا النظامين الأساسيين 32 بت و64 بت؟

يحرر:ما هي المجالات التي أحتاج إلى الاهتمام بها، على سبيل المثال؟طباعة سلاسل/أحرف أو استخدام الهياكل؟

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

المحلول

خيارات:

قم بترميزها في بعض اللغات باستخدام a آلة افتراضية (مثل جافا)

قم بترميزها في .NET ولا تستهدف أي بنية محددة.ال مترجم .NET JIT سوف نقوم بتجميعه لك إلى البنية الصحيحة قبل تشغيله.

نصائح أخرى

يتمثل أحد الحلول في استهداف بيئة افتراضية تعمل على كلا النظامين الأساسيين (أفكر في Java أو .Net هنا).

أو اختر لغة مترجمة.

هل لديك متطلبات أخرى، مثل استدعاء التعليمات البرمجية أو المكتبات الموجودة؟

نفس الأشياء التي كان يجب عليك القيام بها طوال الوقت للتأكد من كتابة التعليمات البرمجية المحمولة :)

المبادئ التوجيهية موزيلا و ال ج الأسئلة الشائعة هي نقاط انطلاق جيدة

أفترض أنك لا تزال تتحدث عنه تجميع لهم بشكل منفصل لكل منصة على حدة؟نظرًا لأن تشغيلهما على كليهما أمر ممكن تمامًا بمجرد إنشاء ملف ثنائي 32 بت.

أهمها هو التأكد من عدم وضع المؤشرات في مواقع تخزين 32 بت.

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

يعتمد الأمر بصراحة على اللغة، لأن اللغات المُدارة مثل C# وJava أو لغات البرمجة النصية مثل JavaScript أو Python أو PHP مقيدة بمنهجيتها الحالية، وللبدء والقيام بأي شيء يتجاوز الأشياء المتقدمة، لا يوجد الكثير مما يدعو للقلق .

لكن أعتقد أنك تسأل عن لغات مثل C++ وC وغيرها من اللغات ذات المستوى الأدنى.

أكبر شيء يجب أن تقلق بشأنه هو حجم الأشياء، لأنه في عالم 32 بت، يقتصر الأمر على قوة 2^32 ولكن في عالم 64 بت تصبح الأمور أكبر بمقدار 2^64.

مع الإصدار 64 بت، لديك مساحة أكبر للذاكرة والتخزين في ذاكرة الوصول العشوائي (RAM)، ويمكنك حساب أرقام أكبر.ومع ذلك، إذا كنت تعلم أنك تقوم بالترجمة لكل من 32 و64، فأنت بحاجة للتأكد من قصر توقعاتك للنظام على عالم 32 بت وقيود المخازن المؤقتة والأرقام.

في C (وربما C++) تذكر دائمًا استخدام عامل التشغيل sizeof عند حساب أحجام المخزن المؤقت لـ malloc.بهذه الطريقة ستكتب المزيد من التعليمات البرمجية المحمولة على أي حال، وسيأخذ هذا أنواع البيانات 64 بت في الاعتبار تلقائيًا.

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

الشيء الوحيد الذي أعتقد أنه قد يسبب مشاكل هو افتراض حجم أنواع البيانات، وهو أمر ربما لا ينبغي عليك القيام به على أي حال.وبالطبع أي شيء مكتوب في التجميع سوف يسبب مشاكل.

ضع في اعتبارك أن العديد من المترجمين يختارون حجم العدد الصحيح بناءً على البنية الأساسية، نظرًا لأن "int" يجب أن يكون أسرع مناول للأرقام في النظام (وفقًا لبعض النظريات).

هذا هو السبب وراء استخدام العديد من المبرمجين لـ typedefs في معظم برامجهم المحمولة - إذا كنت تريد أن تعمل التعليمات البرمجية الخاصة بك على كل شيء بدءًا من معالجات 8 بت وحتى معالجات 64 بت، فأنت بحاجة إلى إدراك أنه في لغة C على أي حال، لم يتم تعريف int بشكل صارم.

تعد المؤشرات مجالًا آخر يجب توخي الحذر - لا تستخدم نوعًا طويلًا أو طويلًا أو أي نوع محدد إذا كنت تعبث بالقيمة الرقمية للمؤشر - استخدم البنية المناسبة، والتي، لسوء الحظ، تختلف من مترجم إلى مترجم ( ولهذا السبب لديك ملف typedef.h منفصل لكل مترجم تستخدمه).

-آدم ديفيس

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