Ruby的元编程(Metaprogramming)在其他语言中是否有相似的技术?
黄舟
黄舟 2017-04-22 08:59:06
0
2
900

元编程:编写在运行时操纵语言构件的代码。
--《Ruby元编程》

应该是借鉴了lisp里的宏(macro)。其他语言里还有类似的用法吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(2)
大家讲道理

Mari kita katakan begini:
Pada masa awal zaman perindustrian, ini adalah situasi:
Orang ramai menghasilkan mesin, dan mesin menghasilkan produk.

Pada peringkat kemudian:
Orang menghasilkan mesin, mesin menghasilkan mesin, dan mesin menghasilkan produk.

Jelas sekali, mesin pengeluaran mesin merupakan satu kemajuan yang hebat, yang membebaskan tenaga buruh.

Metaprogramming adalah serupa dengan mesin yang menghasilkan mesin Secara ringkasnya, program boleh mengubah dirinya sendiri atau menjana program baharu. Ini sudah tentu sangat membebaskan pengaturcara.

Sudah tentu, sebenarnya, sebelum pengaturcaraan meta, pengaturcara mencipta sejumlah besar alat bantu untuk membantu mereka memprogram, seperti IDE dan seumpamanya. Tetapi kemudian, pengaturcara merasakan bahawa IDE masih terlalu lemah, jadi mereka boleh mencari dan menggantikan, melompat ke rujukan dan menggunakan templat, dsb. Alangkah baiknya jika program itu dapat menghasilkan sendiri.

===================== Selesai sudah popularisasi sains, berikut adalah beberapa pemikiran yang tidak bertanggungjawab============== === ====

Sebenarnya, pengaturcaraan meta tidak pernah menjadi konsep yang jelas, terutamanya kerana makna perkataan meta itu sendiri sangat kabur.

Yuan secara amnya difahami sebagai lebih asas dan asas. Metaprogramming ialah pengaturcaraan yang lebih asas daripada program, iaitu program menjana program. Daripada perspektif ini, sama ada templat C++, makro C, .NET's Emit and Compiler Provider, penyambungan dan eval rentetan JavaScript, atau malah penjana kod Dongwang, semuanya adalah program penjanaan program.

Tetapi secara umumnya, untuk dipanggil metaprogramming, syarat-syarat tertentu mesti dipenuhi, kerana konsep metaprogramming tidak ditakrifkan dengan baik, syarat-syarat ini hanya boleh dianggap sebagai konsensus. Ciri-ciri bahasa ini dianggap sebagai pengaturcaraan meta oleh orang A, tetapi adalah perkara biasa bagi orang B untuk tidak berfikir demikian. Syarat yang disenaraikan di bawah hanyalah dari perspektif saya:

1. Bahasa dengan keupayaan metaprogramming mestilah bahasa yang boleh menjana kod dalam bahasa pengaturcaraan yang sama, dan bukannya menggunakan satu bahasa untuk menjana program dalam bahasa lain. Ini mengeluarkan penjana kod daripada persamaan.
2. Untuk bahasa yang mempunyai keupayaan pengaturcaraan meta, kod atur cara yang dihasilkan oleh pengaturcaraan meta mesti boleh lulus analisis leksikal. Artikel ini tidak termasuk makro C dan eval JavaScript.

Ia boleh dilihat bahawa ia dianggap sebagai metaprogramming, dan hasil yang berbeza boleh diperolehi dengan menggunakan kekangan yang berbeza. Apabila kita membincangkan sama ada bahasa pengaturcaraan boleh dimetaprogram, pada asasnya kita boleh mencapai kata sepakat pada syarat 1, tetapi setiap orang mempunyai pendapat mereka sendiri mengenai syarat 2.

Dikatakan bahawa apabila metaprogramming pertama kali dicipta, ia hanya untuk mengurangkan beban pada pengaturcara templat C++ pada mulanya hanyalah lanjutan daripada beban berlebihan. Oleh kerana penaipan yang kuat, bahasa C mesti menulis banyak kod berulang untuk jenis yang berbeza. Tetapi orang-orang dalam Jawatankuasa Standard C++ jelas tidak akan berhenti di generik seperti Anders suasana dan kelas tinggi sentiasa mengejar C++ tanpa henti, jadi generik telah menjadi templat , saya menghasilkan metaprogramming templat C++.

Ty80

Javascript ada!

http://www.slideshare.net/danwrong/metaprogramming-javascript

Perhatikan tarikh penerbitan pembentangan ini. Ini bukan perkara baru Dengan peningkatan dan pengembangan bahasa yang berterusan selama ini, lebih banyak teknik metaprogramming telah digunakan secara meluas.

Selain itu, bahasa yang menyokong pengaturcaraan meta adalah sangat biasa, hampir semua bahasa pengaturcaraan berfungsi tersedia, Java mempunyai Anotasi, dan Clojure tidak perlu dikatakan. Lisp adalah berdasarkan makro, dan Ruby dan Smalltalk kedua-duanya menggunakan mekanisme pantulan. Terdapat juga perkara seperti Groovy yang berdasarkan pengekodan bait dan penukaran AST, dsb.

Metaprogramming ialah kemahiran lanjutan, tetapi ia bukan sihir, dan juga bukan ciri yang sangat jarang berlaku.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan