Какой лучший компилятор С++?
Может ли компилятор С++ создать не очень хороший двоичный файл? Здесь вы можете думать о производительности и производительности. Существует ли такая вещь, как "лучший" компилятор С++? Если нет, то какие сильные стороны и, конечно же, не очень сильные (известные ошибки и проблемы) точки, известных компиляторов (g++, Intel С++ Compiler, Visual С++ и т.д.).
Существуют ли документированные случаи, когда компилятор произвел неверный вывод, что привело к сбою критически важного программного обеспечения?
Ответы
Ответ 1
g++ кажется самым популярным. Он бесплатный, портативный и неплохой. Порт Windows (MinGW) был действительно устаревшим в последний раз, когда я его использовал (возможно, год назад).
Компилятор Intel С++ считается тем, который генерирует самый быстрый код (однако он знает, что он генерирует плохой код SIMD для процессоров AMD).
Вы можете свободно использовать его на GNU/Linux в довольно жестких условиях.
Я использовал его в течение некоторого времени, и мне понравилось, что он испускает умные предупреждения, которые другие не делают.
VС++ часто считается лучшей С++ IDE, и из того, что я слышу, компилятор тоже неплох. Это бесплатно (как в бесплатном пиве), и доступно только на Windows, конечно.
Если вы заинтересованы в программировании Windows, я бы предложил этот компилятор, потому что он всегда обновлен и предоставляет более сложные функции для этой цели.
Я бы предложил VС++ для Windows, g++ для других ОС. Попробуйте бесплатную версию я ++ самостоятельно, чтобы убедиться, что это стоит денег.
Существуют ли документированные случаи, когда компилятор произвел неверный вывод, что привело к сбою критически важного программного обеспечения?
Да, наверное, но я бы сказал, что большую часть времени, вероятно, это ошибка программиста. Например, если кто-то не знает, как работает арифметика с плавающей запятой, легко написать ненадежный код. Хороший программист должен также знать, что гарантировано для работы на стандарте С++, а что нет. Она также должна знать, каковы пределы компилятора, например. насколько хорошо он реализует стандарт и насколько он оптимизирован.
Ответ 2
Прежде всего, какая платформа, которую вы используете, обычно определяет, какие компиляторы использовать.
Во-вторых, ваш вопрос о надежности и производительности. Я не уверен, что вы подразумеваете под устойчивостью. но если вы имеете в виду правильность скомпилированных двоичных файлов, я должен сказать, что пока вы используете стабильную версию любого из компиляторов, о которых вы упомянули, вы не столкнетесь с проблемами "устойчивости". Эти компиляторы очень зрелые и использовались в бесчисленных реальных проектах. Поэтому я бы не стал беспокоиться о надежности.
Что касается производительности, это сложно ответить, потому что у каждого компилятора есть разные методы оптимизации, которые теоретически могут дать разные результаты. Я надеюсь, что есть кто-то более осведомленный, чем я, который может рассказать вам об этом.
В действительности, учитывая, что компиляторы, о которых вы упомянули, являются высококачественными и зрелыми компиляторами, вопросы, которые вы должны задать, не являются компилятором более надежными, но:
- Какой компилятор поддерживает мою целевую платформу.
- Какой компилятор работает с моей средой разработки и инструментами?
- Какой компилятор - моя команда разработчиков и наиболее знакомые с ней интеграторы.
Однако вопрос о методах оптимизации является открытым вопросом, и в этом нетривиальный вопрос. Я надеюсь, что некоторые могут пролить свет на него.
Ответ 3
Поскольку вы упоминаете "как часть коммерческой системы самолета" в комментарии, может быть полезно посмотреть компиляторы, предоставленные компаниями, которые фактически поддерживают сертификацию в этом пространстве или другие безопасные для продукта области безопасности. Программное обеспечение Green Hills является одним из них. Wind River - это другое.
Ответ 4
В дополнение к Bastien Léonard ответ: есть еще один многоплатформенный компилятор С++ — Comeau. Это самый стандартизованный компилятор С++. Последняя версия имеет поддержку языка С++ 0x.
Ответ 5
Какую платформу вы используете? Например, Visual С++ не будет вам полезен в Linux.
Собственно, трое, о которых вы упоминаете, - это три, которые я выбрал бы по этим причинам.
gcc/g++: с открытым исходным кодом, проверенный, усовершенствованный многолетним опытом совместной работы на многих Linux и UNIX-системах. Не очень сильная точка - это просто автономный инструмент командной строки. Вы можете создать или, возможно, найти свою собственную среду в стиле IDE, но она не "отправляется" таким образом, так сказать.
Visual С++: хорошо поддерживается Microsoft, загружает образцы кода и документацию (MSDN), естественно подключается к API Windows. Не совсем так, что это не особенно, ну, "визуально". Если вы привыкли к Visual Basic (скажем), вы обнаружите, что Visual С++ не работает одинаково.
Компилятор Intel С++: увы, у меня нет опыта работы с компилятором Intel, но я уверен, что он поддерживает parallelism и имеет высокоточные числовые библиотеки.
Возможно, стоит упомянуть Borland С++ Builder. Это становится плюсом для быстрой среды разработки приложений с множеством дополнительных элементов управления благодаря совместимости с Delphi VCL, но, наоборот, код, разработанный в С++ Builder, не просто переносится на другие компиляторы С++.
Ответ 6
Если вы говорите о высокой производительности выходного кода в смысле High Performance Computing, вас также может заинтересовать Компиляторы Portland Group и компиляторы IBM XL.
Ответ 7
Точка оптимизирующего компилятора заключается в том, что она должна генерировать оптимизированную программу, функционально эквивалентную оригиналу. Разумеется, функциональный эквивалент связан с наблюдаемыми эффектами; государство, естественно, не было бы таким же. Любой компилятор, который может генерировать неверный перевод, на мой взгляд, является плохим, хотя я полагаю, что вы могли бы смягчить некоторые проблемы в разных ситуациях. Одним из преимуществ компилятора основного потока является то, что ошибки исправляются быстрее.
В отношении производительности компиляторы обычно выполняют два типа оптимизаций: независимые от платформы оптимизации (на уровне источника/синтаксическом дереве/промежуточном представлении) и специфичные для платформы.
Я бы предположил, что наилучшая независимая от платформы оптимизация, вероятно, связана с различными академическими модификациями существующих компиляторов (но, вероятно, другая оптимизация и каждая). Эти оптимизации в конечном итоге признаются и, в конечном счете, стекаются в мейнстрим.
Что касается оптимизаций для платформы, я думаю, что компании, занимающиеся этими платформами, часто имеют наилучшую оптимизацию (например, внутренние компиляторы Intel), но они еще не интегрированы в компиляторы общей доступности и, в конце концов, также стекаются вниз.
Ответ 8
http://www.compilers.net/Dir/Free/Compilers/CCpp.htm
У Microsoft есть хороший бесплатный компилятор, но если вы работаете над unix или mac, которые мало помогут вам.
В Borland есть хороший бесплатный компилятор.
Я опробовал несколько бесплатных компиляторов и чувствовал себя наиболее комфортно с Dev-С++. Общий пакет относительно небольшой по размеру и поставляется в виде окон и linux. Для меня это прекрасно, чтобы проверить пределы языка С++. Он быстро компилируется и упрощает эксперименты.
Я рекомендую вам это программное обеспечение под названием Digital Mars C/С++ Compiler, и вы можете получить его от
http://www.brothersoft.com/digital-mars-...
это бесплатный компилятор C/С++ для среды Win32, Win16, DOS32 и DOS.
Ответ 9
Я нашел проблемы с использованием Cygwin, такой код, который не компилируется, но генерирует ошибку сегментации внутри компилятора. Этот же код работает с MinGW.
[edit] Вот отчет компилятора:
lista.h: In constructor `Lista<Dado>::Lista() [with Dado = int]':
principal.cpp:15: instantiated from here
lista.h:13: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://cygwin.com/problems.html> for instructions.
У меня нет исходного кода, который сгенерировал ошибку, поэтому я не могу отправить отчет.
[/править]