1

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

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

Почему тогда, когда вы хотите загрузить программу для Интернета, вам обычно предоставляется выбор, основанный на вашей ОС, а не на архитектуре набора команд?

Кроме того, поскольку существует так много архитектур набора команд, я не могу себе представить, как выглядит установщик. Например, если установщик поддерживает 20 различных архитектур, отбрасывается ли 95% данных во время установки?

1 ответ1

2

Содержат ли установочные файлы, такие как .deb, машинные инструкции для каждой поддерживаемой архитектуры?

Нет, пакеты .deb - и, как правило, пакеты почти для всех систем упаковки Linux - созданы только для одной конкретной архитектуры. Обычно эта архитектура даже отмечается в имени файла.

Почему тогда, когда вы хотите загрузить программу для Интернета, вам обычно предоставляется выбор, основанный на вашей ОС, а не на архитектуре набора команд?

  • Windows в основном поддерживает только архитектуру x86(_64). (Большинство разработчиков не считают Alpha AXP и Itanium актуальными, а версия Windows для ARM вообще не позволяет запускать сторонние программы.)

  • OS X и iOS используют "толстые двоичные файлы" (см. Ниже).

  • Для Linux/BSD предоставляется скомпилированный исходный код, и конечный пользователь - или упаковщик дистрибутивов - создает его для необходимой архитектуры.

    (Что делать, если программное обеспечение предоставляется только в двоичном виде?
    Ну, в 99% случаев, если вы не на x86, то вы облажались.)

  • Приложения Android распространяются в виде байт-кода Dalvik; они переводятся в нативный код во время установки (если у вас есть ART).

  • "Управляемый" код .NET работает так же; файлы .exe содержат байт-код CIL, который ngen может преобразовать в собственный код во время установки или который может быть запущен непосредственно во время выполнения .NET.

Например, если установщик поддерживает 20 различных архитектур, отбрасывается ли 95% данных во время установки?

Зависит от способа установки. (Предположим, что программа построена как собственный двоичный файл, а не как байт-код Android/.NET/Java.)

  • В случае с Windows, как правило, у вас есть несколько разных инсталляторов с одной архитектурой, и вы загружаете только нужный.

    Но когда программа поставляется в виде одного мультиархитектурного компакт-диска, тогда да, установщик копирует только файлы для вашей архитектуры и игнорирует все остальное. (В конце концов, нет смысла копировать непригодные файлы.)

  • Для пакетов Linux это то же самое - куча арочных конкретных пакетов .deb, например.

  • После перехода с PowerPC на Intel многие программы для OS X создаются в виде "толстых двоичных файлов", где один исполняемый файл содержит код для обеих архитектур, а при его "установке" все копируется точно. (Так что да, программы, как правило, в два раза больше, чем они могли бы быть.)

    Однако я слышал, что iOS App Store переключился на прием только битового кода LLVM и автоматическую компиляцию его в отдельные версии для всех архитектур.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .