سؤال

أعمل حاليًا على تحويل تطبيق 32 بت إلى تطبيق 64 بت في لغة C.يعمل هذا التطبيق حاليًا على بنية x86 (Windows وosx وUnix وLinux).لذا، قبل البدء في البرمجة، أردت أن أعرف ما الذي يجب علي مراعاته أثناء تحويل التطبيق.

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

المحلول

  1. اكتشف من كتبه.هل هم احمق؟هل هم أنت منذ بضع سنوات مضت؟هل يمكنك طرح الأسئلة عليهم؟هل هم على دراية بوجود منصات وأنظمة متعددة؟معرفة عقلية مؤلف (مؤلفي) البرنامج سوف تساعدك على فهم المشاكل عندما تواجهها.
  2. احصل على بيئة تشغيل/جهاز 64 بت.
  3. استبدل long بـ int.كن على علم بذلك تماما LONG ليس long.
  4. يستبدل (int)&x يلقي والكتابة مع intptr_t و (unsigned int)&x مع uintptr_t
  5. تدقيق أي شيء يعتمد على هياكل الصب char* للقيام بالحساب المؤشر معها.
  6. ابحث في Regex عن \<4\> في حال افترضت ذلك 4 = sizeof(void*)
  7. كن صبوراً.عندما تجد مشكلة، ابحث في مكان آخر إذا كانت نفس المشكلة موجودة، وقم بتغليف الحل في ماكرو.
  8. حاول ألا تستخدم #ifdef RUN64 أو أي شيء مماثل.سوف تندم إذا أصبحت منصات 128 بت رائجة.
  9. قم بتغليف جميع تغييراتك فيما يتعلق ببعض وحدات الماكرو المركزية التي ستخفي اختلافات إمكانية النقل في مكان آخر في برنامجك.
  10. استخدم أداة اختبار التغطية للمساعدة في التأكد من تغطية كل شيء (إذا كان ذلك مناسبًا)

يحرر وأضاف uintptr_t ملاحظة كما اقترح التعليق.

نصائح أخرى

إحدى المشكلات المحتملة التي لم يتم ذكرها بالفعل هي أنه إذا كان تطبيقك يقرأ أو يكتب بيانات ثنائية من القرص (على سبيل المثال، اقرأ مجموعة من البنيات باستخدام fread)، سيتعين عليك التحقق بعناية شديدة وربما ينتهي بك الأمر إلى وجود قارئين:واحد للملفات القديمة والآخر لملفات 64 بت.أو، إذا كنت حريصًا على استخدام أنواع مثل uint32_t وهكذا من <stdint.h> ملف الرأس، يمكنك إعادة تعريف بنياتك لتكون متوافقة مع البت مقابل البت.على أي حال، الإدخال/الإخراج الثنائي هو شيء يجب الانتباه إليه.

وهذا يعتمد حقا على الطلب وكيف تم ترميز. يمكن أن يكون مجرد معاد بعض التعليمات البرمجية مع مترجم 64 بت وأنها ستعمل فقط، ولكن عادة هذا لا يحدث إلا إذا كان قد تم تصميم التعليمات البرمجية مع قابلية في الاعتبار.

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

والى حد كبير كل المدلى بها وتحذير المترجم هو العلم الاحمر الذي يحتاج إلى التدقيق بها. إذا كان رمز لا "، محذرا نظيفة" لتبدأ ثم وهذا هو أيضا علامة على أن هناك الكثير من العمل قد يكون مطلوبا.

إذا كنت تستخدم أنواع الصحيح للقيم الخاصة بك - على سبيل المثال. size_t، ptrdiff_t، uintptr_t، وأنواع كثافة العمليات الحجم ثابتة من stdint.h عند الاقتضاء - ولم ترميز ثابت للأحجام القيمة، يجب أن تعمل التعليمات البرمجية من خارج منطقة الجزاء

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

لماذا هذه المشكلة؟ حسنا، لم تكن كذلك، ما لم يفترض التعليمات البرمجية التي sizeof (دولي) == sizeof (الفراغ *). وهذا يمكن أن يؤدي إلى الخلل مؤشر سيئة.

حسنا، في الأساس، وعدد من التغييرات صغيرة إلى حد ما، لكنه سوف يكون لا يزال مهمة رئيسية إذا لم يتم كتابة التطبيق بعناية لتكون محمولة إلى حد ما لتبدأ.

والفرق الرئيسي هو أن مؤشرات واسعة 64 بت، <م> لكن معظم أنواع البيانات الأخرى هي دون تغيير. عدد صحيح لا يزال 32 بت، ومنذ فترة طويلة وربما أيضا لا يزال 32 بت. إذا كان الأمر كذلك يلقي التعليمات البرمجية بين [إينتس] والمؤشرات، أن يحدث كسر. وبالمثل، أي بنية أو ما شابه ذلك الذي يعتمد على تعويض محددة لليجوز لأي عضو أن كسر لأعضاء آخرين قد تكون الآن أكبر، وهكذا تتغير الإزاحة.

وبطبيعة الحال، التعليمات البرمجية يجب أن لا تعتمد على هذه الحيل في المقام الأول، وذلك في عالم مثالي، وهذا لن يكون مشكلة على الإطلاق، وكنت قد ببساطة إعادة ترجمة وأن كل شيء يعمل. ولكن ربما كنت لا نعيش في عالم مثالي ...؛)

الفرقان الرئيسيان بين برمجة 32 بت و64 بت في لغة C هما sizeof(void*) وsizeof(long).المشكلة الرئيسية التي ستواجهك هي أن معظم أنظمة Unix تستخدم معيار I32LP64 الذي يحدد ما يصل إلى 64 بت بينما يستخدم Win64 معيار IL32LLP64 الذي يحدد ما يصل إلى 32 بت.إذا كنت بحاجة إلى دعم التحويل البرمجي عبر الأنظمة الأساسية، فقد ترغب في استخدام مجموعة من محددات الكتابة المستندة إلى البنية للأعداد الصحيحة 32 بت و64 بت للتأكد من أن جميع التعليمات البرمجية ستعمل بشكل متسق.يتم توفير ذلك كجزء من stdint.h كجزء من معيار C99.إذا كنت لا تستخدم مترجم C99، فقد تحتاج إلى إنشاء معادل خاص بك

كما هو مذكور في مكان آخر، ستكون الاهتمامات الأساسية للتحويل هي التعليمات البرمجية التي تفترض sizeof(int) == sizeof(long) == sizeof(void*)، والتعليمة البرمجية لدعم البيانات التي تمت كتابتها على القرص والتعليمة البرمجية لـ IPC عبر الأنظمة الأساسية.

للحصول على مراجعة جيدة للتاريخ وراء هذا، قم بإلقاء نظرة على هذا شرط من قائمة انتظار ACM.

وهناك الكثير من إجابات جيدة بالفعل.

Gimpel ينت . ويمكن أن نشير بالضبط أنواع التركيبات التي هي إشكالية. إذا تجربتك مثل الألغام، وسوف تظهر لك أيضا الكثير من الخلل في نظام لا علاقة لها ميناء 32/64 بت.

وكل ما يتعلق ب 64 بت للمطورين:

التنمية 64 بت

الموارد 64 بت

Viva64

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