我阅读了有关 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 标准库的任何(其他)组件是否从编译器和语言定义中得到特殊处理?