一次编译和二次编译

C++和.Net程序采用了两种不同的编译方式。通常一个C++编写的程序,都是一次编译成二进制的代码,在相应的操作系统平台上直接执行即可。而.Net程序采用两次编译的方式,用C#,VB.Net等语言写成的程序被编译成IL代码,通过CLR在运行的时候JIT编译成为本地二进制代码。
个人觉得,MFC和WinForm很多设计上的不同从根本上说,都是因为编译模式带来的不同。因此,在仔细探讨MFC和WinForm之前,有必要细细体会一下不同编译方式带来的改变。
考虑一段代码,它需要在不同的编译环境下生成不同的代码,或者是为了减少代码编写量用一些替换方式取代类似的代码。在C++中利用预编译和宏来解决这些事情。MFC框架中,更是大量使用宏来进行核心功能的设计。但是宏只是一种巧妙的减少输入代码量的方式,本质上和手写输入一些代码并无区别(也许不够严密吧),它并不能在程序运行的时候动态支持代码的插入和改变,因为此时它已经编译完成了。而二次编译则不同,你可以将它的第一次编译看成是通常一次编译程序的预编译期,只是这个预编译更为的强大,它可以编译生成信息更为丰富的元数据。并且,只要在JIT执行前动态插入代码,利用反射等手段,就可以将已经编译好的程序的行为在某种程度上进行改变,其动态性能得到了本质上的改变。
因此,在MFC和WinForm中,我们可以看到两者在动态性能,安全性和效率方面都有很大的不同,总结一下,都可以归结到这不同的编译模式上来。在以后的日志中,都可以看到这些区别的。

posted on 2007-04-01 01:01 duguguiyu 阅读(423) 评论(2)  编辑 收藏 所属分类: .NetMFC vs WinForm

评论

#1楼  2007-09-26 00:22 小树林 [未注册用户]

  实际上C#对C++的优势关键在于反射、代理与垃圾收集 反射使得运行时型别信息能够完全获知,代理取代函数指针,并且功能远远强于C++指针,导致事件模型能很好地在C#中实现,而C++不可能实现相同功能,   回复  引用    

#2楼 [楼主] 2007-09-26 01:06 duguguiyu      

@小树林
之所以C#能有这些能力,很多还是取决于JIT二次编译模式,这就是我想表达的。。。   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 


导航

公告


姓名:A2F1H1I1N1U2Y1

性别:这里会有女人么?

特长:擅长回答各类码工常见问题,正确率高到0%。

欢迎前往观看另一个我




<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

搜索

 

留言簿(9)

随笔分类(133)

随笔档案(93)

积分与排名

最新评论

阅读排行榜