为什么要编译成中间代码?

时间:2011-06-22 19:42:39

标签: c# java actionscript compiler-construction

为什么Actionscript,Java,C#等编译成中间代码? 我知道使用中间代码的跨平台优势。

问题是:与解释的脚本(JS,Python,PHP,Perl等)相比,编译到中间代码有什么好处?

它只是用于代码混淆吗?或者是什么?

此外,与编译本机代码相比有什么好处?

6 个答案:

答案 0 :(得分:12)

解析和编写IL代码比解析像Java这样的高级语言(尤其是C#(具有更多功能))要快得多。

它还允许开发人员使用新的语言功能,而无需在最终用户的计算机上更新任何内容。 (例如,LINQBridge)

答案 1 :(得分:6)

首先,历史上Java主要针对具有非常有限的CPU /内存的移动设备和嵌入式设备,并且此类设备上的JVM无法进行任何密集优化,就像现在的JIT一样。所以java engeneers决定将优化转移到编译阶段。

接下来,拥有“字节代码”/ IL允许您将来自不同语言的许多编译器转换为这样的字节代码 - 并且只有一个JVM / JIT。为每种语言创建单独的VM + JIT要高效得多。请记住,在JVM世界中有Java,JRuby,JPython,Groovy等,在.NET世界中有C#,VB#,ASP.NET,F#等,每个只有一个运行时/ VM。 / p>

答案 2 :(得分:1)

中间代码与程序集非常相似,因为它包含一组有限的指令。然后,运行时能够可靠且一致地对这个(稍微)一小组指令进行操作,而不必担心解析语言等。因此,它可以获得性能改进并进行优化。

答案 3 :(得分:1)

在.NET编译中,MSIL解决了C#,VB.NET等不同语言之间的互操作性。

答案 4 :(得分:1)

二进制代码指令非常简单和原子,比编程语句更加简单。

例如,z = a + b - (c * d)需要转换为将四个值加载到寄存器中,然后加,乘,减,然后写入另一个内存位置。所以我们至少有8条指令,只是为了那条线!

中间代码是两个世界中最好的 - 跨平台,但也更接近通常编写机器代码的方式。

答案 5 :(得分:1)

除了SLaks的答案之外,编译IL还可以实现一定程度的跨语言互操作性,这在解释语言中通常是不存在的。

这种优势对于新语言来说可能是巨大的。斯卡拉自2003年以来一直存在,它已经获得了巨大的牵引力。另一方面,Ruby在其存在的1.5亿年中并未远远超出用于Rails应用程序的范围。这至少部分是因为Scala与所有预先存在的Java代码和库是字节码兼容的,这使得它有一个巨大的优势:它的社区可以将大部分精力集中在语言本身上,潜在的采用者没有担心要经历任何特殊的扭曲(或更糟糕的是,更换他们的整个代码库)才能开始使用Scala。 F#的故事几乎完全相同,但对于其他主要的托管环境。

与此同时,Ruby不会轻易地使用其他语言的代码,因此其社区必须投入更多精力来开发特定于Ruby的库和框架,并且其潜在用户必须更愿意提交为了使用它,大规模的平台转移。