Информация История о моём знакомстве с LLVM ❤️

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
605
868
Добрейшего времени суток всем форумным! На связи Receiver со статьёй о скорости работы IntelliSense и предложением лучшего аналога. Данная статья написана преимущественно для CMake Enjoyers, но тулза о которой пойдёт речь способна работать практически везде. Статья предлагает вам путь, которым можно пойти после освоения экосистемы Microsoft и по сути своей является некой подложкой статьи от @SR_team. Вам не стоит бояться на своём пути препятствий или потраченного времени и двигаться только вперёд.

1719050011224.png

Рисунок 1 — Расширение «C/C++ Extension Pack» из магазина расширений Visual Studio

Насколько вас устраивает скорость работы IntelliSense? Вероятно вряд ли вы дадите ему больше 5 баллов на 10 бальной шкале и это будет правдой. Особенно хорошо падение скорости ощущается на проекте содержащим 30+ заголовочных файлов и хотя бы одним подключением заголовка <Windows.h>. Поэтому первым же делом при переезде моего проекта на CMake я занялся этой проблемой. Поиски аналога не заняли много времени, почти сразу же я узнал о структуре LLVM и его стоковом компиляторе — Clang. Я ринулся в интернет искать сравнения их отличительных особенностей и сравнения скорости. Давайте же посмотрим на этот график сравнения скорости работы от пользователя Reddit сделанном в 2022 году на проекте работающим с 3D-графиком и огромным количеством файлов.

График 1 — Cравнение производительности во времени компиляции тяжёлого проекта с 3D-графикой:

chart.png


График 2 — Сравнение производительности во времени выполнения при вычислении числа Фибоначчи от 200 миллионов:

chart(1).png


На данных графиках вы можете увидеть что MSVC дичайше отстаёт по скорости от Clang, а от Rust базирующемся на инфраструктуре LLVM и подавно. Да, это графики сравнения именно Clang и MSVC, но они так же верны и для Clangd, ведь под капотом он базируется на инфраструктуре Clang. Интересно в чём же заключается причина такого аутсайдерства MSVC? Ниже представлен список некоторых отличительных особенностей работы Clang:
  • Clang известен более коротким временем компиляции по сравнению с MSVC, благодаря более эффективной архитектуре компилятора и лучшей поддержке прекомпилированных заголовков. Это может быть важным фактором при работе с крупными проектами.​
  • Clang и MSVC поддерживают оптимизацию SSE2/AVX2. Однако, Clang может генерировать более эффективный код при использовании этих расширений набора команд, благодаря более агрессивным алгоритмам оптимизации и лучшей поддержке автовекторизации. Кроме того, Clang поддерживает более новые расширения набора команд, такие как AVX-512, что может быть важно для оптимизации кода для новых процессоров.​
  • Clang и MSVC используют различные стратегии оптимизации кода. Например, Clang использует более агрессивные алгоритмы анализа кода и преобразований, таких как проходка по графу зависимостей (Dependency-Based Analysis) и статический анализ кода (Static Analysis). Эти алгоритмы позволяют Clang выявлять больше возможностей для оптимизации и генерировать более эффективный код.​

После увиденного мне захотелось полностью первести свой проект на архитектуру LLVM, так же большим плюсом ещё была поддержка Inline Assembly на X64. Как же это можно было сделать без особой боли в попенции? А оказывается у LLVM есть свободно поставляемая утилита под названием Clang-cl. Это фронтенд для компилятора Clang, который предоставляет интерфейс командной строки, совместимый с компилятором Microsoft Visual C++ (MSVC). Это и позволяет использовать Clang в качестве альтернативы компилятору MSVC в среде разработки Microsoft Visual Studio.

