編程基礎(chǔ)之什么是元編程
大家知道元編程么?元編程到底什么呢?下面為你介紹元編程。
元編程是用來(lái)產(chǎn)生代碼的程序,操縱代碼的程序,在運(yùn)行時(shí)創(chuàng)建和修改代碼而非編程時(shí),這種程序叫做元程序。而編寫這種程序就叫做元編程。比如編譯原理中用來(lái)生成詞法分析器和語(yǔ)法分析器的lex和yacc。
元編程技術(shù)在多種編程語(yǔ)言中都可以使用,但更多的還是被應(yīng)用于動(dòng)態(tài)語(yǔ)言中,因?yàn)閯?dòng)態(tài)語(yǔ)言提供了更多的在運(yùn)行時(shí)將代碼視為數(shù)據(jù)進(jìn)行操縱的能力。雖然像C#和Java這樣較為靜態(tài)的語(yǔ)言也提供了反射機(jī)制,但是仍然沒有諸如Ruby這樣的更趨動(dòng)態(tài)性的語(yǔ)言那么透明,這是因?yàn)殪o態(tài)語(yǔ)言在運(yùn)行時(shí)其代碼和數(shù)據(jù)是分布在兩個(gè)層次上的。
元編程是指某類[計(jì)算機(jī)程序]的編寫,這類計(jì)算機(jī)程序編寫或者操縱其他程序(或者自身)作為它們的數(shù)據(jù),或者在[運(yùn)行時(shí)]完成部分本應(yīng)在[編譯時(shí)]完成的工作。很多情況下比手工編寫全部代碼相比工作效率更高。編寫元程序的語(yǔ)言稱之為元語(yǔ)言,被操作的語(yǔ)言稱之為目標(biāo)語(yǔ)言。一門語(yǔ)言同時(shí)也是自身的元語(yǔ)言的能力稱之為反射。
反射是促進(jìn)元編程的一種很有價(jià)值的語(yǔ)言特性。把編程語(yǔ)言自身作為頭等對(duì)象(如Lisp或Rebol)也很有用。支持泛型編程的語(yǔ)言也使用元編程能力。
元編程通常有兩種方式起作用。一種方式是通過(guò)應(yīng)用程序接口(API)來(lái)暴露運(yùn)行時(shí)引擎的內(nèi)部信息。另一種方法是動(dòng)態(tài)執(zhí)行包含編程命令的字符串。因此,“程序能編寫程序”。雖然兩種方法都能用,但大多數(shù)方法主要靠其中一種。
使用示例一個(gè)簡(jiǎn)單元編程的例子是使用bash腳本的產(chǎn)生式編程示例:
- #!/bin/bash
- # metaprogram
- echo '#!/bin/bash' >program
- for ((I=1; I<=992; I++)) do
- echo "echo $I" >>program
- done
- chmod +x program
這個(gè)腳本(或程序)生成了一個(gè)新的993行程序來(lái)打印1至992。這只是演示用代碼來(lái)寫更多代碼,并不是打印數(shù)字的最有效方法。然而,一個(gè)程序員可以幾分鐘內(nèi)編寫和執(zhí)行元程序,卻生成了近1000行代碼。
不是所有的元編程都用產(chǎn)生式編程。如果程序可以在運(yùn)行時(shí)改變(如Lisp、Python、REBOL、Smalltalk、Ruby、PHP、Perl, Tcl、Lua、Groovy和JavaScript),這種技術(shù)可以不實(shí)際生成源代碼就使用元編程。
最常用的元編程工具是編譯器,把高級(jí)語(yǔ)言轉(zhuǎn)換為匯編語(yǔ)言或機(jī)器語(yǔ)言。更靈活的方法是在程序中嵌入解釋器直接處理程序數(shù)據(jù)。有一些實(shí)現(xiàn)例如為Object Pascal編寫的RemObject's Pascal Script。
另一個(gè)很常用的元編程例子是lex和yacc,用來(lái)生成詞法分析器和語(yǔ)法分析器。Yacc通常用作編譯器的編譯器,生成一個(gè)把高級(jí)語(yǔ)言轉(zhuǎn)換為機(jī)器語(yǔ)言的工具。
quine是一種源代碼等于輸出的特殊的元程序。
面向語(yǔ)言的程序設(shè)計(jì)是一種強(qiáng)烈關(guān)注元編程的編程風(fēng)格,通過(guò)領(lǐng)域特定語(yǔ)言來(lái)實(shí)現(xiàn)。
希望通過(guò)本文的對(duì)于元編程的介紹,能給你帶來(lái)幫助。
【編輯推薦】