题
我知道GC不受欢迎的日子,当Ada开发,并用于主要使用情况的嵌入程,它仍然不是一个好的选择。
但考虑到Ada是一个通用的语言编程为什么不是部分的和可选择的(痕迹只有明确标记的存储目的)的垃圾收集器引入的,在以后的修订版本的语言和编译器的实现。
我只是不能认为发展中一个正常的桌面应用程序没有垃圾收集了。
解决方案
Ada是设计有军事用途中心。其中一大优先事项在其设计是决定论。即一个想要一个Ada的程序始终如一地执行完全相同的方式每一次,在任何环境中,在所有操作系统...这有点东西。
一个垃圾收集器变成一种应用程序一分为二,工作对一个另一个。Java程序发展的问题,在随机间隔时GC决定去工作,如果它太慢了关于它有一个机会,申请将运行的堆有时并不是其他人。
简化:垃圾收集器,引入了一些变化进入程序的设计者没想要的。你弄得一团糟-你清理干净!同样的代码,同一行为的每一个时间。
不,Ada成为肆虐全球的成功,心你。
其他提示
由于阿达设计用于在控制武器的实时防御系统的使用,和垃圾收集与应用程序的时间干扰。这是很危险这就是为什么,很多年了,Java出现一个警告,它并没有被用于医疗和军事控制系统。
我相信再也没有与Java这样的声明的原因是因为底层的硬件已经变得更快,以及事实上,Java有更好的GC算法和在GC更好的控制。
请记住,艾达是在1970年和1980年的一次开发时,电脑是远远超过他们今天不太强大,并且在控制应用中的时序问题是最重要的。
首先,没有什么语言真的那么的禁止的垃圾收集。
其次一些实施方式的不执行垃圾收集即可。特别是,所有靶向JVM垃圾的实现收集。
第三,有办法让垃圾收集与所有的编译器的一些量。你看,当访问的键入的超出范围,如果你specifially告诉预留的空间certian金额及对象存储的语言,那么空间将在该点被破坏。我已经在过去使用它来获取垃圾收集的一些点点。 voodo您使用的声明是:
type Foo is access Blah;
for Foo'storage_size use 100_000_000; --// 100K
如果你这样做,然后分配给布拉赫对象的内存中的所有(100K)指向指针富时富类型超出范围将被清理。由于阿达允许你嵌套子程序其他子程序的内部,这是特别强大。
要看到更多关于STORAGE_SIZE和存储池可以为你做什么,看到的 LRM 13.11
四,精心编写的Ada程序不倾向于依靠动态内存分配远远不如C程序做。 C具有许多设计漏洞,practicioners学会了用指针油漆过。很多这些习语的不nessecary Ada中。
首先,我想知道谁在使用阿达这些天。其实我喜欢的语言,甚至还有用于Linux / Ada的一个GUI库,但我还没有听说过积极的Ada开发什么好几年了。由于它的军事联系,我真的不知道,如果是古代历史或使巨大的成功,它的使用的所有提到分类。
我认为有在阿达没有GC几个原因。首先,也是最重要的,它的历史可以追溯到一个时代,主要用于大多数编译语言堆栈或静态存储器,或者在少数情况下,明确堆分配/释放。 GC作为一般哲学真的只起飞约1990年左右,当OOP,改进的内存管理算法和处理器功能足够强大做足周期来运行它进入了自己。什么简单的编译艾达可以做一台IBM大型机4331,1989年只是无情。现在我有一个手机,这款手机可以超越那台机器的CPU。
另一个很好的理由是,有谁认为严格的程序设计,包括了内存资源精确控制人,并有不应该成为让动态获取的物体漂浮任何宽容。可悲的是,太多的人最终泄漏内存动态内存越来越规则。此外,像过高级语言汇编语言的“效率”,和原始JDBC过ORM系统的“效率”,手动内存管理的“效率”倾向于反转,因为它大大加快了(我见过的ORM基准在JDBC相当于只有一半的效率)。反直觉的,我知道,但这些天的系统在全球范围内优化大型应用程序要好得多,再加上他们能够做出彻底的重新优化,响应表面上轻微changes.Including动态地重新平衡基础上检测到的飞行算法负荷。
我怕我会与那些谁说,实时系统不起GC存储不同。 GC不再东西,冻结整个系统每两分钟。我们有更聪明的方式来回收内存的这些日子。
我想我会分享如何实现自由()过程(这将在大家都熟悉的C语言编程的方式来使用),一个非常简单的例子...
with Ada.Integer_Text_IO, Ada.Unchecked_Deallocation;
use Ada.Integer_Text_IO;
procedure Leak is
type Int_Ptr is access Integer;
procedure Free is new Ada.Unchecked_Deallocation (Integer, Int_Ptr);
Ptr : Int_Ptr := null;
begin
Ptr := new Integer'(123);
Free (Ptr);
end Leak;
调用在程序将返回所分配的整数到存储池(在C用语“堆”)的端部自由。可以使用的valgrind证明这事实上确实防止泄漏4个字节的内存。
在Ada.Unchecked_Deallocation(一般定义的过程)可以在(我认为)使用可使用“新”的关键字被分配的任何类型。阿达参考手册(“13.11.2未选中存储取消分配”)具有更多的细节。
您的问题是不正确。它的作用。看到它处理GC为您的包ada.finalization。