尽管可能相反,但计算机确实是非常愚蠢的机器。或者更好地说,很简单,因为它们仅“理解”简单的说明,例如“将这两个数字添加在一起”或“告诉我哪个数字更大”。这就是我们所说的机器语言。机器语言的最大优势在于,计算机处理器可以完全油门运行这些简单的操作。
在信息技术的早期期间,计算机程序员(其中大多数是女性)的任务是用这种语言编写的任务。让我们考虑一下仅使用此手段来编写程序将男子推向太空的节目所需的细节的关注。就像使用诸如“直接到交叉路口并右转”之类的短语向某人解释如何从一条街道到另一街,而是说“抬起右腿,抬起左腿,重复十个时代,将身体向右旋转90度……”
由NASA?,公共领域
不用说,我们的人类对这种细节很糟糕。专门使用机器语言会将计算机降级到专家领域。在1950年代初期,美国格蕾丝·霍珀(American Grace Hopper) - 不仅是程序员,而且是其国家海军的服务成员 - 有一个绝妙的主意:为什么不编写一个将用英语写入机器语言的命令的程序呢?因此,编译器诞生了。
在计算世界中,所有将一种编程语言转换为另一种编程语言的程序都称为编译器。最常见的做法是用机器语言编译一种更像人类语言(通常称为高级语言)的语言。尽管现在可以在不同的高级语言之间找到编译器。在我们以前的示例的基础上,编译器将我们的短语“直接转到相交”转换为必要的运动序列。
名称,变量和功能
高级编程语言的最重要特征是它们提供抽象,因此我们可以避免努力处理最细微的细节。不同的语言以不同的级别和抽象形式起作用。但是,几乎所有人都有一些一般概念。
计算机内的数据位置表示为处理器中的位置,称为记录,内存或外部设备。但是从人类的角度来看,诸如“将记录A中的值除以在内存位置42中找到的值的命令并没有透露有关正在发生的事情的任何内容。这就是为什么编程语言允许构成程序命名的元素的原因;如果我们将记录称为“距离”,而我们所指的内存位置是“时间”,那么我们更容易理解该程序正在计算速度。代表数据点的名称通常称为变量。因此,当程序员的意思是“给包含数据点的位置命名”或“分配变量”时,他们在想说“为此数据点给出特定的值”时就会谈论“声明变量”。
让我们回到我们的榜样。如果我们正在开发导航程序,则可能需要多次重复相同的命令才能验证街道的名称。一种可能性是复制并粘贴每次需要执行此任务的代码。但是,更好的方法是将名称分配给一系列命令。这就是我们所说的函数,过程或子例程(在这一点上,这些元素之间的略有差异并不重要)。
使用功能具有两个关键优势:首先,它通过记录一系列命令背后的目的来促进对程序的理解。但这也使我们可以从单个中心点进行更正或修改程序:如果我们发现了检查街道名称的方式,我们只需要在功能中进行校正,而不是在每个功能中进行更正使用的位置。
可移植性
除了其重大的复杂性外,机器兰格还有另一个问题:没有一种“机器语言”,而是每个新的处理器模型都会引入变化。尽管不同的模型可以共享他们的机器语言的很大一部分(这是当我们谈论它们具有相同体系结构时),但这意味着每当新的处理器型号打击时,程序员都必须学习一种新的编程语言市场。换句话说,这就像每次购买新扫帚时都必须重新学习如何扫扫一样。
约翰·麦卡锡(John McCarthy)发明了LISP编程语言 /图像:Flickr
在高级语言和机器语言之间引入编译器作为中介机构解决了此问题的很大一部分:我们可以创建各种编译器,这些编译器在通信链的一侧了解相同的语言,但会产生不同的机器语言输出。这样,我们就不需要一小部分专家来使编译器保持最新状态,从而使大多数程序员无视市场的异想天开并以相同的方式进行编码。这就解释了为什么今天仍可以使用1970年代已经使用的C或LISP语言。
在本文中,我们讨论了复数中的编程语言,因为人类语言的方式适合无限的变化,因此可以使用编程语言。在下一部分中,我们将尝试对最重要的语言家庭进行广泛的描述。如上所述,差异是在每种语言提供的抽象中。