Почему компиляторы обычно генерируют исполняемые файлы только для платформы, на которой они установлены?

10

Я разработчик C ++ и в попытке лучше понять кроссплатформенную разработку, я пытаюсь лучше понять некоторые детали реализации компиляторов и то, как именно они создают специфичные для ОС двоичные файлы. В разгар своего исследования я понял, что, по крайней мере, какое-то время большинство компиляторов, которые вы загружали для конкретной платформы, скомпилировали двоичные файлы для этой платформы. Поэтому, если вы загрузили IDE, поставляемую с exe-файлом компилятора для Windows, этот компилятор сможет скомпилировать вашу программу только для приложений Windows x86-x64, а не приложений Linux или Mac.

Теперь я понимаю, что для разных платформ требуются разные двоичные форматы, но что мешает, скажем, визуальному компилятору C ++ в Windows генерировать двоичный исполняемый файл linux? Пока у вас есть инструкции по сборке процессора, на котором вы работаете, и библиотек, специфичных для ОС, разве вы не сможете скомпилировать исполняемые файлы для любой платформы на любом компьютере?

Джейсон
источник
5
Существует много кросс-компиляторов: я не уверен, почему вы думаете, что кросс-компиляция встречается редко. Visual C ++ имеет смысл, учитывая, что Microsoft хочет заблокировать Windows, но они даже предоставляют инструменты компилятора Android в VS2017.
Похоже, что многие другие сайты делают его кросс-компиляционным компилятором, который очень сложно реализовать, и только до недавнего времени появилось больше кросс-платформенных компиляторов. Если это так, то мне просто интересно, что затруднит кросс-компиляцию, если вам нужны только определенные инструкции по сборке ЦП и системные вызовы для соответствующей ОС
Jason
Я думаю, что у вас есть проблема с пониманием терминологии, которая может сбить вас с толку. Вы используете взаимозаменяемую тенденцию «кросс-компилятор» и «кросс-платформенный компилятор», но это разные вещи (хотя и связанные): кросс-компилятор - это компилятор для платформы, отличной от той, которую вы используете, и такие вещи были доступны примерно столько же, сколько и компиляторы. Кроссплатформенный компилятор - это компилятор, который использует промежуточный шаг, чтобы отделить обработку и оптимизацию исходного языка от генерации кода для конкретной платформы, чтобы его можно было использовать. ..
Жюль
... для компиляции кода для нескольких целевых платформ с минимальными изменениями. Такие вещи являются более свежим нововведением и гораздо более сложными.
Жюль

Ответы:

18

что мешает, скажем, визуальному компилятору C ++ в Windows генерировать двоичный исполняемый файл linux?

Кроме нежелания делать это со стороны Microsoft, абсолютно ничего. Препятствия не являются техническими.

Наборы инструментов разработки - это просто программы, которые принимают и выводят результаты. Visual C ++ создает сборку x86, а затем использует ассемблер для преобразования ее в объектный файл COFF. Если Microsoft вместо этого хотела, чтобы она генерировала ELF, это всего лишь код: приходит сборка, ELF уходит. В объектных файлах или библиотеках нет ничего волшебного; это просто клочки данных в понятном формате.

Еще в каменном веке кросс-компиляция была намного сложнее, потому что чаще всего вы писали бы цепочку инструментов для вашей целевой платформы в сборке для платформы, на которой она будет работать. Это означало, что если бы в мире существовали только архитектуры VAX, M68K и Alpha, то для полного набора кросс-компиляторов потребовалось бы написать девять из них, в основном с нуля. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K и т. Д.) Это немного преувеличено, поскольку части компилятора VAX могут быть повторно использованы и подключен к генераторам кода для каждой цели (например, VAX, M68K и Alpha, каждый написан для VAX.)

Эта проблема ушла, когда мы начали писать компиляторы на языке, который не был привязан к конкретному процессору, например, C. Такой путь означает, что вы пишете весь набор инструментов один раз в C и используете платформу, написанную для локальной платформы. Компилятор C, чтобы построить это. (Вы часто используете компилятор для перекомпиляции после того, как он был загружен на компиляторе локальной платформы, но это другое обсуждение.) Результатом этого является то, что сборка кросс-компилятора стала по существу такой же, как и сборка собственного компилятора на местная платформа. Единственным существенным отличием является то, что где-то в процессе сборки вы сказали, чтобы он компилировался в генераторе кода для вашей целевой платформы, а не для локальной платформы, что было бы логичным выбором.

