第一章

开始之前的话

程序是什么

一段计算机程序(program通常是按美式英语拼写的)是一系列包含了完成一些任务所必需信息的指令。这类似于织布针法,食谱或音乐总谱。同时计算机程序也使用一种特殊的描述方法,即编程语言。

本书讲述了如何编写和理解用一种叫 SIMULA 语言编写的程序。准确来说是使用 1985 SIMULA 标准,该标准扩展和明确了早期的 SIMULA 67 语言。67代表了1967年,在那一年,SIMULA的这一较早版本首次被定义。

这两个语言标准不应该和另一个更老的叫做 SIMULA 1 的语言混淆, SIMULA 1是 SIMULA 67 和现代 SIMULA 的祖先。

极少数关于 SIMULA 的文献(尤其是CACM一篇1966年的文献)是中讨论的是 SIMULA 1 语言。更多的文献中讨论的是 SIMULA 67。许多 SIMULA 的实现尚未有 1984 标准中的全部特性(?1985),尽管这些实现拥有的特性很可能多于1967年确定的标准。在本书中处处都提醒读者,部分特性可能不是通用的。此外,查看您使用的 SIMULA 系统文档是个好主意,以防该实现有一些特性。SIMULA 是高度标准的,但依然可以找到差异。

你可能已经熟悉了其他语言如 Fortran,Basic 或 Pascal。但你还会发现本书是有必要的,因为 SIMULA 在某种程度上看待这个世界的方式很与众不同。特别是 SIMULA 期望你能小心地组织和构建你的程序。它也允许你描述一些动作,好像这些动作是同时或并行发生的。

如果下一段看起来很难以理解,阅读并看看你能理解多少,然后在阅读其他各个章节后返回来直到你能完全理解。对于本书中其他你一开始不理解的内容也采用同样的方法。要记住,在学习一门新的编程语言时,许多概念必须放在一起才能理解,因此经常是多次重复阅读对于后来理解知识点很有必要。

一段 SIMULA 程序由一系列所谓 代码块 的指令组成,它们在不同程度上是相互独立的,但把它们组合在一起可以产生预期的效果。最简单的程序只包含一个代码块,称作程序块。其他所有的代码块都遵循相同的规则,现在让我们看看只有一个代码块的程序。

1.1. Example

1.1: A simple example

  1. begin
  2. integer Int1;
  3. comment The first SIMULA program written for this book;
  4. Int1:=3;
  5. OutInt(Int1,4);
  6. OutImage
  7. end

这当然不是最简单的程序。我们可以写

  1. begin end

代码块内容是空。这告诉我们书写代码块的第一个规则,用begin和end包围代码块

begin和end被称为关键字,因为它们有特殊的用途不能用于做其他事情。

关于字母大小写

尽管本文中的大小写都用,但实际你喜欢用哪一种就用哪一种。所欲哦没有被双引号包围的SIMULA程序都会被转为大写。你甚至可以写BegIN或eNd。

基本组成部分

所以我们必须把代码放在 begin 和 end 里。那么两者之间的文字有什么要求呢?

两种类型结构组成了SIMULA系统,声明和表达式。还有一些SIMULA系统忽略的部分,这些叫注释的部分仅仅是方便人们更容易理解代码。

声明

在例1.1里,begin后的第一个指令是声明

  1. integer Int1;

代码块中的声明表明了这个代码块需要多大的内存。它们也显示了内存被分为多少个部分,每个部分有多大的空间,以及存储什么样的值。程序将通过每个部分的名字来使用它们。

数据类型(比如integer 整形)说明一块内存将保存什么类型的值。例如例1.1中,该内存用来存储一个数字,SIMULA中,一旦一个内存被定义某种类型,就无法再保存其他类型的数据。(类型语言)

由于这个位置会保存一个整数,因此其要求的内存大小也是为SIMULA系统所知道的。所有的同一类型数据所需要的存储空间大小一样。

标识符Int1现在是用这种方法预留的空间的名字。我们也可以使用Int1来获取Int1中保存的值。这是个有用的便捷方法,尤其是当我们不关心其中当前内存中内容的时候。

如果你想使用更多的内存,我们可以用同样的方法定义,但要确保给每一个分配正确的数据类型。例如:

  1. begin
  2. integer Int1;
  3. real Real1;
  4. etc.

这样我们得到了一个叫做 Real1 的实数,可以在这个代码块中使用。SIMULA中可以使用的数据类型以及其使用方法将在第三章讲解。

如果我们需要不止一个保存整数的空间,我们可以使用不同的标识名声明第二个整数。

  1. begin
  2. integer Int1;
  3. integer Count;
  4. etc.

或者你也可以这么写:

  1. begin
  2. integer Int1, Count;
  3. etc.

很多人都认为这中写法很简洁。这种写法被叫做列表声明,定义了一系列类型相同的标识符。

注释

下一行是注释。以关键字 comment 开始,随后是一些文字和分号

  1. comment The first SIMULA program written for this book;

注释不影响程序的行为,但它包含了程序用途的信息。在例1.1中这些注释告诉我们正在看哪一个版本的代码。这些提示信息往往很有用。

除了独立占用一行,注释也可以使用在特定的地方,可以在指令中间,也可以结合在指令后边。这会在下一章中展示。

当你在写独立部分代码时,不会时不时回头看自己写过的代码。但别的人可能需要修改你写的代码。代码的整体介绍,应该能告诉他们你写的这个组件是做什么的,但代码工作的细节可能并不明显。为了帮助这些人理解你的代码,你应该在代码中添加注释。

