【问题标题】:Basic Concepts of Language Type Systems语言类型系统的基本概念
【发布时间】:2011-12-23 15:15:33
【问题描述】:

有人可以清楚简洁地解释语言类型系统的概念吗? 我在这里读过一两篇关于类型系统的文章,但找不到能回答我下面所有问题的文章。

我听说/读到有 3 种类型分类:动态与静态、强与弱、安全与不安全。

一些问题:

  • 还有其他人吗?
  • 这些分别是什么意思?
  • 如果一种语言允许您在运行时更改变量的类型(例如,用于存储 int 的变量后来用于存储字符串),它属于什么类别?
  • Python 如何适合这些类别?
  • 关于类型系统,我还有什么需要了解的吗?

非常感谢!

【问题讨论】:

    标签: programming-languages terminology type-systems


    【解决方案1】:

    1) 显然还有其他人:http://en.wikipedia.org/wiki/Type_system

    2)

    Dynamic => 类型检查在运行时完成(程序执行),例如蟒蛇。

    Static(与动态相反)=> 类型检查在编译时完成,例如C++

    Strong => 一旦类型系统确定一个特定的对象是一种类型,它就不允许它被用作另一种类型。例如蟒蛇

    Weak(相对于 Strong)=> 类型系统允许更改对象类型。例如perl 允许您将数字作为字符串读取,然后再次将其用作数字

    Type safety => 我只能用“C”语句来最好地描述,例如:

    x = (int *) malloc (...);
    

    malloc 返回一个 (void *),我们只需将其类型转换为 (int *)。在编译时没有检查函数 malloc 返回的指针实际上是整数的大小 => 一些 C 操作不是类型安全的。

    有人告诉我,一些“纯函数式”语言本质上是类型安全的,但我不知道这些语言中的任何一种。我认为标准 ML 或 Haskell 将是类型安全的。

    3) “如果一种语言允许您在运行时更改变量的类型(例如,用于存储 int 的变量后来用于存储字符串),那属于什么类别?”:

    这可能是动态的——变量是无类型的,值可以携带隐式或显式类型信息;或者,类型系统可能能够处理改变类型的变量,并且是静态类型系统。

    4) Python:它是动态且强类型的。类型安全是不知道python(以及类型安全本身)的东西。

    5)“关于类型系统,我还有什么需要了解的吗?”:也许可以阅读@BasileStarynkevitch 建议的书?

    【讨论】:

    • 至于您对#3 的回答,我会说这是“动态类型”。以这种方式考虑......如果语言允许您在运行时更改 VARIABLE(值的名称)的类型,那就是动态类型。如果语言允许您更改 VALUE 的类型(有一个字符串“1”并将其视为整数),那就是弱类型。
    • @RHSeeger - 你是对的。这就是我的意思,然后混淆了:(。现在更正。
    • @RHSeeger - 不,我放弃了。我的意思是弱打字。但是,因为我不是专家,也没有来源可以引用权威答案,所以我会忽略这部分问题:)
    • Perl 将整数作为字符串处理并不是弱类型的例子,因为它实际上替换为不同的值。 Perl 是强类型的,具有隐式转换。弱类型是指,例如,C 允许将 int 视为指针(或者实际上允许指针算术)。
    • Python 不是强类型,也不安全。变量在不同的时间可以有不同的类型值。类对象在不同的​​时间可以有不同的方法。
    【解决方案2】:

    您在这里问了很多问题 :) 类型系统是计算机科学的一个专门领域!

    从一开始,“类型系统就是证明不存在某些程序行为的方法”(参见B.Pierce's Types and Programming Languages,在另一个答案中也有提及)。通过类型检查的程序是有效程序的子集。比如方法

    int answer() {
       if(true) { return 42; } else { return "wrong"; }
    }
    

    实际上会在运行时表现良好。 else 分支永远不会执行,答案总是返回 42。静态类型系统是一个保守分析,会拒绝这个程序,因为它不能证明不存在类型错误,即,永远不会返回那个“错误”。

    当然,您可以改进类型系统以实际检测 else 分支永远不会发生。您想改进类型系统以拒绝尽可能少的程序。这就是为什么类型系统多年来不断丰富以支持越来越多的细化(例如泛型等)

    类型系统的重点是证明不存在类型错误。在实践中,它们支持像向下转换这样的操作,这些操作本质上意味着运行时类型检查,并且可能导致类型错误。同样,目标是使类型系统尽可能灵活,这样我们就不需要求助于这些削弱类型安全性的操作(例如泛型)。

    您可以阅读上述书籍的第 1 章以获得非常好的介绍。剩下的,我会推荐你​​What To Know Before Debating Type Systems,这是一篇关于基本概念的很棒的博客文章。

    关于类型系统还有什么我应该知道的吗?

    哦,是的! :)

    愉快地沉浸在类型系统的世界中!

    【讨论】:

      【解决方案3】:

      我建议阅读B.Pierce's Types and Programming Languages 的书。而且我还建议学习一些静态类型的、类型推断的语言,如 Ocaml 或 Haskell。

      【讨论】:

      • 虽然你的建议从长远来看肯定是有用的(至少后一点,我还没有读过那本书),但你没有回答这个问题。好吧,也许除了最后一个问题。
      • 由于您的问题需要整本书才能回答,我相信您可能不会期望在几分钟内给出完整的答案。
      • (这不是我的问题,但除此之外:)对于初学者来说,摘要应该足够了,至少对于前几个问题。最后一个确实很宽泛。
      • @BasileStarynkevitch 我理解你的观点,但指向这本书对读者来说并不是那么有用。他可能只对第 1 章感兴趣。对于其余部分,我想我想首先要了解其他概念,例如什么是泛型/参数多态性,以及我们想要它的原因。
      【解决方案4】:

      类型系统是一种控制访问值的函数的机制。编译时检查是其中的一个方面,如果在编译过程中尝试对未设计处理的值使用函数,则它会拒绝程序。然而另一方面是相反的,选择处理某些值的函数,例如重载。另一个例子是多态函数的特化(例如 C++ 中的模板)。推理和演绎是其他方面,其中函数的类型是通过使用而不是由程序员指定的。

      部分检查和选择可以推迟到运行时。基于变体标记或间接或专用表(如 C++ 虚函数或 Haskell 类型类字典)的方法分派是即使在极强类型语言中也提供的两个示例。

      类型系统的关键概念称为健全性。如果类型系统保证不合适的函数不能使用任何值,那么它就是健全的。粗略地说,一个不健全的类型系统有“漏洞”并且是无用的。如果您删除强制转换(和 void* 转换),则 ISO C89 的类型系统是健全的,如果您允许它们,则不健全。 ISO C++的类型系统不健全。

      类型系统的第二个重要概念称为表现力。多态编程的健全类型系统会阻止程序员编写有效的代码:它们普遍过于严格(我相信不可避免地如此)。使类型系统更具表现力,从而允许更广泛的有效程序集是关键的学术挑战。

      打字的另一个概念是强度。强类型系统可以更早地发现更多错误。例如,许多语言的类型系统太弱,无法使用类型系统检测数组边界违规,因此不得不求助于运行时检查。不知何故,强度与表现力相反:我们希望允许更多有效程序(表现力),但同时也捕获更多无效程序(强度)。

      这里有一个关键问题:解释为什么 OO 类型太弱以至于无法将 OO 用作一般开发范例。 [提示:OO 无法处理关系]

      【讨论】:

        猜你喜欢
        • 2018-11-19
        • 2011-02-14
        • 2012-03-02
        • 2018-05-06
        • 2012-08-25
        • 1970-01-01
        • 2016-12-14
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多