简要介绍了编程方法的历史演变。在计算的早期,硬件很贵,而程序员很便宜。这些廉价的程序员连“程序员”的头??衔都没有,往往被数学家或电气工程师填补。早期的计算机用于快速解决复杂的数学问题,因此数学家天生适合“编程”工作。什么是程序?首先,一点背景。计算机不能自己做任何事情,它的任何行为都需要程序的引导。您可以将程序视为一个非常精确的配方,它接受输入并产生相应的输出。配方中的每个步骤都包含用于操作数据的指令。这听起来很复杂,但您可能知道以下语句的含义:1+2=3其中加号是“指令”,数字1和2是数据。数学中的等号表示等式两边的部分“等价”,但在大多数编程语言中在变量上使用等号意味着“赋值”。如果计算机执行上面的语句,它会将这个加法的结果(即“3”)存储在内存的某个地方。计算机知道如何用数字进行数学运算以及如何在内存结构中移动数据。内存这里就不展开了,大家只需要知道内存一般分为“速度快/空间小”和“速度慢/空间大”两种。CPU寄存器的读写速度很快,但是空间很小,相当于一个速记笔记。主存通常有很大的空间,但读写速度却远不如寄存器。在程序运行的过程中,CPU不断地将它需要的数据从主存中移到寄存器中,然后再将结果放回主存中。汇编计算机在当时很昂贵,而人力又很便宜。程序员需要花费大量时间将手写的数学表达式翻译成计算机可以执行的指令。第一台计算机的用户界面非常糟糕,有些甚至在前面板上有拨动开关。这些开关代表内存“单元”中的“0”和“1”。程序员需要配置一个内存单元,选择一个存储位置,并将该单元提交给内存。这是一个耗时且容易出错的过程。程序员BettyJeanJennings(左)和FranBilas(右)操作ENIAC的主控制面板。后来,一位电气工程师认为他的时间很宝贵,写了一个可以读取“配方”的程序,如将输入转换为计算机可读的版本。这就是最初的“汇编程序”,在当时引起了不小的争议。这些昂贵机器的所有者不想将计算资源浪费在人类已经可以完成的任务上(尽管速度慢且容易出错)。然而,随着时间的推移,人们逐渐发现使用汇编程序比手工编写机器语言更快、更准确,计算机完成的“实际工作”也增加了。尽管汇编程序比在机器面板上切换位状态进步了一大步,但这种编程风格仍然非常专业。上面的加法例子用汇编语言看起来是这样的:01MOVR0,102MOVR1,203ADDR0,R1,R204MOV64,R005STOR2,R0每行是一条计算机指令,前面是指令的简写,后面是通过指令操作的数据。这个小程序首先将值1“移动”到寄存器R0,然后将值2移动到寄存器R1。03行将寄存器R0和R1的值相加,结果存入寄存器R2。***,第04和05行确定结果应放置在主存储器中的什么位置(在本例中为地址64)。管理数据在内存中的存储位置是编程中最耗时且最容易出错的部分之一。编译器和汇编器比手写的计算机指令要好得多,但早期的程序员仍然渴望用他们习惯的方式编写程序,就像写数学公式一样。这种需求推动了高级编译语言的发展,其中一些已经过时,另一些至今仍在使用。例如,ALGO已成为历史,但Fortran和C等语言仍在继续解决实际问题。ALGO和Fortran编程语言的谱系这些“高级”语言允许程序员以更简单的方式编写程序。在C语言中,我们的加法程序变成这样:intx;x=1+2;第一条语句描述了程序将使用的一块内存。在这个例子中,内存应该是一个名为x的整数的大小。第二个语句是加法,尽管是倒着写的。C程序员会说这是“X被赋值为1加2的结果”。需要注意的是,程序员不需要决定将x存储在内存中的什么位置,这个任务留给了编译器。这种称为“编译器”的新程序可以将用高级语言编写的程序转换为汇编语言,然后使用汇编程序将汇编语言转换为机器可读的程序。这种程序组合通常称为“工具链”,因为一个程序的输出成为另一个程序的输入。当从一台计算机迁移到另一台不同型号或品牌的计算机时,编译语言相对于汇编语言的优势就体现出来了。在计算的早期,包括IBM、DEC、德州仪器、UNIVAC和惠普在内的公司制造了大量不同类型的计算机硬件。除了都需要连接到电源外,这些计算机没有太多共同点。它们在内存和CPU架构上有很大不同,而且在当时,将程序从一台计算机转换到另一台计算机通常需要数年时间。对于高级语言,我们只需要将编译器工具链迁移到新平台即可。只要有编译器可用,用高级语言编写的程序最多只需稍作修改就可以在新计算机上重新编译。高级语言的编译是一项真正具有革命性的成就。1983年发布的IBMPCXT是硬件价格下降的早期例子。程序员的生活有了很大的改善。相比之下,通过高级语言表达他们想要解决的问题,事情就容易多了。由于半导体技术的进步和集成芯片的发明,计算机硬件的价格大幅下降。计算机变得越来越快、功能越来越强大,而且越来越便宜。从某个时候开始(也许是80年代后期),事情发生了逆转,程序员变得比他们所开发的硬件更有价值。口译员随着时间的推移,出现了一种新的编程风格。一种称为“解释器”的特殊程序可以直接读取程序并将其转换为计算机指令以立即执行。与编译器非常相似,解释器读取程序并将其转换为中间形式。但与编译器不同的是,解释器直接执行程序的这种中间形式。解释型语言每次执行都要经过这个过程;一个编译好的程序只需要编译一次,然后计算机每次只需要执行编译好的机器指令。顺便说一下,正是这个特性导致人们认为解释型程序运行得更慢。但是现代计算机的功能如此惊人,以至于大多数人都分不清编译程序和解释程序之间的区别。解释程序(有时称为“脚本”)更容易移植到不同的硬件平台。由于该脚本不包含任何特定于机器的指令,因此同一版本的程序可以直接在许多不同的计算机上运行而无需任何修改。但是当然,解释器必须先移植到新机器上。一种非常流行的解释语言是perl。我们的加法问题在perl中的完整表达如下:$x=1+2这个程序虽然看起来和C语言版本很相似,并且在操作上也没有太大区别,但是它缺少初始化变量的语句。其实还有一些其他的不同(超出了本文的范围),但你应该已经注意到,我们编写计算机程序的方式与数学家用笔和纸手写数学表达式的方式非常接近。虚拟机最流行的编程方式是虚拟机(通常简称为VM)。虚拟机分为两类:系统虚拟机和进程虚拟机。两种类型的虚拟机都提供与“真实”计算硬件不同级别的抽象,但它们具有不同的范围。系统虚拟机是一种软件,可以替代物理硬件,而进程虚拟机旨在以“系统无关”的方式执行程序。所以在这个例子中,进程虚拟机(后面我说的虚拟机就是指这种类型)的范围和解释器类似,因为程序是先编译成中间形式,然后虚拟机执行这个中间形式。虚拟机和解释器的主要区别在于,虚拟机创建虚拟CPU和虚拟指令集。有了这一层抽象,我们就可以编写前端工具,将不同语言的程序编译成虚拟机可以接受的程序。也许最新和最著名的虚拟机是Java虚拟机(JVM)。JVM在1990年代最初只支持Java语言,但今天它可以运行许多流行的编程语言,包括Scala、Jython、JRuby、Clojure和Kotlin等。还有其他不太常见的例子,这里不再赘述。我最近也了解到我最喜欢的语言Python不是一种解释型语言,而是一种运行在虚拟机上的语言!虚拟机仍在延续允许程序员使用特定领域的编程语言来解决问题的历史趋势,对特定计算平台的知识要求越来越少。就是这样。我希望您喜欢这篇简短的文章,它简要介绍了该软件在幕后的工作原理。您还有什么其他话题希望我接下来讨论吗?在评论中让我知道。
