Почему для C / Код C++ важно быть компилируемым на различных компиляторах?

Я интересуюсь различными аспектами мобильности (как Вы видите при просмотре моих других вопросов), таким образом, я читал много об этом. Довольно часто я читал/слышал, тот Код должен быть написан способом, который делает его компилируемым на различных компиляторах.

Без любого реального опыта с gcc / g ++, мне кажется, что он поддерживает каждую основную платформу, которую можно вообразить, таким образом, Код, который компилирует на g ++, может работать почти на любой системе. Итак, почему кто-то потрудился бы работать на его коде Компилятор MS, компилятор Intel и другие?

Я могу думать о некоторых причинах, также. Как FAQ предлагают, я попытаюсь отправить их как ответ, настроенный против включения их в мой собственный вопрос.

Править: Заключение

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

  • Участники, намного более вероятно, будут работать мой проект или просто использовать его, если они могут использовать компилятор своего выбора
  • Быть компилируемым везде, быть применимым с будущими компиляторами и инструментами, и соблюдение стандартов осуществляют друг друга, таким образом, это - хорошая идея

С другой стороны, я все еще полагаю, что существуют другие вещи, которые более важны, и теперь я знаю, что иногда это не важно вообще.

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

15
задан Lena Schimmel 2 January 2010 в 22:07
поделиться

13 ответов

Для большинства языков меня меньше волнует портативность и больше - соответствие международным стандартам или принятым определениям языка, из которых, скорее всего, следует портативность свойств. Для языка Си, однако, переносимость является полезной идеей, потому что очень трудно написать программу, которая "строго соответствует" стандарту. (Почему? Потому что комитеты по стандартизации посчитали нужным поделиться некоторой существующей практикой, включая предоставление компиляторам некоторой свободы, которая может им не понравиться)

Так зачем же пытаться соответствовать стандарту или делать свой код приемлемым для нескольких компиляторов, а не просто писать то, что gcc (или другой любимый компилятор) примет?

  • Вероятно, в 2015 году gcc примет скорее другой язык, чем тот, который принят сегодня. Вы бы предпочли не переписывать свой старый код.

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

  • Если ваш код компилируется любым компилятором ANSI C прямо из коробки, без ошибок и предупреждений, то ваша жизнь пользователей будет проще, и ваше программное обеспечение может быть широко портировано и использовано.

  • Возможно, кто-то изобретет отличный новый инструмент для анализа программ на Си, рефакторинга программ на Си, повышения производительности программ на Си или поиска ошибок в программах на Си. Мы не уверены, на какой версии Си этот инструмент будет работать или на каком компиляторе он может быть основан, но почти наверняка инструмент примет стандартный Си.

Из всех этих аргументов, это аргумент в пользу инструмента, который я нахожу наиболее убедительным. Люди забывают, что с исходным кодом можно делать и другие вещи, кроме как просто скомпилировать его и запустить. На другом языке, Haskell, инструменты для анализа и рефакторинга сильно отстали от компиляторов, но люди, которые застряли со стандартом Haskell 98, имеют доступ к еще большему количеству инструментов lot. Похожая ситуация вероятна и для Си: если я собираюсь пойти на попытку собрать инструмент, я буду основывать его на стандарте со сроком службы 10 лет или около того, а не на версии gcc, которая может измениться до того, как мой инструмент будет закончен.

Тем не менее, многие люди могут позволить себе полностью игнорировать переносимость. Например, в 1995 году я изо всех сил пытался убедить Линуса Торвальдса скомпилировать Linux с помощью любого ANSI компилятора C, а не только gcc. Линус не интересовался тем, что, как я подозреваю, он пришел к выводу, что в этом нет ничего ни для него, ни для его проекта. И он был прав. Компиляция Linux только с помощью gcc была большой потерей для исследователей компилятора, но для Linux это не было потерей. Инструментальный аргумент" не подошёл для Linux, потому что Linux стал так дико популярен; люди, собирающие инструменты анализа и поиска ошибок для программ на Си, были готовы работать с gcc, потому что работа под Linux позволила бы их работе иметь большое влияние. Так что если вы можете рассчитывать на дикий успех вашего проекта, как Linux или Mosaic/Netscape, вы можете позволить себе игнорировать стандарты :-)

.
9
ответ дан 30 November 2019 в 23:49
поделиться

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

.
5
ответ дан 30 November 2019 в 23:49
поделиться

Portability. Если вы хотите, чтобы ваш код был доступен максимальному количеству людей, вам необходимо сделать так, чтобы он работал на самом широком наборе компиляторов. Это та же идея, что и заставить сайт работать на браузерах, отличных от IE.

