奥伯伦:如何解决沃斯PIO型防护中的矛盾

  • 本文关键字:PIO 矛盾 何解决 解决 oberon
  • 更新时间 :
  • 英文 :


我正试图弄清楚Oberon是否允许对记录中的字段进行寻址,该字段不存在于所述记录的类型声明中,但仅存在于其扩展名中,并且在没有类型保护的情况下这样做。

在PIO("奥伯龙编程")第62页,第一段的最后一句,沃思写道(1):

这就结束了我们对面向对象范式的简要介绍编程。我们意识到几乎没有任何语言特征添加到Oberon以支持它。除了已经存在的记录和程序类型的便利,只有类型的概念延期既是必要的,也是至关重要的。它允许构建类型的层次结构,并构建不均匀的数据结构。作为放弃严格静态类型规则的结果引入动态型式试验成为必要越远这种类型的防护设施只是一种方便

在PIO第59页,第23.2节之前最后一段的前三句他写道(2):

简单的指示符p.radius是不可接受的,因为p是Figure类型,它没有字段半径。使用类型保护,程序员可以确定在这种情况下p也是Circle类型,在这种情况中,字段半径确实适用而p是基本类型Figure,p(Circle)是类型Circle

一方面,我解释#2,使类型保护是绝对必要的,以便能够寻址不在指示符的类型声明中的字段。如果不是因为类型保护,寻址这样的字段应该会导致编译时错误。

另一方面,如果类型保护仅仅是一种便利,如#1所建议的,那么它也可以被省略。它的功能只是断言,因此编译器可以允许对不在指示符的类型声明中的字段进行寻址。

由于后者不是类型安全的,如果沃思打算这样做,我会感到惊讶。

因此,我倾向于完全无视#1而执行#2。

在我给沃思发电子邮件之前,如果奥伯龙的实践者(和编译器实现者)能够分享他们各自的奥伯龙编译器是如何解释这一点的,我将不胜感激。

提前感谢

我给沃思教授发了电子邮件,要求澄清。

事实证明,在早期的Obron语言报告中,"仅仅是一种方便"的说法确实具有误导性,因为在这些版本的Oberon中,类型保护语法对于处理基类型中不存在的扩展字段是必要的。没有其他方法可以做到这一点。

然而,正如Wirth所指出的,在他对Oberon的最新修订中,CASE语句的语义已经扩展到执行类型测试和对扩展中不存在于其基类型中的字段的寻址。

CASE msg OF
  DrawMsg : msg.draw(self)
| MoveMsg : msg.move(self, msg.dx, msg.dy)
...

在这种情况下,IS类型测试和类型保护语法都不是绝对必要的。因此,在目前的奥伯龙版本中,它们实际上只是方便。

最新Oberon版本的语言报告可在以下位置找到:

https://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Report.pdf

第9.5节介绍了CASE语句。

最新更新