Bir programın 64 bit sürümünü yapmak neden zor olabilir?


29

Kısa süreli programlamamda, programın tam kaynağına sahip olduğum sürece 32 veya 64 bit bir makinede C ++, Java vb.

Ancak bir çok yazılım 64bit piyasaya sürülmedi. En can sıkıcı biçimde, Unity motorunun henüz 64 bit sürümü yok.

64 bit makineler için bazı programların derlenmesini zorlaştıran şey nedir?


57
çünkü aptal programcılar farz etmeye devam ediyorlarsizeof(int)==sizeof(void*)
cırcır

16
Çevremizdeki en üst sebep, 64 bit olarak bulunmayan bazı üçüncü taraf bileşenlerin bağımlılığıdır. Bunun Birlik için de geçerli olup olmadığını bilmiyorum, ama durum böyle olursa şaşırmam.
Doc Brown

Boyutlarını almak yerine int32, int64, int için float, float, pointer gibi typedef komutlarını kullanabilirler. Hangi çok sorunu çözebilir. Sorunların çoğu, varsaymaya başladığımız andan itibaren başlar.
Kshitij

Bu aslında düz mimariler üzerinde mükemmel bir varsayımdır. Windows kendi vidalamalarını bozmamak için kasten yanlış anladı.
Joshua

3
Neden bu makul bir varsayım olsun? Ben iyi bir olmasını beklediğiniz operator*için int, ancak işaretçileri Buna gerek yok. Ayrıca, çoğu Linux ve Unix ortamı da int32 bite sahiptir.
MSalters

Yanıtlar:


61

Genel sorun, bir programda belgelenmemiş varsayımları kodlamanın çok kolay olduğu ve bu varsayımların yapıldığı yerleri bulmanın çok zor olmasıdır. Üst düzey diller bizi bu endişelerden biraz uzaklaştırma eğilimindedir, ancak platformları ve hizmetleri uygulamak için kullanılan düşük seviyeli dillerde, mimaride zorunlu olarak taşınabilir olmayan şeyleri yapmak kolaydır:

  • intBir işaretçiyi depolamak için yeterince büyük olduğunu varsayarak

  • İşaretçilerin gösteriminin özelliklerini, örneğin işaretçi etiketleme için varsaymak

  • Veri işaretçilerin ve kod işaretçilerin aynı boyuta sahip olduğunu varsayarsak

Serbest bırakma yönetiminin pratik kaygısı da var. Sadece bir x86 derlemesi yaparsam, kayıtların sınırlı olması nedeniyle belki de daha yavaş olsa da, x86-64'te çalışır. Oysa eğer hem x86 hem de x86-64 için oluşturursam, şimdi hem mimarileri denemeliyim hem de sadece bir mimaride ortaya çıkabilecek hataları ele alarak yeni bir sürümün gönderim maliyetini arttırmalıyım.


10
Yalnızca işletim sisteminin 64 bit sürümünde bir x86 ikili dosyası çalıştırıldığında ortaya çıkan bir hata yazmanın mümkün olduğunu unutmayın. Daha zor ;-)
Steve Jessop,

6
+1. Aşağıdakileri "sürüm yönetimi" noktasına eklemek isterim: yazılımım üçüncü taraf bileşenlere güveniyorsa, belirli bir bileşenin 32 ve 64 bit sürümü mevcut olsa bile, yeni sürümleri test etmek için ek çaba underrated olmamalıdır. Bu yüzden IMHO sürüm yönetimi sadece bir not değil, listedeki ilk nokta olmalı .
Doktor Brown

İnt işaretçi boyutu sorununu açıklayabilir misiniz? 64 bitlik bir ortamda, bellek alanı bir int'in izin verdiğinden daha yüksek olacağı için mi?
TankorSmash

