类型系统的分类(强/弱,动态/静态)


23

简而言之:如何在学术环境中对类型系统进行分类;尤其是在哪里可以找到使不同类型的类型系统之间的区别清晰的信誉良好的来源?

从某种意义上说,这个问题的难点不是我找不到答案,而是我可以找到太多答案,而且没有一个能脱颖而出。背景是我正在尝试改进Has​​kell Wiki上有关输入的文章,该文章目前具有以下区别:

  • 没有类型:语言没有类型的概念,或者从类型的角度来看:语言中只有一种类型。汇编语言只有“位模式”类型,Rexx和Tk只有“文本”类型,核心MatLab只有“复杂值矩阵”类型。
  • 弱类型输入:只有很少的可分辨类型,可能还有几种类型的类型同义词。例如,C使用整数表示布尔值,整数,字符,位集和枚举。
  • 强类型:细粒度的类型集,例如Ada,Wirthian语言(Pascal,Modula-2),Eiffel

这完全与我的个人看法相反,后者更像是:

  • 弱类型输入:对象具有类型,但是在上下文需要时会隐式转换为其他类型。例如,Perl,PHP和JavaScript都是"1"可以在或多或少可以使用的任何上下文中使用的语言1
  • 强类型化:对象具有类型,并且没有隐式转换(尽管可以使用重载来模拟它们),因此在错误的上下文中使用对象是错误的。在Python中,用字符串或浮点数索引数组会引发TypeError异常;在Haskell中,它将在编译时失败。

我从其他比我更富有经验的人那里征求意见,有人对此进行了描述:

  • 弱类型输入:对数据执行无效操作不会受到控制或拒绝,而只会产生无效/任意结果。
  • 强类型:仅当数据与操作兼容时才允许对数据进行操作。

据我了解,第一个和最后一个特征将称为C弱类型,第二个将其称为强类型。第一个和第二个将Perl和PHP称为弱类型,第三个将它们称为强类型。这三个都将Python描述为强类型。

我认为大多数人会告诉我“嗯,没有共识,没有公认的条款含义”。如果这些人都错了,我很高兴听到这个消息,但如果他们是对的,那么如何 CS的研究人员描述和比较类型的系统?我可以使用哪种问题较少的术语?

作为一个相关的问题,我觉得动态/静态区别通常是用“编译时间”和“运行时间”来表示的,考虑到是否编译语言并不是该语言的本质,我发现这并不令人满意。作为其实现。我觉得应该对动态类型和静态类型进行纯粹的语义描述。类似于“静态语言是可以在其中键入每个子表达式的语言”。我希望您能提出任何使这种概念更加清楚的想法,特别是参考文献。


6
我认为您已经有了答案:没有公认的弱类型和强类型定义。
svick 2012年

我不会觉得难以置信,但是我问这个问题是希望有一个我只是没有听说过的问题:)或至少是一个定义比某个编辑维基的人认为更权威的定义。
本·米尔伍德

3
有关此问题的更多讨论,请参见SO上的相关问题
svick 2012年

1
为了强调svick的观点,不可能在不被接受的内容上找到权威参考。任何声称具有权威性的内容都是错误的(因为可以提供任何数量的反例)。
edA-qa mort-ora-y 2012年

嗯,有人写论文说“这是每个人都同意的一个真实定义”,而有人写论文说“这是我将在本文中使用的定义,尽管我知道有其他”。甚至后者也比我到目前为止所知道的要好。我想你可能是正确的,虽然,在这种情况下,什么让人不得不说一下不同种类的类型的系统?动态/静态区别至少是具体的吗?
Ben Millwood 2012年

Answers:


18

