【问题标题】:Does the Ada language and its standard library have "circular dependence"?Ada 语言及其标准库是否存在“循环依赖”?
【发布时间】:2013-10-30 16:24:14
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 更不用说type Boolean is (False, True);(在系统IIRC包中)。
  • @JacobSparreAndersen 不,它在Standard 中定义。我真的不想提及Standard,因为它本身就是一个超级特例。
  • 更不用说每个符合标准的编译器都必须实现附件 A(标准库)。
  • @darkeskhan 是的,但问题不在于编译器是否有义务实现它们。编译器必须提供Ada.Text_IO,但语言中没有任何东西强制实现与编译器本身的实现方式紧密耦合,而不是Ada.FinalizationAda.Exceptions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
相关资源
最近更新 更多