语句

除了上述内容之外的代码,就是语句了。它们告诉SIMULA系统要做什么。

我们会在随后看到不同类型的语句。现在,先简单地看下这个例子中语句能做什么。

第一个是赋值语句。它告诉系统把一些数据放在我们声明的内存位置以便在代码块中使用。在这个例子中,数值3被保存在标记为Int1的整数内存位置。因为这个值的类型是合法类型。

下一个语句使用OutInt,这是一个执行语句,在所有SIMULA系统中都能使用。OutInt会把参数中的第一个数输出,参数位于语句后的小括号中。它把数字输出在一行末尾,或者叫当前创建的‘图像’。第二个参数是用来告诉系统输出第一个数字前要插入多少空格。

最后的语句使用 OutImage(下载的windows版本中未使用)。类似OutInt, OutImage也是每个SIMULA系统中都有的。这些标准语句被称为系统语句。它们并不是关键字,因为你可以在一个代码块中重新定义它们。

OutImage导致了刚刚创建的行或‘图像’输出到打印机或终端,并重新开始了一行。你注意到它没有任何参数。只有当语句需要从程序中获得信息执行任务时才需要参数。

我们对程序做了什么?

好了,现在我们有了一个所谓的合法SIMULA程序。不幸的是程序还在纸面上,尽管我们知道程序要如何执行,但SIMULA系统不可能从纸上读取它。我们要怎样让系统执行我们的程序呢?

第一当然是写程序,即是书写源代码到SIMULA系统可以读取的介质中。老机器可能需要你用纸带或卡片(什么年代的机器。。。),但现代机器能处理文本文件。这些文件被保存在硬盘或磁带中(磁带?)。你通常可以用编辑器输入源代码到系统中。你需要查阅想使用的电脑说明,尤其是SIMULA用户指南或者程序猿参考手册。

一旦你创建了机器可读版本的源代码,SIMULA系统需要使用编译器来生成一系列的机器指令,以告诉计算机SIMULA程序想做什么。这一过程被称为编译。

机器指令在不同类型的电脑上也不同。如果你想跨平台使用SIMULA程序,你必须使用第二台机器的编译器,重新执行这个编译过程。这一过程成为重编译。

一旦你编译完成,你可能需要链接电脑生成的机器指令。并非所有的机器都需要这一步。这一步完成后会产生目标文件,你的源代码变为目标代码。

链接,有时称为链接编辑,将原程序的目标代码版本和SIMULA系统提供的标准程序-运行时系统或运行时库-合并。这些库提供了可用的读写,标准数学运算;OutInt就是这样链接以后才能使用的。但链接不是必需的,这些标准语句会在运行代码时被找到。

在你的SIMULA系统手册中可以找到,如何编译(可能包括链接)代码。在线帮助文档可能给你提供一个有用的总结。如果你能向一些专家或有经验的SIMULA用户请教,那你能节省很多时间,但你还是应该仔细读一读文档,因为,并不是每个人都能用到SIMULA的各种特性。

编译和链接源代码的最终产物是你机器可以识别的指令。你现在可以“执行”包含这些指令的文件,看看你的程序能做什么。同样的你需要查阅文档看看这一步该怎么做。

注意:要编译运行你的SIMULA程序,你必须能够访问一个SIMULA系统。如果你的机器上没有,你需要买一个(ORZ),但不是每个系统都能使用的。我知道的可以运行SIMULA的支持系统已经在书后列出(…)。如果你的机器不在列表中,给SIMULA A.S.写信,他们可能帮到你。他们的地址已经列出(RBL)。英国的读者可以和我面基。

总结

每章都会以一个简单的总结结束,标明了你应当在本章中学到的内容。

在这一章,我们非正式地浏览了什么是程序和代码块。我们使用了一个仅由一个代码块组成的简单程序来说明这些概念。

我们了解了代码块就是一系列的指令,被关键字begin和end包裹。

指令或者是声明,能够储存和命名一个特殊类型被保存的位置信息,或者是语句,告诉SIMULA系统执行一个些任务。

最后,我们了解了如何在计算机里编译执行我们的程序。

{{ book.Chapter2 }}

练习

当我开始学习编程的时候,被告知了最重要的规则,“不动手学不好编程”。最简单的练习也长长能够教一个有经验的程序员一些新的东西。要避免由于有些内容依赖于下一章而错过本章的练习。这一章已经介绍了很多知识点。你可能感觉完全晕菜。不要绝望。通过在后续的章节和练习中使用这些知识,你会很快熟悉他们。我们从三个基本而重要的练习开始。

1.1 使用本章和你的SIMULA系统文档,编译并运行我们的例子。要注意编译器打印出的信息以及生成的文件。

1.2 几乎所有的编译器都允许你产生一个你程序的打印列表。大部分允许你指定列表的外观,例如是否每行由数字标记,以及是否添加标识符的交叉引用索引。试着用你的SIMULA系统上的任何可能选项产生列表。

1.3 再次练习1.1通过以下方法修改源代码:

  1. 依次去除每行
  2. 去除一个分号
  3. 增加本章展示的其他声明
  4. 交换行位置,尤其注意移动begin,end和Int1声明时的情况。 仔细注意每次运行程序时,编译器产生的不同信息。看看编译器打印出的信息是否不同。