Metaprogramming mengacu pada berbagai cara program memiliki pengetahuan tentang dirinya sendiri atau dapat memanipulasi dirinya sendiri.
Dalam bahasa seperti C #, refleksi adalah bentuk metaprogramming karena program dapat memeriksa informasi tentang dirinya sendiri. Misalnya mengembalikan daftar semua properti suatu objek.
Dalam bahasa seperti ActionScript, Anda dapat mengevaluasi fungsi saat runtime untuk membuat program baru seperti eval ("x" + i). DoSomething () akan mempengaruhi objek yang disebut x1 ketika i bernilai 1 dan x2 jika i bernilai 2.
Akhirnya, bentuk umum lain dari metaprogramming adalah ketika program dapat mengubah dirinya sendiri dengan cara yang tidak sepele. LISP terkenal akan hal ini dan merupakan sesuatu yang diperjuangkan oleh Paul Graham sekitar satu dekade lalu. Saya harus mencari beberapa esai spesifiknya. Tetapi idenya adalah bahwa program akan mengubah bagian lain dari program berdasarkan statusnya. Ini memungkinkan tingkat fleksibilitas untuk membuat keputusan pada waktu proses yang sangat sulit dalam sebagian besar bahasa populer saat ini.
Perlu juga dicatat bahwa di masa lalu yang baik pemrograman dalam perakitan langsung, program yang mengubah dirinya sendiri pada waktu proses diperlukan dan sangat umum.
Dari esai Paul Graham "What Made Lisp Different" :
Banyak bahasa memiliki sesuatu yang disebut makro. Tapi makro Lisp unik. Dan percaya atau tidak, apa yang mereka lakukan terkait dengan tanda kurung. Para desainer Lisp tidak memasukkan semua tanda kurung itu dalam bahasa hanya untuk membuat perbedaan. Bagi programmer Blub, kode Lisp terlihat aneh. Tapi tanda kurung itu ada karena suatu alasan. Mereka adalah bukti lahiriah dari perbedaan mendasar antara Lisp dan bahasa lain.
Kode Lisp dibuat dari objek data Lisp. Dan bukan dalam arti sepele bahwa file sumber berisi karakter, dan string adalah salah satu tipe data yang didukung oleh bahasa. Kode Lisp, setelah dibaca oleh parser, dibuat dari struktur data yang dapat Anda lintasi.
Jika Anda memahami cara kerja kompiler, apa yang sebenarnya terjadi bukanlah Lisp memiliki sintaks yang aneh karena Lisp tidak memiliki sintaks. Anda menulis program di pohon parse yang dihasilkan di dalam kompiler ketika bahasa lain diurai. Tetapi pohon parse ini sepenuhnya dapat diakses oleh program Anda. Anda dapat menulis program yang memanipulasinya. Di Lisp, program ini disebut makro. Mereka adalah program yang menulis program.
Program yang menulis program? Kapan Anda ingin melakukan itu? Tidak terlalu sering, jika Anda berpikir di Cobol. Sepanjang waktu, jika Anda berpikir di Lisp. Akan lebih mudah di sini jika saya dapat memberikan contoh makro yang kuat, dan berkata di sana! bagaimana tentang itu? Tetapi jika saya melakukannya, itu akan terlihat seperti omong kosong bagi seseorang yang tidak mengenal Lisp; tidak ada ruang di sini untuk menjelaskan semua yang perlu Anda ketahui untuk memahami apa artinya. Di Ansi Common Lisp saya mencoba untuk memindahkan semuanya secepat yang saya bisa, dan meskipun demikian saya tidak membuka makro sampai halaman 160.
Tapi saya rasa saya bisa memberikan argumen yang mungkin meyakinkan. Kode sumber editor Viaweb mungkin sekitar 20-25% makro. Makro lebih sulit untuk ditulis daripada fungsi Lisp biasa, dan ini dianggap gaya yang buruk untuk digunakan saat tidak diperlukan. Jadi setiap makro dalam kode itu ada karena harus ada. Artinya, setidaknya 20-25% kode dalam program ini melakukan hal-hal yang tidak dapat Anda lakukan dengan mudah dalam bahasa lain. Betapapun skeptisnya programmer Blub tentang klaim saya atas kekuatan misterius Lisp, ini seharusnya membuatnya penasaran. Kami tidak menulis kode ini untuk kesenangan kami sendiri. Kami adalah perusahaan rintisan kecil, memprogram sekeras yang kami bisa untuk menempatkan hambatan teknis antara kami dan pesaing kami.
Orang yang mencurigakan mungkin mulai bertanya-tanya apakah ada korelasi di sini. Sebagian besar kode kami melakukan hal-hal yang sangat sulit dilakukan dalam bahasa lain. Perangkat lunak yang dihasilkan melakukan hal-hal yang tidak dapat dilakukan perangkat lunak pesaing kami. Mungkin ada semacam hubungan. Saya mendorong Anda untuk mengikuti utas itu. Mungkin ada lebih banyak hal dari orang tua yang tertatih-tatih di tongkatnya itu daripada yang terlihat.