Java和.Net的共性:中间语言

  如果你比较熟悉Java的编译原理的话,你一定会对bytecode这个单词非常熟悉。确实,Java的最大特点并不是它是一个完全基于现代OO理念的编程语言或是其简单而容易上手,而是Java是并不直接把源代码编译为目标代码,而是先编译为一种中间语言:Java Bytecode。在实际执行的时候,Java的解释器JVM,向计算机解释这种代码,从而达到执行目的。在这里不想阐明所谓"编译"和"解释"两个专业术语。但是有一点希望大家了解:编译将生成目标代码,实际执行它,所以效率要高些。解释则不生成目标代码,效率低些。简单举个例子,如果说编译相当于书面翻译的话,解释则有点像口译。
       反观.Net,.Net也采用了编译为中间语言的方法,.Net的中间语言称为IL。这点上,.Net是吸取了Java的长处。同时,也拓宽了中间语言的使用范围。例如,.Net的语言互操作性,就是在IL层面上实现的。也就是说,不管你是用VB.Net,C#,还是J#,Managed C++,最终你编译得到的,都是IL。这就是.Net可以使用多种语言编些项目的秘密所在了。.Net与Java的不同之处在于,编译为中间语言之后,Java用JVM来解释之,而.Net则使用.Net特有的JIT编译器编译之。所谓JIT(Just In Time),是指.Net的JIT编译器并不一下把整个应用程序编译完毕(如果这样的话,应用程序将会有一个很长的启动时间),而是只编译将要执行的那一小段。代码编译过之后,得到的目标代码就可以存储在内存中,下次再执行到这里,就不需要重新编译了。微软认为这样编译,要比一次编译效率要高得多,因为很多代码并不是每次运行都会执行到,这样,这部分代码就不会被编译。同时,用一点编译一点带给用户的感受也是很好的,因为每次都指编译很小的一块,用户感受到的就像是在直接执行一个机器语言可执行程序一样。这就解释了为什么.Net程序虽然是一个与Java同样不直接编译为机器代码,但是运行效率却几乎和内部机器代码一样快。事实上,在相当长的一段时间内,.Net对Java有压倒性的效率优势,直到Jdk1.5出现之后,Java也采用了JIT编译方式。(但是现在,.Net的程序跑起来还是要比Java快一点。)
       为什么要非如此大的周折,采用两次编译的方法,把效率降到这个程度然后再想尽办法提升效率。一个重要的原因在于,编译为中间语言可以实现一个重要特性:平台无关性。平台无关性是指:你写的代码,所实现的功能,与你所采用的平台无关。举个例子,Java是一种平台无关性语言,所以你想绘制一个窗体,在上面显示一个Hello World,那么你写的代码不需要任何更改,就可以同时在Windows,Linux,或是其他有jdk存在的操作系统中执行。目前,在时下流行的大多数操作系统中,都有相应的jdk存在,Java当年推出的时候的豪言壮语:"Write once, run everywhere."在某种程度上说已经实现了。
       那么平台无关性是怎么实现的呢,这就与中间语言分不开了。中间语言可以经过精心设计,使得其本身与平台无关。当framework尝试去解释/编译中间语言的时候(对于.Net而言,完成这个工作的是CLR,对于Java而言,是JVM),将其转化为对应平台可以接收的机器语言代码,这样就可以实现平台无关。比如,中间语言有一个指令表示绘制一个窗体,那么,在Windows下,它被解释为某条(或很多条)Win32API指令,而在linux下面,它则被解释为linux可以接受的指令,这样就实现了平台无关性。
       需要说明的是,目前Java已经相当程度地实现了平台无关性,而对于.Net而言,平台无关性还只是一种可能--.Net采用了与Java相似而又相对优秀的技术,但是,目前,实际上,除了Windows系列操作系统(包括可以运行于手机的Windows)以外,并没有哪个操作系统存在.Net Framework。但是,很多大牛们正在积极准备,编写基于其它平台的.Net Framework。一个很好的例子就是Linux下面的Mono项目,目前Mono还处于测试阶段,但是包括remoting等.Net的重要功能,都已经可以很好地在Linux下面实现,如果你编写的仅仅是dll或是Console程序的话,那么你的程序应该可以在Linux下面运行。最新的消息表明,Mono的图形界面控件库也已经搭建完毕,相信很快,.Net就可以真正实现Linux和Windows的平台无关性。
       使用中间语言不仅仅可以实现平台无关性或是前面所提到的高级语言的互操作性。它还有很多其他重要特性:
      1. 性能优化。传统的编译器会优化代码,但是它们的优化过程独立于代码所运行的特定处理器和环境。这是由于,传统的编译器直接将软件编译为机器可执行的内部代码,编译器并不知道该程序将运行的处理器类型。例如,你想编译出来的程序可以利用Pentium III的新特性,那么你就必须要放弃Pentium I,II的用户。但是,使用了中间语言之后,实际的编译过程发生在客户端,编译器知道该程序将在什么环境下运行,于是编译器可以最大程度的利用新型处理器的新特性,编译出最优的目标代码。
       2. 基于代码的安全性。传统的目标代码(机器语言)非常抽象,机器不可能理解每条语句的意义,而只能照着执行。而采用中间语言之后,基于代码的安全控制成为可能。由于中间语言相对于机器语言比较具体,编译器在目标机器上编译并执行时,可以在编译之前检查,该程序是否具有执行该操作的权限。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值