4
@TankorSmash: normalde x86'da sizeof(int) == sizeof(void *)(ikisi de 32 bit'tir); x86_64 üzerinde, int32 bit tutmak normaldir (x86 ile uyumlu kalır ve bellekte boşa harcanmayı önler), ancak işaretçiler 64 bit olmalıdır (sanal adres alanı 2 ^ 64 değerine ulaştığından), bir intveya içine itti unsigned int.
Matteo Italia

26

32 ve 64 bit Intel / AMD mimarileri için derlendiğinde çoğu yazılım aynı şekilde çalışacaktır. Ancak, bazı yazılımlar olmaz. Tembellik dışında ya da daha geniş bir kitleye ulaşmanın 64 bit olarak yeniden derlenmesinin işe yaramayacağının belirli nedenleri var.

  • Yazılım güvenli olmayan işaretçi işlemlerini kullanabilir. Belki de bir program bir işaretleyiciyi int'ye yerleştirir, bu çoğu C ve C ++ derleyicileri için genellikle 32 bit'dir. İşaretçiler 64 bit programda 64 bit. Bu çalışmıyor.

  • Bit kaydırma işlemleri, kullanılan tamsayı türü farklı bir boyuttaysa farklı sonuçlar verebilir. Bu gibi standart bir typedef yerine normal bir veri türü kullanırken bir sorun olabilir.int32_t

  • Bir birleşmede kullanılan bir veri türü, birliğin davranışını değiştirerek boyutlarını değiştirebilir.

  • Yazılım sadece 32-bit kütüphanelere güvenebilir. Genel olarak, 64 bitlik bir program yalnızca yığın, işaretçiler vb. Hakkındaki varsayımlar nedeniyle 64 bitlik kütüphanelerle çalışacaktır.

Sorunuzda sorduğunuz zorluk, basitçe bazı kod tabanlarında, güvensiz işlemler yapan, güvensiz varsayımlar yapan, kısayollar ve geliştiriciler tarafından zekice hazırlanmış "optimizasyonlar" yapan milyonlarca kod satırı olabilir. Kod 64 bitlik bir ortamda derlenmeyecek veya derlenecek ancak show-stopper hatalarına sahip olacaktır. Tüm sorunları çözmek uzun zaman alabilir. Belki bir şirket 64 bitlik bir sürümü piyasaya sürünceye kadar zamanla düzeltebilir. Belki bir şirket mevcut bakım sürümleriyle birlikte "sürüm 2" geliştirebilir, çünkü toplam yeniden yazma gerekli.

Hikayenin ahlaki, temiz kod yazmak ve derleyiciyi ikinci kez tahmin etmeye çalışmak veya ihtiyaç duyulmayan akıllı optimizasyonlar eklemek istemiyor, yazılımı kırabilir ve muhtemelen yine de yardımcı olmaz.

Bu makale, bu cevaba dahil etmeyi umduğumdan çok daha fazla ayrıntı içeriyor: 64 bit platformda C ++ kodu taşıma işleminin 20 sorunu


8
Meseleler sadece derlemeden daha ileriye gidebilir; Kullanılabilir 64 bit FL Studio'yu kullanamayan bir kaslı arkadaşım var, çünkü yalnızca 32 bit olan birçok VSTI gerektiriyor; diğer dinamik bağlantı tabanlı eklenti mimarileri de benzer şekilde etkilenir.
StarWeaver

Düzenleme için teşekkürler: Normalde çok dilbilgisi konusunda seçici değilim ama birkaç hata yaptım. Ve @ StarWeaver kod derleyebileceğini ancak hataları olabileceğini söylediğimde dokunduğumu düşünüyorum. Bu hala hedeflediğiniz dil ve platform için temiz kod yazmak konusunda benim açımdan dönüyor.

"Şov-durdurucu böcek var" Şov-durdurucu açık ve "yüzünüzde" ve ele alınabilir. Muhtemelen daha kötü olduğunu düşündüğüm şey, uzun süre farkedilmeyecek çok yanlış sonuçlara yol açan sorunların tümü.
Burhan Ali,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.