Компиляторы
Last updated
Last updated
Компилятор, сделай мне хорошо (C) Цитаты великих людей
Выделим наиболее популярные компиляторы:
Clang (clang c, clang++, далее LLVM). Скачать собранную версию можно по ссылке: https://github.com/llvm/llvm-project/releases.
Visual C++ (далее MSVC). Поставляется вместе с Visual Studio.
GCC (gcc, g++).
MinGW. GCC для Windows.
Clang не является полностью самостотельным компилятором и для работы с ним нужны библиотеки от "родных для ОС" компиляторов: msvc
для Windows и gcc
для остальных. Поэтому для использования clang
нужно установить Visual Studio на Windows.
На данный момент Intel выпускает набор инструментов для разработки Intel OneAPI, в который входит новый компилятор от Intel, представляющий собой по сути LLVM (Clang), но с существенно другим генерируемым кодом. Версии компилятора до Intel OneAPI и Legacy компилятор в OneAPI – это самостоятельная разработка Intel.
Если вы используете GCC/G++ (он же MinGW под Windows), то велик шанс (по незнанию) использования нестандартных библиотек и заголовочных, поставляемых только с этим компилятором. Могут возникать проблемы при написании кроссплатформенного-кросскомпиляторного кода.
Чтобы поставить компилятор в Visual Studio, нужно выбрать Разработка классических приложений на С++.
Разные компиляторы предлагают разные функции и (часто) разрабатываются разными командами разработчиков, поэтому у них разные детали реализации. Все компиляторы С и C++, соответствующие стандарту ISO, должны быть способны преобразовать вашу исходную программу в целевую программу с одинаковым наблюдаемым поведением.
Одно из отличий компиляторов, которое может заинтересовать, – это качество диагностики, предоставляемой каждым из них. Сообщения об ошибках могут незначительно отличаться, а понимание сообщений ошибок и предупреждений могут на самом деле облегчить понимание того, почему код может не компилироваться или работает не так, как вы ожидаете.
Еще один интересный момент, который следует рассмотреть, – это реализация стандартной библиотеки. По крайней мере, GCC, LLVM и MSVC поставляют свою собственную реализацию стандартной библиотеки с соответствующими компиляторами. Эти реализации будут отличаться, учитывая лицензирование и корпоративную поддержку компиляторов.
Следующее различие между компиляторами заключается в оперативности – насколько быстро добавляется поддержка последних нововведений стандарта (опубликованные ISO). GCC и Clang часто первыми предлагают поддержку новых функций C++, MSVC очень быстро поддерживает, что хотят, и много лет не поддерживают, что не хотят. Все GCC, Clang и MSVC также поддерживают некоторые экспериментальные функции и собственные расширения, ни с чем больше не совместимые.
Пример с OpenMP: Поддержка OpenMP в MSVC по умолчанию достаточно древняя (2.0), некоторые возможности более новых версий можно получить в новых версиях MSVC указанием специального ключа компиляции (и некоторыми заморочками с dll). В это время последние версии GCC и Clang поддерживают версию 4.5 и часть функционала версий 5.0 и выше.
Подводя итоги: различные компиляторы, претендующие на поддержку одного и того же стандарта ISO, требуются для создания целевых программ, которые функционально эквивалентны. Они могут оптимизировать вашу целевую программу так, чтобы она была "лучшей" версией вашей исходной программы (но все равно функционально такой же), и они, скорее всего, сделают это по-другому.