Некоторые из них политические. У компаний есть стандарты, у людей есть любимые инструменты и т.д. Говорить кому-то, что они должны использовать X, действительно отталкивает одних людей, и делает его действительно недоступным для других.

Неманья тоже поднимает хороший вопрос, нацеленность на то, чтобы определенный компилятор заставил вас использовать его. В мире Open Source это может быть не такой большой проблемой (хотя люди могут просто перестать разрабатывать на нем, и он устареет), но что если компания, которую вы покупаете, прекратит выпуск продукта или выйдет из бизнеса?

12
ответ дан 30 November 2019 в 23:49
поделиться

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

Хорошо быть компилируемым под компилятором Intel, потому что он часто компилирует более быстрый код.

Хорошо быть компилируемым под Clang, потому что это может дать лучшие сообщения об ошибках и обеспечить лучший опыт разработки, и это более легкий проект для работы, чем GCC, и поэтому может получить дополнительные преимущества в будущем.

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

И даже если вы обычно собираетесь компилировать только под GCC, убедитесь, что ваш код, компилируемый под другими компиляторами, также, скорее всего, поможет найти проблемы, которые могут помешать вашему коду работать с прошлыми и будущими версиями GCC, например, если есть что-то, что GCC сейчас менее строгий, но позже добавляет проверки, другой компилятор может поймать вас заранее, помогая поддерживать ваш код в чистоте. Я нашел это полезным в обратном случае, когда GCC поймал больше потенциальных проблем с предупреждениями, чем MSVC (MSVC - единственный компилятор, который нам нужно было поддерживать, так как мы поставляли только под Windows, но мы сделали частичный порт на Mac под GCC в наше свободное время), что позволило мне производить более чистый код, чем я бы сделал в противном случае

.
13
ответ дан 30 November 2019 в 23:49
поделиться

Некоторые причины из головы:

1) Чтобы не быть заблокированным у одного производителя компилятора (с открытым исходным кодом или без).

2) Компиляция кода разными компиляторами, скорее всего, обнаружит больше ошибок: предупреждения разные, и разные компиляторы поддерживают Стандарт в разной степени.

.
20
ответ дан 30 November 2019 в 23:49
поделиться

Итак, вот причины, по которым я могу думать о

  • , если наибольшее беспокойство вызывает скорость и есть специальный, высоко оптимизированный компилятор для некоторых платформ
  • , если вы собираете библиотеку с интерфейсом C++ (классов и шаблонов, а не только функций). Из-за искажения имен и прочего, библиотека должна быть скомпилирована тем же компилятором, что и клиентский код, и если клиент хочет использовать Visual C++, то он должен быть в состоянии скомпилировать lib с ним
  • если вы хотите поддержать какую-то очень редкую платформу, которая не имеет поддержки gcc

(Для меня эти причины несущественны, так как я хочу собрать библиотеку, которая использует C++ внутри, но имеет C-интерфейс)

.
4
ответ дан 30 November 2019 в 23:49
поделиться

Я не думаю, что кто-либо упоминал об этом до сих пор, но другой причиной может быть доступ к определенным платформоспецифическим особенностям : Многие производители операционных систем имеют специальные версии GCC, или даже собственные отечественные (или лицензированные и модифицированные) компиляторы. Поэтому, если вы хотите, чтобы ваш код хорошо работал на нескольких платформах, Вам может понадобиться выбрать правильный компилятор на каждой платформе. Будь то встроенная система, MacOS, Windows и т.д.

Кроме того, скорость может быть проблемой (как скорость компиляции, так и скорость исполнения). Во времена PPC GCC выпускал печально известный медленный код на процессорах PowerPC, поэтому Apple поместила кучу инженеров на GCC, чтобы улучшить это (GCC был очень новым для Mac, а все остальные платформы PowerPC были небольшими). Платформы, которые используются меньше, могут быть меньше оптимизированы в GCC, поэтому использование другого компилятора, написанного для этой платформы, может быть быстрее.

Но в заключение: Хотя идеальная ценность компиляции на нескольких компиляторах существует, на практике это в основном интересно для кроссплатформенного программного обеспечения (и программного обеспечения с открытым исходным кодом, потому что его часто довольно быстро делают кроссплатформенным, и авторам проще, если они могут использовать свой компилятор по выбору вместо того, чтобы учиться новому). Если нужно поставлять только на одной платформе, то shipping и maintenance обычно гораздо важнее, чем инвестировать в сборку на нескольких компиляторах, если вы выпускаете сборки, сделанные только на одном из них. Тем не менее, вы захотите четко задокументировать любые отклонения от стандарта (например, GCC-измы), чтобы облегчить работу по переносу, если вам когда-нибудь понадобится это сделать.