Я быстренько перенастроил CMake, но в работе у меня по прежнему оставался IntelliSense, который никак не мог справиться с быстрым анализом моих проектов и отдавал подсказки аж спустя минуту после написания строчки кода. Мне стало интересно какие ещё полезные тулзы может предложить мне LLVM и как оказывается он ещё много чего может показать:
  • Clangd — это языковой сервер для C и C++, который предоставляет возможности автодополнения кода, проверки синтаксиса, навигации по коду и других функций, полезных для разработки. Clangd использует информацию о коде, полученную из компилятора Clang, для предоставления точных результатов и подсказок. Clangd может интегрироваться с многими редакторами кода и средами разработки, такими как Visual Studio Code, Vim, Emacs и другими.​
  • Clang-format — это инструмент для автоматического форматирования кода в соответствии с заданным стилем. Clang-format использует файл конфигурации, в котором можно задать правила форматирования кода, такие как отступы, размещение скобок и другие параметры. Этот инструмент может быть полезен для поддержания единообразного стиля кода в проекте и сокращения времени на ручное форматирование.​
  • Clang-lldb — это отладчик, основанный на компиляторе Clang и отладчике LLDB. Clang-lldb предоставляет улучшенную поддержку отладки кода на языках C и C++, включая более точную информацию о типах данных и выражениях, поддержку отладки многопоточных приложений и другие функции. Clang-lldb может быть интегрирован с многими средами разработки, такими как Visual Studio Code, Xcode и другими.​
1719051216495.png

Рисунок 2 — Расширение «clangd» из магазина расширений Visual Studio

1719053581360.png

Рисунок 3 Расширение «Clang-Format» из магазина расширений Visual Studio


1719055941383.png

Рисунок 4 Расширение «CodeLLDB» из магазина расширений Visual Studio

Все эти расширения являются аналогами на архитектуре LLVM для набора расширений «C/C++ Extension Pack». Первым делом вам будет необходимо установить LLVM в связке с Clang. Делается это всё по любой первой инструкции в интернете. Оригинальный образ вы можете взять с https://releases.llvm.org/download.html. Теперь давайте перейдём к важным заметкам по настройке всего этого добра:

1719054097353.png
Рисунок 5 — Прописанный путь до Clangd в 'Settings -> Extensions -> clangd'
[/FONT]

1719054246521.png
Рисунок 6 — Прописанный путь до Clang-Format в 'Settings -> Extensions -> Clang-Format'

1719054800447.png
Рисунок 7 — Включённое форматирование при сохранении файла в 'Settings -> Text Editor -> Formattng'

1719054965371.png
Рисунок 8 — Установленный форматировщик в 'Settings -> Text Editor'


Так же для работы clangd понадобится включить генерацию compile-commands.json. Посредством CMake это можно сделать таким способом:

Makefile:
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

Помимо Visual Studio Code вы так же можете использовать это всё в Visual Studio с CMake Based Project через расширения Visual Studio. Если хотите использовать лишь сам компилятор Clang в MS Based проектах, то в Visual Studio Installer установите галочки на «C++ Clang compiler for Windows» и «MSBuild support for LLVM toolset».


1719055203634.png

Рисунок 9 — Установка компилятора Clang в Visual Studio Installer.
Теперь мой проект полностью работает на LLVM, компилируется за считанные секунды благодаря Clang, показывает узкие места в коде с Undefined Behavior силами Clang-Tidy, форматируется по Google-style с помощью Clang-Format и конечно же моментально выдаёт подсказки. На моём компьютере Clangd одноразово анализирует AST (синтаксическое дерево кода) всех подключённых Windows-заголовков меньше чем за минуту и сохраняет результаты в кэше, к которому в будущем и обращается.


Тёма о жесточайшей раскачке Visual Studio Code под C++ IDE: https://www.blast.hk/threads/202243/. Бонусом там есть супер классный пропатченный clangd, за что огромное спасибо @SR_team.


Ссылки на расширения:

"Человек, который смог сдвинуть гору, начинал с того, что перетаскивал с места на место мелкие камешки." — Неизвестный автор
Теперь его проект такой типа: https://music.yandex.ru/album/31025265/track/125532538?lang=en
 
Последнее редактирование:

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,648
2,526
что-то ты перестарался, достаточно было лишь установить clion + vs для компиляции