qiezi的学习园地

AS/C/C++/D/Java/JS/Python/Ruby

  C++博客 :: 首页 :: 新随笔 ::  ::  :: 管理 ::
“为C++实现一个IDL”这个主题,我已经考虑得差不多了,最后几个问题也解决了,打算建立一个项目来实现它。

项目命名为ancients,字面意思是“远古的,旧的”,实际上这个主题也算是旧的了。原本打算命名为C++ Remoting,不过想了一下,还是换个名字,免得让人一看就想拿去跟java, c#的remoting比较。

取这个名字主要是因为喜欢看《星际之门》剧集,里面最喜欢的一个种族就是ancients。

asgard是另一个种族,在ancients这个名字被人占用了的情况下,只好选它了。它的字面意思是“仙宫”,也是不错的名字,呵呵。asgard这个种族的科技非常发达,有先进的亚空间旅行技术,先进的光传送技术,身体也比较符合一些报道中外星人的样子。

暂时还没找到合适的空间来放这个项目,就以压缩包的形式在这个blog上做吧。

打算先实现动态部分,我给它命名为reflection,模仿java的,当然也不会做它那么完整。这部分必须先做,这样方便用来测试静态结构。

然后是静态结构部分,前面已经写了2篇乱七八糟的描述,剩余问题(函数原形推导问题)基本已经解决了。

整个框架在Service以下都是环境无关的,这里的环境指的是协议、通讯等环境。也就是说,定义一个Service,并不在一开始就指定它所使用的通讯协议。定义完成以后,把它指定给一个协议,就可以实现协议绑定,甚至在运行时刻动态切换到另一个协议。当然这可能是不合理的,不过我认为如果支持这种做法,本身就是灵活性的一种体现。



前面还有些地方,和实际情况有些差别的,需要补充完善。简要描述如下:

使用宏来定义Service,前面只定义了方法的原型、名称、服务端绑定的函数,其实还差一个重要的东西,就是参数的名字。
如果使用自己的协议,或者是顺序存储的协议,比如BENCODE,来作为远程调用协议,那么参数的名字是不重要的,只要按顺序把参数序列化、反序列化就可以了。
但在使用SOAP作为远程调用协议时,就得考虑为参数加上名字了,SOAP是从XML元素中,按参数名称来提取参数值的,虽然我们可以为参数生成一个名字,但这个名字不能描述参数所表达的意思。
所以需要考虑为参数取上名字。

暂时就补充这一点,其它方面有等进一步研究。
posted on 2005-09-20 10:30 qiezi 阅读(513) 评论(16)  编辑 收藏 引用 所属分类: 自家破烂C++