C ++ Insights adalah alat berbasis dentang yang melakukan transformasi sumber ke sumber. Tujuan dari wawasan C ++ adalah untuk membuat hal -hal terlihat yang secara normal dan sengaja terjadi di balik layar. Ini tentang keajaiban yang dilakukan kompiler bagi kita untuk membuat segalanya bekerja.
Ambil sepotong kode ini, misalnya:
class Base {
};
class Derived : public Base {
};
int main () {
Derived d;
Derived d2 = d;
d2 = d;
Base& b = d;
}Tidak ada yang istimewa, dan tentu saja, itu dikompilasi. Ini adalah pandangan kompiler di atasnya:
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 ;
} Anda dapat melihat semua fungsi anggota khusus yang disediakan kompiler dan Umbast dari Derived to Base .
C ++ Insights adalah alat berbasis dentang yang melakukan transformasi sumber ke sumber. Tujuan dari wawasan C ++ adalah untuk membuat hal -hal terlihat yang secara normal dan sengaja terjadi di balik layar. Ini tentang keajaiban yang dilakukan kompiler bagi kita untuk membuat segalanya bekerja. Atau melihat melalui kelas kompiler.
Pada 2017, saya mulai mencari beberapa hal baru yang kami dapatkan dengan C ++ 11, C ++ 14, dan C ++ 17. Hal-hal menakjubkan seperti lambdas, loop berbasis jangkauan, dan binding terstruktur. Saya menyatukannya dalam pembicaraan. Anda dapat menemukan slide dan video online.
Namun, semua penelitian itu dan beberapa pelatihan dan pengajaran saya membuat saya mulai berpikir tentang bagaimana jika kita bisa melihat dengan mata kompiler. Tentu, ada dump ast, setidaknya untuk dentang. Kita dapat melihat kode apa yang dihasilkan kompiler dari cuplikan sumber C ++ dengan alat -alat seperti Compiler Explorer. Namun, yang kita lihat adalah Assembler. Baik output AST maupun compiler explorer tidak ada dalam kode bahasa yang saya tulis. Oleh karena itu, saya tidak terlalu terbiasa dengan output ini. Ditambah lagi, ketika mengajar siswa C ++, menunjukkan AST dan menjelaskan bahwa hanya itu yang tidak cukup memuaskan bagi saya.
Saya mulai menulis alat berbasis dentang yang dapat mengubah for-loop berbasis rentang menjadi versi compiler-internal. Kemudian, saya melakukan hal yang sama untuk binding dan lambdas yang terstruktur. Pada akhirnya, saya melakukan lebih dari yang direncanakan sebelumnya. Ini menunjukkan di mana operator dipanggil dan tempat -tempat di mana kompiler melakukan beberapa casting. Wawasan C ++ dapat menyimpulkan jenis di belakang auto atau decltype . Tujuannya adalah untuk menghasilkan kode yang dapat dikompilasi. Namun, ini tidak mungkin di semua tempat.
Anda dapat melihat, misalnya, transformasi lambda, for-loop berbasis jangkauan, atau otomatis. Tentu saja, Anda dapat mengubah cuplikan C ++ lainnya.
Lihat diri Anda. C ++ Insights tersedia online: cppinsights.io.
Tetap saja, ada pekerjaan yang harus dilakukan.
Saya tidak mengklaim memperbaiki semua hal. Saya juga sedang mengerjakan fitur pendukung dari standar baru, seperti C ++ 20, saat ini. Harap diingat bahwa wawasan C ++ didasarkan pada dentang dan pemahamannya tentang AST.
Saya melakukan beberapa pembicaraan tentang wawasan C ++ sejak saya merilis wawasan C ++. Misalnya, di C ++ sekarang. Berikut adalah slide dan videonya.
Wawasan C ++ dapat dibangun di dalam atau di luar pohon sumber dentang.
Lihat readme_windows.md
Untuk membangun dengan extra/clang menggunakan bendera tambahan berikut: -DINSIGHTS_USE_SYSTEM_INCLUDES=off -DCLANG_LINK_CLANG_DYLIB=on -DLLVM_LINK_LLVM_DYLIB=on
Lihat #186 untuk penjelasan mengapa INSIGHTS_USE_SYSTEM_INCLUDES perlu dimatikan.
extra/clang dan extra/llvm menyediakan /usr/lib/{libclangAST.so,libLLVM*.a,libLLVM.so} . libclangAST.so membutuhkan libLLVM.so dan akan ada konflik jika libLLVM*.a (bukan libLLVM.so ) terhubung. Lihat https://bugs.archlinux.org/task/60512
Anda perlu memiliki instalasi dentang di jalur pencarian.
git clone https://github.com/andreasfertig/cppinsights.git
mkdir build && cd build
cmake -G"Ninja" ../cppinsights
ninja
Biner (wawasan) yang dihasilkan dapat ditemukan di folder build .
Cara termudah untuk membangun wawasan C ++ di dalam pohon sumber dentang adalah menggunakan opsi 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
Ada beberapa opsi yang dapat diaktifkan dengan CMake:
| Pilihan | Keterangan | Bawaan |
|---|---|---|
| Insights_strip | Strip wawasan demi build | PADA |
| Wawasan_static | Gunakan tautan statis | MATI |
| Wawasan_coverage | Aktifkan cakupan kode | MATI |
| Wawasan_use_libcpp | Gunakan libc ++ untuk tes | MATI |
| Debug | Aktifkan debug | MATI |
Tampaknya lebih baik untuk memasok arsitektur selama konfigurasi:
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/
Kemudian, dalam Cumber Impor -> General -> Proyek yang ada ke ruang kerja. Pilih build_eclipse . Nikmati pengeditan dengan Cevelops.
Menggunakan wawasan C ++ cukup sederhana:
insights <YOUR_CPP_FILE> -- -std=c++17
Segalanya menjadi rumit ketika datang ke jalur sistem-termasuk. Jalan-jalur ini dikodekan dalam biner, yang tampaknya berasal dari wawasan C ++ kompiler dibangun. Untuk membantu, lihat skrip/getinclude.py. Skrip mencoba mengumpulkan jalur sistem-termasuk dari kompiler. Tanpa opsi, getinclude.py menggunakan g++ . Anda juga dapat melewati kompiler lain sebagai argumen pertama.
Inilah contohnya:
./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
Script dapat digunakan bersama dengan wawasan C ++:
insights <YOUR_CPP_FILE> -- -std=c++17 `./scripts/getinclude.py`
Jika Anda memiliki build khusus dari kompiler GCC, misalnya, GCC-11.2.0, dan tidak diinstal di kompiler di jalur sistem default, kemudian setelah membangun, dentang gagal menemukan jalur libstdc++ yang benar (STL GCC). Jika Anda mengalami situasi ini, Anda dapat menggunakan " --gcc-toolchain=/path/GCC-1x.xx/installed/path " untuk memberi tahu clang/c ++ wawasan lokasi stl:
./cppinsights Insights.cpp -- --gcc-toolchain=${GCC_11_2_0_INSTALL_PATH} -std=c++20
Di sini " ${GCC_11_2_0_INSTALL_PATH} " adalah direktori instalasi GCC yang dibuat khusus. Opsi untuk dentang dijelaskan di sini.
Ada juga proyek GitHub lain yang mengatur wadah Docker dengan versi C ++ Insights terbaru di dalamnya: C ++ Insights - Docker
Plugin untuk VIM tersedia di sini.
Plugin untuk Neovim tersedia di sini.
Ekstensi untuk kode Visual Studio tersedia di pasar VS Code: C ++ Insights - Ekstensi VScode.
Setidaknya untuk macOS, Anda dapat menginstal wawasan C ++ melalui homebrew berkat formular ini:
brew install cppinsights
Saya bertujuan untuk repositori untuk dikompilasi dengan dentang versi terbaru dan setidaknya yang sebelumnya. Situs web mencoba untuk tetap dekat dengan rilis Clang terbaru. Namun, karena masalah tertentu (membangun dentang untuk Windows), versi situs web sering ditunda beberapa bulan.
Saya membuat saluran YouTube di mana saya merilis video baru setiap bulan. Dalam video ini, saya menggunakan wawasan C ++ untuk menampilkan dan menjelaskan konstruksi C ++ tertentu, dan kadang -kadang saya menjelaskan wawasan C ++ juga.
Lihat Todo.
Jika Anda ingin mendukung proyek, pertimbangkan untuk mengirimkan tambalan. Alternatif lain adalah menjadi sponsor GitHub atau pendukung Patreon.