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

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

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

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

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

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

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

解析和JIT编译IL代码比解析像Java这样的高级语言,特别是C#(具有更多function)要快得多。

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

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

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

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

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

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

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

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

同时Ruby不会轻易地使用其他语言的代码,因此它的社区必须投入更多精力来开发特定于Ruby的库和框架,并且其潜在用户必须更愿意承诺大量 – 平台移位以便使用它。