简而言之:如何在学术环境中对类型系统进行分类;尤其是在哪里可以找到使不同类型的类型系统之间的区别清晰的信誉良好的来源?
从某种意义上说,这个问题的难点不是我找不到答案,而是我可以找到太多答案,而且没有一个能脱颖而出。背景是我正在尝试改进Haskell Wiki上有关输入的文章,该文章目前具有以下区别:
- 没有类型:语言没有类型的概念,或者从类型的角度来看:语言中只有一种类型。汇编语言只有“位模式”类型,Rexx和Tk只有“文本”类型,核心MatLab只有“复杂值矩阵”类型。
- 弱类型输入:只有很少的可分辨类型,可能还有几种类型的类型同义词。例如,C使用整数表示布尔值,整数,字符,位集和枚举。
- 强类型:细粒度的类型集,例如Ada,Wirthian语言(Pascal,Modula-2),Eiffel
这完全与我的个人看法相反,后者更像是:
- 弱类型输入:对象具有类型,但是在上下文需要时会隐式转换为其他类型。例如,Perl,PHP和JavaScript都是
"1"
可以在或多或少可以使用的任何上下文中使用的语言1
。 - 强类型化:对象具有类型,并且没有隐式转换(尽管可以使用重载来模拟它们),因此在错误的上下文中使用对象是错误的。在Python中,用字符串或浮点数索引数组会引发TypeError异常;在Haskell中,它将在编译时失败。
我从其他比我更富有经验的人那里征求意见,有人对此进行了描述:
- 弱类型输入:对数据执行无效操作不会受到控制或拒绝,而只会产生无效/任意结果。
- 强类型:仅当数据与操作兼容时才允许对数据进行操作。
据我了解,第一个和最后一个特征将称为C弱类型,第二个将其称为强类型。第一个和第二个将Perl和PHP称为弱类型,第三个将它们称为强类型。这三个都将Python描述为强类型。
我认为大多数人会告诉我“嗯,没有共识,没有公认的条款含义”。如果这些人都错了,我很高兴听到这个消息,但如果他们是对的,那么如何做 CS的研究人员描述和比较类型的系统?我可以使用哪种问题较少的术语?
作为一个相关的问题,我觉得动态/静态区别通常是用“编译时间”和“运行时间”来表示的,考虑到是否编译语言并不是该语言的本质,我发现这并不令人满意。作为其实现。我觉得应该对动态类型和静态类型进行纯粹的语义描述。类似于“静态语言是可以在其中键入每个子表达式的语言”。我希望您能提出任何使这种概念更加清楚的想法,特别是参考文献。