sherrylso

C++博客 首页 新随笔 联系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

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

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

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

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

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

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

详见解释:

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

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

    


posted on 2009-02-18 15:28 爱上龙卷风 阅读(2541) 评论(2)  编辑 收藏 引用

Feedback

# re: 程序的模块化之:关于Native DLL和Java JAR的一些思考 2009-02-18 17:46 路人乙
是翻译的文章吗,怎么有些地方读着不顺不清不楚的?
比如“对于常规的函数库,链接器从中拷贝它需要的所有库函数,并把确切的函数地址传送给调用这些函数的程序。”
“常规的函数库”此处确切的指普通静态库,而不是“常规”的意思,“连接器从中”是指“从”静态库“中”,“函数地址传送”其实本质上讲编译器做的并不是“传送”动作,而是将二进制代码从定位后的相对地址填入函数调用处。

后面就更多了,尤其那些中英文夹杂的地方莫名其妙的保留英文原文,那些都是有明确的中文表达方式的,不是什么非英文描述不可的概念。  回复  更多评论
  

# re: 程序的模块化之:关于Native DLL和Java JAR的一些思考 2009-02-18 18:02 爱上龙卷风
@路人乙
多谢!  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理