Programming languages 语言类型系统的基本概念

Programming languages 语言类型系统的基本概念,programming-languages,terminology,type-systems,Programming Languages,Terminology,Type Systems,有人能简单明了地解释一下语言类型系统的概念吗? 我在这里读过一两篇关于类型系统的文章,但很难找到一篇能回答我下面所有问题的文章 我听说/读到有三种类型的分类:动态与静态、强与弱、安全与不安全 一些问题: 还有其他的吗 这些都是什么意思 如果一种语言允许您在运行时更改变量的类型(例如,用于存储int的变量后来用于存储字符串),那么它属于哪一类 Python如何适应这些类别 关于类型系统还有什么我应该知道的吗 非常感谢 我建议读这本书。我还建议学习一些静态类型的,带有类型推断的语言,比如Ocam

有人能简单明了地解释一下语言类型系统的概念吗? 我在这里读过一两篇关于类型系统的文章,但很难找到一篇能回答我下面所有问题的文章

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

一些问题:

  • 还有其他的吗
  • 这些都是什么意思
  • 如果一种语言允许您在运行时更改变量的类型(例如,用于存储int的变量后来用于存储字符串),那么它属于哪一类
  • Python如何适应这些类别
  • 关于类型系统还有什么我应该知道的吗
非常感谢

我建议读这本书。我还建议学习一些静态类型的,带有类型推断的语言,比如Ocaml或Haskell。

我建议阅读这本书。我还建议学习一点静态类型的、带有类型推断的语言,比如Ocaml或Haskell。

1)显然,还有其他语言:

(二)

动态
=>类型检查在运行时(程序执行)完成,例如Python

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

Strong
=>一旦类型系统确定某个特定对象属于某个类型,它就不允许将其用作另一个类型。e、 g.Python

(与强相反)=>类型系统允许更改对象类型。e、 perl允许您将数字作为字符串读取,然后再次将其作为数字使用

类型安全
=>我只能用“C”语句来最好地描述,如:

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

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

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

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

4) Python:它是动态和强类型的。类型安全性是我对python(以及类型安全性本身)所知不多的东西,对此我不敢苟同

5) “关于类型系统还有什么我应该知道的吗?”:也许读一读@BasileStarynkevitch建议的书吧?

1)显然,还有其他的:

(二)

动态
=>类型检查在运行时(程序执行)完成,例如Python

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

Strong
=>一旦类型系统确定某个特定对象属于某个类型,它就不允许将其用作另一个类型。e、 g.Python

(与强相反)=>类型系统允许更改对象类型。e、 perl允许您将数字作为字符串读取,然后再次将其作为数字使用

类型安全
=>我只能用“C”语句来最好地描述,如:

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

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

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

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

4) Python:它是动态和强类型的。类型安全性是我对python(以及类型安全性本身)所知不多的东西,对此我不敢苟同


5) “关于类型系统还有什么我应该知道的吗?”:也许读一下@BasileStarynkevitch建议的书吧?

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

从一开始,“类型系统是证明没有特定程序行为的方法”(参见,也在另一个答案中提到)。通过类型检查的程序是有效程序的子集。例如,方法

int answer() {
   if(true) { return 42; } else { return "wrong"; }
}
在运行时会表现良好。else分支永远不会执行,并且答案总是返回42。静态类型系统是一种保守的分析,它将拒绝该程序,因为它不能证明没有类型错误,即“错误”永远不会返回

当然,您可以改进类型系统以实际检测else分支从未发生。您希望改进类型系统以尽可能少地拒绝程序。这就是为什么多年来类型系统得到了丰富,以支持越来越多的细化(例如泛型等)

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

你可以阅读本书的第一章