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