Saya sedang membaca artikel di TheServerSide tentang pemrograman ployglot di platform Java . Beberapa komentar dalam artikel tersebut merujuk pada metaprogramming sebagai kemampuan untuk menghasilkan kode (mungkin dengan cepat).
Apakah metaprogramming adalah kemampuan untuk menghasilkan kode dengan cepat atau apakah itu kemampuan untuk memasukkan metode dan atribut ke dalam objek yang ada saat runtime (seperti yang diizinkan oleh beberapa bahasa dinamis seperti Python, Ruby, dan Groovy).
metaprogramming
Parag
sumber
sumber
Jawaban:
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" :
sumber
in order to put technical barriers between us and our competitors
dan ini benar.Pertanyaan bagus. Saya sangat menyesal melihat tidak ada jawaban yang saat ini benar-benar menjawab pertanyaan Anda dengan benar. Mungkin saya bisa membantu ...
Definisi metaprogramming sebenarnya cukup sederhana: itu berarti program yang memanipulasi program.
Jawaban Anda yang diterima mengatakan program yang memanipulasi dirinya sendiri. Itu memang metaprogram tetapi mereka adalah bagian dari semua metaprogram.
Semua:
adalah metaprogram. Jadi kompiler GCC adalah metaprogram, interpreter CPython adalah metaprogram, sistem aljabar komputer Mathematica adalah metaprogram, prover teorema Coq adalah metaprogram dan seterusnya.
Jawaban lain telah menegaskan bahwa metaprogram adalah program yang menghasilkan program lain. Itu memang metaprogram tetapi, sekali lagi, mereka adalah bagian dari semua metaprogram. The Tercepat Fourier Transform di Barat (FFTW) perpustakaan adalah contoh dari metaprogram sebuah tersebut. Kode sumber sebagian besar ditulis dalam OCaml dan menghasilkan bit kode C (disebut codelet) yang digabungkan untuk membuat rutinitas Fast Fourier Transform berkinerja tinggi yang dioptimalkan untuk mesin tertentu. Library tersebut sebenarnya digunakan untuk menyediakan rutinitas FFT di Matlab. Orang-orang telah menulis program untuk menghasilkan metode numerik selama beberapa dekade, sejak masa awal FORTRAN .
Bahasa pemrograman pertama yang mengintegrasikan dukungan untuk metaprogramming adalah bahasa LISt Processor (LISP) pada akhir 1950-an. LISP 1.5 menyertakan sejumlah fitur yang membuat metaprogramming lebih mudah. Pertama, tipe data inti LISP adalah daftar bersarang, yaitu seperti pohon
(a (b c) d)
, yang berarti setiap kode LISP dapat diekspresikan secara native sebagai struktur data. Ini dikenal sebagai homoikonisitas. Kedua, kode LISP dapat diubah menjadi data dengan mudah menggunakan QUOTE. Misalnya(+ 1 2 3)
menambahkan 1 + 2 + 3 dan(QUOTE (+ 1 2 3))
membuat ekspresi yang menambahkan 1 + 2 + 3 saat dievaluasi. Ketiga, LISP menyediakan meta-circular evaluator yang memungkinkan Anda menggunakan interpreter host atau compiler untuk mengevaluasi kode LISP pada saat run-time, termasuk kode LISP yang dihasilkan run-time. Keturunan LISP termasuk Skema dan Clojure. Dalam semua bahasa ini, metaprogramming paling sering terlihat dalam bentuk program yang memodifikasi dirinya sendiri, biasanya menggunakan makro.Pada 1970-an, Robin Milner mengembangkan MetaLanguage (ML) yang berkembang menjadi keluarga bahasa pemrograman ML yang mencakup Standard ML dan OCaml dan sangat memengaruhi Haskell dan F # . Bahasa-bahasa ini memudahkan untuk mengekspresikan bahasa lain. Dalam bahasa-bahasa ini metaprogram paling sering terlihat dalam bentuk lexers, parser, interpreter dan compiler.
Pada tahun 1994, Erwin Unruh menemukan bahwa sistem template C ++ Turing sudah lengkap dan dapat digunakan untuk mengeksekusi program sewenang-wenang pada waktu kompilasi . C ++ template metaprogramming membawa metaprogramming ke massa yang tidak dicuci yang (ab) menggunakannya untuk banyak hal berbeda termasuk menghasilkan metode numerik di pustaka Blitz ++ .
sumber
Nah, metaprogramming hanyalah pemrograman, tapi pada dasarnya "menulis kode yang menulis kode" .
Kemampuan yang Anda sebutkan, ketika suatu program dapat mengamati dan memodifikasi struktur dan perilakunya sendiri disebut refleksi dan itu adalah jenis metaprogramming.
Bahasa yang diketik secara dinamis, memiliki fitur refleksi waktu proses yang kuat, dimungkinkan oleh sifat bahasa yang ditafsirkan ...
Bahasa tipe statis juga memiliki teknik metaprogramming yang kuat, misalnya metaprogramming template C ++ ...
sumber
Ini hanya pendapat pribadi saya, yang mungkin merupakan definisi metaprogramming yang paling liberal.
Saya pikir itu termasuk:
Saya pikir Anda bisa sampai di sana dengan menggunakan salah satu dari ini dan dalam kombinasi:
sumber
Metaprogramming adalah menulis program yang mengeluarkan program lain. Ini adalah sesuatu yang sangat bagus dalam bahasa seperti Lisp. Jauh lebih mudah dilakukan dalam bahasa yang mendukung makro nyata (bukan makro C ++, melainkan yang dapat memanipulasi kode yang mereka keluarkan) seperti Ruby, Lisp, Skema, dll. Daripada dalam bahasa seperti Java.
Salah satu implementasinya adalah membuat "domain specific language" yang merupakan cara menyempurnakan bahasa pemrograman untuk menyelesaikan tugas tertentu. Ini bisa menjadi sangat kuat jika dilakukan dengan benar. Ruby on Rails adalah contoh yang bagus untuk pemrograman semacam ini.
Jika Anda tertarik untuk mengeksplorasi metode ini, lihat Struktur dan Interpretasi Program Komputer yang merupakan salah satu buku penting yang membahas subjek.
sumber
Pada dasarnya, ini menulis kode yang menghasilkan lebih banyak kode, yang dijalankan untuk mencapai beberapa tujuan. Ini biasanya dilakukan baik dalam bahasa yang sama (menggunakan javascript untuk membuat string javascript, kemudian
eval
itu) atau untuk memancarkan bahasa lain (menggunakan .NET untuk membuat file batch windows).sumber
wikipedia memiliki artikel bagus tentang topik tersebut. Seseorang tidak perlu melakukan modifikasi runtime untuk sesuatu agar memenuhi syarat sebagai metaprogramming. Misalnya, banyak orang menggunakan template C ++ untuk melakukan metaprogramming pada waktu kompilasi.
sumber