مزیت انتقال C و ++C از 32 بیت به 64 بیت

محرک اصلی توسعه مدرن C++ / C نیاز به تولید کد 64 بیتی بومی است. در بیشتر موارد ، سرورها و سیستم های دسکتاپ اکنون تقریباً منحصراً ماشین های 64 بیتی هستند. با توجه به این واقعیت ، آیا انتقال به کد 64 بیتی فقط تغییر چند تنظیم ساخت نیست؟ استفان بی موریس توضیح می دهد که چرا این کار خیلی ساده نیست.

انتقال کد 32 بیتی C++ / C به 64 بیتی کار ساده ای نیست. موارد زیادی وجود دارد که باید در نظر گرفته شود. این مقاله به مناطق محدودیت عددی ، ترازبندی داده ها ، حساب اشاره گر و نمایه سازی آرایه ها می پردازد. قبل از شروع ، بیایید با یک اصطلاح “64 بیتی” یک تعریف کوتاه را ارائه دهیم تا برخی تعاریف را ارائه دهیم.

“64 بیتی” دقیقاً چیست؟

x86-64 (همچنین به عنوان x64 ، x86_64 و AMD64 نیز شناخته می شود ) نسخه 64 بیتی مجموعه دستورالعمل ها برای آن است. به راحتی می توانید بفهمید که سیستم شما 64 بیتی است یا نه. در Linux ، فقط دستور ترمینال زیر را تایپ کنید:

$ uname -a
Linux VirtualBox 3.13.0-46-generic # 77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux

به وجود نماد x86_64 توجه کنید . اگر خروجی مشابه این را مشاهده کردید ، یک دستگاه 64 بیتی دارید. یعنی معماری x86-64 است. اگر شما یک پلتفرم 32 بیتی دارید ، احتمالاً چیزی مشابه آن را خواهید دید ، به جز رشته ای مانند i686 i386 GNU / Linux .
توجه داشته باشید که من از یک ماشین مجازی با اوبونتو استفاده می کنم. این یک روش واقعا مناسب برای آزمایش با معماری های مختلف است: شما به سادگی با استفاده از VirtualBox یا VMware یک ماشین مجازی ایجاد می کنید ، یک سیستم عامل مناسب نصب می کنید ، آن را پیکربندی می کنید و دور می شوید. اگر سیستم عامل توسعه شما از آن پشتیبانی می کند ، می توانید با ایجاد یک سیستم 64 بیتی به سادگی با ایجاد یک ماشین مجازی بازی کنید.

پردازنده 64 بیتی از میزان قابل توجهی حافظه مجازی و حافظه فیزیکی بیشتر از آنچه در معماری های 32 بیتی امکان پذیر است پشتیبانی می کند. این یکی از مزایای عمده 64 بیتی است ، زیرا به برنامه ها امکان می دهد مقدار زیادی داده را در حافظه ذخیره کنند. علاوه بر این ، x86-64 ثبات های 64 بیتی برای اهداف عمومی و انواع مختلف دیگر پیشرفت ها مانند مدل حافظه با انعطاف پذیری بیشتری را فراهم می کند.
x86-64 همچنین با کد 16 بیتی x86 و 32 بیتی کاملاً عقب است. این سازگاری بسیار مهم است زیرا به شما امکان می دهد باینری های 32 بیتی موجود یا قدیمی را بدون هیچ گونه سازگاری یا مجازات عملکردی اجرا کنید. این کاملاً عالی به نظر می رسد ، شما قادر به اجرای کد 32 بیتی و 64 بیتی بر روی همان دستگاه هستید ، درست است؟

حالت سازگاری

