语言混编总结二
语言混编的核心在于建立联系。
语言混编是两种以上的语言合作,利用各自的优点,协作完成软件的功能。
要完成语言的混合编程开发,需要各种层次的支持,分别是开发时、编译时、运行时;同时要准对不同语言的特点区别对待。
开发要做的事情:
1)建立语言同等层次的对象和值的映射关系;
2)建立联系;包含赋值、调用、上下文引用、(协议)桥接注册等。
注:桥接注册是跨语言时,一种语言的要素向另一种语言宣告存在的声明;另一种语言在引用时会检索这个声明列表。
依赖注入、存在宣告。
编译时要做的工作,主要是考察两种语言在编译后的融合程度。分为三种情况。
1)全部融合为一个可执行文件;比如c++和oc,在机器码层面上实现了无差别融合;这个时候需要编译器支持,不需要系统的运行时支持。
2)分裂为两种可执行文件;比如c++和java;java是字节码的存在,需要解释执行;c++部分以库文件的形式存在,用于辅助。这个时候需要运行时桥接支持。
3)分裂为源码和可执行文件(字节码)的形式。比如oc和js。oc以可执行文件形式存在,js以源码形式寸杂。在运行时,js代码加载到运行环境,然后执行。
两种代码的融合,完全有系统和运行时支持。
系统和运行时:
1)对于最终形态为一个可执行文件的混编,无需任何支持。
2)对于非一个可执行文件的混编,
(1)需要考虑不同语言的加载形式。
(2)需要运行时的桥接支持,以打破相互调用的界限。
这个与动态链接库的动态加载有点类似。
混编运行时支持的本质在于:语言的运行环境是本身也是软件,并且运行机制与通信的语言环境相同,所以可以留后门。比如javascribcore就是oc语言实现的;
所以便于与oc通信。
混编与线程:
当语言混编存在时,调用通信不一定发生在期望的线程中;比如js调用oc,这时候需要尤其注意。
虚拟机或解释器是桥接的关键;用于给信息交换提供上下文。