您好,登錄后才能下訂單哦!
元編程這個概念本身不新,只是沒有發現原來很早就在用這個東西,所以python等下再聊,先理一理怎么理解編程這個事情。
我仔細思考,其實是在做一件設計想法,紀錄想法,實現想法的過程。
怎么樣設計想法?應該需要一些圖形,文字通過一定格式紀錄下來,反復修改,最好是有一個規范或者工具讓其他人也能明白和理解,方便交流。這個問題在編程這里也就是進入到編程語言的選擇上面來,也可以自己制定一個規范,不管你用lex+yacc語法制導還是設計LLVM的AST,反正結果是要一種編程語言來設計你的想法。
選定了設計想法的規范也就是編程語言,現在就是怎么樣來紀錄想法,顯而易見不可能是流水賬式的紀錄,你得把想法重點理清楚,想法的關鍵字是什么,有些什么用途,有沒有關聯的事務,這里就是紀錄想法的格式,對應到編程就是你用什么設計模式,你是用傳統的類繼承,還是鴨子類型的接口或者猴子補丁的方式來紀錄想法。
有了紀錄的想法圖紙,對應到編程就是靜態的代碼字面量,就能真正的實現想法,根據想法圖紙生成真實的對象。
這個過程和元編程有什么關系?如果你明白上面的過程,我就可以這樣描述:lex+yacc可以創建編程語言,編程語言可以創建元編程,元編程可以創建類,類可以創建對象實例。
那到底什么是元編程呢,C++里面他的實現叫做模板和宏,python里面他可以用裝飾器實現,也可以用type元類型實現,他是在編程語言和類之間的一層設計技術,yacc生成的對象是編程語言,編程語言生成的對象是元編程對象,元編程對象生成的對象是類,類生成的對象是實例。
C的宏和模板出現得很早很早,本質也很簡單,就像是一份留白的合同,你填上名字就能用。
python對象有2個重要的容器,一個是繼承元組,一個是屬性字典,所有的屬性包括方法都是放在屬性字典里面,這個2個容器在init之前就已經生成好,如果你要在init之前做一些處理,比如捕獲子類的屬性名把字符串類型的屬性名前面都加上str,把方法名首字符都大寫,強制子類使用一些編程規約,還或者加載一些緩存的數據,實現方法重載等等。當然子類可以在init做自己的處理,如果你是一個框架的設計者,自動化一些背后的處理確實看起來很高級。所以元編程的本質就是一種增加樂趣的玩具,應為編碼很枯燥的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。