Mengapa mungkin sulit untuk membuat versi 64 bit dari suatu program?

29

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?

Calben
sumber
57
karena programmer bodoh terus berasumsisizeof(int)==sizeof(void*)
ratchet f
16
Alasan teratas di lingkungan kita adalah ketergantungan pada beberapa komponen pihak ketiga yang tidak tersedia sebagai 64 bit. Tidak tahu apakah itu berlaku untuk Persatuan juga, tapi saya tidak akan terlalu heran jika itu yang terjadi.
Doc Brown
Mereka dapat menggunakan typedef seperti int32, int64 untuk int, float, pointer alih-alih mengasumsikan ukurannya. Yang mungkin bisa memecahkan banyak masalah. Banyak masalah mulai dari saat kita mulai berasumsi.
Kshitij
Yang sebenarnya merupakan asumsi yang sangat masuk akal pada arsitektur datar. Windows sengaja melakukan kesalahan untuk menghindari kerusakan pada sekrup mereka sendiri.
Joshua
3
Mengapa itu menjadi asumsi yang masuk akal? Saya harapkan untuk memiliki yang layak operator*untuk int, tetapi pointer tidak perlu itu. Juga, sebagian besar lingkungan Linux dan Unix memiliki int32 bit juga.
MSalters

Jawaban:

61

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 intcukup besar untuk menyimpan pointer

  • Dengan 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.

Jon Purdy
sumber
10
Perhatikan bahwa dimungkinkan untuk menulis bug yang hanya bermanifestasi ketika biner x86 dijalankan pada OS versi 64 bit. Ini lebih sulit ;-)
Steve Jessop
6
+1. Saya ingin menambahkan yang berikut ini ke titik "manajemen rilis": jika perangkat lunak saya bergantung pada komponen pihak ketiga, bahkan jika ada versi 32 dan 64 bit dari komponen tertentu yang tersedia, upaya tambahan untuk menguji rilis baru tidak boleh diremehkan. Jadi manajemen rilis IMHO harus menjadi poin pertama dalam daftar itu, bukan hanya catatan.
Doc Brown
Bisakah Anda menguraikan masalah ukuran pointer int? Apakah karena di lingkungan 64bit, ruang memori akan lebih tinggi dari yang diizinkan oleh sebuah int?
TankorSmash
4
@TankorSmash: pada x86 secara normal sizeof(int) == sizeof(void *)(keduanya 32 bit); pada x86_64, itu normal untuk menjaga int32 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 dalam intatau unsigned int.
Matteo Italia
26

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 sepertiint32_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

Tulains Córdova
sumber
8
Masalahnya bisa lebih jauh dari sekedar kompilasi juga; Saya punya teman berotot yang tidak dapat menggunakan FL Studio 64-bit yang tersedia karena mereka membutuhkan banyak VSTi yang hanya 32 bit; arsitektur plugin berbasis tautan dinamis lainnya juga terpengaruh.
StarWeaver
Terima kasih untuk hasil edit: Saya biasanya sangat pemilih soal tata bahasa tetapi membuat beberapa kesalahan. Dan @StarWeaver saya pikir saya menyentuh itu ketika saya mengatakan kode mungkin mengkompilasi tetapi memiliki bug. Ini masih kembali ke poin saya tentang penulisan kode bersih untuk bahasa dan platform apa pun yang Anda targetkan.
"Memiliki bug show-stopper" The show stopper sudah jelas dan "di wajah Anda" dan dapat ditangani. Apa yang saya pikir mungkin lebih buruk adalah semua masalah yang menghasilkan hasil yang salah secara halus yang akan luput dari perhatian untuk waktu yang lama.
Burhan Ali