Dalam pemrograman waktu singkat saya, sudah sepele untuk mengkompilasi C ++ saya, Java, dll. Baik untuk mesin 32 atau 64 bit asalkan saya memiliki sumber lengkap untuk program tersebut.
Tetapi banyak perangkat lunak yang tidak dirilis 64bit. Paling menjengkelkan, belum ada rilis 64bit dari mesin Unity.
Apa yang membuatnya sulit untuk mengkompilasi beberapa program untuk mesin 64 bit?
sizeof(int)==sizeof(void*)
operator*
untukint
, tetapi pointer tidak perlu itu. Juga, sebagian besar lingkungan Linux dan Unix memilikiint
32 bit juga.Jawaban:
Masalah umumnya adalah sangat mudah untuk menyandikan asumsi tidak berdokumen dalam suatu program, dan sangat sulit untuk menemukan tempat di mana asumsi-asumsi itu dibuat. Bahasa tingkat tinggi cenderung melindungi kami dari masalah ini, tetapi dalam bahasa tingkat rendah yang digunakan untuk mengimplementasikan platform dan layanan, mudah untuk melakukan hal-hal yang tidak selalu portabel di seluruh arsitektur:
Dengan asumsi itu
int
cukup besar untuk menyimpan pointerDengan asumsi properti representasi pointer, misalnya, untuk penandaan pointer
Dengan asumsi bahwa pointer data dan pointer kode memiliki ukuran yang sama
Ada juga keprihatinan praktis manajemen rilis. Jika saya hanya membuat build x86, itu masih akan berjalan pada x86-64, meskipun mungkin lebih lambat karena ketersediaan register yang terbatas. Sedangkan jika saya membangun untuk x86 dan x86-64, sekarang saya harus menguji pada kedua arsitektur dan menangani bug yang mungkin hanya timbul pada satu arsitektur, meningkatkan biaya pengiriman rilis baru.
sumber
sizeof(int) == sizeof(void *)
(keduanya 32 bit); pada x86_64, itu normal untuk menjagaint
32 bit (tetap kompatibel dengan x86 dan menghindari pemborosan ruang dalam memori), tetapi pointer harus 64 bit (karena ruang alamat virtual naik hingga 2 ^ 64), sehingga mereka tidak bisa lagi mendorong ke dalamint
atauunsigned int
.Sebagian besar perangkat lunak akan bekerja sama ketika dikompilasi untuk arsitektur Intel / AMD 32 dan 64 bit. Namun, beberapa perangkat lunak tidak akan melakukannya. Selain kemalasan, atau menjangkau khalayak yang lebih besar, ada beberapa alasan khusus mengapa kompilasi ulang sebagai 64 bit tidak akan berhasil.
Perangkat lunak dapat menggunakan operasi pointer yang tidak aman. Mungkin sebuah program menempatkan pointer ke int, yang umumnya 32 bit untuk sebagian besar kompiler C dan C ++. Pointer adalah 64 bit dalam program 64 bit. Itu tidak bekerja.
Operasi bit shift dapat menghasilkan hasil yang berbeda jika tipe integer yang digunakan adalah ukuran yang berbeda. Ini mungkin masalah ketika menggunakan tipe data biasa dan bukan tipe standar seperti
int32_t
Tipe data yang digunakan dalam serikat dapat mengubah ukuran, mengubah perilaku serikat.
Perangkat lunak mungkin bergantung pada perpustakaan yang hanya 32-bit. Secara umum, program 64 bit hanya akan bekerja dengan pustaka 64 bit karena asumsi tentang stack, pointer, dll.
Kesulitan yang Anda tanyakan dalam pertanyaan Anda adalah bahwa dalam beberapa basis kode mungkin ada jutaan baris kode yang melakukan operasi yang tidak aman, membuat asumsi yang tidak aman, memiliki pintasan dan "optimisasi" pintar yang dilakukan oleh pengembang. Kode tidak akan dikompilasi dalam lingkungan 64 bit, atau akan dikompilasi tetapi memiliki bug show-stopper. Mungkin perlu waktu lama untuk memperbaiki semua masalah. Mungkin perusahaan akan memperbaikinya dari waktu ke waktu sampai mungkin untuk merilis versi 64 bit. Mungkin perusahaan akan mengembangkan "versi 2" bersama rilis pemeliharaan saat ini karena penulisan ulang total diperlukan.
Moral dari cerita ini adalah untuk menulis kode yang bersih dan jangan mencoba menebak-nebak kompiler atau menambahkan optimisasi cerdas yang tidak diperlukan, dapat merusak perangkat lunak, dan mungkin tidak membantu juga.
Artikel ini jauh lebih terperinci daripada yang bisa saya harap sertakan dalam jawaban ini: 20 masalah porting kode C ++ pada platform 64-bit
sumber