Pemrograman meta

10

Saya baru saja memulai perjalanan saya sebagai pengembang C ++, dan baru-baru ini saya meneliti topik yang disebut pemrograman-meta. Sejauh ini, saya telah melalui banyak informasi mengenai topik ini, dan memiliki beberapa pertanyaan.

  1. Penggunaan Refleksi dalam c ++: Apakah mungkin? Sesuai pemahaman saya, refleksi adalah teknik meta-pemrograman yang memiliki kemampuan untuk memanipulasi keadaan suatu program, dan manipulasinya dapat berupa introspeksi atau introcession.

  2. Apa perbedaan antara arsitektur reflektif dan arsitektur meta-level? Dalam kategori apa arsitektur meta-pemrograman termasuk dalam kategori ini?

  3. Meta-programming terdiri dari dua level: level meta dan level dasar. Dalam pemahaman saya, program objek atau sistem yang sedang diselidiki adalah tingkat dasar, dan program meta yang akan beroperasi di atas sistem yang diselidiki adalah tingkat meta. Apakah saya benar?

Juga bantu saya dengan memberikan beberapa panduan tentang bekerja pada pemrograman metap di C ++.
Bolehkah Anda menyarankan saya beberapa contoh yang bisa diterapkan yang bisa saya cari untuk mendapatkan pengalaman dalam teknik pemrograman ini?

ChrisF
sumber
2
Pertanyaan ini mungkin lebih banyak dimiliki oleh programmer daripada pada stackoverflow. Yang pertama lebih teoretis, dan yang lebih praktis. Beberapa bagian dapat dengan mudah dijawab dari sudut pandang praktis C ++ tidak memiliki refleksi , tetapi yang lain tidak terkait kode (perbedaan antara arsitektur reflektif dan metalevel, misalnya)
David Rodríguez - dribeas
Jawaban SO ini membahas mengapa C ++ tidak memiliki refleksi: stackoverflow.com/q/359237/120163 , dan beberapa teknik C ++ lemah untuk mensimulasikannya dengan buruk.
Ira Baxter
Jika Anda sangat tertarik dengan metaprogramming, saya sarankan Anda untuk melihat bahasa D, yang lebih jelas daripada C ++ pada poin ini.
deadalnix

Jawaban:

10

Metaprogramming berarti Anda memiliki sarana untuk menulis kode yang menulis kode lain (dalam arti luas). C ++ melakukan ini melalui mekanisme templat, yang pada dasarnya adalah bahasa makro tipe-aman. Sangat mungkin untuk hanya menerapkan langkah perluasan templat, dan hasilnya akan menjadi kode C ++ bebas templat yang valid.

Refleksi adalah kemampuan bahasa pemrograman dan / atau lingkungan runtime untuk memeriksa (dan sering memodifikasi) elemen bahasanya sendiri pada saat run-time. Biasanya, bahasa reflektif menawarkan struktur data yang mewakili elemen bahasa seperti kelas, metode, variabel, parameter, dll., Serta rutinitas atau kelas untuk memeriksa, memodifikasi, dan membuatnya. Kemampuan modifikasi menjadikan refleksi jenis meta-pemrograman, karena memungkinkan Anda untuk menulis kode yang menghasilkan kode lain.

Contoh lain dari metaprogramming termasuk generator kode, biner yang memodifikasi sendiri (meskipun ini tidak sepopuler hari ini karena mereka dua dekade lalu), makro C; orang bisa berpendapat bahwa kari dan teknik pemrograman fungsional serupa juga semacam metaprogramming.

tammmer
sumber
+1 Saya sangat suka jawaban Anda dan saya ingin bertanya tentang menggunakan kompiler sebagai layanan seperti di C # atau menggunakan mesin scripting seperti di Jawa untuk mengeksekusi kode yang dibangun dalam run-time. Bukankah ini juga suatu bentuk metaprogramming?
M.Sameer
Jadi siapa pun yang membangun interpreter Python di C adalah metaprogramming? Bagaimana dengan implementasi ORM yang memetakan bahasa berorientasi objek ke SQL? Apakah setiap kerangka kerja web merupakan contoh metaprogramming?
kojiro
1
  1. Tidak. Program C ++ dikompilasi ke kode mesin dan semua informasi tentang kelas dll hilang (kecuali menggunakan C ++ / CLI untuk lingkungan .NET, tapi itu bukan C ++ murni).

2-3. Saya tidak tahu - tunggu jawaban lain yang membantu :-)

Pemrograman meta menggunakan templat C ++ sangat kuat, tetapi juga rumit. Perluasan templat membutuhkan gaya fungsional pemrograman daripada pemrograman imperatif yang digunakan C ++. Jika Anda tidak memiliki pengalaman sebelumnya dengan pemrograman fungsional, saya akan merekomendasikan Anda untuk mengambil jalan memutar dan mempelajari beberapa dasar lump, haskell atau skema.

Anders Abel
sumber