程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 冒號和他的學生們(連載10)——超級范式

冒號和他的學生們(連載10)——超級范式

編輯:關於JAVA

超級范式

智能繁衍:機器人生產機器人           ——題記

引號忽然想起一事,問道:“有一本名為《C++模版元編程》的書,既然提到了模板,想來也屬於泛型編程吧?”

冒號答道:“模板元編程即Template Metaprogramming,與GP密切相關但自成一派,隸屬於另一種編程范式——元編程(Metaprogramming),簡稱MP。這裡的前綴‘meta-’常譯作‘元’,其實就是‘超級’、‘行而上’的意思。比如,元數據(Metadata)是關於數據的數據,元對象(Metaobject)是關於對象的對象,依此類推,元編程自然是關於程序的程序,或者說是編寫、操縱程序的程序。”

歎號皺著眉:“聽著有點繞。”

冒號投影出另一段代碼——

C++(元編程):

template <int N>
struct factorial
{
   enum { value = N * factorial<N - 1>::value };
};
template <>      // 特化(specialization)
struct factorial<0>  // 遞歸中止
{
   enum { value = 1 };
};
void main()
{
   cout << factorial<5>::value << endl; // 等價於cout << 120 << endl;
}

“以上用模板元編程實現了階乘運算。”冒號講解道,“與前面三種基本范式的階乘實現有著根本的不同:這裡階乘的值是在編譯時而非運行時計算出來的。換句話說,這段代碼以模板形式通過編譯器生成了新的代碼,並在編譯期間獲得執行。”

歎號不解:“這又說明什麼呢?”

冒號並不直接回答:“假設你需要批量處理用戶文檔,其格式結構預先給定,但既不像CSV(逗號分隔)那麼簡單,也不像XML那麼標准,並且用戶隨時可能改變格式標准,請問如何設計這段程序?”

歎號略一思索,便回答:“三大模塊:閱讀器讀出輸入文檔,解析器按照格式標准去解析,處理器對解析結果進行處理。”

“顯然關鍵在解析器,如果你是從頭做起,那麼問題至少有四。”冒號扳著指頭數:“第一、費時寫解析器代碼;第二、費時調試解析器代碼;第三、如果用戶更改格式標准,你得重復做上兩件事;第四、如果這段程序是大型程序的一部分,任何改動都可能意味著軟件的重新編譯、連接、測試、打包、部署等等。如果因為你的緣故公司不得不頻頻發布補丁包的話,你的飯碗恐怕是朝不保夕了。”

還是句號機靈:“既然談到了元編程,一定是利用元編程,根據不同的格式標准自動生成相應的解析器代碼。不過——此法雖一勞永逸,但難度似乎不小啊。”

“思路對頭!”冒號贊許道,“大家聽說過Lex和Yacc嗎?它們能根據格式標准生成相應的解析器代碼。更妙的是,格式標准不限於靜態數據,甚至可以含有動態指令!這意味著用戶不僅能定義業務數據格式,還能定義業務流程乃至領域特定語言DSL(Domain Specific Language),而這其實涉及到另一種編程范式:語言導向式編程(Language-Oriented Programming)。如果在此基礎上再用圖形界面包裝一下,那麼你的客戶會欣喜地發現,他們的經理只要點點鼠標就可以改變整個業務流程了,而這一切不僅不需要軟件開發方的參與,連本公司的技術人員也免了。這時候倒是你的老板發愁了:你的設計太過完美,客戶的後續開發費怕是賺不到了。”

眾人一樂。

冒號續道:“如果知道Lex和Yacc本來就是編寫編譯器和解釋器的工具,你就不會驚訝於它們的強大了。順帶說一句,編譯器本身就是元編程的典型范例——把高級語言轉化為匯編語言或機器語言的程序,不就是能寫程序的程序嗎?其實元編程的例子比比皆是:許多IDE如Visual Studio、Delphi、Eclipse等均能通過向導、拖放控件等方式自動生成代碼;UML建模工具將類圖轉換為代碼;Servlet引擎將JSP轉換為Java代碼等等。”

逗號恍然大悟:“原來元編程就是編寫能自動生成源代碼的程序。”

“也不盡然。”冒號修正道,“自動生成源代碼的編程也屬於另一種編程范式——生成式編程(Generative Programming)的范疇。有的元編程雖不生成源代碼,卻能修改程序。從低級的匯編語言到一些高級的動態語言如Perl、Python、Ruby、JavaScript、Lisp、Prolog等均支持此類功能。”

問號問道:“編寫病毒算不算元編程?”

“編寫一個只是刪除或感染文件的病毒,不必用到元編程。”冒號應道,“但如果要求此病毒能自我變異,那就需要元編程了。”

引號自言自語:“程序的程序,就是程序的平方。”

“也可以是程序的立方,四次方……理論上是無限次方。元程序將程序作為數據來對待,能自我發現和自我賦權,有著其他程序所不具備的自覺性、自適應性和智能性,可以說是一種最高級的程序。它要求編程者超越常規的編程思維,在一種嶄新的高度上理解編程。想象一下,”冒號激情勃發,“如果有一天機器人能自我學習、自我完善,甚至能生產機器人,實現‘智能繁衍’,是不是很美妙?”

“我怎麼覺得特恐怖呢?”歎號此言令人忍俊不禁。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved