语言类型系统的基本概念

时间:2011-12-23 15:15:34

标签: programming-languages terminology type-systems

有人可以清楚简洁地解释一下语言类型系统的概念吗? 我已经在类型系统上阅读了一两篇帖子,但是找不到下面我所有问题的答案。

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

有些问题:

  • 还有其他人吗?
  • 这些意味着什么?
  • 如果某种语言允许您在运行时更改变量的类型(例如,用于存储int的变量稍后用于存储字符串),那么该类别属于哪个类别?
  • Python如何适应这些类别?
  • 关于类型系统还有其他我应该知道的吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

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建议的那本书?

答案 1 :(得分: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,这是一篇关于基本概念的博文。

  

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

哦,是的! :)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

类型系统的关键概念称为健全性。如果类型系统保证不适合的功能可以使用任何值,则该类型系统是合理的。粗略地说,不健全的类型系统有“漏洞”并且没用。如果你删除演员表(和* *转换),ISO C89的类型系统是合理的,如果允许的话,它是不健全的。 ISO C ++的类型系统不健全。

类型系统的第二个重要概念称为表现力。用于多态编程的声音类型系统阻止程序员编写有效的代码:它们通常限制太多(我认为不可避免地如此)。使类型系统更具表现力,因此它们允许更广泛的有效程序是关键的学术挑战。

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

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