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