元編程這個(gè)概念本身不新,只是沒(méi)有發(fā)現(xiàn)原來(lái)很早就在用這個(gè)東西,所以python等下再聊,先理一理怎么理解編程這個(gè)事情。
我仔細(xì)思考,其實(shí)是在做一件設(shè)計(jì)想法,紀(jì)錄想法,實(shí)現(xiàn)想法的過(guò)程。
怎么樣設(shè)計(jì)想法?應(yīng)該需要一些圖形,文字通過(guò)一定格式紀(jì)錄下來(lái),反復(fù)修改,最好是有一個(gè)規(guī)范或者工具讓其他人也能明白和理解,方便交流。這個(gè)問(wèn)題在編程這里也就是進(jìn)入到編程語(yǔ)言的選擇上面來(lái),也可以自己制定一個(gè)規(guī)范,不管你用lex+yacc語(yǔ)法制導(dǎo)還是設(shè)計(jì)LLVM的AST,反正結(jié)果是要一種編程語(yǔ)言來(lái)設(shè)計(jì)你的想法。
選定了設(shè)計(jì)想法的規(guī)范也就是編程語(yǔ)言,現(xiàn)在就是怎么樣來(lái)紀(jì)錄想法,顯而易見不可能是流水賬式的紀(jì)錄,你得把想法重點(diǎn)理清楚,想法的關(guān)鍵字是什么,有些什么用途,有沒(méi)有關(guān)聯(lián)的事務(wù),這里就是紀(jì)錄想法的格式,對(duì)應(yīng)到編程就是你用什么設(shè)計(jì)模式,你是用傳統(tǒng)的類繼承,還是鴨子類型的接口或者猴子補(bǔ)丁的方式來(lái)紀(jì)錄想法。
有了紀(jì)錄的想法圖紙,對(duì)應(yīng)到編程就是靜態(tài)的代碼字面量,就能真正的實(shí)現(xiàn)想法,根據(jù)想法圖紙生成真實(shí)的對(duì)象。
這個(gè)過(guò)程和元編程有什么關(guān)系?如果你明白上面的過(guò)程,我就可以這樣描述:lex+yacc可以創(chuàng)建編程語(yǔ)言,編程語(yǔ)言可以創(chuàng)建元編程,元編程可以創(chuàng)建類,類可以創(chuàng)建對(duì)象實(shí)例。
那到底什么是元編程呢,C++里面他的實(shí)現(xiàn)叫做模板和宏,python里面他可以用裝飾器實(shí)現(xiàn),也可以用type元類型實(shí)現(xiàn),他是在編程語(yǔ)言和類之間的一層設(shè)計(jì)技術(shù),yacc生成的對(duì)象是編程語(yǔ)言,編程語(yǔ)言生成的對(duì)象是元編程對(duì)象,元編程對(duì)象生成的對(duì)象是類,類生成的對(duì)象是實(shí)例。
C的宏和模板出現(xiàn)得很早很早,本質(zhì)也很簡(jiǎn)單,就像是一份留白的合同,你填上名字就能用。
python對(duì)象有2個(gè)重要的容器,一個(gè)是繼承元組,一個(gè)是屬性字典,所有的屬性包括方法都是放在屬性字典里面,這個(gè)2個(gè)容器在init之前就已經(jīng)生成好,如果你要在init之前做一些處理,比如捕獲子類的屬性名把字符串類型的屬性名前面都加上str,把方法名首字符都大寫,強(qiáng)制子類使用一些編程規(guī)約,還或者加載一些緩存的數(shù)據(jù),實(shí)現(xiàn)方法重載等等。當(dāng)然子類可以在init做自己的處理,如果你是一個(gè)框架的設(shè)計(jì)者,自動(dòng)化一些背后的處理確實(shí)看起來(lái)很高級(jí)。所以元編程的本質(zhì)就是一種增加樂(lè)趣的玩具,應(yīng)為編碼很枯燥的。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。