【问题标题】:Why compiling into intermediate code?为什么要编译成中间代码?
【发布时间】:2011-06-22 19:42:38
【问题描述】:

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

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

只是为了代码混淆?还是什么?

此外,与编译为原生代码相比有什么好处?

【问题讨论】:

  • 这不是混淆。一点都没有

标签: c# java actionscript compiler-construction


【解决方案1】:

解析和 JIT 编译 IL 代码比解析高级语言(如 Java 或尤其是 C#)要快得多。

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

【讨论】:

    【解决方案2】:

    首先,从历史上看,Java 主要针对 CPU/内存非常有限的移动设备和嵌入式设备,而此类设备上的 JVM 无法像现代 JIT 现在那样进行任何密集优化。所以java工程师决定把优化移到编译阶段。

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

    【讨论】:

    • ASP.NET 是一个平台,而不是编程语言。
    • 好吧,可能是我用错了一些名字——.NET 不是我的专长 :)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        中间代码是两全其美 - 跨平台,但也更接近机器代码的正常编写方式。

        【讨论】:

          【解决方案6】:

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

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

          同时,Ruby 不能轻易地与其他语言的代码交流,因此它的社区必须投入更多的精力来开发特定于 Ruby 的库和框架,而且它的潜在用户必须更加愿意投入使用到大型平台转移才能使用。

          【讨论】:

          • JRuby(JVM 上的 Ruby)怎么样?
          猜你喜欢
          • 2010-10-03
          • 2014-05-24
          • 2012-08-04
          • 2012-12-28
          • 2020-02-02
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          • 2016-11-23
          相关资源
          最近更新 更多