當前位置:首頁 » 編程軟體 » 程元編程

程元編程

發布時間: 2022-06-06 03:46:35

⑴ 元編程的使用示例

一個簡單元編程的例子是使用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的構造函數
{
public:
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
==========
不是所有的元編程都用產生式編程。如果程序可以在運行時改變(如Lisp、Ruby、python、Smalltalk、Lua、Groovy和JavaScript),這種技術可以不實際生成源代碼就使用元編程。
在Ruby中,最常用的就是attr系列方法,譬如attr、attr_reader、attr_writer、attr_accessor。attr_reader方法為一個實例變數產生一個用於讀取其值的方法,attr_writer為其產生一個用於寫入值的方法,attr_accessor則同時具有這兩種功能。
class Foo
attr_reader :just_read
attr_writer :just_write
attr_accessor :both_read_and_write
def initialize
@just_read = 0
@just_write = 0
@both_read_and_write = 0
end
end
# 輸出attr系列方法生成的方法
puts Foo.instance_methods - Foo.superclass.instance_methods
最常用的元編程工具是編譯器,把高級語言轉換為匯編語言或機器語言。更靈活的方法是在程序中嵌入解釋器直接處理程序數據。有一些實現例如為Object Pascal編寫的RemObject's Pascal Script。
另一個很常用的元編程例子是lex和yacc,用來生成詞法分析器和語法分析器。Yacc通常用作編譯器的編譯器,生成一個把高級語言轉換為機器語言的工具。
quine是一種源代碼等於輸出的特殊的元程序。
面向語言的程序設計是一種強烈關注元編程的編程風格,通過領域特定語言來實現。

⑵ 元編程的發展

元編程在1994年初露端倪,由一個叫 Erwin Unruh 的人首先發現。在1994年,C++標准委員會在聖迭戈(SanDiego)舉行的一次會議期間, Erwin Unruh展示了一段特別的代碼。這段代碼的特別之處在於程序的功能在編譯期實現而非運行期,編譯器以錯誤信息的方式產生從2到某個給定值之間的所有質數。同年夏天, Todd Veldhuizen 受Erwin 的例子啟發,發現可以使用C++模板進行元編程,並發表了一份技術報告。

⑶ 如何提高」元編程「能力

編程能力:C++接觸最多,將基礎知識回顧一下,給段程序能看懂、給個需求能邊查書邊捉急的寫出、bug基本可以通過斷點等調試出來;接觸過Python、Matlab、R等;整體編程設計能力處於Matlab水平。

⑷ C++里的元編程是一很厲害的技術嗎

元編程是利用模板特化機制實現編譯期條件選擇結構,利用遞歸模板實現編譯期循環結構,模板元程序則由編譯器在編譯期解釋執行。是C++中最復雜也是威力最強大的編程範式。也確實是一種很厲害的技術,C++的STL庫和BOOST庫就大量的運用到了這種技術。

⑸ 為什麼要有限元編程

任何有限元商業軟體都有其局限性,很多非常專業的計算還是自己編寫程序計算的。另外,購買大型商業軟體需要很高的費用,如果進行簡單的計算,自己編出更為經濟。

⑹ 元編程的元編程的概念

反射是促進元編程的一種很有價值的語言特性。把編程語言自身作為頭等對象(如Lisp或Rebol)也很有用。支持泛型編程的語言也使用元編程能力。
元編程通常有兩種方式起作用。一種方式是通過應用程序介面(API)來暴露運行時引擎的內部信息。另一種方法是動態執行包含編程命令的字元串。因此,「程序能編寫程序」。雖然兩種方法都能用,但大多數方法主要靠其中一種。

⑺ 元編程是C++比較高階的編程技術么

精確地說,C++不提供元編程 —— 元編程(在運行期生成代碼)是Ruby之類的語言才有的概念

如果你想說模板元編程(template metaprogramming),那確實是比較高級的技術(一般的技術也不足以大大延長編譯時間)

⑻ 編程基礎之什麼是元編程

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

⑼ 怎麼理解元編程

Meta- 這個前綴在希臘語中的本意是「在…後,越過…的」,類似於拉丁語的 post-,比如 metaphysics 就是「在物理學之後」,這個詞最開始指一些亞里士多德的著作,因為它們通常排序在《物理學》之後。

但西方哲學界在幾千年中漸漸賦予該詞綴一種全新的意義:關於某事自身的某事。比如 meta-knowledge 就是「關於知識本身的知識」,meta-data 就是「關於數據的數據」,meta-language 就是「關於語言的語言」,而 meta-programming 也是由此而來,是「關於編程的編程」。

弄清了詞源和字面意思,可知大陸將 meta- 這個前綴譯為「元」並不恰當。台灣譯為「後設」,稍微好一點點,但仍舊無法望文生義。也許「自相關」是個不錯的選擇,「自相關數據」、「自相關語言」、「自相關編程」——但是好像又太羅嗦了。

Anyway。先看看 meta-data:「我的電話是 +86 123 4567 8910」——這是一條數據;「+86 123 4567 8910 有十三個數字和一個字元,前兩位是國家代碼,後面是一個行動電話號碼」是關於前面那條數據的數據。那麼照貓畫虎,怎樣才算 meta-programming 呢?泛泛來說,只要是與編程相關的編程就算是 meta-programming 了——比如,若編程甲可以輸出 A - Z,那麼寫程序甲算「編程」;而程序乙可以生成程序甲(也許還會連帶著運行它輸出 A - Z),那麼編寫程序乙的活動,就可以算作 meta-programming,「元編程」。注意,程序甲和程序乙並不一定是同一種語言:
('A'..'Z').each do |char|
system("python -c 'print \"#{char}\"'")
end

如此說來,inline SQL 甚至動態生成 HTML 也是元編程了?摳定義的話是這樣吧。

不過 metaprogramming 更狹義的意思應該是指「編寫能改變語言語法特性或者運行時特性的程序」。換言之,一種語言本來做不到的事情,通過你編程來修改它,使得它可以做到了,這就是元編程。本版同文提及 method_missing,那麼 Wat — Destroy All Software Talks 之中給出了運行時元編程的經典範例:
>> ruby has no bare words
NameError: undefined local variable or method `words' for main:Object
from (irb) 1
>> def method_missing(*args); args.join(" "); end
=> nil
>> ruby has bare words
=> "ruby has bare words"
>> bare words can even have bangs!
=> "bare words can even have bangs!"

C、C++、Python、JavaScript…… 多數流行的語言或多或少都有元編程能力;Lisp 諸方言更是以元編程為基本。而 Ruby 更是因為元編程易用又強大,被許多人拿來寫 DSL,因為元編程可以捏出「本不存在的語法特性」來讓書寫 DSL 變得簡單。

熱點內容
計算機編譯干什麼的 發布:2025-05-20 04:05:18 瀏覽:45
安卓如何調手機時間 發布:2025-05-20 04:01:31 瀏覽:915
風扇轉壓縮機不轉 發布:2025-05-20 03:57:47 瀏覽:284
安卓手機如何測網速慢 發布:2025-05-20 03:55:49 瀏覽:495
用電腦做機房的伺服器 發布:2025-05-20 03:55:48 瀏覽:13
如何修改文件夾修改日期 發布:2025-05-20 03:44:08 瀏覽:831
安卓如何登陸tiktok 發布:2025-05-20 03:30:53 瀏覽:75
linux下執行python 發布:2025-05-20 03:23:30 瀏覽:431
sql查看器 發布:2025-05-20 03:22:53 瀏覽:134
天格屬火三才配置哪些最好 發布:2025-05-20 03:18:42 瀏覽:978