Насколько я знаю, так называемые «толстые двоичные файлы» - исполняемые файлы, содержащие машинный код для нескольких систем, - действительно используются только на компьютерах Apple, и даже там кажется, что они использовали их только потому, что им нужно было перейти с PowerPC для x86.
В настоящее время большая часть программного обеспечения является кроссплатформенной, и кажется, что сделать один толстый двоичный файл во многих отношениях проще, чем отслеживать дюжину или около того различных загрузок для каждой комбинации операционной системы и архитектуры, не говоря уже о том, как передавать клиенту, какой они хотят.
Я могу придумать множество предположений о том, почему этот подход никогда не завоевывал популярность, например:
- Отсутствие инструментов кросс-компиляции, делающих невозможным использование бинарных файлов для нескольких ОС
- В любом случае вам необходимо протестировать код на каждой ОС, поэтому у вас уже должны быть системы, которые могут компилироваться для каждой ОС.
- Видимо 32-битные программы "просто работают" уже на 64-битных машинах
- Динамическое связывание работает по-разному в каждой ОС, поэтому «толстая библиотека» может не работать, даже если «толстое приложение» будет
Но так как я всегда работаю с библиотекой или фреймворком, который скрывает от меня все эти специфичные для ОС и архитектурные детали, я не знаю, насколько это правда, или есть еще проблемы, которых я не знаю около. Итак, каковы реальные причины, по которым толстые двоичные файлы обычно не используются для создания программного обеспечения с несколькими архитектурами и / или несколькими ОС? (вне Apple)
Ответы:
Жирный двоичный подход имеет смысл, если:
Вот почему они не используются для кроссплатформенного кода (оба критерия не применяются) или для поддержки различных дистрибутивов Linux с одним двоичным кодом (1. не применяется, 2. применяется в определенной степени).
В Linux оба критерия будут применяться, если вы хотите поддерживать 32- и 64-разрядные версии в одном дистрибутиве Linux . Но зачем, если вам уже приходится поддерживать несколько дистрибутивов?
В Windows переход с 16-разрядного на 32-разрядный процесс произошел изначально с появлением Windows NT, который во многих отношениях значительно отличался от 16-разрядного мира Windows (виртуальная память, многопользовательское управление доступом, изменения API ...). Со всеми этими изменениями было лучше разделить 32- и 16-битные миры. NT уже имела концепцию «подсистем», поддерживающих различные «персоны» ОС (Win32, POSIX), поэтому сделать Win16 третьей подсистемой было простым выбором.
Переход с Win32 на Win64 не повлек за собой подобных серьезных изменений, но Microsoft все равно использовала похожий подход, вероятно, потому что он был доказан и опробован.
источник
Логистика распределения по возрасту в интернете устраняет необходимость в двоичных файлах двумя способами:
Точка продажи не включает в себя физические товары и, следовательно, предпочитает меньшее количество SKU, как в случае, когда продукты конкурируют за розничные полки, и у покупателей ограничены возможности для совершения покупки.
Затраты на пропускную способность способствуют доставке только минимально необходимых бит для конкретного программного пакета. Доставка толстых двоичных файлов по сети ухудшает как качество обслуживания клиентов, так и эффективность инфраструктуры продавца.
Жирные двоичные файлы имели больше смысла, когда программное обеспечение было упаковано в физический носитель.
источник
Одна из причин, почему толстые двоичные файлы не увенчались успехом, заключается в том, что существует больше, чем спецификации ABI и процессора (на самом деле, набор команд ) для аннулирования двоичного исполняемого файла. Бинарный исполняемый файл часто во многом зависит от других ресурсов, в частности от динамических библиотек (см. Ад DLL ), внешних сервисов (например, СУБД, таких как PostGreSQL ....), конфигурации системы (например, расположение файлов конфигурации
/etc/
в Linux) и т. Д. . так далее....Просто для Linux / x86-64 на практике трудно сделать исполняемый двоичный файл, способный работать на всех дистрибутивах Linux (потому что он часто привязан к конкретным версиям
libc
илиlibstdc++
). FatELF существует, но не очень успешно.Даже с четко определенным ABI и набором инструкций оптимизация будет отличаться для разных марок процессоров - см. Флаг
-mtune=native
оптимизации x86 в GCC .Apple частично удалось создать толстые двоичные файлы только потому, что они обеспечивают очень замкнутую экосистему вычислительных ресурсов.
Свободное программное обеспечение - это еще один способ решения вашей проблемы с переносимостью: если приложение является свободным программным обеспечением (тщательно закодированным для обеспечения переносимости), оно довольно легко переносится на подобные системы. И даже если исходный код не работает должным образом в вашей системе, вы можете адаптировать его (или заплатить кому-то за выполнение работы), как правило, достаточно легко (конечно, бесплатное программное обеспечение, привязанное к конкретной ОС, ABI или процессору, нелегко порт, вы будете платить больше усилий для этого). И такие стандарты, как POSIX или Linux Standard Base также помогают.
Вы можете заплатить (или попросить) кого-то портировать какое-либо (бесплатное) программное обеспечение с доступным исходным кодом, но портировать двоичный исполняемый файл нереально.
Наконец, существует несколько структур, помогающих портировать на несколько операционных систем (при условии, что доступен исходный код), например, Qt & POCO .
Даже использование хорошо определенного байт-кода, такого как JVM , не всегда гарантирует переносимость: известно, что некоторые приложения Java не являются переносимыми (например, потому что они ожидают определенной иерархии файлов и именования).
Кстати, компьютерные системы сегодня, вероятно, гораздо менее разнородны, чем в 1980-х или начале 1990-х (или в эпоху мэйнфреймов).
Наконец, толстые двоичные файлы являются толстыми: вы потратите много ресурсов (время сборки, пропускную способность, размер исполняемого файла) на проблему переносимости, которая может не беспокоить многих людей. Вспомните афоризм: «нет переносимого программного обеспечения, только программное обеспечение, которое было перенесено» (для некоторых конкретных систем).
источник