是否有任何托管编程语言可以编译为机器代码?

时间:2009-07-31 15:02:00

标签: managed-code machine-code

托管语言是为您处理内存清理的语言。

编辑我不是在谈论垃圾收集。我只是对了解free()自动记忆的语言感兴趣,并且仍然可以编译成机器代码。

6 个答案:

答案 0 :(得分:9)

您似乎混淆了“托管”和“垃圾收集”,而通常托管语言(例如C#和Java)具有自动垃圾收集功能,“托管”实际上指的是存在“虚拟机”的事实执行你的代码(见http://en.wikipedia.org/wiki/Managed_code)。

例如,CLR(公共语言运行时)是执行.Net代码的虚拟机,而JVM(Java虚拟机)是执行java代码的虚拟机。

实际上你可以为非托管语言设置垃圾收集(例如C++),反之亦然,托管语言没有垃圾收集(编辑:我当时正在寻找一些,但我似乎找不到任何东西,除非Objective C很重要,我不确定在没有垃圾收集的情况下创建托管语言会有很大的意义。

Java和C#实际上都可以直接编译成机器代码,所以它们直接执行而不是使用虚拟机 - 对于.Net代码,这是使用NGEN完成的(实际上CLR将.Net程序集编译到机器中)代码执行时,所谓的“及时”编译)

编辑:作为对您的问题更新的更新,事实上在完全手动内存管理和垃圾收集的极端之间的频谱中有许多垃圾收集的替代方案,以及很多编译成机器代码的语言都包含不同形式的内存管理,不需要你明确释放内存。

我可以问一下 - 这是一个“不感兴趣”的问题,还是你试图为一个项目选择一种语言 - 如果是后者那么你为什么对你的语言编译成机器代码如此感兴趣?当然在.Net的情况下,你的代码编译JIT提供了许多性能优势(在大多数情况下),同样NGENing你的代码不会消除对.Net框架的依赖。

答案 1 :(得分:8)

批次:

LISP(和变体),Erlang,C#(Mono下),Haskell,Java(带gcj)

答案 2 :(得分:4)

当然有。例如,Java。 (GCJ)

然而,管理本身意味着你必须携带一些运行时。

答案 3 :(得分:3)

更广泛意义上的“托管”意味着安全(通过运行时类型检查或详尽的静态分析)和/或垃圾收集:

  • OCaml的
  • d
  • 阿达
  • 的Prolog
  • 清洁
  • 艾菲尔

答案 4 :(得分:1)

类似于Efraims的回答,任何.NET程序也会编译为机器代码,通常分两步(JIT),但有一个NGEN工具可以将MSIL预编译为本机。

答案 5 :(得分:1)

有一个半GC选择:GLIB。

Gilb使用引用计数来管理对象的生命周期。当参考计数满足0时,将清理一个对象。

它比.NET或Java或Python更加不方便,但是当你必须使用C时,它总比没有好。