По мере развития архитектуры компиляторов стало удобно просто включать и создавать все генераторы кода вместе с продуктом и выбирать, какой из них будет использоваться во время выполнения. Clang / LLVM делает это, и я уверен, что есть и другие.

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

Blrfl
источник
Теперь это лучший, самый глубокий ответ. Я думаю, что история действительно помогает понять контекст.
Джейсон
3
@ Джейсон Иногда стоит быть старым. :-)
Blrfl
4
«Кроме нежелания делать это со стороны Microsoft, абсолютно ничего». - Я бы не назвал это "нежеланием". Microsoft является публично ориентированным на прибыль бизнесом; у них есть определенные обязанности перед своими акционерами и заинтересованными сторонами. Им нужно будет нанимать, обучать и платить разработчикам за бэкэнд Linux, им нужно будет нанимать, обучать и оплачивать тестировщиков за бэкэнд Linux, им нужно будет нанимать, обучать и оплачивать персонал поддержки, знакомый с бэкэндом Linux, им нужно будет проектировать, разрабатывать, поддерживать, поддерживать и расширять код, и все это для платформы, которая…
Йорг Миттаг
... вне их основного бизнеса. И все это просто для добавления n + 1-го компилятора к уже существующим n компиляторам, которые вы также можете использовать. Какую выгоду Microsoft может конкурировать с GCC, Clang, ICC (Intel), xlc (IBM), Digital Mars, tcc, pcc, TenDRA, Metrowerks, PathScale,…? Лично я не думаю, что есть.
Йорг Миттаг
3
@ JörgWMittag What would be the business benefit ... I don't think there is any.- это хорошая причина для нежелания делать это.
Blrfl
8

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

Есть две проблемы, которые, как правило, возникают:

  1. Люди не фокусируются на этом, потому что это менее распространенный сценарий. Часто единственное, что вы кросс-компилируете, это компилятор, так что вы можете остановить кросс-компиляцию. Меньшая концентрация означает худшую поддержку.
  2. Нетривиальным программам нужно больше, чем просто код. Работа с включением / связыванием библиотек становится немного легче, когда у вас есть библиотеки для платформы, на которой вы работаете. Они будут в хорошо известном месте, в хорошо известной кодировке.

Они не являются непреодолимыми, конечно. В основном, вы получаете компиляторы, предназначенные для платформы, на которой они работают, потому что это то, что люди хотят.

Telastyn
источник
Понимаю. Спасибо за разъяснение. Определенно имеет больше смысла для меня сейчас.
Джейсон
Я виню в этом интеллигентность.
Джеффо
2

Я не согласен с вашей предпосылкой. Есть миллионы разработчиков Android и iOS. И все они используют компиляторы, работающие на Windows или Mac, производящие код для совершенно другого компьютера.

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

Так сколько же Microsoft заработает, если их компиляторы будут собираться и для Linux? Примерно 0 долларов. Сколько еще программного обеспечения для Windows будет создано? Никто. Сколько еще программного обеспечения для Linux будет создано? Понятия не имею, но это не то, что заботит Microsoft. Какова будет стоимость? Довольно значительно. Компиляторы должны быть без ошибок. Они должны быть проверены.

Еще одна проблема: если вы пишете компилятор для Windows, вам нужен кто-то, кто знает, как писать программы для Windows. Если вы пишете компилятор для Linux, вам нужен кто-то, кто знает, как писать программы для Linux. Если вы напишите компилятор для Linux, работающий под Windows, вам вдруг понадобится гораздо более редкий хлеб разработчика, который знает как Windows, так и Linux.

gnasher729
источник
«Существуют миллионы разработчиков Android и iOS. И все они используют компиляторы, работающие на Windows или Mac, производящие код для совершенно другого компьютера». Хм, нет, не они. Многие, многие разработчики Android используют Linux, и на самом деле это самая популярная платформа для разработчиков, согласно собственному опросу StackExchange.
Майлз Рут