0

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

编辑我不是在谈论垃圾收集。我只是想知道可以free()自动为我记忆的语言,并且仍然可以编译成机器代码。

4

6 回答 6

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 框架的依赖。

于 2009-07-31T15:14:59.870 回答
8

很多:

LISP(及其变体)、Erlang、C#(在 Mono 下)、Haskell、Java(使用 gcj)

于 2009-07-31T15:07:07.747 回答
4

当然有。以 Java 为例。(gcj)

但是,托管一词本身意味着您必须携带一些运行时。

于 2009-07-31T15:03:56.393 回答
3

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

  • OCaml
  • D
  • 艾达
  • 序言
  • 干净的
  • 埃菲尔
于 2009-07-31T15:15:15.500 回答
1

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

于 2009-07-31T15:07:19.930 回答
1

有一个半GC选择:GLIB。

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

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

于 2009-07-31T15:24:44.987 回答