计算机程序

计算机程序（）是指一组指示计算机或其他具有讯息处理能力装置每一步动作的指令，通常用某种程序设计语言编写，运行于某种目标体-{系}-结构上。打个比方，一个程序就像一个用"汉语"（程序设计语言）写下的红烧肉"菜谱"（程序），用于指导"懂汉语"（编译器）同时也会"烹饪手法的人"（体-{系}-结构）来做这道菜。 通常，以英文文本为基础的计算机程序要经过编译和连结而成为一种人们不易看清而计算机可解读的一连串数字的格式，然后放入运行。未经编译就可运行的程序，通常称之为脚本程序（script）。

为了一个程序运行，计算机加载程序代码，可能还要加载数据，从而初始化成一个开始状态，然后调用某种启动机制。在最低层上，这些是由一个载入器开始的。

在大多数计算机中，操作系统例如Windows等，加载并且执行很多程序。在这种情况下，一个计算机程序是指一个单独的可执行的映射，而不是当前在这个计算机上运行的全部程序。

在一台基于最常见的冯诺依曼体系结构（又称普林斯顿结构）的计算机上，程序从某种外部设备，通常是硬盘，被加载到计算机之内。 如果计算机选择冯诺依曼体系结构，那么程序就被加载入-{zh-hans:内存; zh-hant:记忆体;}-。 指令序列顺序执行，直到一条跳转或转移指令被执行，或者一个中断出现。所有这些指令都会改变指令寄存器的内容。

基于这种体系的计算机，如果没有程序的支持，将无法工作。一个计算机程序是一系列指令的集合。

程序里的指令都是基于机器语言；程序通常首先用一种计算机程序设计语言编写，然后用编译器或者直译器翻译成机器语言。 有时，也可以用-{zh-hans:汇编语言; zh-hant:组合语言;}-编程，-{zh-hans:汇编; zh-hant:组合;}-语言实质就是表示机器语言的一组记号－在这种情况下，用于翻译的程序叫做-{zh-hans:汇编程序; zh-hant:组译程式;}-。

数据可以被定义为被程序处理的信息。当我们考虑到整个计算机系统时，有时程序和数据的区别就不是那么明显了。中央处理器有时有一组微指令控制硬件，数据可以是一个有待执行的程序（参见脚本编程语言），程序可以编写成去编写其它的程序；所有这些例子都使程序和数据的比较成为一种视角的选择。有人甚至断言程序和数据没有区别。

编写一个程序去生成另外一个程序的过程被称之为元编程（）。它可以被应用于让程序根据给定数据生成代码。单单一个程序可能不足以表示给定数据的所有方面。让一个程序去分析这个数据并生成新的程序去处理数据所有的方面可能会容易一些。就是一例支持这种编程模式的程序语言。

在神经网络里储存的权重是一种数据。正是这些权重数据，跟网路的拓扑结构一起，定义了网络的行为。人们通常很难界定这些数据到底表示什么或者它们是否可以由程序来代替。这个例子以及跟人工智能相关的其它一些问题进一步考验程序和数据的区别。

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

编写程序是以下步骤的一个往复过程：编写新的源代码，测试、分析和提高新编写的代码以找出语法和语义错误。从事这种工作的人叫做程序设计员。由于计算机的飞速发展，编程的要求和种类也日趋多样，由此产生了不同种类的程序设计员，每一种都有更细致的分工和任务。软件工程师和系统分析员就是两个例子。现在，编程的长时间过程被称之为“软件开发”或者软件工程。后者也由于这一学科的日益成熟而逐渐流行。

因此，如今程序设计员可以指某一领域的编程专家，也可以泛指软件公司里编写一个复杂软件系统里某一块的一般程序员。一组为某一软件公司工作的程序员有时会被指定一个程序组长或者项目经理，用以监督项目进度和完成日期。大型软件通常经历由系统设计师掌握的一个长时间的设计阶段，然后才交付给开发人员。牛仔式的编程（未经详细设计）是不为人所齿的。

两种当今常见的程序开发方式之一是项目组开发方式。使用这种方式项目组里每一个成员都能对项目的进行发表意见，而由其中的某一个人协调不同意见。这样的项目组通常有15个左右的成员，这样做是为了便于管理。第二种开发方式是结对开发。