元編程

元編程(Metaprogramming)是指某類計算機程序的編寫,這類計算機程序編寫或者操縱其餘程序(或者自身)做爲它們的數據,或者在運行時完成部分本應在編譯時完成的工做。不少狀況下與手工編寫所有代碼相比工做效率更高。編寫元程序的語言稱之爲元語言,被操做的語言稱之爲目標語言。一門語言同時也是自身的元語言的能力稱之爲反射。ios

反射是促進元編程的一種頗有價值的語言特性。把編程語言自身做爲頭等對象(如 LispRebol)也頗有用。支持 泛型編程的語言也使用元編程能力。
元編程一般有兩種方式起做用。一種方式是經過 應用程序接口(API)來暴露運行時引擎的內部信息。另外一種方法是動態執行包含編程命令的字符串。所以,「程序能編寫程序」。雖然兩種方法都能用,但大多數方法主要靠其中一種。
 
一個簡單元編程的例子是使用bash腳本的 產生式編程示例:
#!/bin/bash
# metaprogram
echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)) do
echo "echo $I" >>program
done
chmod +x program
這個腳本(或程序)生成了一個新的993行程序來打印1至992。這只是演示用代碼來寫更多代碼,並非打印數字的最有效方法。然而,一個程序員能夠幾分鐘內編寫和執行 元程序,卻生成了近1000行代碼。
==========
C++中也可使用模板來進行元編程(如下代碼在VC2008中編譯經過):
#include<iostream>
using namespace std;
int Result;
//主模板
template<int N> //模板
class Fibonacci
{
public:
enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result };
//枚舉,帶有隱含計算
};
//徹底特化模板
template<>
class Fibonacci<1> //帶常參數1的 構造函數
{
enum { Result = 1 };
//給枚舉賦初值1
};
//徹底特化模板
template<>
class Fibonacci<0> //帶參數0的模板
{
public:
enum { Result = 0 };
//給枚舉賦初值0
};
int main()
{
std::cout << "第20項的Fibonacci數是:" << Fibonacci<20>::Result << std:: endl;
//隱含計算
system("pause");
return 1;
}
該示例定義了一個 類模板,類中聲明瞭一個 枚舉類型,該程序的奧祕就在枚舉類型的構造上。從枚舉類型的構造能夠看出,他自身有一個樣俺的 迭代計算。兩個 構造函數爲枚舉類型初始化了數列的初始值,當調用「Fibonacci<20>::Reasult「時,就以這兩個初始值爲基礎進行 迭代。所以,程序在運行時並無顯示的計算,而是在編譯時就由 編譯器計算了。
當編譯器實例化Fibonacci<20>時,爲了給其enum Result賦值,編譯器須要對Fibonacci<19>和Fibonacci<18>進行實例化,以後同理······,當實例化到Fibonacci<1>和Fibonacci<0>的時候,徹底特化模板被實例化,至此迭代結束。
因此,該 程序編譯的結果僅包含一個 常量值,輸出以下:
第20項的 Fibonacci數是:6765
 
元編程是:關於程序的程序、操縱代碼的程序。
應用:編譯時計算、補充類型系統、基於模板的計算
優勢:加強代碼重用,編譯時計算,不佔用運行時cpu。
缺點:代碼可讀性較差,調試困難,編譯時間延長,侷限性(數值計算)
主要思想:利用模板特化機制實現編譯期條件選擇結構,利用遞歸模板實現編譯期循環結構,模板元程序則由編譯器在編譯期解釋執行。
模板元編程使用靜態c++語言成分,編程風格相似於函數式編程,其中不可使用變量、賦值語句和迭代結構等。
在模板元編程中,主要操做整形(包括布爾類型、字符類型、整數類型)常量和類型。被操縱的實體也稱爲元數據。全部元數據都可做爲模板參數。
相關文章
相關標籤/搜索