Lot*_*har 12 garbage-collection ada
我知道GC在Ada开发的时代并不受欢迎,对于嵌入式编程的主要用例,它仍然不是一个好的选择.
但是考虑到Ada是一种通用编程语言,为什么不是部分和可选的(仅跟踪显式标记的内存对象)垃圾收集器在后来的语言版本和编译器实现中引入.
我根本想不到开发一个没有垃圾收集器的普通桌面应用程序了.
Car*_*icz 31
Ada的设计考虑了军事应用.其设计的一个重要优先事项是决定论.也就是说,人们希望Ada程序在任何环境下,在所有操作系统下,每次都能以完全相同的方式执行......那种事情.
垃圾收集器将一个应用程序转换为两个,相互作用.当GC决定开始工作时,Java程序会以随机的间隔产生打嗝,如果它的速度太慢,那么应用程序有时会耗尽堆而不是其他应用程序.
简化:垃圾收集器将一些可变性引入设计者不想要的程序中.你搞得一团糟 - 你把它弄干净了!相同的代码,每次都有相同的行为.
请注意,并非Ada在全球取得了成功.
Mic*_*lon 15
因为Ada设计用于实时控制武器的防御系统,垃圾收集会干扰您的应用程序.这很危险,这就是为什么Java多年来一直警告它不能用于医疗保健和军事控制系统.
我相信不再存在Java的这种免责声明的原因是因为底层硬件变得更快以及Java具有更好的GC算法和更好地控制GC这一事实.
请记住,Ada是在1970年代和1980年代开发的,当时计算机的功能远远不如现在,而且在控制应用中,计时问题至关重要.
首先,该语言中没有什么真正禁止垃圾收集的。
其次,某些实现确实执行垃圾回收。特别是,所有针对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中,许多惯用语不是必要的。
| 归档时间: |
|
| 查看次数: |
5690 次 |
| 最近记录: |