Types 编程语言中的类型声明来自哪里?

Types 编程语言中的类型声明来自哪里?,types,programming-languages,Types,Programming Languages,当我们在C/C++中定义一个函数时,我们键入 int add(int a, int b){ return a+b; } 然而,我们在函数中实际做的事情是得到两个可求和的东西的和并返回它的值。在许多早期创建的编程语言(如Algol、C、pascal)中,在对变量执行某些操作之前,应该声明变量的类型。此外,在相当多的主流语言中,如Java、C#(尽管它有“var”等关键字),这也是必需的 在许多动态编程语言(如Python)中,我们将前面的函数重写为: def add(a,b):

当我们在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)?而且,在早期,人们对代码应该是什么样子的印象非常模糊,所以我猜类型标识符的想法肯定来自某个地方。我的第二个问题是,类型声明的概念来自哪里(数学?实践?还是其他地方?)?如果我知道答案,我想我会对“类型”有更好的理解。

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

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

很明显,这是一个相当粗糙的想法,并且不能扩展到任何更有趣的类型系统。因此,下一代语言,特别是Algol(1950年代后期),使其更加明确,并引入了类型语法

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

非类型化(或者所谓的“动态类型化”,在一个明显的术语滥用中)编程语言也相当古老。第一个是Lisp(20世纪50年代末),它实际上已经从非类型的lambda演算中获得了灵感。然而,这种语言直到很久以后才流行起来。原因是它们在运行时系统中需要更昂贵的机器,这在早期的计算中是无法负担的,现在也常常无法负担。(最近关于这类语言的炒作似乎有些退潮,因为(再次)发现这种形式的开发没有很好的扩展性——所有为这些语言发明的类型系统都见证了这一点:类型化Scheme、类型脚本、MyPy、Hack等。)

编程语言部分来自逻辑btw的另一个灵感是类型推断。即使在最初发明类型化lambda calculi时,已经有两种形式:显式类型化和隐式类型化。函数式语言ML是第一个采用类似于编程思想的语言(20世纪70年代末):ML程序在不编写单一类型声明的情况下进行完全类型检查。最近,这一想法已经出现在主流语言中,尽管通常以更加有限的方式出现


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

Andreas的优秀历史并没有解决问题的第一部分。数据类型很早就存在于编程语言中,但问题是为什么需要类型声明

原因是内存容量。当时,包括编译器在内的程序必须在非常有限的内存量下运行。这有两个直接后果:

  • 程序员不能使用一刀切的方法来表示数据,因为它使用内存效率低下;他们希望为不同的类型专门化数据的表示,以便一次可以在内存中容纳更多的数据

  • 编译器不能一次将整个程序放入内存中,因此它们需要能够编译i