从历史上看,“强类型编程语言”一词在70年代开始使用,以响应现有的广泛使用的编程语言,其中大多数都有类型漏洞。一些例子:

  • 在Fortran中,有一些称为“ COMMON”的存储区域,可以在模块之间共享,但是没有检查每个模块是否以相同的类型声明COMMON存储的内容。因此,一个模块可以声明一个特定的COMMON存储块具有一个整数,另一个具有浮点数,因此数据将被破坏。Fortran还具有“等价”语句,据此,同一存储可以声明为包含两个不同类型的不同对象。

  • 在Algol 60中,过程参数的类型仅声明为“过程”,而没有指定过程参数的类型。因此,可以假设一个过程参数是一个整数接受过程,但传入一个实数接受过程作为参数。这将导致与COMMON和EQUIVALENCE语句相同的损坏。(但是,Algol 60确实消除了较旧的问题。)

  • 在Pascal中,添加了“变量记录”,这些记录几乎与旧的EQUIVALENCE语句完全一样。

  • 在C语言中,添加了“类型转换”,从而可以将任何类型的数据重新解释为其他类型的数据。这是一个相当刻意的类型漏洞,适用于据说应该知道自己在做什么的程序员。

70年代设计的强类型语言旨在消除所有此类类型漏洞。如果深入了解这意味着什么,那么从本质上讲这意味着数据表示受保护。不能将一种类型的数据对象视为恰好具有与其内部表示相同的位模式的另一种类型的对象。理论家开始使用术语“表示独立性”来表征此属性,而不是模糊的“强类型”概念。

请注意,在保护表示形式的意义上,像Lisp这样的动态类型化语言会执行完整的运行时类型检查,因此会“强类型化”。同时,静态类型的语言除非进行数组边界检查,否则将失去表示的独立性。因此,严格意义上讲,它们不是“强类型”的。由于这些异常后果,“强类型”一词在70年代后就被废弃了。当美国国防部对Ada的设计提出了严格的要求时,其中包括要求该语言应“强类型化”的要求。(当时似乎认为“强类型”是不言而喻的。没有提供定义。)作为回应提交的所有语言建议都声称是“强类型”的。当Dijkstra分析所有语言建议时,他发现这些建议都不是强类型的,实际上,甚至不清楚该术语的含义。查看报告EWD663。但是,我看到这个词现在已经通过不知道该词条历史的年轻一代研究人员重新使用。

术语“静态类型化”是指所有类型检查都是静态完成的,并且在运行时不会发生类型错误。如果语言也是强类型的,则意味着执行期间实际上没有类型错误。另一方面,如果类型系统中存在类型孔,则没有运行时类型错误就没有任何意义。结果可能会完全损坏。

关于“强类型vs弱类型”的新争论似乎是关于是否应允许某些类型转换。根据这些人的说法,允许在其中需要整数的字符串是“弱类型”。从某种意义上说,因为如果字符串不能恰好代表整数,则尝试将字符串转换为整数可能会失败。但是,将整数转换为字符串不会有此问题。这些人会认为这是“弱打字”的例子吗?我不知道。我注意到Wikipedia关于“弱键入”的讨论没有引用任何引用的出版物。我不认为这是一个连贯的想法。

补充说明:基本要点是,“严格键入”一词并未作为具有严格定义的技术术语使用。这更像是一些语言设计师所感觉到的:“我们的类型系统很强大;它可以捕获所有类型错误;没有类型漏洞”,因此,当他们发布语言设计时,他们声称它是“强类型的”。 。这个流行语听起来不错,人们开始使用它。Cardelli-Wegner的论文是我所看到的第一篇论文,其中对它的含义进行了一些分析。我在这里的帖子应该被视为对他们立场的阐述。


您能为历史发展提供一些参考吗?“没有运行时类型错误意味着什么?” –您在这里是指编译时吗?
拉斐尔

这是一篇关于Euclid的论文,出现在Google Scholar中。我记得在70年代见过几篇论文,其中的语言被认为是强类型的。人们普遍认为这是一种销售方式。
Uday Reddy 2012年

