Ini dimulai sebagai pertanyaan SO tetapi saya menyadari bahwa itu sangat tidak konvensional dan berdasarkan pada deskripsi aktual di situs web, mungkin lebih cocok untuk programmer. Karena pertanyaan itu memiliki banyak bobot konseptual.
Saya telah belajar dentang LibTooling dan itu adalah alat yang sangat kuat yang mampu mengekspos seluruh "seluk beluk" kode dengan cara yang ramah, yaitu, dengan cara semantik , dan bukan dengan menebak-nebak. Jika dentang dapat mengkompilasi kode Anda, maka dentang pasti tentang semantik setiap karakter tunggal di dalam kode itu.
Sekarang izinkan saya untuk mundur sejenak.
Ada banyak masalah praktis yang muncul ketika seseorang terlibat dalam metaprogramming template C ++ (dan terutama ketika menjelajah di luar templat ke dalam wilayah makro yang pintar meskipun menakutkan). Sejujurnya, bagi banyak programmer, termasuk saya sendiri, banyak penggunaan template biasa juga agak menakutkan.
Saya kira contoh yang baik akan menjadi kompilasi-waktu string . Ini adalah pertanyaan yang sudah berumur lebih dari satu tahun sekarang, tetapi jelas bahwa C ++ pada saat ini tidak membuat ini mudah bagi manusia biasa. Walaupun melihat opsi-opsi ini tidak cukup untuk menimbulkan mual bagi saya, namun tetap membuat saya tidak percaya diri untuk dapat menghasilkan kode mesin ajaib, efisien secara maksimal untuk memenuhi aplikasi mewah apa pun yang saya miliki untuk perangkat lunak saya.
Maksudku, mari kita hadapi itu, teman-teman, string cukup sederhana dan mendasar. Beberapa dari kita hanya menginginkan cara yang nyaman untuk memancarkan kode mesin yang memiliki string tertentu "dipanggang" secara signifikan lebih banyak daripada yang kita dapatkan ketika mengkodekannya dengan cara langsung. Dalam kode C ++ kami.
Masukkan dentang dan LibTooling, yang mengekspos pohon sintaksis abstrak (AST) dari kode sumber dan memungkinkan aplikasi kustom C ++ sederhana untuk memanipulasi kode sumber mentah dengan benar dan andal (menggunakan Rewriter
) di samping model berorientasi objek semantik yang kaya dari segala sesuatu di AST. Ini menangani banyak hal. Ia tahu tentang ekspansi makro, dan memungkinkan Anda mengikuti rantai itu. Ya, saya berbicara tentang transformasi atau terjemahan kode sumber ke sumber.
Tesis mendasar saya di sini adalah bahwa dentang sekarang memungkinkan kita untuk membuat executable yang mereka sendiri dapat berfungsi sebagai tahapan preprocessor kustom yang ideal untuk perangkat lunak C ++ kami, dan kami dapat mengimplementasikan tahapan pemrograman metaprogram ini dengan C ++. Kami hanya dibatasi oleh fakta bahwa tahap ini harus mengambil input yang merupakan kode C ++ yang valid dan menghasilkan sebagai kode C ++ yang lebih valid. Ditambah kendala apa pun lainnya yang diterapkan sistem build Anda.
Input harus setidaknya sangat dekat dengan kode C ++ yang valid karena, bagaimanapun, dentang adalah front-end kompiler dan kami hanya melihat-lihat dan menjadi kreatif dengan API-nya. Saya tidak tahu apakah ada ketentuan untuk dapat mendefinisikan sintaks baru untuk digunakan, tetapi jelas kita harus mengembangkan cara untuk menguraikannya dengan benar dan menambahkannya ke proyek dentang untuk melakukan ini. Mengharapkan lagi adalah memiliki sesuatu dalam proyek dentang yang di luar jangkauan.
Bukan masalah. Saya akan membayangkan bahwa beberapa fungsi makro no-op dapat menangani tugas ini.
Cara lain untuk melihat apa yang saya jelaskan adalah menerapkan konstruksi metaprogramming menggunakan runtime C ++ dengan memanipulasi AST dari kode sumber kami (terima kasih untuk dentang dan API-nya) alih-alih menerapkannya menggunakan alat yang lebih terbatas yang tersedia dalam bahasa itu sendiri. Ini juga memiliki manfaat kinerja kompilasi yang jelas (header-template header kompilasi lambat secara proporsional dengan seberapa sering Anda menggunakannya. Banyak hal yang dikompilasi kemudian dengan hati-hati dicocokkan dan dibuang oleh linker).
Namun, hal ini datang dengan biaya untuk memperkenalkan satu atau dua langkah tambahan dalam proses pembuatan dan juga dalam persyaratan untuk menulis beberapa (tentu saja) perangkat lunak yang agak lebih bertele-tele (tetapi setidaknya itu adalah runtime langsung C ++) sebagai bagian dari alat kami .
Itu bukan gambaran keseluruhan. Saya cukup yakin bahwa ada ruang fungsionalitas yang jauh lebih besar yang bisa didapat dari menghasilkan kode yang sangat sulit atau tidak mungkin dengan fitur-fitur bahasa inti. Dalam C ++ Anda dapat menulis templat atau makro atau kombinasi gila keduanya, tetapi dalam alat dentang Anda dapat memodifikasi kelas dan fungsi dengan cara APA PUN yang dapat Anda capai dengan C ++, saat runtime , sambil memiliki akses penuh ke konten semantik, selain template dan makro dan yang lainnya.
Jadi, saya bertanya-tanya mengapa semua orang belum melakukan ini. Apakah fungsi ini dari dentang begitu baru dan tidak ada yang akrab dengan hirarki kelas besar AST dentang? Itu tidak mungkin.
Mungkin saya hanya meremehkan kesulitan ini sedikit, tetapi melakukan "kompilasi waktu manipulasi string" dengan alat dentang hampir secara kriminal sederhana. Itu verbose, tapi sangat mudah. Yang diperlukan hanyalah sekelompok fungsi makro tanpa std::string
operasi yang memetakan ke operasi nyata yang sebenarnya . Plugin dentang mengimplementasikan ini dengan mengambil semua panggilan makro no-op yang relevan, dan melakukan operasi dengan string. Alat ini kemudian dimasukkan sebagai bagian dari proses pembangunan. Selama build, panggilan fungsi makro no-op ini secara otomatis dievaluasi ke dalam hasilnya, dan kemudian dimasukkan kembali sebagai string waktu kompilasi lama yang biasa dalam program. Program kemudian dapat dikompilasi seperti biasa. Bahkan program yang dihasilkan ini juga jauh lebih portabel sebagai hasilnya, tidak memerlukan kompiler baru yang mendukung C ++ 11.