C ++ Insights เป็นเครื่องมือที่อิงกับการเปลี่ยนแปลงที่เกิดจากการแปลงแหล่งกำเนิด เป้าหมายของข้อมูลเชิงลึก C ++ คือการทำให้สิ่งต่าง ๆ มองเห็นได้ตามปกติและจงใจเกิดขึ้นเบื้องหลัง มันเกี่ยวกับเวทมนตร์ที่คอมไพเลอร์ทำเพื่อให้เราทำสิ่งต่าง ๆ
ใช้รหัสชิ้นนี้ตัวอย่างเช่น:
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 ;
} คุณสามารถดูฟังก์ชั่นสมาชิกพิเศษที่ให้ไว้ทั้งหมดและ upcast จาก Derived เป็น Base
C ++ Insights เป็นเครื่องมือที่อิงกับการเปลี่ยนแปลงที่เกิดจากการแปลงแหล่งกำเนิด เป้าหมายของข้อมูลเชิงลึก C ++ คือการทำให้สิ่งต่าง ๆ มองเห็นได้ตามปกติและจงใจเกิดขึ้นเบื้องหลัง มันเกี่ยวกับเวทมนตร์ที่คอมไพเลอร์ทำเพื่อให้เราทำสิ่งต่าง ๆ หรือดูผ่านคลาสของคอมไพเลอร์
ในปี 2560 ฉันเริ่มดูสิ่งใหม่ ๆ ที่เราได้รับจาก C ++ 11, C ++ 14 และ C ++ 17 สิ่งที่น่าอัศจรรย์เช่นแลมบ์ดาส, ลูปที่มีระยะและการผูกที่มีโครงสร้าง ฉันรวบรวมมันไว้ด้วยกันในการพูดคุย คุณสามารถค้นหาสไลด์และวิดีโอออนไลน์
อย่างไรก็ตามการวิจัยทั้งหมดและการฝึกอบรมและการสอนของฉันทำให้ฉันเริ่มคิดว่ามันจะเป็นอย่างไรถ้าเราเห็นด้วยสายตาของคอมไพเลอร์ แน่นอนว่ามีการถ่ายโอนข้อมูล AST อย่างน้อยสำหรับเสียงดัง เราสามารถดูว่าโค้ดที่คอมไพเลอร์สร้างจากตัวอย่างต้นฉบับ C ++ พร้อมเครื่องมือเช่นคอมไพเลอร์ Explorer อย่างไรก็ตามสิ่งที่เราเห็นคือแอสเซมเบลอร์ ทั้ง AST หรือเอาต์พุต Explorer คอมไพเลอร์อยู่ในภาษาที่ฉันเขียนรหัส ดังนั้นฉันไม่คุ้นเคยกับผลลัพธ์นี้มากนัก นอกจากนี้เมื่อสอนนักเรียน C ++ แสดง AST และอธิบายว่าทุกอย่างไม่น่าพอใจสำหรับฉัน
ฉันเริ่มเขียนเครื่องมือที่ใช้ระบบเสียงดังซึ่งสามารถแปลงวงกลมแบบใช้ช่วงให้เป็นรุ่นคอมไพเลอร์ภายใน จากนั้นฉันก็ทำเช่นเดียวกันกับการผูกที่มีโครงสร้างและแลมบ์ดาส ในท้ายที่สุดฉันทำมากกว่าที่วางแผนไว้ในตอนแรก มันแสดงให้เห็นว่าผู้ประกอบการถูกเรียกใช้และสถานที่ที่คอมไพเลอร์ทำการคัดเลือก ข้อมูลเชิงลึก C ++ สามารถอนุมานประเภทที่อยู่เบื้องหลัง auto หรือ decltype เป้าหมายคือการสร้างรหัสที่รวบรวมได้ อย่างไรก็ตามสิ่งนี้เป็นไปไม่ได้ในทุกสถานที่
คุณสามารถเห็นการเปลี่ยนแปลงของแลมบ์ดา, ระยะสำหรับลูปหรืออัตโนมัติ แน่นอนคุณสามารถแปลงตัวอย่าง C ++ อื่น ๆ
เห็นตัวเอง C ++ Insights พร้อมใช้งานออนไลน์: cppinsights.io
ยังมีงานต้องทำ
ฉันไม่ได้อ้างว่าได้รับทุกสิ่งที่ถูกต้อง ฉันยังทำงานเกี่ยวกับคุณสมบัติการสนับสนุนจากมาตรฐานใหม่เช่น C ++ 20 ในขณะนี้ โปรดจำไว้ว่าข้อมูลเชิงลึกของ C ++ นั้นขึ้นอยู่กับเสียงดังและความเข้าใจของ AST
ฉันพูดคุยกันสองสามเรื่องเกี่ยวกับข้อมูลเชิงลึกของ C ++ ตั้งแต่ฉันปล่อยข้อมูลเชิงลึก C ++ ตัวอย่างเช่นที่ C ++ ตอนนี้ นี่คือสไลด์และวิดีโอ
ข้อมูลเชิงลึก C ++ สามารถสร้างขึ้นภายในหรือภายนอกต้นไม้แหล่งข้อมูลเสียงดังก้อง
ดู 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
คุณต้องมีการติดตั้งเสียงดังในเส้นทางการค้นหา
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
ไบนารีที่ได้ (ข้อมูลเชิงลึก) สามารถพบได้ในโฟลเดอร์ build
วิธีที่ง่ายที่สุดในการสร้างข้อมูลเชิงลึก C ++ ภายในแผนผังแหล่งกำเนิดคือการใช้ตัวเลือก 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/
จากนั้นในการนำเข้า Cevelop -> ทั่วไป -> โครงการที่มีอยู่ในพื้นที่ทำงาน เลือก build_eclipse สนุกกับการแก้ไขด้วย CEVEVELD
การใช้ข้อมูลเชิงลึก 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.2.0 และ ไม่ได้ ติดตั้งในคอมไพเลอร์ในเส้นทางระบบเริ่มต้นหลังจากนั้นหลังจากการสร้างการปะทะล้มเหลวในการค้นหาเส้นทาง 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 ที่สร้างขึ้นเอง ตัวเลือกสำหรับเสียงดังก้องอธิบายไว้ที่นี่
นอกจากนี้ยังมีโครงการ GitHub อื่นที่ตั้งค่าคอนเทนเนอร์ Docker ด้วยรุ่น Insights C ++ ล่าสุดใน IT: C ++ Insights - Docker
ปลั๊กอินสำหรับ VIM มีให้ที่นี่
ปลั๊กอินสำหรับ NeoVim มีให้บริการที่นี่
ส่วนขยายสำหรับรหัส Visual Studio มีอยู่ที่ VS Code Marketplace: C ++ Insights - ส่วนขยาย VSCODE
อย่างน้อยสำหรับ macOS คุณสามารถติดตั้งข้อมูลเชิงลึก C ++ ผ่าน Homebrew ด้วยสูตรนี้:
brew install cppinsights
ฉันตั้งเป้าหมายให้ที่เก็บรวบรวมด้วย Clang เวอร์ชันล่าสุดและอย่างน้อยก็ก่อนหน้านี้ เว็บไซต์พยายามที่จะอยู่ใกล้กับรุ่นล่าสุดของ Clang อย่างไรก็ตามเนื่องจากปัญหาบางอย่าง (การสร้าง Clang สำหรับ Windows) เวอร์ชันของเว็บไซต์มักจะล่าช้าภายในไม่กี่เดือน
ฉันสร้างช่อง YouTube ที่ฉันปล่อยวิดีโอใหม่ในแต่ละเดือน ในวิดีโอเหล่านี้ฉันใช้ข้อมูลเชิงลึก C ++ เพื่อแสดงและอธิบายการสร้าง C ++ บางอย่างและบางครั้งฉันก็อธิบายข้อมูลเชิงลึก C ++ เช่นกัน
เห็นสิ่งที่ต้องทำ
หากคุณต้องการสนับสนุนโครงการให้พิจารณาส่งแพตช์ อีกทางเลือกหนึ่งคือการเป็นผู้สนับสนุน GitHub หรือผู้สนับสนุน Patreon