Чому може бути складно зробити 64-бітну версію програми?


29

У моєму програмуванні за короткий час було тривіально збирати будь-яку з моїх C ++, Java і т. Д. Для 32 або 64-бітної машини, якщо я маю повне джерело для програми.

Але багато програмного забезпечення не випущено 64-бітним. Що найприємніше, ще немає 64-бітового випуску двигуна Unity.

Що ускладнює компіляцію деяких програм для 64-бітних машин?


57
тому що дурні програмісти продовжують припускатиsizeof(int)==sizeof(void*)
храповий вирод

16
Найвища причина в нашому середовищі - залежність від сторонніх компонентів, які недоступні як 64 біт. Не знаю, чи це стосується і Єдності, але я б не надто здивувався, якщо це так.
Док Браун

Вони можуть використовувати typedef, як int32, int64 для int, float, pointer, замість того, щоб вважати їх розмір. Що може вирішити багато проблем. Багато проблем починаються з того часу, коли ми починаємо вважати.
Кшитій

Це насправді цілком розумне припущення щодо плоских архітектур. Windows помилково помилилася, щоб не зламати власні гвинти.
Джошуа

3
Чому це було б розумним припущенням? Я б очікувати , щоб мати пристойний operator*для int, але покажчики не потрібно. Крім того, більшість середовищ Linux та Unix мають також int32 біти.
MSalters

Відповіді:


61

Загальна проблема полягає в тому, що кодувати незадокументовані припущення в програмі дуже просто, і дуже важко знайти місця, де були зроблені ці припущення. Мови високого рівня, як правило, відштовхують нас від цих проблем, але мовами нижчого рівня, які використовуються для впровадження платформ і служб, легко робити речі, які не обов'язково переноситься в архітектурах:

  • Якщо припустити, що intдостатньо великий, щоб зберігати вказівник

  • Припускаючи властивості подання покажчиків, наприклад, для мітки покажчиків

  • Якщо припустити, що покажчики даних та покажчики коду мають однаковий розмір

Існує також практична проблема управління випусками. Якщо я зроблю лише збірку x86, вона все ще працюватиме на x86-64, хоча й може бути повільніше через обмеженість доступності регістрів. Якщо, якщо я будувати для x86 та x86-64, я повинен перевірити обидві архітектури та мати справу з помилками, які можуть виникнути лише в одній архітектурі, збільшуючи вартість доставки нового випуску.


10
Зауважте, що помилку можна записати лише тоді, коли бінарний x86 працює у 64-бітній версії ОС. Просто складніше ;-)
Стів Джессоп

6
+1. Я хотів би додати наступне до пункту "управління випуском": якщо моє програмне забезпечення покладається на сторонні компоненти, навіть якщо доступна 32 та 64-бітна версія конкретного компонента, додаткові зусилля для тестування нових випусків не слід недооцінювати Тож управління випуском IMHO має стати першим пунктом у цьому списку, а не лише стороною.
Док Браун

Чи можете ви детальніше розглянути питання про розмір вказівника? Це тому, що в 64-бітовому середовищі простір пам'яті був би більшим, ніж це дозволяє int?
TankorSmash

4
@TankorSmash: на x86 зазвичай sizeof(int) == sizeof(void *)(вони обоє 32 бітні); на x86_64 нормально зберігати int32-бітний (він залишається сумісним з x86 і уникає витрачання місця в пам’яті), але покажчики повинні бути 64-бітовими (оскільки віртуальний адресний простір збільшується до 2 ^ 64), тому вони більше не можуть бути засунули в intабо unsigned int.
Маттео Італія

26

Більшість програмного забезпечення буде працювати однаково при компіляції для 32-ти та 64-бітної архітектури Intel / AMD. Однак деяке програмне забезпечення не буде. Окрім лінощів чи досягнення більшої аудиторії, є деякі конкретні причини, чому перекомпіляція як 64-бітний не спрацює.

  • Програмне забезпечення може використовувати небезпечні операції вказівника. Можливо, програма ставить покажчик на int, який, як правило, становить 32 біт для більшості компіляторів C і C ++. Покажчики - це 64 біти в 64-бітній програмі. Це не працює.

  • Операції зсуву бітів можуть давати різні результати, якщо використовується цілочисельний тип іншого розміру. Це може бути проблемою при використанні звичайного типу даних замість стандартного typedef, такого якint32_t

  • Тип даних, що використовується в об'єднанні, може змінювати розміри, змінюючи поведінку об'єднання.

  • Програмне забезпечення може покладатися на 32-розрядні бібліотеки. Загалом, 64-бітна програма працюватиме лише з 64-бітовими бібліотеками через припущення про стек, покажчики тощо.

Складність, про яку ви ставите у своєму запитанні, полягає лише в тому, що в деяких кодових базах може бути мільйони рядків коду, які виконують небезпечні операції, роблять небезпечні припущення, мають ярлики та розумні "оптимізації", що вводяться розробниками. Код або не буде компілюватися в 64-бітовому середовищі, або буде компілюватися, але має помилки show-stopper. Щоб виправити всі проблеми, може знадобитися багато часу. Можливо, компанія виправить їх з часом, поки не вийде 64-бітна версія. Можливо, компанія розробить "версію 2" поряд з поточними версіями технічного обслуговування, оскільки необхідна загальна перезапис.

Мораль історії полягає в тому, щоб писати чистий код і не намагатися вдруге відгадати компілятор або додати розумні оптимізації, які не потрібні, можуть зламати програмне забезпечення і, мабуть, не допомогти все одно.

Ця стаття описується набагато детальніше, ніж я міг би сподіватися, щоб включити у цю відповідь: 20 питань перенесення коду C ++ на 64-бітну платформу


8
Питання можуть піти і далі, ніж просто компіляція; У мене є друг-музикант, який не може використовувати доступну 64-бітну FL Studio, тому що їм потрібно багато VSTi, які є лише 32-бітовими; інші архітектури плагінів, засновані на динамічних посиланнях, піддаються впливу.
StarWeaver

Дякую за редагування: Я зазвичай ДУЖЕ вибагливий до граматики, але допустив кілька помилок. І @StarWeaver я думаю, що я торкнувся цього, коли сказав, що код може компілюватись, але у ньому є помилки. Це все ще повертається до моєї точки зору написання чистого коду для будь-якої мови та платформи, на яку ви орієнтовані.

"мають помилки на стоп-шоу" Показати, що пробка очевидна і "на вашому обличчі", і з нею можна боротися. Я вважаю, що це, мабуть, гірше, - це всі проблеми, які призводять до невірних неправильних результатів, які довго залишаться непоміченими.
Бурхан Алі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.