Как мы можем распространять скомпилированный исходный код, если он указан c, на оборудование, на котором он был скомпилирован? - PullRequest
1 голос
/ 11 июля 2020

Предположим, мы берем скомпилированный язык, например, C++. Теперь давайте возьмем пример Framework, допустим Qt. Qt имеет общедоступный исходный код и позволяет пользователям загружать двоичные файлы и разрешать пользователям использовать их API. Мой вопрос, однако, заключается в том, что когда они компилировали свой код, он был скомпилирован в соответствии с их спецификациями c HardWare, Операционная система и все такое. Я понимаю, сколько программного обеспечения требует перекомпиляции для разных типов операционных систем (включая 32 и 64-битные) и предлагает несколько загрузок на своем веб-сайте, однако как не go даже дальше предполагать, что это также аппаратная спецификация c и в конечном итоге приводит при перераспределении скомпилированных исполнений крайне сложно производить?

1 Ответ

1 голос
/ 11 июля 2020

Код компилируется в целевой базовый ЦП (например, 32-разрядный x86, x86_64 или ARM), но не обязательно для процессора с спецификацией c, такого как Core i9-10900K. По умолчанию компилятор обычно генерирует код для работы на самом широком диапазоне процессоров. А Intel и AMD гарантируют прямую совместимость для выполнения этого кода на новых процессорах. Компиляторы часто предлагают переключатели для оптимизации для работы на новых процессорах с новыми наборами инструкций, но вы делаете это редко, поскольку не у всех ваших клиентов есть такая конфигурация. Или, возможно, вы создаете свой код дважды (один раз для старых процессоров и оптимизированная сборка для новых процессоров).

Существует также концепция, называемая кросс-компиляцией. Вот где компилятор генерирует код для совершенно другого процессора, чем он работает. Так обстоит дело, когда вы создаете приложение iOS на Ma c. Сам компилятор представляет собой программу x86_64, но он генерирует набор инструкций процессора ARM для запуска на iPhone.

. Код компилируется и связывается с определенным набором API ОС и внешними библиотеками времени выполнения (включая C / Среда выполнения C ++). Если вы хотите, чтобы ваш код запускался на Windows 7 или Ma c OSX Maverics, вы не станете статически ссылаться на API, который существует только в Windows 10 или Ma c OS Big Sur. Код будет компилироваться, но не будет работать в более старых операционных системах. Вместо этого вы должны сделать обходной путь или условно загрузить API, если он доступен. Microsoft и Apple обеспечивают прямую совместимость, предоставляя те же самые API-интерфейсы библиотеки времени выполнения, которые будут доступны в более поздних выпусках ОС.

Дополнительно Windows поддерживает выполнение 32-разрядных процессов на 64-разрядных микросхемах и ОС. Ma c может даже эмулировать x86_64 на своих новых устройствах на базе ARM, которые появятся позже в этом году. Но я отвлекся.

Что касается Qt, они на самом деле предлагают несколько готовых конфигураций для своих эталонных двоичных загрузок. Поскольку, по крайней мере, на Windows, MSVCRT (C -время выполнения API из Visual Studio) тесно связаны с разными версиями компилятора Visual Studio. Поэтому они предлагают различные загрузки в соответствии с конфигурацией, для которой вы хотите создать свой код (32-разрядная, 64-разрядная, VS2017, VS2019, et c ...). Поэтому, когда вы собираете полное приложение со сторонними зависимостями, необходимо учитывать некоторые из этих конфигураций сборки, связывания и ЦП / ОС.

...