همانطور که قبلاً ذکر شد ، به لطف راه حلهای مختلف سازگاری ، اجرای کد باینری 32 بیتی C++ / C در دستگاههای مدرن 64 بیتی مسئله ای نیست. به عنوان مثال ، ویندوز Wow64 دارد. لینوکس همچنین اجازه می دهد تا کد قدیمی 32 بیتی اجرا شود. با این حال ، مانند هر فناوری ، هرگز یک ناهار رایگان وجود ندارد! کد 32 بیتی که در حالت سازگاری اجرا می شود ممکن است در واقع کندتر از نسخه 64 بیتی بومی باشد. از طرف مثبت ، چنین کدهای 32 بیتی هنگام کار با دستگاه 64 بیتی ممکن است به حافظه بیشتری دسترسی داشته باشند.

برای برنامه هایی که روی ویندوز اجرا می شوند ، کد قدیمی 32 بیتی ممکن است نیاز به دسترسی به DLL ها داشته باشد ، که همچنین باید نسخه های 32 بیتی باشد. همین مسئله برای باینری های لینوکس که از کتابخانه های 32 بیتی خارجی استفاده می کنند ، صدق می کند.

معنی این کار این است که اجرای کد 32 بیتی در بستر 64 بیتی کاملاً امکان پذیر است. با این حال ، ممکن است کتابخانه های خارجی مجبور باشند به طور جداگانه نصب و نگهداری شوند. پشتیبانی از نسخه های مختلف کتابخانه می تواند دردناک باشد ، خصوصاً اگر دستگاه میزبان تحت کنترل شما نباشد (به عنوان مثال در دستگاه مشتری).

همانطور که مشاهده می کنید ، استفاده از 32 بیتی C++ / C در دنیای 64 بیتی دارای یک برچسب قیمت است ،قیمت زیادی نیست ، اما باید پرداخت شود و هرچه بیشتر با کد 32 بیتی بمانید ، هزینه آن بیشتر است.

درک کاربر نهایی

علاوه بر دردسرهایی که با ماندن در کد 32 بیتی متحمل می شوید ، ممکن است مشتریان و کاربران با استفاده از آنچه ممکن است از فناوری “میراث” تصور کنند خیلی خوشحال نباشند. البته این نگرانی روانی است که احتمالا بیش از حد واقعی است، اما برخی از مشتریان ممکن برای دیدن ادامه برنامه استفاده خود را از کد 32 بیتی انتخاب کنند، و آنها ممکن است برای چیزی در ازای قرار دادن با کد 32 بیت درخواست کنند به عنوان مثال ، آنها ممکن است از نرم افزار شما ویژگی های اضافی را درخواست کنند. در نهایت ایجاد این ویژگی های اضافی می تواند تلاش شما را برای انتقال کد 64 بیتی سخت تر کند. در واقع ، این مسئله کد 32 بیتی در مقابل 64 بیتی می تواند هزینه قابل توجهی برای سازمان شما باشد.
بنابراین ، به طور خلاصه می توان کد 32 بیتی ++C خود را حفظ کرد و با آن در دنیای 64 بیتی به کار خود ادامه داد. با این حال ، همانطور که اکنون می دانیم ، این کار بدون مشکل نیست. فراتر از این مسائل لجستیکی ، آیا دلایل دیگری برای انتقال به ++C به صورت 64 بیتی وجود دارد؟ سؤال خوبی بود.

چرا به 64 بیت برویم؟

یک انگیزه قابل توجه برای انتقال کد شما به 64 بیتی ممکن است صرفاً همگام بودن با زمان باشد. علاوه بر مزایای دیگری که قبلاً ذکر کردیم ، با این حال ، حالت 64 بیتی حافظه بیشتری را فراهم می کند ، که ممکن است منجر به زمان اجرای سریع تر شود ، به ویژه اگر برنامه شما دارای یک عنصر خرد کننده تعداد قابل توجه باشد.
بیایید اکنون برخی از مواردی را که باید در انتقال از کد 32 بیتی به 64 بیتی C++ / C حل شود ، بررسی کنیم. یکی از مواردی که شاید در مورد محاسن و معایب کد 64 بیتی کمتر شناخته شده باشد ، موضوع ترازبندی داده ها است. هم ترازی می تواند برخی از مشکلات گره خورده را برای افراد ناآگاه ایجاد کند ، بنابراین زمینه خوبی برای شروع است.