Официальный релиз LLVM 3.3

в 23:55, , рубрики: c++, c++11, clang, LLVM, Компиляторы, метки: , ,

Для тех, кто не следит пристально за развитием Clang/LLVM, сообщаю — состоялся релиз версии 3.3. LLVM продолжает развиваться семимильными шагами и новый релиз, как заявлено, первым поддерживает все фичи C++11, добавлена поддержка целой пачки новых таргетов и появилось несколько интересных тулов, основанных на инфраструктуре LLVM. Также продолжает развиваться оптимизатор — появился автовекторизатор, который работает по умолчанию на -O3, много сделано для улучшения уже уже существующих оптимизаций. Кому интересны подробности — добро пожаловать под кат.

Начнём с поддержки C++11. Заявлена полная поддержка, включая библиотечную поддержку таких важных фич, как например, std::regex. О завершении работы над С++11 в транке было объявлено в LLVM blog'е ещё в апреле и теперь разработчики фронт-энда заняты работой над поддержкой драфта следующего стандарта, который именуется С++1y. Говорят, что после того, как после релиза С++11 нашлось несколько досадных огрехов, Бьерн Страуструп заявил, что не выпустит нового стандарта, пока все фичи не будут реализованы хоть в одном компиляторе. Так что остаётся только поприветствовать активность разработчиков clang'а.

Для тех, кто готов начать использовать С++11 прямо сейчас в уже существующих проектах, предлагается специальный C++11 Migration Tool. С помощью этой утилиты вы сможете автоматически конвертировать старые циклы в range-based for циклы, расставить использование nullptr вместо инициализации указателей нулями, изменить тип в объявлениях переменных на auto там, где это уместно, и добавить override к объявлениям виртуальных функций. Отрадно отметить, что этот тул разработан сотрудниками компании Intel, которая начинает всё больше инвестировать в LLVM наряду с Apple и Google.

Ещё один интересный инструмент, который стал возможен благодаря открытости и расширяемости Clang, это clang-format. Он позволяет форматировать исходный код согласно заданному стилю, но при этом отличается от своих аналогов тем, что, используя различные компоненты Clang, получает информацию о синтаксической структуре кода, достаточную для полного переформатирования, практически не ориентируясь на исходное форматирование (за редкими исключениями: например, он может оставлять пустые строки, разделяющие логические блоки кода, и сохранять привязку комментария к комментируемым сущностям). При этом clang-format не использует целиком парсер Clang, что позволяет использовать его для любых фрагментов исходника, похожих на корректный C++ код. И если во времена С можно было обойтись относительно простыми подходами, то обилие синтаксических конструкций в C++ и их зависимость от контекста требуют от подобного инструмента достаточно глубокого понимания кода. Кому интересны подробности, рекомендую посмотреть видео с конференции, где один из разработчиков рассказывает об этом инструменте: материалы конференции, ищите «clang-format — Automatic formatting for C++». Кстати, также доступны плагины для Vim и Emacs, которые позволяют форматировать текст на лету.

Оптимизатор также неплохо прибавил. Главное нововведение — автовекторизатор циклов, включённый по умолчанию на -O3. Как известно, чуть меньше года назад Apple начала активно продвигать создание автовекторизатора и сейчас мы можем наблюдать первые плоды этих усилий. Объективно оценивая статус проекта стоит отметить, что хоть и до лучшего доступного на рынке автовекторизатора для x86 (реализованного в Intel Compiler) ещё в лучшем случае многие годы разработки и конкуренция с GCC пока тоже не в пользу новичка, но даже относительно простое решение способно дать пользователю заметные бенефиты. Ведь как известно 80% результата достигается 20% усилий. И пусть не пинают меня за аффелированность с компанией Intel, думаю с такой оценкой согласятся многие.

Перечислять же более мелкие улучшения в оптимизациях бессмысленно. Просто скажу, что в том, что касается скалярных оптимизаций, Clang готов поспорить и с GCC, и с Intel Compiler, а иногда и обыграть этих зубров оптимизации. Неплохо себя чувствует и LTO (link time optimizations) — но в то время как результаты хоть и неплохие, один из архитекторов признает, что там есть фундаментальные проблемы, которые ещё предстоит решить. Заинтригованным столь дерзким заявлением советую посмотреть keynote «Optimization in LLVM — Numbers, A Case Study, and Looking Forward» товарища Chandler'а на всё той же конференции.

В Release Notes на удивление обошли стороной одну из самых сильных сторон Clang'а — его непревзойдённую точность и детализацию диагностики, над которой тоже продолжают работать (скажем прямо, на фоне такого конкурента разработчикам GCC стало стыдно и они тоже хорошо прибавили в этом направлении). В семействе инструментов динамической верификации кода, так называемых санитайзеров, тоже прибавление — в дополнению к Address и Thread Sanitizer добавился Memory Sanitizer. Для тех, кто пользуется статической проверкой кода, тоже хорошая новость — Clang Static Analyzer теперь поддерживает несколько новых типов проверок и умеет ходить через границы С++ конструкторов и деструкторов.

В новом релизе появилась поддержка новых таргетов, самыми заметыми из которых стали AArch64 и AMD R600 GPU. Также в списке присутствет IBM's z/Architecture S390 — думаю, поддержка такой архитектры, это уже заявка на зрелость компилятора. Кому-то возможно будет интересн серьёзно улучшенный бек-энд PowerPC и поддержка MIPS.

Официальные Release Notes достуны тут, а сам компилятор для различных платформ можно скачать здесь.

Автор: DmitryBabokin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js