“為C++實(shí)現(xiàn)一個(gè)IDL”這個(gè)主題,我已經(jīng)考慮得差不多了,最后幾個(gè)問(wèn)題也解決了,打算建立一個(gè)項(xiàng)目來(lái)實(shí)現(xiàn)它。
項(xiàng)目命名為ancients,字面意思是“遠(yuǎn)古的,舊的”,實(shí)際上這個(gè)主題也算是舊的了。原本打算命名為C++ Remoting,不過(guò)想了一下,還是換個(gè)名字,免得讓人一看就想拿去跟java, c#的remoting比較。
取這個(gè)名字主要是因?yàn)橄矚g看《星際之門》劇集,里面最喜歡的一個(gè)種族就是ancients。
asgard是另一個(gè)種族,在ancients這個(gè)名字被人占用了的情況下,只好選它了。它的字面意思是“仙宮”,也是不錯(cuò)的名字,呵呵。asgard這個(gè)種族的科技非常發(fā)達(dá),有先進(jìn)的亞空間旅行技術(shù),先進(jìn)的光傳送技術(shù),身體也比較符合一些報(bào)道中外星人的樣子。
暫時(shí)還沒(méi)找到合適的空間來(lái)放這個(gè)項(xiàng)目,就以壓縮包的形式在這個(gè)blog上做吧。
打算先實(shí)現(xiàn)動(dòng)態(tài)部分,我給它命名為reflection,模仿java的,當(dāng)然也不會(huì)做它那么完整。這部分必須先做,這樣方便用來(lái)測(cè)試靜態(tài)結(jié)構(gòu)。
然后是靜態(tài)結(jié)構(gòu)部分,前面已經(jīng)寫了2篇亂七八糟的描述,剩余問(wèn)題(函數(shù)原形推導(dǎo)問(wèn)題)基本已經(jīng)解決了。
整個(gè)框架在Service以下都是環(huán)境無(wú)關(guān)的,這里的環(huán)境指的是協(xié)議、通訊等環(huán)境。也就是說(shuō),定義一個(gè)Service,并不在一開(kāi)始就指定它所使用的通訊協(xié)議。定義完成以后,把它指定給一個(gè)協(xié)議,就可以實(shí)現(xiàn)協(xié)議綁定,甚至在運(yùn)行時(shí)刻動(dòng)態(tài)切換到另一個(gè)協(xié)議。當(dāng)然這可能是不合理的,不過(guò)我認(rèn)為如果支持這種做法,本身就是靈活性的一種體現(xiàn)。
前面還有些地方,和實(shí)際情況有些差別的,需要補(bǔ)充完善。簡(jiǎn)要描述如下:
使用宏來(lái)定義Service,前面只定義了方法的原型、名稱、服務(wù)端綁定的函數(shù),其實(shí)還差一個(gè)重要的東西,就是參數(shù)的名字。
如果使用自己的協(xié)議,或者是順序存儲(chǔ)的協(xié)議,比如BENCODE,來(lái)作為遠(yuǎn)程調(diào)用協(xié)議,那么參數(shù)的名字是不重要的,只要按順序把參數(shù)序列化、反序列化就可以了。
但在使用SOAP作為遠(yuǎn)程調(diào)用協(xié)議時(shí),就得考慮為參數(shù)加上名字了,SOAP是從XML元素中,按參數(shù)名稱來(lái)提取參數(shù)值的,雖然我們可以為參數(shù)生成一個(gè)名字,但這個(gè)名字不能描述參數(shù)所表達(dá)的意思。
所以需要考慮為參數(shù)取上名字。
暫時(shí)就補(bǔ)充這一點(diǎn),其它方面有等進(jìn)一步研究。