为什么Ada没有垃圾收集器?

Lot*_*har 12 garbage-collection ada

我知道GC在Ada开发的时代并不受欢迎,对于嵌入式编程的主要用例,它仍然不是一个好的选择.

但是考虑到Ada是一种通用编程语言,为什么不是部分和可选的(仅跟踪显式标记的内存对象)垃圾收集器在后来的语言版本和编译器实现中引入.

我根本想不到开发一个没有垃圾收集器的普通桌面应用程序了.

Car*_*icz 31

Ada的设计考虑了军事应用.其设计的一个重要优先事项是决定论.也就是说,人们希望Ada程序在任何环境下,在所有操作系统下,每次都能以完全相同的方式执行......那种事情.

垃圾收集器将一个应用程序转换为两个,相互作用.当GC决定开始工作时,Java程序会以随机的间隔产生打嗝,如果它的速度太慢,那么应用程序有时会耗尽堆而不是其他应用程序.

简化:垃圾收集器将一些可变性引入设计者不想要的程序中.你搞得一团糟 - 你把它弄干净了!相同的代码,每次都有相同的行为.

请注意,并非Ada在全球取得了成功.

  • 语言中没有任何内容表示"没有垃圾收集器",正如您所暗示的那样.如果有人在他们的编译器中想要一个,他们可以自由地放入一个.有些编译器有. (5认同)
  • 抱歉,这个答案是完全错误的,例如,Ada中的大部分任务模型是不确定的。Ada语言规范中没有阻止GC的内容-如果需要,可以使用GC可选的附加软件包。 (2认同)
  • 应该注意的是,当 C 的 `malloc` 需要以与 Java(其他语言的)GC 类似的非确定性方式将小块内存重新组合成更大的内存时,它具有类似的“打嗝”模式。易于分配/解除分配总是有代价的。 (2认同)

Mic*_*lon 15

因为Ada设计用于实时控制武器的防御系统,垃圾收集会干扰您的应用程序.这很危险,这就是为什么Java多年来一直警告它不能用于医疗保健和军事控制系统.

我相信不再存在Java的这种免责声明的原因是因为底层硬件变得更快以及Java具有更好的GC算法和更好地控制GC这一事实.

请记住,Ada是在1970年代和1980年代开发的,当时计算机的功能远远不如现在,而且在控制应用中,计时问题至关重要.


Adr*_*son 6

答案更复杂:Ada不需要垃圾收集器,因为实时约束等.但是,该语言设计巧妙,以便实现垃圾收集器.

虽然,许多(几乎所有)编译器都没有包含垃圾收集器,但有一些值得注意的实现:

  • GNAT补丁
  • 针对Java虚拟机的Ada编译器(我不知道这些项目是否仍然受支持).它使用了JVM的垃圾收集器.

网络上有很多关于垃圾收集的其他来源.这个问题已经在长度进行了讨论,主要是因为与Java的激烈竞争在90年代中期的(看看这个页面:"Ada 95 is what the Java language should have been"),当Java是'下一件大事’微软吸引C#之前.


T.E*_*.D. 6

首先,该语言中没有什么真正禁止垃圾收集的。

其次,某些实现确实执行垃圾回收。特别是,所有针对JVM垃圾的实现都将收集。

第三,有一种方法可以在所有编译器中获得一定数量的垃圾回收。您会看到,当访问类型超出范围时,如果您明确地告诉该语言留出一定数量的空间来存储其对象,那么该空间将在此时被销毁。我过去曾使用过这种方式来获得一些垃圾回收。您使用的声明voodo是:

type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K
Run Code Online (Sandbox Code Playgroud)

如果执行此操作,则当Foo类型超出范围时,将清除分配给Foo指针指向的Blah对象的所有(100K)内存。由于Ada允许您将子例程嵌套在其他子例程中,因此此功能特别强大。

要了解有关storage_size和存储池可以做什么的更多信息,请参阅LRM 13.11

第四,编写良好的Ada程序不太像C程序那样依赖动态内存分配。C有许多设计漏洞,从业人员学会了使用指针进行绘制。在Ada中,许多惯用语不是必要的。