Computer science 支持和反对名称等价和结构等价的论点是什么?

Computer science 支持和反对名称等价和结构等价的论点是什么?,computer-science,language-design,type-equivalence,Computer Science,Language Design,Type Equivalence,在语言设计界,曾经有一场关于语言应该使用还是不应该使用的长期争论。像ALGOL、ML或Modula-3这样的语言使用结构等价,而。。。大多数编程语言都使用命名等价(包括Modula-2) 支持结构对等的典型论点是什么?反对它的典型论点是什么?支持名称等效的典型论据是什么?与之相反的典型论点是什么?我认为结构类型系统的优势在于,它们鼓励您创建面向接口用户需求的细粒度接口,而不是面向实现者提供的接口 在命名类型系统中,您需要对接口具有公共依赖关系。在结构类型系统中,这种需求被消除了:您可以构建一个松

在语言设计界,曾经有一场关于语言应该使用还是不应该使用的长期争论。像ALGOL、ML或Modula-3这样的语言使用结构等价,而。。。大多数编程语言都使用命名等价(包括Modula-2)


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

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

在命名类型系统中,您需要对接口具有公共依赖关系。在结构类型系统中,这种需求被消除了:您可以构建一个松散耦合的系统,而无需创建一个公共库,在其中放置所有接口。每个客户端都可以独立地声明它期望从协作者处获得的接口

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

public interface IBananaProvider
{
   /// Returns a banana, never null.
   Banana GetBanana();
}
然后,将隐式地考虑以下类在结构类型系统中实现
ibanaaprovider
。但是,该类违反了post条件,即返回的香蕉从不为null:

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;
        }
    }
} 

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

支持严格名称等价的一个很好的论据(例如在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 */

。。。根据应用程序和系统的类型,最终会出现错误计算,从而导致不可预测的行为,这可能导致严重的财务损失甚至死亡。如果没有严格的名称对等,这样的逻辑错误也很难找到。

维基百科链接:这告诉我它们是什么。我已经知道这一点,作为一个用户,很多语言都使用这两种语言的变体。那些网页没有告诉我的是,有什么论据是用来支持双方,推翻另一方的。是的,我只是为那些不知道问题是什么的读者提供了链接。也许我应该改为编辑这个问题。啊,这是有道理的。我将自己编辑这个问题。为了澄清起见:结构等价的优点与duck类型的优点类似,但是需要实现完整的接口,所以灵活性较低,但更可能正确地键入?我不理解你的意思“需要实现完整的接口,因此灵活性较低.Structural typing允许您为每个协作者定义绝对最小接口,而实现者不需要知道所有这些最小接口。因此我想说的是相反的:结构类型消除了实现无用接口成员的需要,因为每个必需的成员都是客户端实际使用的成员。在duck类型中,如果我有一个包含元素A和B的“接口”,并且我知道它的给定用户只访问A,我可以传递一个“实现者”只提供一个(比如说,一个用于测试的模拟对象)的接口的类型——只在使用点检查“类型”,并且只检查正在使用的特定元素。在Modula-3(一种结构等价语言)中,我不能这样做。编译器静态地检查结构的等价性,因此即使我知道这个特定的客户端(或其中的一部分)只使用该子集,我也不能传入提供功能子集的内容。这里的问题是类型系统的问题,即对象引用本质上是可为空的,和/或第二,除了“属于类型A”之外,没有粒度,所以你是说NASA更喜欢严格的名称等效至于美国宇航局,有一个前往金星的任务,由于公里和英里的混合,飞船丢失了。如果该软件是用一种具有严格名称等价性的语言编写的,那么是的,事实上,这个错误会在编译时被捕获。