【问题标题】:What are the arguments both for and against both name equivalence and structural equivalence?支持和反对名称等价和结构等价的论据是什么?
【发布时间】:2010-03-01 11:11:21
【问题描述】:

在语言设计圈子里,关于语言应该使用structural equivalence 还是name equivalence,曾经存在过长期争论。 ALGOL 或 ML 或 Modula-3 等语言使用结构等价,而......嗯,几乎大多数编程语言都使用命名等价(包括 Modula-2)。

支持结构对等的典型论据是什么?反对它的典型论据是什么?支持名称等效的典型论据是什么?反对它的典型论据是什么?

【问题讨论】:

  • 这告诉我它们是什么。我已经知道这一点,因为我是很多使用这两种变体的语言的用户。这些页面没有告诉我的是用什么论据来支持每一方并推翻另一方。
  • 是的,我只是为不知道问题内容的读者提供链接。也许我应该编辑这个问题。
  • 啊,有道理。我会自己编辑问题。

标签: computer-science language-design type-equivalence


【解决方案1】:

我认为结构化类型系统的优势在于,它们鼓励您创建面向接口用户需求的细粒度接口,而不是实现者提供的。

在主格类型系统中,您需要对接口的共同依赖。在结构化类型系统中,该要求被消除:您可以构建一个松散耦合的系统,而无需创建放置所有接口的公共库。每个客户端都可以独立地声明它期望从协作者那里得到的接口。

结构类型系统的缺点是它们将类与可能无法真正实现正确契约的接口相匹配。例如,如果你有这个接口:

public interface IBananaProvider
{
   /// Returns a banana, never null.
   Banana GetBanana();
}

那么下面的类将被隐式考虑在结构类型系统中实现IBananaProvider。但是,该类违反了返回的香蕉永远不会为空的后置条件:

public class SomeBananaProvider
{
    // returns a banana or null if we're all out
    public Banana GetBanana()
    {
        if (bananas.Count > 0)
        {
            return bananas.RemoveLast();
        }
        else
        {
            return null;
        }
    }
} 

如果合同以某种方式正式指定并被视为类型结构的一部分,则可以解决此问题。我认为事情正在朝着这个方向发展,例如System.Diagnostics.Contracts 在 .NET 4.0 中。

【讨论】:

  • 只是为了澄清:结构等价的优点类似于鸭子类型的优点,但是需要实现完整的接口,因此不太灵活,但更可能是正确类型的?
  • 我不明白您所说的“需要实现完整的接口,因此不太灵活”是什么意思。结构类型允许您为每个协作者定义绝对最小的接口,而实现者不需要知道所有这些最小接口。因此我会说相反:结构类型消除了实现无用接口成员的需要,因为每个必需的成员都是客户端实际使用的成员。
  • 如果我有一个包含元素 A 和 B 的“接口”并且我知道它的给定用户只能访问 A 我可以传入该接口的仅提供 A (例如,用于测试的模拟对象)-“类型”仅在使用时检查,并且仅针对正在使用的特定元素。在 Modula-3(一种结构等价语言)中,我不能这样做。编译器静态检查结构是否等效,因此即使我知道这个特定客户端(或其一部分)仅使用该子集,我也无法传入提供功能子集的东西。
  • 这里的问题是类型系统的问题,即对象引用本质上可以为空,和/或其次,除了“属于类型A”之外没有粒度
【解决方案2】:

支持严格名称等效的一个很好的论据(例如,在 Ada 中可用)是,编译器可以拒绝意外混合不同单位的代码,例如厘米和英寸,或摄氏度和华氏度。

在具有严格名称等效性的语言中,您可以有两种类型

type celsius based on float;
type fahrenheit based on float;

var c : celsius; var f : fahrenheit;

c := f; /* compile time error: incompatible types */

虽然,在一种语言中失去名称等价性和结构等价性......

type celsius is float;
type fahrenheit is float;

c := f; /* no error and no warning here */

...您最终会因计算错误而导致不可预知的行为,具体取决于应用程序和系统的类型,这可能会导致严重的经济损失甚至死亡。如果没有严格的名称等效性,这样的逻辑错误也很难追踪。

【讨论】:

  • 所以你是说 NASA 更喜欢严格的名称对等? ;)
  • 至于美国国家航空航天局,有一次前往金星的任务中,航天器因公里数和英里数混淆而丢失。如果该软件是用具有严格名称等效性的语言编写的,那么是的,确实,这个错误会在编译时被捕获。
猜你喜欢
  • 1970-01-01
  • 2010-12-18
  • 2015-11-05
  • 2011-01-20
  • 2011-03-17
  • 1970-01-01
  • 2014-06-18
  • 2015-11-28
  • 2013-07-01
相关资源
最近更新 更多