程序

  程序,又称“计算机程序”或者“软件程序”,是指一组指示计算机或其他具有消息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。通常,计算机程序要经过编译和链接而成为一种人们不易看清而计算机可解读的格式,然后运行。未经编译就可运行的程序,通常称之为脚本程序(script)。  任何以计算机为处理工具的任务都是计算任务。处理对象是数据,如数字、文字和图像等。处理规则一般指处理动作和步骤。在低级语言中,程序是一组指令和有关的数据。在高级语言中,程序一般是一组说明和语句。程序是程序设计中最基本的概念,也是软件中最基本的概念。程序是软件的本体,又是软件的研究对象。程序的质量决定软件的质量。  程序要能实际起作用,必须装入到机器内部。程序的实际工作过程称为程序的执行。衡量程序质量,除对程序结构进行静态考察外,还必须考察其执行过程。与执行过程无关的特性,称为程序的静态特性;与执行过程有关的特性,称为程序的动态特性。

基本成分

   构成程序的基本成分包括程式、子程式、子程序、协同程式、递归程式和模块。

·程式

   与一项计算任务相应的处理对象和处理规则的描述。它一般在一个程序或多个程序中多次使用。

·子程式

   与子计算任务相应的处理对象和处理规则的描述。它一般也是多次使用。子程式有两个方面:一个是定义方面,称为子程式定义或子程式说明;另一个是调用方面,称为子程式调用。随着实现方式的不同,又可区分为开式子程式和闭式子程式。开式子程式在调用处嵌入相应的子程式定义;闭式子程式则在调用时直接转至相应的定义,执行后返回。二者各有利弊。开式子程式时间节省,空间浪费;闭式子程式恰恰相反。

·子程序

   程序中具有相对独立性的程序单位。

·协同程式

   一组程序单位可以互相调用,彼此处于平等地位,调用后毋须返回到开始位置,且自带工作区。协同程式示意图:
图中的C1和C2表示两个协同程式。其中A1为C1的起点,当C1执行到A2位置,调用C2(C2的起点为B1),C1执行到B2位置又调用C1,这时便从A2开始执行,到了A3位置又调用C2。依此类推,直到C1执行到终点A4处为止。

·递归程式

   可以作为其本身的子程式而被调用的程式。这种调用可以是直接的,也可以是间接的(即通过其他子程式)。

·模块

   具有相对独立性的一组逻辑上有关的实体。在现代高级语言中,有各种定义模块的方式,但其主要成分是一组说明和一组语句。

程序的运行

  为了一个程序运行,计算机加载程序代码,可能还要加载数据,从而初始化成一个开始状态,然后调用某种启动机制。在最低层上,这些是由一个引导序列开始的。  在大多数计算机中,操作系统例如Windows等,加载并且执行很多程序。在这种情况下,一个计算机程序是指一个单独的可执行的映射,而不是当前在这个计算机上运行的全部程序。

程序和数据

  数据可以被定义为被程序处理的信息。当我们考虑到整个计算机系统时,有时程序和数据的区别就不是那么明显了。中央处理器有时有一组微指令控制硬件,数据可以是一个有待执行的程序(参见脚本编程语言),程序可以编写成去编写其它的程序;所有这些例子都使程序和数据的比较成为一种视角的选择。有人甚至断言程序和数据没有区别。  编写一个程序去生成另外一个程序的过程被称之为原编程(Metaprogramming)。它可以被应用于让程序根据给定数据生成代码。单单一个程序可能不足以表示给定数据的所有方面。让一个程序去分析这个数据并生成新的程序去处理数据所有的方面可能会容易一些。Lisp就是一例支持这种编程模式的程序语言。  在神经网络里储存的权重是一种数据。正是这些权重数据,跟网路的拓扑结构一起,定义了网络的行为。人们通常很难界定这些数据到底表示什么或者它们是否可以由程序来代替。这个例子以及跟人工智能相关的其它一些问题进一步考验程序和数据的区别。

算法

  算法指解决某个问题的严格方法,通常还需辅以某种程度上的运行性能分析。算法可以是纯理论的,也可以由一个计算机程序实现。理论算法通常根据复杂性分为不同类别;实现的算法通常经过颇析(Profiling)以测试其性能。请注意虽然一个算法在理论上有效可行,但是一个糟糕的实现仍会浪费宝贵的计算机资源。

程序开发

  编写程序是以下步骤的一个往复过程:编写新的源代码,测试、分析和提高新编写的代码以找出语法和语义错误。从事这种工作的人叫做程序设计员。由于计算机的飞速发展,编程的要求和种类也日趋多样,由此产生了不同种类的程序设计员,每一种都有更细致的分工和任务。软件工程师和系统分析员就是两个例子。现在,编程的长时间过程被称之为“软件开发”或者软件工程。后者也由于这一学科的日益成熟而逐渐流行。  因此,如今程序设计员可以指某一领域的编程专家,也可以泛指软件公司里编写一个复杂软件系统里某一块的一般程序员。一组为某一软件公司工作的程序员有时会被指定一个程序组长或者项目经理,用以监督项目进度和完成日期。大型软件通常经历由系统设计师掌握的一个长时间的设计阶段,然后才交付给开发人员。牛仔式的编程(未经详细设计)是不为人所齿的。  两种当今常见的程序开发方式之一是项目组开发方式。使用这种方式项目组里每一个成员都能对项目的进行发表意见,而由其中的某一个人协调不同意见。这样的项目组通常有15个左右的成员,这样做是为了便于管理。第二种开发方式是结对开发。