W moim krótkim programowaniu kompilowanie dowolnego C ++, Java itp. Na maszynie 32- lub 64-bitowej było banalne, o ile mam pełne źródło programu.
Ale wiele programów nie zostało wydanych 64-bitowych. Najbardziej denerwujące jest to, że nie ma jeszcze 64-bitowej wersji silnika Unity.
Co utrudnia kompilację niektórych programów dla komputerów 64-bitowych?
sizeof(int)==sizeof(void*)
operator*
zaint
, ale wskaźniki nie potrzebujemy. Ponadto większość środowisk Linux i Unix ma równieżint
32 bity.Odpowiedzi:
Ogólny problem polega na tym, że bardzo łatwo jest zakodować nieudokumentowane założenia w programie i bardzo trudno jest znaleźć miejsca, w których te założenia zostały przyjęte. Języki wysokiego poziomu w pewnym stopniu izolują nas od tych obaw, ale w językach niższego poziomu używanych do wdrażania platform i usług łatwo jest robić rzeczy, które niekoniecznie są przenośne w różnych architekturach:
Zakładając, że
int
jest wystarczająco duży, aby przechowywać wskaźnikZakładanie właściwości reprezentacji wskaźników, np. Do znakowania wskaźnika
Zakładając, że wskaźniki danych i wskaźniki kodu mają ten sam rozmiar
Istnieją również praktyczne obawy związane z zarządzaniem wersjami. Jeśli zrobię tylko wersję x86, nadal będzie działać na x86-64, choć być może wolniej z powodu ograniczonej dostępności rejestrów. Podczas gdy kompiluję zarówno dla x86, jak i x86-64, muszę teraz przetestować obie architektury i radzić sobie z błędami, które mogą wystąpić tylko w jednej architekturze, zwiększając koszt wysyłki nowej wersji.
źródło
sizeof(int) == sizeof(void *)
(oba są 32-bitowe); na x86_64 normalne jest utrzymywanieint
32 bitów (pozostaje kompatybilny z x86 i unika marnowania miejsca w pamięci), ale wskaźniki muszą być 64-bitowe (ponieważ wirtualna przestrzeń adresowa wzrasta do 2 ^ 64), więc nie mogą być dłużej wbity wint
lubunsigned int
.Większość oprogramowania będzie działać tak samo, jeśli zostanie skompilowane zarówno dla 32-bitowej, jak i 64-bitowej architektury Intel / AMD. Jednak niektóre oprogramowanie tego nie zrobi. Oprócz lenistwa lub docierania do większej liczby odbiorców istnieją pewne szczególne powody, dla których rekompilacja w wersji 64-bitowej nie będzie działać.
Oprogramowanie może wykorzystywać niebezpieczne operacje na wskaźnikach. Być może program wstawia wskaźnik do int, który jest zazwyczaj 32-bitowy dla większości kompilatorów C i C ++. Wskaźniki to 64 bity w 64-bitowym programie. To nie działa.
Operacje przesunięcia bitów mogą dawać różne wyniki, jeśli zastosowany typ liczby całkowitej ma inny rozmiar. Może to stanowić problem przy korzystaniu ze zwykłego typu danych zamiast standardowego typu typef, takiego jak
int32_t
Typ danych używany w unii może zmieniać rozmiary, zmieniając zachowanie unii.
Oprogramowanie może polegać na bibliotekach tylko 32-bitowych. Ogólnie rzecz biorąc, program 64-bitowy będzie działał tylko z bibliotekami 64-bitowymi ze względu na założenia dotyczące stosu, wskaźników itp.
Trudność, o którą pytasz w swoim pytaniu, polega na tym, że w niektórych bazach kodu mogą znajdować się miliony wierszy kodu, które wykonują niebezpieczne operacje, dokonują niebezpiecznych założeń, mają skróty i sprytne „optymalizacje” wprowadzone przez programistów. Kod albo nie skompiluje się w środowisku 64-bitowym, albo skompiluje, ale będzie zawierał błędy show-stopper. Naprawienie wszystkich problemów może zająć dużo czasu. Być może firma naprawi je z czasem, dopóki nie będzie możliwe wydanie wersji 64-bitowej. Być może firma opracuje „wersję 2” wraz z aktualnymi wydaniami serwisowymi, ponieważ konieczne jest całkowite przepisanie.
Morał tej historii jest pisanie czystego kodu i nie próbowanie odgadywania kompilatora na nowo ani dodawania sprytnych optymalizacji, które nie są potrzebne, mogą uszkodzić oprogramowanie i prawdopodobnie i tak nie pomogą.
W tym artykule zawarto o wiele więcej szczegółów, niż mogłem się spodziewać w tej odpowiedzi: 20 problemów z przenoszeniem kodu C ++ na platformie 64-bitowej
źródło