C ++ Insights-это инструмент, основанный на кланге, который делает преобразование источника в источник. Цель C ++ Insights состоит в том, чтобы сделать вещи видимыми, которые обычно и намеренно происходят за кулисами. Речь идет о магии, которую компилятор делает для нас, чтобы заставить вещи работать.
Возьмите этот кусок кода, например:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}Ничего особенного, и, конечно, это компилируется. Это представление компилятора на это:
class Base
{
public:
// inline constexpr Base() noexcept = default;
// inline constexpr Base(const Base &) noexcept = default;
// inline constexpr Base & operator=(const Base &) noexcept = default;
};
class Derived : public Base
{
public:
// inline constexpr Derived() noexcept = default;
// inline constexpr Derived(const Derived &) noexcept = default;
// inline constexpr Derived & operator=(const Derived &) noexcept = default;
};
int main ()
{
Derived d;
Derived d2 = Derived (d);
d2. operator =(d);
Base & b = static_cast <Base&>(d);
return 0 ;
} Вы можете увидеть все предоставленные компиляторы функции специальных членов и вакансию от Derived до Base .
C ++ Insights-это инструмент, основанный на кланге, который делает преобразование источника в источник. Цель C ++ Insights состоит в том, чтобы сделать вещи видимыми, которые обычно и намеренно происходят за кулисами. Речь идет о магии, которую компилятор делает для нас, чтобы заставить вещи работать. Или просмотр классов компилятора.
В 2017 году я начал изучать некоторые новые вещи, которые мы получили с C ++ 11, C ++ 14 и C ++ 17. Удивительные вещи, такие как Lambdas, диапазон для петли и структурированные привязки. Я собрал это в разговоре. Вы можете найти слайды и видео в Интернете.
Тем не менее, все эти исследования и некоторые из моих тренировок и обучения заставили меня начать думать о том, как было бы, если бы мы могли видеть глазами компилятора. Конечно, есть свалку AST, по крайней мере, для Clang. Мы можем увидеть, какой код компилятор генерирует из фрагмента источника C ++ с такими инструментами, как компилятор. Однако, как мы видим, это ассемблер. Ни вывод AST, ни вывод компилятора нет на языке, который я пишу код. Следовательно, я не очень знаком с этим выходом. Кроме того, при обучении студентов C ++ показывают AST и объясняя, что это все, что мне не совсем удовлетворило.
Я начал писать инструмент на основе кланг, который может преобразовать диапазон для петли в компилятор-внутреннюю версию. Затем я сделал то же самое для структурированных привязков и лямбдов. В конце концов, я сделал гораздо больше, чем изначально. В нем показано, где приводятся операторы и места, в которых компилятор делает немного кастинга. C ++ Insights может вывести тип auto или decltype . Цель состоит в том, чтобы создать компилируемый код. Однако это невозможно во всех местах.
Вы можете увидеть, например, преобразование Lambda, на основе диапазона для петли или авто. Конечно, вы можете преобразовать любой другой фрагмент C ++.
Увидеть себя. C ++ Insights доступен онлайн: cppinsights.io.
Тем не менее, есть работа.
Я не утверждаю, что все делаю все правильно. Я также работаю над поддержкой функций из новых стандартов, таких как C ++ 20, на данный момент. Пожалуйста, помните, что C ++ Insights основана на Clang и его понимании AST.
Я сделал пару разговоров о C ++ Insights с тех пор, как выпустил C ++ Insights. Например, сейчас в C ++. Вот слайды и видео.
C ++ Insights может быть построена внутри или за пределами дерева исходного дерева Clang.
Смотрите readme_windows.md
Чтобы построить с помощью extra/clang Используйте следующие дополнительные флаги: -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
См. #186 для объяснения того, почему INSIGHTS_USE_SYSTEM_INCLUDES необходимо отключить.
extra/clang и extra/llvm предоставляет /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} . libclangAST.so нужен libLLVM.so , и будет конфликт, если бы libLLVM*.a (вместо libLLVM.so ) связаны. См. Https://bugs.archlinux.org/task/60512
Вам нужно иметь инсталляцию Clang в пути поиска.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
Полученные бинарные (идеи) можно найти в папке build .
Самый простой способ построить понимание C ++ внутри дерева источника Clang - это использование опции LLVM_EXTERNAL_PROJECTS .
git clone https://github.com/llvm/llvm-project.git
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build
cd build
cmake -G Ninja -D=CMAKE_BUILD_TYPE=Release -DLLVM_EXTERNAL_PROJECTS=cppinsights -DLLVM_EXTERNAL_CPPINSIGHTS_SOURCE_DIR=<PATH/TO/cppinsights> [INSIGHTS CMAKE OPTIONS] ../llvm-project/llvm
ninja
Есть пара вариантов, которые можно включить с Cmake:
| Вариант | Описание | По умолчанию |
|---|---|---|
| Insights_strip | Полос | НА |
| Insights_static | Используйте статическое связывание | ВЫКЛЮЧЕННЫЙ |
| Insights_coverage | Включить покрытие кода | ВЫКЛЮЧЕННЫЙ |
| Insights_use_libcpp | Используйте libc ++ для тестов | ВЫКЛЮЧЕННЫЙ |
| ОТЛАЖИВАТЬ | Включить отладку | ВЫКЛЮЧЕННЫЙ |
Кажется, лучше всего предоставить архитектуру во время конфигурации:
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ../cppinsights
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build_eclipse
cd build_eclipse
cmake -G"Eclipse CDT4 - Unix Makefiles" ../cppinsights/
Затем в Cevellov Import -> General -> существующий проект в рабочее пространство. Выберите build_eclipse . Наслаждайтесь редактированием с помощью Cevell.
Использование C ++ Insights довольно просто:
insights <YOUR_CPP_FILE> -- -std=c++17
Вещи становятся сложными, когда дело доходит до путей включения системы. Эти пути твердо кодированы в бинарном, который, по-видимому, поступает из компилятора C ++ Insights. Чтобы помочь с этим, ознакомьтесь с Scripts/getinclude.py. Сценарий пытается собрать системы включения системы от компилятора. Без опции getinclude.py использует g++ . Вы также можете передать еще один компилятор в качестве первого аргумента.
Вот пример:
./scripts/getinclude.py
-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1 -isystem/usr/local/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.3.0/include -isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -isystem/usr/include
Сценарий можно использовать вместе с C ++ Insights:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
В случае, если у вас есть пользовательская сборка компилятора GCC, например, GCC-11.2.0 и не установлен в компиляторе в пути системы по умолчанию, затем после строительства Clang не может найти правильный путь libstdc++ (STL GCC). Если вы столкнетесь с этой ситуацией, вы можете использовать " --gcc-toolchain=/path/GCC-1x.xx/installed/path ", чтобы сообщить Clang/c ++, понимая местоположение STL:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
Здесь " ${GCC_11_2_0_INSTALL_PATH} "-это каталог установки вашего настраиваемого GCC. Опция для Clang описана здесь.
Существует также еще один проект Github, который устанавливает контейнер Docker с последней версией C ++ Insights в нем: C ++ Insights - Docker
Плагин для VIM доступен здесь.
Плагин для Neovim доступен здесь.
Расширение кода Visual Studio доступно на рынке кода VS: C ++ Insights - расширение VSCODE.
По крайней мере, для macOS вы можете установить C ++ Insights через Homebrew благодаря этой форме:
brew install cppinsights
Я стремлюсь к репозиторию, чтобы компилировать с последней версией Clang и, по крайней мере, той, что раньше. Сайт пытается оставаться рядом с последним выпуском Clang. Тем не менее, из -за определенных проблем (создание класса для Windows) версия веб -сайта часто задерживается на несколько месяцев.
Я создал канал YouTube, где я выпускаю новое видео каждый месяц. В этих видео я использую C ++ Insights, чтобы показать и объяснять определенные конструкции C ++, а иногда я также объясняю Insights C ++.
Смотри Тодо.
Если вы хотите поддержать проект, рассмотрите возможность отправки патча. Другая альтернатива - стать спонсором GitHub или сторонником Patreon.