<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    冒號和他的學生們

    ——程序員提高班紀事

    1. 超級范式

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


    引號忽然想起一事,問道:“有一本名為《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那么標準,并且用戶隨時可能改變格式標準,請問如何設計這段程序?”

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

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

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

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

    眾人一樂。

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

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

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

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

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

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

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

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

    posted on 2008-05-10 00:02 鄭暉 閱讀(2019) 評論(3)  編輯  收藏 所屬分類: 冒號和他的學生們

    評論

    # re: 冒號和他的學生們(連載10)——超級范式 2008-05-10 00:29 Lone_wolf

    “如果有一天機器人能自我學習、自我完善,甚至能生產機器人,實現‘智能繁衍’,是不是很美妙?”
    可能到時候不是"美妙"了,是嘆號說的"恐怖"了..  回復  更多評論   

    # re: 冒號和他的學生們(連載10)——超級范式 2008-08-05 14:54 Odin

    那肯定是跟《機械公敵》一樣了  回復  更多評論   

    # re: 冒號和他的學生們(連載10)——超級范式 2008-09-11 14:48 卡拉揚

    醍醐灌頂啊!  回復  更多評論   

    導航

    統計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久精品国产亚洲av瑜伽| 暖暖免费高清日本一区二区三区| 亚洲av无码无线在线观看| 亚洲AV无码精品色午夜在线观看| 国产一级理论免费版| 1024免费福利永久观看网站| 在线免费观看h片| 免费国产在线精品一区| 亚洲综合在线一区二区三区 | 亚洲精品国产av成拍色拍| 久久夜色精品国产噜噜亚洲AV| 亚洲一区二区精品视频| 国产成人高清精品免费软件| 欧洲精品成人免费视频在线观看| 少妇太爽了在线观看免费视频| 两个人的视频www免费| 免费无码午夜福利片| 青青青亚洲精品国产| 亚洲欧洲AV无码专区| 久久精品国产亚洲AV忘忧草18| 亚洲无线电影官网| 亚洲av无码精品网站| 亚洲国产精品久久久天堂| 中文字幕精品亚洲无线码二区| 亚洲AⅤ无码一区二区三区在线| 日本a级片免费看| 好大好深好猛好爽视频免费| 成熟女人牲交片免费观看视频| 免费三级毛片电影片| 国产精品成人观看视频免费| 91av免费观看| 91成人免费在线视频| 免费观看的毛片大全| 日韩av无码成人无码免费 | 在线aⅴ亚洲中文字幕| 亚洲人成7777| 亚洲国产成人AV在线播放 | 亚洲国产精品成人网址天堂| 亚洲福利精品电影在线观看| 亚洲精品第一国产综合境外资源 | 狠狠入ady亚洲精品|