Почему «толстые двоичные файлы» более широко не используются для кроссплатформенных приложений?

27

Насколько я знаю, так называемые «толстые двоичные файлы» - исполняемые файлы, содержащие машинный код для нескольких систем, - действительно используются только на компьютерах Apple, и даже там кажется, что они использовали их только потому, что им нужно было перейти с PowerPC для x86.

В настоящее время большая часть программного обеспечения является кроссплатформенной, и кажется, что сделать один толстый двоичный файл во многих отношениях проще, чем отслеживать дюжину или около того различных загрузок для каждой комбинации операционной системы и архитектуры, не говоря уже о том, как передавать клиенту, какой они хотят.

Я могу придумать множество предположений о том, почему этот подход никогда не завоевывал популярность, например:

  • Отсутствие инструментов кросс-компиляции, делающих невозможным использование бинарных файлов для нескольких ОС
  • В любом случае вам необходимо протестировать код на каждой ОС, поэтому у вас уже должны быть системы, которые могут компилироваться для каждой ОС.
  • Видимо 32-битные программы "просто работают" уже на 64-битных машинах
  • Динамическое связывание работает по-разному в каждой ОС, поэтому «толстая библиотека» может не работать, даже если «толстое приложение» будет

Но так как я всегда работаю с библиотекой или фреймворком, который скрывает от меня все эти специфичные для ОС и архитектурные детали, я не знаю, насколько это правда, или есть еще проблемы, которых я не знаю около. Итак, каковы реальные причины, по которым толстые двоичные файлы обычно не используются для создания программного обеспечения с несколькими архитектурами и / или несколькими ОС? (вне Apple)

Ixrec
источник
5
Есть ли серьезная проблема, которую это решит? Когда я захожу на страницу загрузки основных кроссплатформенных приложений, они автоматически определяют используемую мной ОС и указывают мне правильное направление. У пользователей Linux есть менеджеры пакетов. Мне кажется, что все, что это сделало бы, это раздутые размеры загрузки.
Доваль
4
Я не знаю много о толстых двоичных файлах, но разве они не нуждаются в поддержке со стороны ОС (особенно загрузчик)? Тогда я не вижу особой привлекательности для «программного обеспечения для нескольких ОС», поскольку поставщики ОС никак не могут договориться о совместимом формате.
7
Потому что у нас есть байт-код и виртуальные машины, которые лучше решают эту проблему.
Роберт Харви
2
Меня удивляет, возможно ли вообще создать исполняемый файл polyglot, который работает как в Windows, так и в некоторых * NIX?
aaaaaaaaaaaa
2
Для исторической записи толстые двоичные файлы датируются переходом 68k -> PPC, а не переходом PPC -> x86.
Марк

Ответы:

9

Жирный двоичный подход имеет смысл, если:

  1. Обе архитектуры сосуществуют в одной системе
  2. Все остальное более или менее одинаково для всех архитектур

Вот почему они не используются для кроссплатформенного кода (оба критерия не применяются) или для поддержки различных дистрибутивов Linux с одним двоичным кодом (1. не применяется, 2. применяется в определенной степени).

В Linux оба критерия будут применяться, если вы хотите поддерживать 32- и 64-разрядные версии в одном дистрибутиве Linux . Но зачем, если вам уже приходится поддерживать несколько дистрибутивов?

В Windows переход с 16-разрядного на 32-разрядный процесс произошел изначально с появлением Windows NT, который во многих отношениях значительно отличался от 16-разрядного мира Windows (виртуальная память, многопользовательское управление доступом, изменения API ...). Со всеми этими изменениями было лучше разделить 32- и 16-битные миры. NT уже имела концепцию «подсистем», поддерживающих различные «персоны» ОС (Win32, POSIX), поэтому сделать Win16 третьей подсистемой было простым выбором.

Переход с Win32 на Win64 не повлек за собой подобных серьезных изменений, но Microsoft все равно использовала похожий подход, вероятно, потому что он был доказан и опробован.

oefe
источник
11

Логистика распределения по возрасту в интернете устраняет необходимость в двоичных файлах двумя способами:

  1. Точка продажи не включает в себя физические товары и, следовательно, предпочитает меньшее количество SKU, как в случае, когда продукты конкурируют за розничные полки, и у покупателей ограничены возможности для совершения покупки.

  2. Затраты на пропускную способность способствуют доставке только минимально необходимых бит для конкретного программного пакета. Доставка толстых двоичных файлов по сети ухудшает как качество обслуживания клиентов, так и эффективность инфраструктуры продавца.

Жирные двоичные файлы имели больше смысла, когда программное обеспечение было упаковано в физический носитель.

Бен Руджерс
источник
1
В случае развертывания программного обеспечения стоимость полосы пропускания в настоящее время практически не имеет значения. Если это все еще проблема, просто подождите еще 5 минут.
Роберт Харви
2
@RobertHarvey, но это 5 минут, я бы не стал ждать.
Артуро Торрес Санчес
2

Одна из причин, почему толстые двоичные файлы не увенчались успехом, заключается в том, что существует больше, чем спецификации 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-х (или в эпоху мэйнфреймов).

Наконец, толстые двоичные файлы являются толстыми: вы потратите много ресурсов (время сборки, пропускную способность, размер исполняемого файла) на проблему переносимости, которая может не беспокоить многих людей. Вспомните афоризм: «нет переносимого программного обеспечения, только программное обеспечение, которое было перенесено» (для некоторых конкретных систем).

Василий Старынкевич
источник
4
Я оспариваю идею о том, что «бесплатное» программное обеспечение делает его легко переносимым.
Роберт Харви
3
Это не делает программное обеспечение переносимым, но оно позволяет кому-то тратить усилия на портирование его на какую-то другую платформу (чего вы не сможете реально сделать, если у вас нет доступа и права изменять исходный код)
Василий Старынкевич,
2
@RobertHarvey, в принципе, не может быть никакой фундаментальной связи, но есть несколько совершенно прагматичных причин, по которым Свободное ПО очень широко распространилось на стольких платформах и создало так много кроссплатформенных инструментов сборки и цепочек инструментов.
Брюс
Приложение с закрытым исходным кодом, полностью зависящее от открытых исходных кодов, переносимых платформ и библиотек, будет проще переносить на другие платформы владельцем приложения с закрытым исходным кодом. Я говорю это на собственном опыте счастья, когда узнал, что «кодирование в стиле OpenCV» - это все, что вам нужно (для обработки изображений). Конечно, для GUI все еще требуются другие фреймворки, такие как Qt и т. Д. (Хотя я не имею непосредственного опыта в этом).
rwong
4
@RobertHarvey Это не так. Свободное программное обеспечение, которое является абсолютным беспорядком для портирования, по-прежнему является абсолютным беспорядком для портирования - вы просто увеличиваете поверхность, на которой вы можете поймать кого-то, кто заботится об использовании его на конкретной архитектуре или ОС, достаточно для его портирования, или предложите путь, который сделать портирование что-то, что не заставляет людей кровоточить.
Тим Пост