gpt4 book ai didi

types - 编程语言中的类型声明从何而来?

转载 作者:行者123 更新时间:2023-12-01 19:04:31 26 4
gpt4 key购买 nike

当我们在 C/C++ 中定义函数时,我们输入类似的内容

int add(int a, int b){
return a+b;
}

但是,我们在函数中实际做的事情是获取两个可求和的值的总和并返回其值。在许多早期创建的编程语言(如 Algol、C、pascal)中,您应该在对变量进行某些操作之前声明变量的类型。而且,很多主流语言如Java、C#(虽然有“var”等关键字)都是需要的。

在许多动态编程语言(例如 Python)中,我们将前面的函数重写为:

def add(a,b):
return a+b

没有函数和参数的“类型标识符”。我想到的是,与C/C++之类的语言相比,Python版本似乎更接近程序员头脑中的原始想法:只是封装两个数字相加的行为并返回和。

另一方面,在实践中,这些类型声明对减少错误有很大帮助,例如,如果我只想要两个数字的和,我不会将字符串传递给“add”函数。如果我传递两个字符串,编译器会将其视为错误。在此示例中,类型声明似乎是对代码的保护。

但让我困惑的是,为什么这么多早期创建的语言需要变量的类型声明?为什么历史上大多数具有类型声明的语言出现得较早,而大多数具有简单语法版本的语言出现得较晚?

我知道我们无法判断哪种方法“更好”,而且它们都是图灵完备的,但我只是好奇为什么早期的语言创建者没有选择更直观和更简单的语法,即专注于实现功能 100%,但选择添加类型标识符作为语言的必需部分(问题 1)?另外,在早期,人们对代码应该是什么样子的印象非常模糊,所以我猜类型标识符的想法必须来自某个地方。我的第二个问题是类型声明的想法从何而来(数学?实践?还是其他地方?)?我想如果我知道答案的话我会对“类型”有更好的理解。

最佳答案

可以说,数据类型的概念从一开始就存在于编程语言中。最早的语言是机器语言,甚至对于那些机器语言来说,无论是添加整数还是添加 float ,它都可能是相关的。不过,类型的区别是通过使用不同的指令来实现的。

第一种更高级的语言是 Fortran(20 世纪 50 年代中期)。 Fortran 区分变量类型,但不是根据类型声明来区分,而是根据变量名称来区分。例如,变量 i、j k 等将为整数,而 p、q、r 为 float (IIRC)。这允许使用相同的方便的符号,例如另外,无论是什么类型。

显然,这是一个相当老套的想法,并且无法扩展到任何更有趣的类型系统。因此,下一代语言,特别是 Algol(20 世纪 50 年代末),使这一点更加明确,并引入了类型语法。

随着语言变得更加高级并支持更有趣的数据类型,类型系统也变得更有趣。在某个时候(1970 年左右),人们意识到编程语言中的类型实际上与数学中已知的类型概念非常密切相关:即 20 世纪 30 年代发明的类型化 lambda 演算。事实上,人们意识到计算逻辑和编程语言之间的关系实际上在各个层面上都极其密切,并且编程语言可以解释为 lambda 演算的变体,这就是大多数现代编程语言理论(和设计)的内容确实如此。

无类型(或所谓的“动态类型”,明显滥用术语)编程语言也相当古老。第一个是 Lisp(20 世纪 50 年代末),它实际上已经从无类型 lambda 演算中获得了灵感。然而,这种语言直到很久以后才开始流行。原因是它们在运行时系统中需要昂贵得多的机器,这在早期的计算中是负担不起的,而且在今天通常仍然是负担不起的。 (最近对此类语言的炒作似乎有所减弱,因为(重新)发现这种开发形式不能很好地扩展——现在为这些语言发明的所有类型系统都证明了这一点: Scheme、TypeScript、MyPy、Hack 等)

编程语言部分从逻辑中获得的另一个灵感是类型推断。即使最初发明类型化 lambda 演算时,也已经有两种形式:显式类型化和隐式类型化。函数式语言 ML 是第一个采用与编程类似的思想的语言(20 世纪 70 年代末):ML 程序经过完全类型检查,无需编写单个类型声明。最近,这个想法已经进入主流语言,尽管通常以更加有限的方式。

这意味着类型化和非类型化之间的区别不一定与语法和类型声明的存在相关——语言可以是(“静态”)类型化的并且不需要类型声明。

关于types - 编程语言中的类型声明从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26071886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com