1
@Raphael。我的意思是“运行时类型错误”。要运行时,程序首先必须通过静态类型检查器。关键是强类型语言(例如Java)在编译时无法检查时会在运行时给出类型错误。类型漏洞语言(例如C)将使运行时产生垃圾,而不是给出错误。
Uday Reddy 2012年

1
@benmachine。请参阅我引用的Euclid论文中有关“类型检查”的部分。我认为要点是,“强类型”是一个时髦的词。这不是技术概念。充其量,它的技术含量是指没有类型的孔。
乌代·雷迪

1
在典型的现代实现方式,其中两个不同的整数类型具有相同的表示(例如两个intlong是32位的,或两者longlong long为64,一个程序,使用一个指向一个这种类型写一些存储并使用其他类型的指针读取它通常不会触发可检测到的运行时错误,但可能会以任意其他方式任意发生故障,因此现代C失去了其他语言的类型安全性,而没有获得Ritchie语言质量实现所具有的任何语义以前在交易所提供的。
supercat

7

乌迪·雷迪(Uday Reddy)在他的答案《关于理解类型,数据抽象和多态性》(1985)中找到了以下答案:

可以通过静态程序分析确定每个表达式的类型的编程语言被称为静态类型。静态类型是一个有用的属性,但是在编译时将所有变量和表达式绑定到类型的要求有时过于严格。它可以由较弱的要求所取代,即尽管类型本身可能是静态未知的,但所有表达式都必须保证类型一致。通常可以通过引入一些运行时类型检查来完成。所有表达式类型均一致的语言称为强类型语言。如果语言是强类型的,则其编译器可以保证所接受的程序将在没有类型错误的情况下执行。通常,我们应该努力实现强类型化,并尽可能采用静态类型。


发布为社区Wiki,因为我不值得为此而功劳。
本·米尔伍德

我在这里遇到的问题与svick的第一条评论有关。虽然很高兴找到强类型的定义,但这肯定不是公认的定义。
edA-qa mort-ora-y 2012年

@ edA-qamort-ora-y:您是根据什么说的?对于什么是普遍接受的,您是否拥有比传闻证据更好的证据?有引用吗?(我知道即使没有,您也可能有一个正确的观点,但是我仍然认为以上内容回答了我的问题;即使没有达成共识,也至少要知道一个严肃的学术答案是很好的)。
本·米尔伍德

1
我真的无法证明没有约定的定义吗?从逻辑上讲这是不可能的。但是,维基百科上有关强类型的文章确实提供了许多证据和参考,以引起分歧和矛盾。en.wikipedia.org/wiki/Strong_typing
EDA-QA MORT-ORA-Y

@ edA-qamort-ora-y:Wikipedia的引用实际上并没有那么大的帮助:有些不是学术性的,而有些引用是出于定义术语之外的原因。Typeful Programming论文的确看起来很有希望,但是只是很简短地提到了定义。无论如何,值得编辑我的答案。关于缺席证明,我认为知道他们在说什么的人们之间存在争议/分歧的证据对我来说就足够了(的确,Typeful Programming论文可能会给我提供)。
本·米尔伍德

6

权威的答案可以在Cardelli和Wegner的调查文章中找到:关于理解类型,数据抽象和多态

请注意,尽管“强类型”具有公认的含义,但“弱类型”却没有。强类型的任何失败都可能被认为是微弱的,人们可能会在可接受的失败类型和不可接受的类型方面有所不同。



太好了,这就是我想要的。该论文需要一些阅读,因此我认为应该有一个总结要点的答案。我应该将它们编辑为您的答案,还是发布自己的社区Wiki答案?无论哪种方式,我都会给它多几天时间,以防其他人有任何输入,然后接受剩下的内容:)
Ben Millwood 2012年

@benmachine。全文值得一读,但是高级概念性问题仅在前几节中介绍。
Uday Reddy 2012年

4
我仍然认为应该在此页面上进行总结。该链接可能稍后会过期。
本·米尔伍德

@benmachine。欢迎您发表摘要,作为对问题的自己的回答。
Uday Reddy 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.