软件是计算机的灵魂,没有软件的计算机毫无用处。软件是用户与硬件之间的接口,用户通过软件使用计算机硬件资源。
1.程序
程序(Program)是指一组指示计算机或其他具有信息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,能够运行于某种目标体系结构上。计算机程序是由数据结构和算法构成的。
简而言之,程序是指令的集合,这些指令按预先编制的顺序执行,能够完成特定的任务。Pascal之父、结构化程序设计的先驱Niklaus Wirth在他1976年出版的著作《算法+数据结构=程序》(Algorithms+Data Structures=Programs)对程序有深层的剖析,正如他的书名,他认为“算法+数据结构=程序”。其中,算法是解决问题的方法,数据结构是数据的组织形式。人在解决问题时一般分为分析问题、设计方法和求出结果三个步骤。相应地,计算机解题也要完成模型抽象、算法分析和程序编写三个过程。不同的是计算机所研究的对象仅限于它能识别和处理的数据。因此,数据的算法和结构直接影响计算机解决问题的正确性和高效性。
2.程序设计语言
就广义而言,语言是一套共同采用的沟通符号、表达方式与处理规则。
人与人之间的交流是通过语言进行的,人类使用的语言称为自然语言。自然语言由字、词、句、段、篇等构成,其中,“字”是符号集,“词、句、段、篇”是按一定词法、语法规则对符号的应用。不同的自然语言使用不同的符号和规则,因此,使用不同语言的人要进行交流,必须通过翻译。
类似于自然语言,人与计算机之间的“沟通”,或者说人们向计算机下达命令以完成某项任务,也需用使用语言,这就是计算机语言,也称程序设计语言。程序设计语言也有自己的符号和规则,即程序设计语言也由字、词、句、段(函数)和篇(程序文件)组成。程序设计语言是软件系统的基础组成部分。程序设计语言经历了从无到有、从低级到高级的发展过程。从存储程序概念开始,程序设计语言经历了机器语言、汇编语言、高级语言三个阶段。
1)机器语言
在计算机中,指挥计算机完成某个基本操作的命令称为指令。所有的指令集合称为指令系统,直接用二进制代码表示指令系统的语言称为机器语言。
机器语言是直接用二进制代码指令表达的计算机语言。机器语言是唯一能被计算机硬件系统理解和执行的语言。因此,它的处理效率最高,执行速度最快,且无须“翻译”。但机器语言的编写、调试、修改、移植和维护都非常困难。机器语言程序员需要记住计算机指令系统中的每条机器指令的二进制代码,并记住这些指令的操作数使用规则,这使得程序(软件)的开发成本特别昂贵,并限制了计算机的发展。
如图1-28所示,CL和DH两个8位寄存器相加的机器语言二进制代码为“00000010 11001111”,图中描述了指令中的位代表的含义。显然,要记住成百上千的机器指令及其用法是十分困难的。
图1-28 寄存器CL加BH的机器语言
2)汇编语言
为了克服机器语言的缺点,人们想到直接使用英文单词或缩写代替难懂的二进制代码来进行编程,从而出现了汇编语言。汇编语言是机器语言的符号化,即汇编语言与机器语言一一对应。
相对机器语言,汇编语言更容易编写、阅读、调试和维护。但计算机无法自动识别和执行汇编语言,必须进行翻译。将汇编语言翻译成机器语言(目标程序)的程序叫汇编程序。目标程序还必须经过链接程序将外部库链接成可执行程序,才能在计算机中执行。
汇编语言比机器语言更高级,更易于学习和使用,但它还存在两个重大的缺点:一是汇编语言仍然是面向机器的语言,无法在不同体系结构的计算机之间移植;二是汇编语言的书写习惯与人类自然语言有着很大的差异,例如,下面的代码用来计算1+2,并将结果送入变量X。
3)高级语言(www.xing528.com)
汇编语言虽然比机器语言前进了一步,但使用起来仍然很不方便,编程仍然是一种极其烦琐的工作,而且汇编语言的通用性差。人们在继续寻找一种更加方便的编程语言,于是出现了高级语言。
高级语言是最接近人类自然语言和数学公式的程序设计语言,它基本脱离了硬件系统,如Pascal语言中采用“Write”和“Read”表示写入和读出操作,采用“+、-、*、/”表示加、减、乘和除运算等。
高级语言在发展的过程中,大致出现了结构化程序设计和面向对象程序设计两个阶段。
结构化程序设计确定了三种基本程序结构,即顺序结构、选择结构、循环结构,并确定程序必须是单入单出的模块结构。结构化编程思想极大地提高了软件的产量和质量,降低了软件成本,推动了计算机的发展和普及。代表性的结构化程序设计语言有C、Pascal、Fortran、Basic等。
由于计算机软件是纯智力产物,随着软件需求的日益增加,以及在运行软件的日益积累,软件的高需求与软件的低产量之间的矛盾,软件的高积累与软件的低维护性之间的矛盾,导致了软件危机的产生。为了解决软件危机,人们提出了面向对象思想,并创造了面向对象程序设计语言。面向对象程序设计语言极大地提高了软件的可重用性和可维护性,从而进一步提高了软件产量和质量、降低了软件成本。代表性的面向对象程序设计语言有C++、Object Pascal(Delphi)、Visual Studio.Net(包括C++.Net、C#.Net、VB.Net等)、Java等。
下面是一个简单的C语言程序。该程序提示用户从键盘输入两个整数,然后计算两个整数的和,并将计算结果在屏幕上显示出来。这样的程序比汇编语言就要好理解多了。
显然,高级语言编写的源程序不能在计算机中直接执行,必须翻译成机器语言,通常有两种翻译方式:编译方式和解释方式。
编译方式是将高级语言源程序整个编译成目标程序,然后通过链接程序将目标程序链接成可执行程序的方式。将高级语言源程序翻译成目标程序的软件称为编译程序,这种翻译过程称为编译。编译过程经过词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等六个环节,才能生成对应的目标代码程序,目标程序还不能直接执行,还需经过链接和定位生成可执行程序后才能执行。采用编译方式的语言有C、C++、Pascal等。
解释方式是将源程序逐句翻译、逐句执行的方式,解释过程不产生目标程序,基本上是翻译一行执行一行,边翻译边执行。如果在解释过程中发现错误就给出错误信息,并停止解释和执行,如果没有错误就解释执行到最后的语句。采用解释方式运行的代表性语言为Basic语言。
无论是编译程序还是解释程序其作用都是将高级语言编写的源程序翻译成计算机可以识别与执行的机器指令。它们的区别在于:编译方式是将源程序经编译、链接得到可执行程序文件后,就可脱离源程序和编译程序,单独执行,所以编译方式的效率高,执行速度快。而解释方式在执行时,源程序和解释程序必须同时参与才能运行,由于不产生目标文件和可执行程序文件,解释方式的效率相对较低,执行速度慢。
现代面向对象语言,如Java和.Net语言,通常采用中间代码方式。它们产生的目标程序是经过优化的字节代码,并不是机器语言,不能在目标机器上直接运行。但这些语言提供了一种虚拟机,如JVM(Java Virtual Machine,Java虚拟机)、.Net Framework(.Net框架)等,中间代码在这些虚拟机中运行。这样做的好处是便于移植,例如,Java应用程序可直接在Windows和Linux操作系统上运行,只要这两个系统中有对应的JVM即可。
3.程序与进程
进程(Process)是操作系统中的一个核心概念。进程,顾名思义,是指进行中的程序。即:进程=程序+执行。
进程是程序的一次执行过程,是系统进行调度和资源分配的一个独立单位。或者说,进程是一个程序与其数据一道在计算机上顺利执行时所发生的活动。简单地说,就是一个正在执行的程序。一个程序被加载到内存,系统就创建了一个进程,程序执行结束后,该进程也就消亡了。进程和程序的关系犹如演出和剧本的关系。其中,进程是动态的,而程序是静态的;进程有一定的生命期,而程序是一个在存储设备(如硬盘)上保存的一个可执行文件;一个程序可以对应多个进程,而一个进程只能对应一个程序。
例如,图1-29(a)所示是Windows 7资源管理器中的程序文件QQ.exe,它是存储在硬盘上的一个静态的可执行文件,无论是否开机、是否启动了QQ,该文件都静态地存储在硬盘上。图1-29(b)所示是Windows 7的任务管理器,可以通过【Ctrl+Shift+Esc】组合键打开。在“进程”选项卡的进程列表中,可以看到两个“QQ.exe”进程,表示当前系统中正运行着两个QQ进程。无论是在QQ中使用“退出”命令,还是在任务管理器中单击【结束进程】,或是关机,QQ进程都会结束。用户可以再次双击资源管理器中的QQ.exe程序文件(或快捷方式)重新创建一个或多个QQ进程。
图1-29 程序与进程的关系
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。