Ada语言及其标准库是否具有“循环依赖”?

时间:2013-10-30 16:24:14

标签: programming-languages ada circular-dependency standard-library

我读到Ada.Finalization.Controlled,当我在搜索范围退出时自动调用用户定义过程的可能性时,实现RAII范例,如c ++中用于资源管理一般,而不仅仅是记忆。

我发现要获得这样的自动scope-exit-invocation,你必须从标准库扩展一个类型。库的那部分是由编译器和语言定义专门处理的吗?或者该功能在技术上一般可用,但良好的实践原因要求使用库组件?

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

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

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

我发现:

  

langauge< - 标准库

     

langauge< - 任何其他图书馆

     

langauge< - application

是正常的。

如果箭头意味着拍摄方(图书馆,应用程序)的行为无法在不参考或解释指向方(语言)的情况下进行解释,那就是它“取决于”它,但指向的是方(语言)可以单独解释。此外,拍摄方面的一切(图书馆,应用程序)都可以替换,不会改变语言语义或破坏任何东西。

在我看来,Ada和Java都与他们的std-libs有“循环”关系。

  

语言< - >标准库

或者更确切地说:

  

整个语言< - 整个图书馆,

     

语言特征X - >库组件Y

     

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

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

所以我的问题是:

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

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

Ada.Finalization.Controlled参与了这种关系吗?

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

1 个答案:

答案 0 :(得分:3)

是的,Ada的某些功能取决于“预定义语言环境”,必须作为任何Ada编译系统的一部分提供。是的,Ada.Finalization.Controlled是其中一项功能。不,这不是潜在的问题根源。如果您来自C或C ++,可能需要略微调整一下思路,其中通过添加新关键字或新的有趣的标点符号序列来添加每个语言特征(而不是“标准库”)。 (好吧,我确定这是夸张的。)我能想到的其他软件包与预定义软件包有密切关系:System(Address属性使用类型System.Address),{{ 1}}(Ada.Exceptions使E具有exception when E : others},Ada.Exceptions.Exception_OccurrenceAda.Streams,以及其他人,具体取决于您定义的条款。它确实意味着你不能只用这个包的第三方备用版本替换System.Storage_Pools或这样的包,因为Ada.Finalization的实现很可能与编译器的工作原理相结合。我不认为这是一个问题。