.
2
ответ дан 30 November 2019 в 23:49
поделиться

И компилятор Intel и llvm быстрее gcc. Реальными причинами использования gcc являются

  • Бесконечная аппаратная поддержка (ни на одном другом компиляторе вы не сможете скомпилировать ледяной ментальный штурмовой код на старом DEC).

  • Это дешевый

  • лучший оптимизатор спагетти в бизнесе.

1
ответ дан 30 November 2019 в 23:49
поделиться

Это один из тех вопросов "Это зависит". Для открытого кода хорошо быть переносимым на несколько компиляторов. В конце концов, когда люди в разных средах собирают код, это вроде как вопрос.

Но для закрытых исходных текстов это гораздо менее важно. Никогда не хочется неоправданно привязывать себя к конкретному компилятору. Но в большинстве мест, где я работал, переносимость компилятора даже не попала в десятку самых важных вещей, которые нас волновали. Даже если вы никогда не используете ничего, кроме standerd C/C++, переключение большой базы кода на новый компилятор - опасная вещь. В компиляторах есть ошибки. Иногда в вашем коде будут ошибки, которые доброкачественны на одном компиляторе, но внезапно возникают проблемы на другом.

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

for (int ii = 0; ii < n; ++ii) { /* some code */ }
for (int ii = 0; ii < y; ++ii) { /* some other code */ }

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

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

Другое место пробовало новый компилятор в течение от 6 месяцев до года, прежде чем они переходили на него.

.
4
ответ дан 30 November 2019 в 23:49
поделиться

Обычно именно по этим причинам я нахожу:

  • кросс-платформенные (windows, linux, mac)
  • разные разработчики, занимающиеся разработкой на разных операционных системах (хотя это и не оптимально, но случается - тестирование обычно происходит только на целевой платформе).
  • Компиляторы выходят из бизнеса - или прекращают разработку на этом языке. Если вы хорошо знаете, что ваша программа компилируется/запускается с помощью другого компилятора, то вы сделали ставку.

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

.
4
ответ дан 30 November 2019 в 23:49
поделиться

Несколько проектов используют GCC/G++ как "повседневный" компилятор для нормального использования, но каждый раз так часто проверяют свой код на соответствие стандартам с помощью Comeau C/C++ компилятора . Их сайт выглядит как кошмар, и компилятор не бесплатный, но он известен как, возможно, самый стандартный компилятор в мире, и предупредит Вас о вещах, которые многие компиляторы будут молча принимать или явно допускать в качестве нестандартного расширения (да, я смотрю на Вас, господин компилятор). Я-я-я не-думаю- и-фактически-активно-поддерживаю-что-бы-делать-показатели-аритметики-на-указатели-GCC).

Компиляция так часто компилятором так строго, как Comeau (или, что еще лучше, компиляция с таким количеством компиляторов, как Вы можете получить) даст Вам знать об ошибках, которые могут возникнуть у людей, пытающихся компилировать Ваш код, вещи, которые ваш компилятор разрешает вам делать, а потенциально вещи, которые другие компиляторы не разрешают вам делать, вы должны делать. Написание ANSI C или C++ должно быть важной целью для кода, который вы собираетесь использовать на нескольких платформах, и использование компилятора, соответствующего самым высоким стандартам, является хорошим способом сделать это.

(Отказ от ответственности: у меня нет Comeau, и я не планирую его получить, и не могу его получить, потому что я на OS X. Я делаю C, а не C++, так что на самом деле я могу знать весь язык, а средний компилятор C намного ближе к стандарту C, чем средний компилятор C++ к стандарту C++, так что для меня это не такая уж и большая проблема. Просто хотел поместить это сюда, потому что это начало выглядеть как реклама для Comeau. Это следует рассматривать скорее как объявление для компиляции с большим количеством различных компиляторов)

.
4
ответ дан 30 November 2019 в 23:49
поделиться

Для приложений (особенно для приложений с открытым исходным кодом) очень распространено, что другие разработчики захотят использовать разные компиляторы. Некоторые предпочли бы использовать Visual Studio с MS Compiler для разработки. Некоторые предпочли бы использовать компилятор Intel для заявленной производительности и так далее

.
4
ответ дан 30 November 2019 в 23:49
поделиться

Я нахожу gcc медленным компилятором на windows (не с чем сравнивать под linux). Поэтому мне (иногда) хочется компилировать свой код под другими компиляторами, просто для более быстрых циклов разработки.

2
ответ дан 30 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: