关于C++的ABI

  如果要给最头疼的C++特性投 票,我会选ABI兼容:C++标准没有明确跨编译器的二进制兼容,于是各个编译器的实现都不同。用VC在Extension Dll里实现一个类,到了gcc代码里就不能直接调用。这带来了很多麻烦,尤其在有移植和平台兼容需求的大项目里。最近我的项目进行下一步规划,就为培训新手挠头。

  更糟的是,这还导致其他编程语言不能简明地“胶合”C++:大多数编程语言的编译器或解析器都是以C/C++实现的。按理说来,在这些语言中调用C++的类应该是很容易实现的天然属性。但是正由于ABI不兼容,这些语言要支持C++二进制调用就必须先选择编译器:到底是支持VC还是 gcc?因此很多语言避开C++,以纯C形式的动态链接库(Windows下就是Regular Dll)作为对外胶合的二进制接口。这进一步影响到不少混合语言项目选用C而非C++与动态语言进行高低搭配。

  作为实现“底层硬核”的系统级语言,C++的调用接口这种基础机制不理想,负面影响有些大。

  当然也有不少对应的解决方案。最有名的是COM,它利用类似虚函数表的方法,建立语言无关的接口兼容模型,微软把Windows系统的几乎所有的模块接口都变成了COM,比如ActiveX和DirectX。还有其他一些常用方案,像SWIG。普通一点的方法是用C语言接口做桥接。

  前几天刘未鹏征求中国程序员给B.S.的问题,俺问ABI标准啥时候有指望。据说问题的关键不是技术,而是C++标准委员会各大厂商间的政治原因。

  BTW:最近玩D语言,本来就是一帮C++高手另立山头搞出来的,自然是针对后者的软肋作改进,目前看起来的确很美好。不过二十年前C++刚从C里面蜕变出来时,看起来也很美。路漫漫其修远兮。

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.