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