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

zhx*_*n17 2 types programming-languages

当我们在 C/C++ 中定义一个函数时,我们输入类似

int add(int a, int b){
    return a+b;
}
Run Code Online (Sandbox Code Playgroud)

然而,我们在函数中实际做的事情是获取两个可求和的东西的总和并返回其值。在许多早期创建的编程语言中,例如 Algol、C、pascal,您应该先声明变量的类型,然后再对其进行一些操作。此外,这在很多主流语言中都是必需的,例如 Java、C#(尽管它有诸如“var”之类的关键字)。

在 Python 等许多动态编程语言中,我们将之前的函数重写为:

def add(a,b):
    return a+b
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

And*_*erg 5

可以说,数据类型的概念从一开始就存在于编程语言中。机器语言的第一种语言,甚至对于那些与您相关的语言,例如,添加整数或添加浮点数。但是,通过使用不同的指令来区分类型。

第一种更高级的语言是 Fortran(1950 年代中期)。Fortran 区分变量类型,但不是基于类型声明来做,而是基于变量名来做。例如,变量 i、jk 等将是整数,而 p、q、r 是浮点数 (IIRC)。这允许使用相同的方便符号进行加法,无论类型是什么。

显然,这是一个非常老套的想法,并不能扩展到任何更有趣的类型系统。因此,下一代语言,尤其是 Algol(1950 年代后期),使这一点更加明确,并引入了类型语法。

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

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

编程语言部分从逻辑中获得的另一个灵感是类型推断。即使最初发明了类型化 lambda 演算,也已经有两种形式:显式类型化和隐式类型化。函数式语言 ML 是第一个采用类似于编程思想的语言(1970 年代后期):ML 程序完全类型检查,无需编写单个类型声明。最近,这个想法已经出现在主流语言中,尽管通常以非常有限的方式出现。

也就是说,类型化和非类型化之间的区别不一定与语法和类型声明的存在有关——语言可以(“静态”)类型化并且不需要类型声明。