计算机程序是由计算机执行时执行特定任务的指令的集合[1] 。计算机需要程序才能运行。
计算机程序通常由计算机程序员用编程语言编写。从源代码的人类可读形式中,编译器可以导出机器代码——一种由计算机可以直接执行的指令组成的形式。或者,计算机程序可以在解释器的帮助下执行。
计算机程序、库和相关数据的集合称为软件。计算机程序可以按照功能分类,例如应用软件和系统软件。用于某些计算或操作的基本方法称为算法。
最早的可编程机器先于数字计算机的发明。1801年,约瑟夫-玛丽·贾卡发明了一种织布机,可以通过跟随一系列穿孔卡片来编织图案。图案可以通过排列卡片来编织和重复。[2]
1837年,查尔斯·巴贝奇受到贾卡织布机的启发,试图建造分析引擎。[2]计算装置的部件名称是从纺织业借来的。在纺织工业中,纱线是从商店里拿来碾磨的。这种设备应该有一个“存储器”——存储1000个数字,每个数字有40个十进制数字。 然后,来自“存储器”的数字会被转移到“工厂”(类似于现代机器的中央处理器)进行处理。“线程”是由设备执行的编程指令。它使用两组穿孔卡片进行编程——一组用于指导操作,另一组用于输入变量。[2][3] 然而,在英国政府投入超过17000英镑的资金后,数以千计的齿轮和齿轮仍不能完全协同工作。[4]
在1842年至1843年的九个月期间,阿达·洛芙莱斯翻译了意大利数学家路易吉·梅纳布雷亚的回忆录。回忆录涵盖了分析引擎。译文包含完全详细地描述了使用分析引擎计算伯努利数的方法的注释G。一些历史学家认为这是世界上第一个书面计算机程序。[5]
1936年,艾伦·图灵引入了通用图灵机——一种理论装置,可以对图灵机完成的所有计算进行建模。[6]这是一个有无限长读/写磁带的有限状态机。机器可以来回移动磁带,并在执行算法时改变其内容。机器从初始状态开始,经过一系列步骤,当遇到停止状态时停止。[7]有些人认为这台机器是存储程序计算机的起源——约翰·冯·诺依曼(1946年)用它来命名“电子计算仪器”,现在它有冯·诺依曼体系结构的名字。[8]
Z3计算机是康拉德·楚泽(1941年)在德国发明的,是一台数字可编程计算机。[9] 数字计算机使用电流作为计算组件。Z3包含2400个继电器来创建电路。这些电路提供了一台二进制浮点九指令计算机。Z3的编程是通过一个特别设计的键盘和穿孔带进行的。
电子数值积分计算机,ENIAC(1945年秋季)是一台图灵完整的通用计算机,它使用17,468根真空管来创建电路。它的核心是由一系列帕斯卡灵连接在一起。[10] 它的40个部件共重30吨,被占用1,800平方英尺(167平方米) ,闲置时每小时消耗650美元(以20世纪40年代的货币计算)。[10] 它有20个十进制蓄能器。ENIAC的编程耗时长达两个月。[10] 三个功能表安装在轮子上,需要滚动到固定的功能面板上。功能表使用黑色粗线连接到功能面板。每个功能表有728个旋钮。ENIAC的编程还包括3000个开关中的一些设置。调试一个程序花了一周时间。[10] ENIAC的程序员是女性,她们被统称为“ENIAC女孩”。[11] ENIAC的特点是并行操作。不同组的累加器可以同时处理不同的算法。它使用穿孔卡片机进行输入和输出,并由时钟信号控制。它运行了八年,计算氢弹参数,预测天气模式,并制作射表瞄准火炮。
曼彻斯特宝贝(1948年6月)是一台存储程序计算机。[12] 编程从移动电缆和设置拨号盘转变而来;相反,计算机程序以数字的形式存储在内存中。每个指令只有三位内存可用,所以它被限制在八条指令。32个开关可供编程。
直到20世纪70年代制造的计算机都有用于编程的前面板开关。计算机程序写在纸上以供参考。指令由开/关设置的配置表示。设置配置后,按下执行按钮。然后重复这个过程。计算机程序也是通过纸带或穿孔卡片手工输入的。加载介质后,通过开关设置起始地址,并按下执行按钮。[13]
1961年,巴勒斯B5000被专门设计成用ALGOL 60语言编程。硬件采用电路来简化编译阶段。[14]
1964年,IBM System/360是由六台计算机组成的生产线,每台计算机都具有相同的指令集体系结构。30型是最小和最便宜的。客户可以升级和保留相同的应用软件。[15] 每个系统/360型号都有多道程序设计。有了操作系统的支持,多个程序可以同时存在于内存中。当一个人在等待输入/输出时,另一个人可以计算。每种型号也可以模仿其他计算机。客户可以升级到系统/360并保留他们的IBM 7094或IBM 1401应用软件。[15]
计算机编程是编写或编辑源代码的过程。编辑源代码包括测试、分析、精化,有时还包括与其他程序员就共同开发的程序进行协调。实践这一技能的人被称为计算机程序员、软件开发者,有时也称为程序员。
有时漫长的计算机编程过程通常被称为软件开发。软件工程这个术语越来越流行,因为这个过程被视为一门工程学科。
计算机程序可以根据用来产生它们的编程语言范例来分类。两种主要范式是命令式和声明式的。
命令式语言
命令式编程语言 使用声明、表达式和语句指定顺序算法:[16]
var x: integer;
2 + 2
产量4x := 2 + 2; if x = 4 then do_something();
对命令式语言的一个批评是赋值语句对一类称为非局部变量的变量的副作用。[17]
陈述性语言
声明式编程语言 形容 什么 应该执行计算,而不是 怎么 来计算它。声明性程序省略了控制流,并被考虑 设置 指示。两大类声明性语言是功能语言和逻辑语言。函数语言(如Haskell)背后的原则是不允许副作用,这使得像数学函数这样的程序更容易推理。[17] 逻辑语言(如Prolog)背后的原则是定义要解决的问题 目标 –将详细的解决方案留给Prolog系统本身。[18] 目标是通过提供子目标列表来定义的。然后,通过进一步提供其子目标列表等来定义每个子目标。如果一个子目标的路径没有找到解决方案,那么该子目标被回溯,并且系统地尝试另一个路径。
人类可读的计算机编程语言形式的计算机程序称为源代码。源代码可以由编译器转换成可执行图像,或者在解释器的帮助下立即执行。
编译器用于将源代码从编程语言翻译成目标代码或机器代码。[19] 目标代码需要进一步处理才能成为机器代码,机器代码由中央处理器的本机指令组成,准备执行。编译后的计算机程序通常被称为可执行文件、二进制图像或简称为二进制文件 –对用于存储可执行代码的二进制文件格式的引用。
解释器用于逐行执行编程语言的源代码。解释器解码每个语句并执行其行为。解释器的一个优势是它们可以很容易地扩展到交互式会话。程序员会得到一个提示,并立即输入和执行单独的代码行。
解释器的主要缺点是计算机程序运行比编译时慢。解释代码比较慢,因为解释器必须解码每个语句,然后执行它。然而,使用解释器软件开发可能会更快,因为当编译步骤被省略时,测试是立即进行的。解释器的另一个缺点是解释器必须出现在执行计算机上。相比之下,编译后的计算机程序在执行过程中不需要编译器。
编译器在执行前及时预编译计算机程序。例如,Java虚拟机热点包含一个即时编译器,它有选择地将Java字节码编译成机器代码,但只有热点预测的代码可能会被多次使用。
编译或解释的程序可以在批处理过程中执行,无需人工交互。
脚本语言通常用于创建批处理。一种常见的脚本语言是Unix shell,它的执行环境称为命令行界面。
编程语言的任何属性都不需要专门编译或解释。分类通常反映了最流行的语言执行方法。例如,尽管有Java编译器和C解释器,但Java被认为是一种解释语言,而C是一种编译语言。
通常,计算机程序存储在非易失性存储器中,直到被计算机用户直接或间接请求执行。根据这样的请求,程序被一种称为操作系统的计算机程序加载到随机存取存储器中,在那里它可以被中央处理器直接访问。然后,中央处理器一条指令一条指令地执行(“运行”)程序,直到终止。正在执行的程序称为进程。[20] 终止是源自正常的自我终止、用户干预或软件错误或硬件错误。
许多操作系统支持多任务处理,这使得许多计算机程序看起来可以在一台计算机上同时运行。 操作系统可以通过进程调度运行多个程序 –一种软件机制,用于经常在进程之间切换中央处理器,以便用户可以在每个程序运行时与其交互。[21] 在硬件中,现代多处理器计算机或具有多核处理器的计算机可以运行多个程序。[22]
正在执行的计算机程序通常被视为不同于该程序所操作的数据。然而,在某些情况下,当计算机程序修改自己时,这种区别就变得模糊了。修改后的计算机程序随后作为同一程序的一部分被执行。用机器代码、汇编语言、Lisp、C、COBOL、PL/1和Prolog编写的程序可以使用自修改代码。
计算机程序可以按照功能分类。主要功能类别是应用软件和系统软件。系统软件包括将计算机硬件与应用软件相结合的操作系统。[23] 操作系统的目的是提供一个环境,在这个环境中应用软件以方便和有效的方式执行。[23] 除了操作系统,系统软件还包括嵌入式程序、引导程序和微程序。为最终用户设计的应用软件具有用户界面。不是为最终用户设计的应用软件包括中间件,它将一个应用程序与另一个应用程序耦合在一起。应用软件还包括实用程序。系统软件和应用软件之间的区别正在争论之中。
有许多类型的应用软件:
实用程序是旨在帮助系统管理员和计算机程序员的应用程序。
操作系统是在计算机用户和计算机硬件之间充当中介的计算机程序。[23]
在20世纪50年代,程序员,也是操作员,会编写一个程序并运行它。[13]程序完成执行后,输出可能已经打印出来,也可能已经穿孔在纸带或卡片上,供以后处理。[13]这个程序经常不起作用。[24]然后程序员看着控制台灯并拨弄其开关。如果运气不佳,还会打印一份内存供进一步研究。[24]在20世纪60年代,程序员通过自动化操作员的工作来减少浪费的时间。[24] 一个叫做 操作系统 一直保存在电脑里。[24]
最初,操作系统是在汇编中编程的;然而,现代操作系统通常是用c语言编写的。
存储程序计算机需要存储在其只读存储器中的初始计算机程序才能启动。引导过程是识别和初始化系统的所有方面,从处理器寄存器到设备控制器到内存内容。[25] 在初始化过程之后,这个初始计算机程序加载操作系统并设置程序计数器以开始正常操作。
独立于主机,硬件设备可能具有嵌入式固件来控制其操作。当计算机程序很少或从未被期望改变时,或者当断电时程序不能丢失时,会使用固件。[24]
微码程序控制一些中央处理器和一些其他硬件。该代码在寄存器、总线、算术逻辑单元和中央处理器中的其他功能单元之间移动数据。与传统程序不同,微码通常不由系统的最终用户编写,甚至对其不可见,通常由制造商提供,被认为是设备内部的。
^Rochkind, Marc J. (2004). Advanced Unix Programming, Second Edition. Addison-Wesley. p. 1.1.2..
^McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 16. ISBN 978-0-8027-1348-3..
^Bromley, Allan G. (1998). "Charles Babbage's Analytical Engine, 1838" (PDF). IEEE Annals of the History of Computing. 20 (4)..
^Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 15. ISBN 978-0-13-854662-5..
^J. Fuegi; J. Francis (October–December 2003), "Lovelace & Babbage and the creation of the 1843 'notes'", Annals of the History of Computing, 25 (4): 16, 19, 25, doi:10.1109/MAHC.2003.1253887.
^Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6..
^Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 234. ISBN 978-0-669-17342-0..
^Davis, Martin (2000), Engines of Logic: Mathematicians and the origin of the Computer (1st ed.), New York NY: W. W. Norton & Company, ISBN 978-0-393-32229-3, (pb.).
^"History of Computing"..
^McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 102. ISBN 978-0-8027-1348-3..
^Frink, Brenda D. (1 June 2011). "Researcher reveals how "Computer Geeks" replaced "Computer Girls"". Gender News. Stanford University. Archived from the original on 12 March 2015. Retrieved 22 October 2018..
^Enticknap, Nicholas (Summer 1998), "Computing's Golden Jubilee", Resurrection (20), ISSN 0958-7403, retrieved 19 April 2008.
^Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 6. ISBN 978-0-201-50480-4..
^Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 20. ISBN 978-0-13-854662-5..
^Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 21. ISBN 978-0-13-854662-5..
^Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 75. ISBN 978-0-201-56885-1..
^Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 213. ISBN 978-0-201-56885-1..
^Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 244. ISBN 978-0-201-56885-1..
^"What is a Compiler?". Retrieved 2012-01-10..
^Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 97. ISBN 978-0-201-50480-4..
^Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 100. ISBN 978-0-201-50480-4..
^Akhter, Shameem (2006). Multi-Core Programming. Richard Bowles (Intel Press). pp. 11–13. ISBN 978-0-9764832-4-3..
^Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 1. ISBN 978-0-201-50480-4..
^Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 11. ISBN 978-0-13-854662-5..
^Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 30. ISBN 978-0-201-50480-4..
暂无