# Компиляторы

> Компилятор, сделай мне хорошо [(C)](https://vk.com/itmoquotes?w=wall-153124242_22) Цитаты великих людей

Выделим наиболее популярные компиляторы:

* [Clang](https://clang.llvm.org/) (*clang c*, *clang++*, далее *LLVM*). Скачать собранную версию можно по ссылке: <https://github.com/llvm/llvm-project/releases>.
* [Visual C++](https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170) (далее *MSVC*). Поставляется вместе с Visual Studio.
* [Intel](https://www.intel.com/content/www/us/en/developer/tools/oneapi/overview.html#gs.ovgv6k) (icx c, icx c++). Скачиваем [отсюда](https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html): `Select OS` - `Offline installer` - `Continue as a Guest (download starts immediately) /* под большой кнопкой Sign up & download */`.
* [GCC](https://gcc.gnu.org/) (gcc, g++).
* [MinGW](https://www.mingw-w64.org/). 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, нужно выбрать Разработка классических приложений на С++.

<figure><img src="/files/uQ2fvI5rfbn7XvCaEnCg" alt="Visual Studio"><figcaption></figcaption></figure>

## Об особенностях компиляторов

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

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

Еще один интересный момент, который следует рассмотреть, – это **реализация стандартной библиотеки**. По крайней мере, GCC, LLVM и MSVC поставляют свою собственную реализацию стандартной библиотеки с соответствующими компиляторами. Эти реализации будут отличаться, учитывая лицензирование и корпоративную поддержку компиляторов.

Следующее различие между компиляторами заключается в **оперативности** – насколько быстро добавляется поддержка последних нововведений стандарта (опубликованные ISO). GCC и Clang часто первыми предлагают поддержку новых функций C++, MSVC очень быстро поддерживает, что хотят, и много лет не поддерживают, что не хотят. Все GCC, Clang и MSVC также поддерживают некоторые экспериментальные функции и собственные расширения, ни с чем больше не совместимые.

Пример с OpenMP: Поддержка OpenMP в MSVC по умолчанию достаточно древняя (2.0), некоторые возможности более новых версий можно получить в новых версиях MSVC указанием специального ключа компиляции (и некоторыми заморочками с dll). В это время последние версии [GCC](https://gcc.gnu.org/wiki/openmp) и [Clang поддерживают](https://clang.llvm.org/docs/OpenMPSupport.html#openmp-5-1-implementation-details) версию 4.5 и часть функционала версий 5.0 и выше.

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://skkv-itmo.gitbook.io/c-cpp-cookies/environments/compilers.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
