程序的模块化之:关于Native DLL和Java JAR的一些思考

程序的模块化之:关于Native DLL和Java JAR的一些思考

       Windows Native的c++应用大量使用了DLL技术。"动态链接"这几字指明了DLLs是如何工作的。对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。而对于DLLs,函数储存在一个独立的动态链接库文件中。在创建Windows程序时,链接过程并不把DLLs文件链接到程序上。直到程 序运行并调用一个DLLs中的函数时,该程序才要求这个函数的地址。此时Windows才在DLLs中寻找被调用函数,并把它的地址传送给调用程序。采用这种方法,DLLs达到了复用代码的极限。

      对于DLL, 关键一点是,所有run on windows system 的程序可以共用同一个DLL库,从而达到最大限度的代码复用。并且,由于DLL并不拷贝它需要的所有库函数 , 这样的话Native的C++程序 executable image size 会比较小。

      从modularity的角度,如果要在Java的应用里寻找相对应的DLL的概念,我们会自然地想到jar包。JAR包可以被 Class Loader动态装载进JVM, 不过要几点区别需要说明的是:

第一、从本质上来讲,JAR包是存在于磁盘上的一些data而已(由JVM解释执行),而DLL是executable 的image。

第二、Class Data Sharing (CDS)作为一个新的feature,在Java5才被引入,其做法就是:把 system jar 文件打包成为"shared archive",这些"shared archive"会作为memory-mapped in文件存在,共享于不同的JVM 进程间,以减少JVM的footprint,加快Java应用的启动时间。

            值得一提的是:两者都有所谓的HELL问题(JAR HELL vs DLL HELL),新老版本的兼容问题始终让人头疼。

详见解释:

http://en.wikipedia.org/wiki/DLL_hell

http://en.wikipedia.org/wiki/JAR_hell#JAR_hell

    


你可能感兴趣的:(程序的模块化之:关于Native DLL和Java JAR的一些思考)