1

我阅读了有关 Ada.Finalization.Controlled 的信息,当时我正在寻找在范围退出时自动调用用户定义的过程的可能性,以实现 RAII 范式,如 c++ 中一般用于资源管理,而不仅仅是内存。

我发现要获得这种自动范围退出调用,您必须从标准库中扩展一个类型。库的那部分是否由编译器和语言定义专门处理?或者该功能在技术上通常是可用的,但良好实践的原因决定了库组件的使用?

我现在想知道,Ada 语言语义是否“依赖”于标准库?

我不确定术语,所以让我详细说明。

我的意思是 Ada 语言和 Ada.Finalization.Controlled 之间是否存在关系,类似于 Java 中的 for(x:y) 循环如何“依赖”java.lang.Iterable,或者字符串看起来如何只是一个类,但对 operator+ 和文字有特殊处理。

我发现:

语言 <-- 标准库

语言 <-- 任何其他库

语言 <-- 应用程序

要正常。

其中箭头表示射击方(库,应用程序)的行为不能在不参考或解释指向方(语言)的情况下解释,即它“取决于”它,但指向方(语言) ) 可以自己解释。此外,拍摄方面的所有东西(库、应用程序)都可以替换,而不会改变语言语义或破坏任何东西。

在我看来,Ada 和 Java 都与它们的标准库有“循环”关系。

语言 <--> 标准库

更确切地说:

整个语言 <-- 整个库,以及

语言功能 X --> 库组件 Y

但是如上所述,该库组件已经依赖于其他语言功能。

(在我看来,可以通过将该部分从库中移动到仅在语言中来消除这种情况,也就是说,该语言可以“吞下该库组件的语义”并且会出现干净的情况。)

所以我的问题是:

我的上述解释是愚蠢的还是无意义的,还是只有语言纯粹主义者才关心的东西?

这样的(潜在)问题来源不是吗?

Ada.Finalization.Controlled 是否涉及这种关系?

Ada 标准库的任何(其他)组件是否从编译器和语言定义中得到特殊处理?

4

1 回答 1

4

是的,Ada 的某些特性依赖于“预定义的语言环境”,它必须作为任何 Ada 编译系统的一部分提供。是的,Ada.Finalization.Controlled是这些功能之一。不,这不是问题的潜在根源。如果您来自 C 或 C++,则可能需要稍微调整思维,其中每个语言功能(与“标准库”相对)都是通过添加新关键字或新的有趣的标点字符序列来添加的。(好吧,我敢肯定这是夸大其词。)我能想到的其他包与预定义的包有密切的关系:(System地址属性使用类型System.Address),Ada.Exceptionsexception when E : others使 E 具有类型Ada.Exceptions.Exception_OccurrenceAda.Streams,,System.Storage_Pools,以及其他取决于您定义您的条款的人。这确实意味着你不能仅仅Ada.Finalization用一些第三方替代版本的包替换或包这样的包,因为它的实现Ada.Finalization很可能与编译器的工作方式相结合。我不认为这是一个问题。

于 2013-10-30T18:04:27.870 回答