C ++ Insights هي أداة تعتمد على Clang تقوم بتحويل من المصدر إلى المصدر. الهدف من 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 هي أداة تعتمد على Clang تقوم بتحويل من المصدر إلى المصدر. الهدف من C ++ Insights هو جعل الأمور مرئية والتي تحدث بشكل طبيعي وعميد وراء الكواليس. إنه يتعلق بالسحر الذي يقوم به المترجم بالنسبة لنا لجعل الأمور تعمل. أو النظر من خلال فصول المترجم.
في عام 2017 ، بدأت أبحث في بعض الأشياء الجديدة التي حصلنا عليها مع C ++ 11 و C ++ 14 و C ++ 17. أشياء مذهلة مثل lambdas ، وحلقات المستندة إلى المدى ، والروابط المنظمة. أضعها معًا في حديث. يمكنك العثور على الشرائح والفيديو عبر الإنترنت.
ومع ذلك ، فإن كل هذا البحث وبعض التدريب والتدريس جعلني أبدأ بالتفكير في كيف سيكون الأمر إذا استطعنا أن نرى بأعين المترجم. بالتأكيد ، هناك تفريغ AST ، على الأقل ل Clang. يمكننا أن نرى الرمز الذي ينشئه برنامج التحويل البرمجي من مقتطف مصدر C ++ مع أدوات مثل برنامج التحويل البرمجي. ومع ذلك ، ما نراه هو التجميع. لا يوجد إخراج AST أو المترجم المستكشف باللغة التي أكتبها. وبالتالي ، لست على دراية بهذا الإخراج. بالإضافة إلى ذلك ، عند تعليم الطلاب C ++ ، إظهار AST وشرح أن كل شيء لم يكن مرضيًا تمامًا بالنسبة لي.
بدأت في كتابة أداة تعتمد على clang يمكنها تحويل حلقة قائمة على النطاق إلى إصدار التحويل البرمجي الداخلي. ثم ، فعلت الشيء نفسه بالنسبة للربط المنظم و lambdas. في النهاية ، فعلت أكثر بكثير من المخطط في البداية. إنه يوضح أين يتم استدعاء المشغلين والأماكن التي يقوم فيها المترجم ببعض الصب. يمكن أن تستنتج C ++ Insights النوع وراء auto أو decltype . الهدف هو إنتاج رمز قابل للتجميع. ومع ذلك ، هذا غير ممكن في جميع الأماكن.
يمكنك أن ترى ، على سبيل المثال ، تحول Lambda ، أو المدى القائم على الحلقة ، أو Auto. بالطبع ، يمكنك تحويل أي مقتطفات أخرى C ++.
ترى نفسك. C ++ Insights متوفرة على الإنترنت: cppinsights.io.
ومع ذلك ، هناك عمل للقيام به.
لا أدعي أن أحصل على كل الأشياء بشكل صحيح. أنا أعمل أيضًا على دعم الميزات من معايير جديدة ، مثل C ++ 20 ، في الوقت الحالي. يرجى تذكر أن C ++ رؤى تستند إلى Clang وفهمها لـ AST.
لقد أجريت بعض المحادثات حول C ++ رؤى منذ أن أصدرت C ++ رؤى. على سبيل المثال ، في C ++ الآن. وهنا الشرائح والفيديو.
يمكن بناء رؤى C ++ داخل أو خارج شجرة مصدر 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 provess /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 | Bread Insight بعد الإنشاء | على |
| 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/
ثم ، في CEVERVER IMPORT -> عام -> المشروع الحالي في مساحة العمل. حدد build_eclipse . استمتع بالتحرير مع CEVELL.
إن استخدام رؤى C ++ بسيطة إلى حد ما:
insights <YOUR_CPP_FILE> -- -std=c++17
تصبح الأمور معقدة عندما يتعلق الأمر بمسارات النظام. يتم ترميز هذه المسارات في الثنائي ، والتي يبدو أنها تأتي من برامج التحويل البرمجية C ++ التي تم بناؤها. للمساعدة في ذلك ، تحقق من البرامج النصية/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 <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
في حال كان لديك بناء مخصص لمتوجّل GCC ، على سبيل المثال ، GCC-11.0 ، ولم يتم تثبيته في المترجم في مسار النظام الافتراضي ، ثم بعد المبنى ، فشل Clang في العثور على مسار libstdc++ الصحيح (GCC's STL). إذا واجهت هذا الموقف ، فيمكنك استخدام " --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 Code: C ++ Insights - امتداد VSCode.
على الأقل بالنسبة إلى MacOS ، يمكنك تثبيت C ++ Insights عبر Homebrew بفضل هذا الصياغة:
brew install cppinsights
أهدف إلى تجميع المستودع مع أحدث إصدار من Clang وعلى الأقل واحد من قبل. يحاول الموقع البقاء على مقربة من أحدث إصدار من Clang. ومع ذلك ، نظرًا لبعض المشكلات (بناء clang لنظام التشغيل Windows) ، غالبًا ما يتم تأخير إصدار الموقع لمدة بضعة أشهر.
لقد قمت بإنشاء قناة YouTube حيث أقوم بإصدار مقطع فيديو جديد كل شهر. في مقاطع الفيديو هذه ، أستخدم C ++ Insights لإظهار وشرح بعض بنيات C ++ ، وأحيانًا أشرح رؤى C ++ أيضًا.
انظر تودو.
إذا كنت ترغب في دعم المشروع ، ففكر في تقديم التصحيح. بديل آخر هو أن يصبح راعيًا جيثب أو مؤيد باتريون.