编程语言之Pascal
2010-11-03 13:25:38 阿炯

Pascal是一个有影响的命令式和过程化编程语言,由尼古拉斯·沃斯在1968年9月设计,在1970年发行,作为一个小型的和高效的语言,意图鼓励使用结构化编程和数据结构进行良好的编程实践。笔者所学的第一门计算机语言就是pascal。称作Object Pascal的一个派生分支是为面向对象编程设计的。


Pascal基于ALGOL编程语言,为纪念法国数学家和哲学家布莱兹·帕斯卡而命名。Wirth后来开发了类似Pascal的Modula-2和Oberon。在开发Pascal之前,Wirth开发了语言Euler,然后开发了Algol-W。最初的Pascal在很大程度上但不是完全地为了教授学生结构化编程,很多代学生已使用Pascal作为本科课程的入门语言。其变种也逐渐地用于从研究项目到PC游戏和嵌入式系统的所有领域,更新的Pascal编译器存在于广泛使用它的领域。

Pascal之父,Niklaus Wirth(1934-02-15—2024-01-01)


GCC,Gnu编译器套件,最初是用Pascal的一种方言Pastel编写的(见GCC#概观)。Pascal是Apple Lisa和早期Mac开发使用的高级语言;最初Macintosh操作系统的部分是从Pascal源代码手工翻译成Motorola 68000汇编语言的。流行的排版系统TeX是由高德纳使用基于DEC PDP-10 Pascal的最初文学编程系统WEB编写的,而像Total Commander的应用是使用Delphi(即Object Pascal)编写的。

Object Pascal仍然广泛用于开发像Skype这样的Windows应用。

Free Pascal
简称 FPC(原名为 FPK Pascal)是一个 32 及 64位 Pascal 及 Object Pascal 编译器。Free Pascal 提供多种语法模式,使其相容于 Turbo Pascal、Delphi、Apple Pascal 等 Pascal 语法。Free Pascal 并支援多种处理器,包括(但不限于) Intel 80386、Motorola 680x0,以及多种操作系统,包括(但不限于) Linux、FreeBSD、NetBSD、DOS、Win32、Win64、OS/2、BeOS、SunOS(Solaris)、QNX 以及以前的 Amiga。Free Pascal 的口号是「Write Once, Compile Everywhere」(写一次代码,在各处编译)。系开源软体,用 Object Pascal 编写,遵循 GPL 许可,其开发团队于 2010 年 1 月 1 日发布了最新的稳定版本 2.4.0。目前最新的开发版本号为 2.5.x。

在 Free Pascal 之基础上,有一个名为 Lazarus 的项目,其类似 Delphi 的快速应用开发(RAD)环境。Lazarus 用 Free Pascal 编译,也使用其作为后端编译器,其结果是 Lazarus 也可在多种操作系统上运行,并且用户可以极为方便地创建跨平台图形介面应用程式。现Free Pascal已经被选定为全国青少年信息学奥林匹克联赛(NOIP)以及全国青少年信息学奥林匹克竞赛(NOI)的指定编译环境。官方Wiki页面中有相当的中文参考。

Free Pascal 特点
1.非常纯净:Pascal 是一种非常好的语言,所编写的程序将比 C 语言更易读和可维护,让人忘记 C++。不需要放弃这种能力,Pascal 就是你要想的强大语言。

2.没有 Makefile:与大多数编程语言不同 Pascal 不需要 Makefile。可以节省大量时间,编译器会自己找出那些需要重新编译的文件。

3.编译器的速度很快,非常快,Free Pascal 也不例外。是的,编译程序时不再需要长时间等待,只要点击编译,它就完成了,甚至对于大型程序也是如此。

4.每个单元都有自己的标识符:在 Pascal 中永远不用担心污染命名空间,例如在 C 中,标识符需要在整个程序中唯一。在 Pascal 中非常轻松,因为每个单元都有自己的命名空间。

5.高速,低内存使用:这是现代编译器编译成机器代码的标配。Free Pascal 已经能够使 Pascal 成为最快的语言之一。此外 Free Pascal 程序往往使用很少的内存。为了与其他语言进行比较, 建议使用 Shootout benchmark 测试,并建议根据自己的喜好修改权重。

6.整合开发环境:Free Pascal 附带了一个可在多个平台上运行的 IDE,可以编写,编译和调试程序。使用 IDE将节省大量时间,是值得拥有的最佳编程伙伴。

7.与汇编程序完美结合:还只认为 Pascal 只适合初学者编程入门吗? 错!它非常适合高科技开发,提供了集成的汇编器。可以轻松混合汇编器代码和 Pascal 代码,使用你熟悉语言?喜欢 Intel 风格的汇编器?没问题,如果需要,Free Pascal 将转换为 ATT。是否可以将程序转换为 Nasm 源文件?没问题,源文件中的所有 ATT 汇编程序都会自动转换。

8.面向对象编程:如果认真编程,会对面向对象编程非常感兴趣。根据喜好使用 Turbo Pascal 和 Object Pascal 进行面向对象编程。FCL 和 Free Vision 为你提供强大的对象库。对于数据库需求,则支持 PostgreSQL、MySQL、Interbase 和 ODBC。

9.智能链接:Free Pascal 智能链接器将排除不使用的任何变量或代码。这使得小程序变得更小,而它们仍然是静态链接,避免 DLL 地狱!

10.发行独立性(Linux):因此在 Linux 下由 Free Pascal 编译的软件可以在任何 Linux 发行版上运行,这使得你的软件支持多个 Linux 发行版变得更加容易。

11.可用于多种架构和平台:与其它大多数 Pascal 编译器相比,Free Pascal 可用于更多平台,还很容易交叉编译,只需在 IDE 中更改目标并编译即可!并且支持更多平台和处理器的工作正在进行中。

12.兼容:现有代码吗?Free Pascal 的兼容性比其它 Pascal 编译器更高。几乎完全兼容 Turbo Pascal,并且与 Delphi 源代码完全兼容。如果有其他语言的代码,比如 C 或汇编程序,只需使用喜欢的编译器,然后从 Free Pascal 调用它。

Lazarus 的组件库 Lazarus Components Library(LCL) 是独立设计的,采用了比LGPL更开放的授权,可以商用情况下静态链接,也方便了供其它语言封装调用。


简要描述
沃斯的意图是基于一个最近变得流行的概念,即所谓的结构化编程,创建一个高效(无论是编译速度还是生成代码的运行速度)。Pascal植根于Algol 60语言,但是也引进了一些概念和机制,使程序员(在Algol的标量和数组之上)能定义他们自己的复杂(结构化)数据类型,也使创建诸如lists、trees和graphs这样的动态和递归数据结构更容易。这些重要的特性包括记录、枚举、子范围、使用关联指针去动态分配变量和集合。为了使这些有可能和有意义,Pascal在所有对象上有一个强类型,意味着如果不使用显式转换,一种数据类型不能转换或解释成另外一种。类似的机制是今天许多编程语言的标准。影响Pascal开发的其它语言是COBOL、Simula 67和沃斯自己的Algol-W。Pascal像今天的许多编程语言一样(但是不像C家族的绝大多数语言),允许任意层次的嵌套过程定义,也允许过程和函数内部的绝大多数种类的定义和声明。这使得一个非常简单和一致的语法,能让一个完整的program与一个单独的procedure或function语法上近似相同(当然除了关键字本身外)。

实现
第一个Pascal编译器是在Zurich为CDC 6000系列主机计算机家族设计的。Niklaus Wirth报道,在1969年第一次使用Fortran实现的尝试没有成功,由于Fortran不足以表达复杂的数据结构。第二次尝试以Pascal语言本身来制定,并在1970年代中期实施。由于许多Pascal编译器已类似地自托管,即编译器本身是以Pascal编写的,因此在新特性加入语言或编译器移植到一个新环境时编译器通常能重编译其本身。用C编写的GNU Pascal编译器是一个显著的例外。

1992年,Welsh和Quinn在QUB,第一次将CDC Pascal编译器成功地移植到另外一个主机。目标主机是ICL1900系列。这个编译器反过来说是ICS Multum微计算机Pascal编译器的父母。以一个使用Pascal作为系统编程语言的视角,Glasgow University计算机科学系的Findlay,Cupples,Cavouras和Davis开发了Multum接口。完成于1973年夏季的Multum Pascal被认为是第一个16位实现。

一个全新的编译器由QUB的Welsh et al.在1977年完成。它提供了一个由Glasgow University的Findlay和Watt实现的源语言诊断特性(结合分析,跟踪和类型识别格式化事后转储)。该实现在1980年由Southampton University和Glasgow University的一个小组移植到ICL 2900系列。标准Pascal模式实现也基于该编译器,Manchester University的Welsh和Hay在1984年已将其改编,以严格检查与BSI 6192/ISO 7185标准的一致性,以及为可移植抽象机生成代码。

在北美洲为PDP-11编写的第一个Pascal编译器在Donald B. Gillies的University of Illinois构造,并生成了本地机器代码。Pascal在整个1970年代和1980年代大受欢迎。

为了迅速地传播该语言,一个编译器“移植工具包”在Zurich产生,包括一个为“虚拟”堆栈机(即引导本身合理有效解释的代码)生成代码的编译器,一个解释这些代码的解释器——Pascal-P系统。虽然SC(堆栈计算机)代码的主要意图是在至少一个系统上编译成真实的机器代码,著名的UCSD实现使用它创建了解释性UCSD p-System。P-系统编译器被称作P1-P4,P1是来自于Zurich的第一个版本,P4是最后一个。

P4编译器/解释器仍然可以在兼容最初Pascal的系统上运行和编译。然而,它本身只是Pascal语言的一个子集。接受全部Pascal语言和包含ISO 7185兼容性的一个P4版本创建了,称作P5编译器,它在源形式上可用。

一个为IBM System/370主机计算机产生本地二机制代码的P4编译器版本由澳大利亚原子能委员会发布;缩写该委员会的名称后,它被称作“AAEC Pascal编译器”。从1975年6月起,一个包含编译器源代码和二机制代码,以及PDP-10主机运行时库文件的P4版本可以从这里下载。

在1980年代早期,也是为IBM System 370开发的Watcom Pascal开发了。

IP Pascal是一个使用Micropolis DOS的Pascal编程语言的实现,但是被迅速地移植到运行于Z80上的CP/M。在1994年它被移植动80386类型机器上,今天作为Windows/XP和Linux实现存在。在2008年,该系统达到一个新层次,该结果语言称作 “Pascaline”(Pascal的计算器之后)。它包括对象,命名空间控制,动态数组和许多其它扩展,以及与C有相同功能和类型保护的通用特性。它仅是也兼容最初Pascal实现(作为ISO 7185的标准)的这样一个实现。

在1980年代早期,UCSD Pascal移植到Apple II和Apple III计算机,以提供一个随着机器而来的BASIC解释器的结构化替代品。

Apple Computer在1982年为Lisa Workshop创建了自己的Lisa Pascal,在1985年将该编译器移植到Apple Macintosh和MPW。在1985年,经咨询Niklaus Wirth,Larry Tesler定义了Object Pascal,这些扩展合并进Lisa Pascal和Mac Pascal编译器。

在1980年代,Anders Hejlsberg为Nascom-2编写了Blue Label Pascal编译器。为IBM PC编写的该编译器的重实现在Borland收购之前以Compas Pascal和PolyPascal的名称销售。重命名为Turbo Pascal后,它变得广受欢迎,一方面由于一个积极的定价策略,一方面由于是第一个全屏集成开发环境之一,以及快速的周转时间(只需要数秒编译,链接和运行)。另外,它用汇编语言编写,并整体高度优化,使它比许多竞争对手更小和更快。1986年Anders将Turbo Pascal移植到Macintosh,并将Apple的Object Pascal扩展合并进Turbo Pascal。这些扩展然后加回到Turbo Pascal v5.5的PC版本中。与此同时Microsoft也实现了Object Pascal编译器。Turbo Pascal 5.5给在1980年代后期开始主要关注于IBM PC的Pascal社区带来巨大影响力。许多研究BASIC结构化替代品的PC爱好者使用该产品。它也开始被专业开发人员接受。几乎同时,为了让Pascal程序员直接使用Microsoft Windows的基于C的API,许多概念从C引入。这些扩展包括空终止字符串,指针算法,函数指针,address-of运算符和非安全类型转换。

然而,Borland后来决定需要更多精细的面向对象特性,并在Delphi里使用Apple提议的Object Pascal草图标准作为基础重新开始。(该Apple草图仍然不是一个正式的标准。)Delphi编程语言的第一版相应地命名为Object Pascal。与老的OOP扩展相比较,主要的增加是基于参考对象模型,虚拟构建器和析构器,以及属性。几个其它编译器也实现了该方言。

Turbo Pascal,和其它有单元或模块概念的派生物是模块化语言。然而它不提供一个嵌套模块概念或合格的导入和导出指定符号。

Super Pascal是一个增加了非数字标签,作为类型名称的返回语句和表达式的变异。

Zurich、Karlsruhe和Wuppertal大学已开发了一个EXtension for Scientific Computing(Pascal XSC),为有控制精度的数字计算编程提供了一个自由的解决方案。

语言结构
最初形式的Pascal是一个纯粹的过程化语言,包括有诸如if,then,else,while,for等等保留字的类Algol控制结构的传统数组。然而Pascal也有许多最初Algol60不包括的数据结构工具和其它抽象概念,像类型定义、记录、指针、枚举和集合。这些结构部分从Simula67、Algol68、尼古拉斯·沃斯自己的Algol-W和C. A. R. Hoare的建议继承或获得灵感。

Hello world
Pascal程序开始于外部文件描述符作为参数的program关键字;然后跟着begin和end关键字封装的主要块。分号分区语句,完全停止终结整个程序(单元)。Pascal源代码里忽略字母大小写。这里是一个非常简单的“Hello world”程序示例的源代码: (注:请注意,在实际编程中,通常可以省略第一行的output)

Program HelloWorld(output);
begin
writeln('Hello, world!')
end.

数据类型
Pascal和几种其它流行编程语言的类型以定义变量能存储的值的范围的方式定义一个变量,也定义了一个允许在该类变量上执行的操作符集。预定义类型是:
数据类型     变量能存储的值的类型     包括的种类
integer     整数     包括shortint,byte;integer,word;longint,longword;int64,qword。其中int64和qword类型不能做循环变量。
real     浮点数     包括real;comp;single;double;extended。其中comp类型的实质是整数型。
boolean     TRUE或FALSE     只有boolean一种。
char     来自有序字符集的一个单独字符     只有char一种。

每种类型(除了boolean)允许的值的范围是定义实现的。为一些数据转换提供了函数。为了将real转换成integer,下面的舍入函数可用:使用银行家舍入(四舍五入)取整的round和roundto(非标准);分别向上和向下舍入的ceil和floor;向零舍入的trunc。注意在str和floattostr函数(非标准)中转换成十进制的输出,和write命令不使用银行家舍入。

程序员可以使用Pascal类型声明工具以预定义类型,自由地定义其它常用数据类型(例如,byte,string等等。)。 (修改者注:实际上,以上所提到的byte,string是已经定义过的) 例如:
type
byte = 0..255;
signedbyte = -128..127;
string = packed array [1..255] of char;

标量类型
Pascal的标量类型是real、integer、character、boolean和引进Pascal的新类型枚举:

var
r: Real;
i: Integer;
c: Char;
b: Boolean;
e: (apple, pear, banana, orange, lemon);

子范围类型
可以构造任意有序类型(除了real的简单类型)的子范围:
var
x: 1..10;
y: 'a'..'z';
z: pear..orange;

集合类型
与该时代的其它编程语言相反,Pascal支持集合类型:
var
set1: set of 1..10;
set2: set of 'a'..'z';
set3: set of pear..orange;

集合是现代数学的基础概念,可能在很多算法中使用。这样一个特性是非常有用的,可能比不支持集合的语言的同等结构更快。例如,对于许多Pascal编译器:
if i in [5..10] then
...

比下面代码执行更快:

if (i>4) and (i<11) then
...

从性能和可读性来说,非连续值的集合可能特别有用:
if i in [0..3, 7, 9, 12..15] then
...

对于像这些涉及小域上集合的例子,性能的提高通常是编译器将集合变量看作位掩码实现的。集合操作符然后可以作为按位机器码运算有效实现。

然而对于值范围显著大于本地字长的例子,集合表达式比使用关系运算符的同等表达式可能导致更糟的性能和更多的内存使用。

类型声明
使用类型声明,可以从其它类型定义新类型:
type
x = Integer;
y = x;
...

更进一步,复杂的类型可以从简单的类型构建:
type
a = Array [1..10] of Integer;
b = record
x: Integer;
y: Char
end;
c = File of a;

File类型
正如上面的例子所示,Pascal的文件是组件串行。每个文件有一个用f^表示的缓冲变量。过程get(读)和put(写)移动到缓冲变量的下一个元素。引进了读,使得read(f, x)与x:=f^; get(f);相同。引进了写,使得write(f, x)与f^ := x; put(f);相同。打印的文字作为字符文件预定义了。当缓冲变量能用于检查下一个字符可用(读一个整数前检查一个数字)时,这个概念导致了早期实现的交互程序的严重问题,但是后来用“lazy I/O”概念解决了。

在Jensen & Wirth的Pascal里,字符串用封装的字符数组表示;因此有固定长度和通常是空间填充。有些方言有一个自定义字符串类型。

指针类型
Pascal支持指针的使用:
type
a = ^b;
b = record
a: Integer;
b: Char;
c: a
end;
var
pointertob: a;

这里变量pointertob是数据类型记录b的一个指针。指针在声明之前可用。这是前向声明,一个使用之前必须声明的规则的例外。创建一个新记录,将值10和字符A分配给记录的域a和b,将指针c初始化为nil,命令是这样的:
new(pointertob);
pointertob^.a := 10;
pointertob^.b := 'A';
pointertob^.c := nil;
...

也可以如下面这样使用with语句来做:
new(pointertob);
with pointertob^ do
begin
a := 10;
b := 'A';
c := nil
end;
...

在with语句范围内,a和b指记录指针pointertob的子域,而不是记录b或指针类型a。

通过在记录里包含一个指针类型域(c,参见nil和null),可以创建链表、栈和队列。

与许多以指针为特性的语言不同,Pascal只允许指针引用匿名的动态创建的变量,不允许引用标准的静态或本地变量。另外,指针是类型邦定的,即字符指针与整数指针是类型不兼容的。该净效果是Pascal指针是“安全的”,远离其它指针实现固有的类型安全问题。

控制结构
Pascal是结构化编程语言,意味着控制流被结构化成标准语句,理想地没有“go to”命令。

while a b do writeln('Waiting');

if a > b then writeln('Condition met')
else writeln('Condition not met');

for i := 1 to 10 do writeln('Iteration: ', i:1);

repeat
a := a + 1
until a = 10;

case i of
0: write('zero');
1: write('one');
2: write('two')
end;

过程和函数
Pascal将程序结构化成过程和函数。

program mine(output);

var i : integer;

procedure print(var j: integer);

function next(k: integer): integer;
begin
next := k + 1
end;

begin
writeln('The total is: ', j);
j := next(j)
end;

begin
i := 1;
while i <= 10 do print(i)
end.

过程和函数可以嵌套任意深度,“program”构造是逻辑上最外层的块。

每个过程或函数可以有自己的正确顺序的goto标签、常量、类型、变量和其它过程和函数声明。 此顺序要求最初的本意是允许高效的单通编译。然而在一些方言里声明节严格的顺序要求是不必要的。分号作为语句分区符。

Pascal从ALGOL语言里吸纳了许多语言语法特性,包括使用分号作为语句分区符。这与其它诸如PL/I、C等的语言是不同的。它们使用分号作为语句终止符。正如上述例子演示的,记录类型声明、块或case语句的end关键字之前,repeat语句的until关键字之前,if语句的else关键字之前,不需要分号。
在Pascal的早期版本里,不允许存在额外的分号。然而,1973年的修订报告,后来成为ISO 7185:1983里的额外的类ALGOL空语句现在允许这些情况的绝大多数可选地使用分号。例外是仍然不允许分号立即出现在if语句的else关键字之前。

在一些情况下,真正需要空语句:
(* skip blanks *)
while GetChar() = ' ' do ;

然而,滥用可能会产生问题。虽然下面语句是语法正确的,但是结果不大可能是想要的:
if alarm then;
begin;
SendMayday;
EjectPilot;
end;


编译器和解释器

几个Pascal编译器和解释器可供一般公众使用:
* Delphi是Embarcadero(前身为Borland/CodeGear)的旗舰RAD(快速应用开发)产品。它使用继承自Pascal的Object Pascal语言(Borland称作“Delphi编程语言”)为Windows平台创建应用。从Delphi 8到Delphi 2007就存在的.NET支持已终止,被一个不完全向后兼容的语言(Prism,更名为Oxygene,参见下面)所替代。最新版本(Delphi 2010)增加了VCL开发Win7触摸屏程序支持,以及增强RTTI。

* Free Pascal是一个Pascal编写的多平台编译器(它是自托管的)。它旨在提供一个方便而强大的编译器,既能编译遗留应用又是开发新应用的手段。它在GNU GPL下发布,而包和运行时库遵守一个修改的GNU LGPL。除了Turbo Pascal、Delphi和Mac Pascal的兼容模式,它也有自己的过程和面向对象语法模式,以支持诸如操作符重载的扩展特性。它支持许多平台和操作系统。

* Lazarus是一个RAD(快速应用开发)的类Delphi的可视跨平台IDE。基于FreePascal,Lazarus可用于包括Linux、FreeBSD、Mac OS X和Microsoft Windows的无数平台。

* Dev-Pascal是一个以Borland Delphi设计的,支持Free Pascal和GNU Pascal作为后台的Pascal IDE。与它的C++兄弟相反,多年来还没见到它的重要发布。

* Oxygene(前身是Chrome)是一个.NET和Mono平台上的下一代Object Pascal编译器。它由RemObjects Software创建和销售,最近由Codegear/Embarcadero作为Prism开发和出售。它试图将Pascal的精神带到.NET,但不是很兼容其它Pascals。

* Kylix是Delphi的一个后代,支持Linux操作系统,有一个改善的对象库。其编译器和IDE现已用于非商业用途。Borland不再支持该产品。

* GNU Pascal编译器(GPC)是GNU编译器集(GCC)的Pascal编译器。编译器本身是用C编写的,运行时库绝大多数用Pascal编写。在GNU通用公共许可下自由发布,它运行在许多平台和操作系统上。它支持ANSI/ISO标准语言和部分Borland/Turbo Pascal语言支持。比较痛苦的疏漏之一是缺乏100% TP兼容的字符串类型。可能除了Mac Pascal,对Borland Delphi和其他语言版本的支持是非常有限的,不过对它们的支持在快速增长。

* Virtual Pascal是作为一个兼容Borland Pascal语法的本地OS/2编译器由Vitaly Miryanov在1995年创建的。然后,由fPrint进行商业开发,增加了Win32支持;在2000年成为了自由软件。今天它可以为Win32、 OS/2和Linux编译,主要兼容于Borland Pascal和Delphi。该编译器的开发在2005年4月4日终止了。

* P4编译器,许多后来的包括UCSD p-System的用Pascal实现的Pascal编译器的基础。它实现了完全Pascal的一个子集。

* P5编译器,是一个P4的ISO 7185(完全Pascal)适应。

* Turbo Pascal是 1980年代和1990年代早期,PC的主要Pascal编译器,由于强大的扩展和极短的编译时间而流行。Turbo Pascal是紧凑编写的,可以完全从内存编译、运行和调试,而不需要访问磁盘。那时慢速软盘驱动器对程序员来说是常见的,进一步放大了Turbo Pascal的速度优势。目前,Turbo Pascal的老版本(直到5.5)可从Borland的站点免费下载。

* Turbo51是一个8051家族单片机上的自由Pascal编译器。(使用Turbo Pascal 7语法)

* IP Pascal实现了语言“Pascaline”(后来命名为Pascal计算器),是一个兼容ISO 7185原始Pascal的高度扩展Pascal。它具有命名空间控制模块,包括并发任务模块、信号、对象、在运行时分配的任意维数组、重载、覆盖和许多其它扩展。IP Pascal有一个对Pascal语言自定义定制的内置可移植库。例如,1970年代原始Pascal的一个标准文本输出应用可以重编译以运行在一个窗口里,甚至可以添加图形结构。

* Pascal-XT由Siemens为他们的主机操作系统BS2000和SINIX创建的。

* PocketStudio是一个Pascal子集编译器和RAD工具,针对Palm OS和MC68xxx处理器,有一些自己的扩展以辅助与Palm OS API接口。它仿制Delphi和Lazarus,有一个可视表单设计器,一个对象查看器和一个源代码编辑器。

* MIDletPascal——一个生成小而快的专门设计来为手机创建软件的Java字节码的Pascal编译器和IDE。

* Vector Pascal是一个针对诸如MMX和AMD 3d Now的SIMD指令集的语言,支持所有Intel和AMD处理器,以及Sony Playstation 2 Emotion Engine。

* Morfik Pascal允许Web应用的开发全部(服务器和浏览器端)用Object Pascal编写。

* Web Pascal是一个在线IDE和Pascal编译器。

* WDSibyl——win32和OS/2的可视开发环境和Pascal编译器。

* PP编译器,直接运行在手持计算机上的Palm Os的编译器。

* CDC 6000 Pascal编译器第一个(CDC 6000)Pascal编译器的源代码。

* Pascal-S - "Pascal-S: A Subset and Its Implementation", N. Wirth in Pascal - The Language and Its Implementation, by D.W. Barron, Wiley 1979.

一个非常广泛的清单可以在Pascaland上找到。该站点在法国,但是它基本上是一个编译器的URL清单;对不讲法语者没有障碍。站点Pascal Central,Mac中心的一个有文章档案的丰富集合的Pascal信息和宣传站点,加上许多编译器和教程的链接。

标准
1983年,该语言标准化为国际标准IEC/ISO 7185,以及一些当地国家的具体标准,包括美国ANSI/IEEE770X3.97-1983和ISO 7185:1983。这2个标准的区别仅在于ISO标准包含一个conformant数组的“级别1”扩展,而ANSI不允许对原始(Wirth版本)语言扩展。1989年,对ISO 7185进行了修正(ISO 7185:1990),纠正了原始文档中找到的各种错误和模糊。

1990年,一个扩展的Pascal标准作为ISO/IEC 10206创建。1993年,ANSI组织用ISO 7185:1990标准代替了ANSI标准,有效地终结了作为一个不同标准的状态。

ISO 7185被说成是对《用户手册和报告(Jensen和Wirth)》详述的Wirth的1974年语言的澄清,但是引人注意的是增加了作为标准级别1的 “Conformant Array Parameters”,级别0是没有Conformant Array的数组。该增加是在C. A. R. Hoare的请求下,得到了Niklaus Wirth赞同。该变动的原因是Hoare想创建数学算法库(NAG)的一个Pascal版本,该库最初用FORTRAN编写,发现如果没有允许变长数组参数的扩展就无法实现该库。出于同样的考虑,ISO 7185包含了指定过程和函数参数的参数类型的工具。

注意Niklaus Wirth自己将1974年的语言当作“标准”,以将其与CDC 6000编译器的机器特定特征相区别。该语言记录在“Pascal用户手册和报告”的第二部分报告”。

在Pascal起源的大型机(主机和微计算机)上,这些标准普遍遵循。在IBM-PC上,这些标准不被遵循。在IBM-PC上,Borland标准 Turbo Pascal和Delphi有最大量的用户。因此,了解一个特别的实现符合原始Pascal语言还是Borland方言非常重要。

该语言的IBM-PC版本开始区别于UCSD Pascal,以对该语言的几个扩展以及几个遗漏和变化为特性的解释型实现。许多UCSD语言特性今天仍然存在,包含于Borland的方言。

Divisions
Pascal的Niklaus Wirth的Zurich版本在ETH之外以2个基本形式发布,CDC 6000编译器源和一个称作Pascal-P系统的移植工具。Pascal-P编译器遗漏了完全语言的几个特性。例如,作为参数使用的过程和函数、无区别变体记录、包装、处理、过程间的goto方法和完全编译器的其它特性被忽略。

Kenneth Bowles教授的UCSD Pascal是基于Pascal-P2包的,因此有几个共同的Pascal-P语言限制。UCSD Pascal后来作为Apple Pascal被接纳了,并持续有几个版本。虽然UCSD Pascal实际上扩展了Pascal-P2包的Pascal子集,通过添加回标准Pascal结构,它仍然不是一个完整的Pascal标准安装。

Borland的Turbo Pascal由Anders Hejlsberg用汇编语言独立于UCSD或Zurich编译器编写。然而,它与UCSD编译器一样接纳了许多相同子集和扩展。这可能是因为UCSD系统是适于在当时可用的资源限制的微处理器上开发应用的最常见Pascal系统。

相关标准清单
* ISO 8651-2:1988 信息处理系统——计算机图像——图像核心系统(GKS)语言邦定——第二部分:Pascal

评论:Pascal在计算社区产生了广泛的响应,包括批评和赞美。

声明:本文绝大部分源自维基百科。

补充参考来源:《Borland旗下多种开发工具再度迎来更新

Turbo Pascal 诞生 40 周年记

Turbo Pascal 在2023年11月迎来了其40岁生日。1983 年 11 月 20 日,Borland 公司发布了 Turbo Pascal 的第一个版本。该版本的编译器核心部分由 Anders Hejlsberg 授权给 Borland 公司。


Anders Hejlsberg 为 MS-DOS 和 CP/M 设计了 Pascal 编译器,Borland 买下该编译器并改称 Turbo Pascal,之后他本人也加入了 Borland 公司,并且是后来所有 Turbo Pascal 版本与 Delphi 前 3 个版本的架构师。再后来他被比尔・盖茨下重本挖到了微软,先后创造了 Visual J++、.NET、C# 和 TypeScript。关于安德斯海尔斯伯格(Anders Hejlsberg)的更多介绍可参考本站的《程序开发界名人一览》第11小节。


说回 Turbo Pascal,它作为一种结构化编程语言对计算机编程产生了重大影响,并成为了许多程序员的入门语言。其设计目标是提供一种易于学习和使用的编程语言,同时具有高效的编译器和强大的功能。它采用了 Pascal 语言的语法和结构,但在性能和功能上进行了优化和扩展。Turbo Pascal 的编译器非常快速,可以在几秒钟内将源代码编译成可执行文件。这使得程序员能够快速地进行开发和调试。在教育领域也非常受欢迎。许多学校和大学使用它作为计算机科学课程的教学工具。它的简单易学的语法和清晰的结构使得初学者能够快速上手,并理解编程的基本概念。

Pascal 之父 Niklaus Wirth 逝世

Eiffel 编程语言发明者 Bertrand Meyer 在社交媒体公布了 Niklaus Wirth 于 2024年1月1日去世的消息(1934 年 2 月 15 日 —2024 年 1 月 1 日,享年 90 岁)。

Niklaus Wirth 是致力于编程语言研究的计算机科学家,被称为 Pascal 之父。此外他也是多门编程语言的主设计师:Algol W、Modula、Pascal、Modula-2、Oberon

他的主要经历:
1934 年 2 月 15 日,尼古拉斯・沃斯出生于瑞士温特图尔。
1959 年,获得瑞士联邦理工学院电气工程学士学位。
1960 年,获得加拿大拉瓦尔大学理学硕士学位。
1963 年,获得加州大学伯克利分校计算机科学博士学位。
1963 年 —1967 年,担任斯坦福大学计算机科学助理教授。
1967 年 —1968 年,担任苏黎世大学助理教授。
1968 年 —1999 年,担任苏黎世联邦理工学院信息学教授。
1984 年,获得图灵奖。
1992 年,当选为瑞士工程院院士。
1994 年,当选为美国国家工程院外籍院士。
1999 年 4 月,退休。
2004 年,当选为美国计算机历史博物馆 fellow。

在此期间,他曾两次休假一年,前往施乐 PARC 工作。沃思在编程语言和算法方面的开创性工作使他广为人知。由于这些成就,他于 1984 年获得 ACM 图灵奖,1994 年入选 ACM 研究员,2004 年成为计算机历史博物馆研究员。他还担任过许多编程语言的总设计师,其中包括欧拉(Euler,1965 年)、PL360(1966 年)、ALGOL W(1968 年)、Pascal(1970 年)、Modula(1975 年)、Modula-2(1978 年)、Oberon(1987 年)、Oberon-2(1991 年)和 Oberon-07 (2007 年)。

在这些语言中,最著名和最常用的当属 Pascal,它一直是计算机科学入门课程的主要教学语言,直到 20 世纪 90 年代 Java 和后来的 Python 开始取而代之。Pascal 也是一种重要的商业编程语言,由 Borland 的 Turbo Pascal 推广开来,并在 Anders Hejslberg 的领导下发展成为 Object Pascal 和 Delphi。Delphi 在早期的 Windows 16 位和 32 位软件开发中取得了巨大成功,直接与微软 Visual BASIC 竞争。后来,Hejslberg 受雇于微软,创建了 C# 编程语言,同时也是 TypeScript 的首席架构师。

Niklaus Wirth 的文章《Program Development by Stepwise Refinement》被视为软件工程中的经典之作。他的著作《Algorithms + Data Structures = Programs》(算法 + 数据结构 = 程序)是计算机科学的名句。他于 1995 年提出了一条幽默定律:软件变慢的速度永远快过硬件变快的速度。后人称其为维尔特定律(Wirth's law)。

在沃思令人印象深刻的开创性重大成就和活动的支持下,世界各地有许许多多的人不断为技术做出贡献,沃思非常重视算法和数据结构作为优秀计算机软件基础的重要性。事实上,他 1975 年出版的书名为《算法 + 数据结构 = 程序》,几十年来一直是许多人的灵感来源。沃思曾开玩笑说,他自己的名字是一个计算机科学的双关语;你可以用引用("Wirth")或价值("Worth")来称呼他。关于 Niklaus Wirth 名字也有一则有趣的双关语轶闻。他的姓氏正确发音类似于「Virt」,欧洲人通常都能将他的名字读得正确,但在美国每个人都用「Worth」来称呼他。因此 Niklaus Wirth 打趣称,在欧洲我是传名调用 (Call by Name),在美国则是传值调用 (Call by Value)。(“传值调用” 英文双关 “按照价值称呼”,而 “Nickel's Worth” 中文意为 “价值一分钱”)

Pascal 之父、图灵奖得主 Niklaus Wirth 生平简介

出品 | CSDN

2024年1月4日,Eiffel 编程语言的创造者 Bertrand Meyer 在 Twitter 上发布了一则讣告,“我们是失去了一位编程语言、编程方法、软件工程和硬件设计领域的巨星。Niklaus Wirth 于 1 月 1 日去世。我们对这位先驱、同事、导师和朋友的离去深感哀痛。”

Niklaus Wirth,这位被很多人尊称为编程祖师爷的人物,先后开发了 Euler、Algol-W、Pascal、Modula、Modula-2、Oberon、Oberon-2 和 Oberon-07 多款具有创新性的语言。其中,最让人熟知、也是很多程序员入门语言的 Pascal,不仅具有重要教学意义,而且为未来的计算机语言、系统和体系结构研究提供了基础。

与此同时,Niklaus Wirth 对计算机语言和软件开发有着清晰而深思熟虑的观点,他在 1976 年提出来的「算法+数据结构=程序」的结构化公式直至现在也在影响无数应用。

1、生平经历:凭借 Euler、Algol-W 在计算机领域崭露头角

回顾一代巨擘的成长经历,从小在瑞士长大的 Niklaus Wirth,大部分生涯是在苏黎世的瑞士联邦理工学院 (ETH) 度过的。

1959 年,Niklaus Wirth 在苏黎世的瑞士联邦理工学院获得学士学位后,前往加拿大拉瓦尔大学攻读研究生,并在 1960 年取得硕士学位。而后他继续进入加州大学伯克利分校深造,于 1963 年获得博士学位。

在整个学生生涯中,从小便具有极强动手能力的 Niklaus Wirth 一直没闲着,也做了很多计算机科学的研究工作。时至 1960 年,Wirth 正在撰写博士论文时,一篇《算法语言 Algol 60 报告》(https://dl.acm.org/doi/10.1145/367236.367262)横空出世,吸引了不少学者的关注。

Algol 60 是最早实现函数定义(可以递归调用)的语言之一,其函数定义可以相互嵌套,具有词法作用域。在很多人看来,Algol 60 是业界第一个清晰定义的语言。不过在当时那个环境下,也有一些学者认识到,清晰的规格说明对于可靠而有效的实现是必需的,但还不够。还有人从报告中发现了一些不足。

后来 Wirth 在和 Algol 的主要设计者 Andrian van Wijngaarden 多次交流之后,决定对 Algol 60 做进一步优化,并以此为自己的博士论文课题,后来就诞生了一款通用编程语言 Euler。

正是有了上述经历,斯坦福大学看中了 Wirth,这也是为什么随着博士毕业,Niklaus Wirth 直接进入斯坦福大学担任计算机科学助理教授的原因。

除此之外,这一次的尝试也得到了 Algol 项目组的青睐,随后也加入了 Algol 语言完善与扩充的工作小组工作。

1966 年,Wirth 向小组提交了一份提案,该提案要求下一代 Algol 是受到他自己的语言 Euler 影响的 Algol 60 的扩展和改进版。遗憾的是,Algol 委员会反对这项提案,并采用一个更复杂、更先进的设计,而不是 Wirth 所提出经过简化的 Algol 60。当然,让 Algol 委员会没想到的是,其后来推出更复杂的 Algol 68 版本与Algol 60 存在很大不同,因此也遭到了业界不少的批评。

与之形成对比,选择与 Tony Hoare(1980 年图灵奖得主)合作,将被拒绝的提案转变为新的非官方 Algol 版本——Algol-W,它在斯坦福大学的第一台 IBM 360 上成功实现并正式应用。

值得一提的是,IBM 360 当时只提供汇编语言和 FORTRAN 语言,但 Wirth 和他的学生都觉得这两者并不适宜于作为设计编译器的工具。后来 Wirth 和他的学生开发了一款新的系统编程语言 PL360,用于 IBM System/360 系列计算机。而 Wirth 也在 1968 年选择从 Algol 小组辞职。

Wirth 的这项早期工作在语法和语义的正式分离、新颖的实现技术以及通过特定解析方法进行高效实现的精细语言设计方面开辟了新天地。

2、Pascal 之父

Wirth 使用 Algol-W 作为他最具影响力的创造语言 Pascal 的基础。

1970 年,Wirth 设计了 Pascal,最初的目的是作为一种教学工具,以推广另一位领先的计算先驱 Edsger W. Dijkstra 的结构化编程风格,但它很快就超越了其最初的设想范围,成为一种通用语言。

Wirth 曾在接受外媒采访时说道,“只要程序员们珍惜他们的自由,不仅可以设计出自己聪明的软件,而且还可以按照自己的喜好修改已被采用的软件,那么就不可能有适当的设计纪律。只要公司暗中珍视复杂性,将其作为防止被抄袭的有效保护措施,那么大幅提高技术水平的希望就渺茫。”

所以,简单性是 Wirth 一直遵循的原则。Pascal 就是遵循他的个人审美、简单、灵活等准则的产物,旨在快速编译为高效代码。它保留了 Algol 的代码结构、逻辑完整性和对递归的支持,但剥离了一些复杂性并增加了对用户定义数据类型的支持。

Pascal 于 1971 年在 ETH 中被采用用于教学,并很快就得到了大学的认可。

为了帮助在各种计算机上实现 Pascal,Wirth 创建了一种新型编译器,该编译器是为虚拟机编写的,并生成在虚拟机上运行的代码。在新计算机上模拟这个虚拟机可以轻松移植他的编译器。

可要说 Pascal 之所以会成为一门通用语言,Wirth 表示,“位于圣克鲁斯的 Borland Inc. 的 Philippe Kahn 为我们的编译器提供了一个简单的操作系统、一个文本编辑器以及用于错误发现和诊断的程序。他们以 50 美元的价格出售这个软盘包 (Turbo Pascal)。因此 Pascal 立即传播开来,尤其是在学校,它成为许多人进入编程和计算机科学的切入点。”


Borland Turbo Pascal 的第一个历史性广告

3、Modula 之父

20 世纪 70 年代中期,为适应并发程序设计的需要,Wirth 又成功开发了一个获得广泛应用的语言 Modula。

Modula 除了提供并发程序设计功能之外,另外一个重要特征是引进了模块概念(这也是这个语言叫做Modula的原因)。此外,它还引进了“进程”(process)这一和并发程序相联系而产生的重要概念。但比 Modula 具有更加重大意义的却是它的第二个版本 Modula-2。

彼时 Wirth 在 1976 年至 1977 年期间于施乐帕洛阿尔托研究中心 (PARC) 度过了一个假期,期间接触到了新的工作站技术,即在 ETH 领导一个项目,旨在构建一个新的图形工作站。它被命名为 Lilith,是一个完整的计算环境,具有操作系统 (Medos)、高速局域网、文本和图形编辑器以及激光打印机等应用程序。


Wirth 开发新的编程语言 Modula-2 扩展了 Pascal,支持并发性和更高的代码模块化性。在 Wirth 指导下,一款由 Modula-2 模块构建的单用户、面向对象的操作系统的 Medos-2 诞生了。

第一批 Lilith 系统便是搭载了上述的系统,并于 1980 年开始运行,使这些功能在商业产品出现之前就已成为 ETH(以及其他几所大学)的标准。

几年后,Wirth 又领导了 Lilith 的后续版本 Ceres 工作站的开发,以及其操作系统以及新的面向对象的 Oberon 编程语言和操作系统的开发。

从 20 世纪 80 年代中期到 20 世纪 90 年代,ETH 曾多次使用这些标准。Modula-2 和 Oberon 被转移到商业机器上并用于计算机科学教学应用,尽管两者都没有 Pascal 的广泛影响。

Oberon 是为完全不同的机器实现的,实现了后来因 Java 而闻名的程序可移植性。

4、硬件设计的重要参与者

和很多计算机科学家有所不同,Niklaus Wirth 在进行软件开发时,同样意识到硬件的重要性与挑战性。

在后来很长一段时间里,Wirth 将自己的精力分一半聚焦到硬件维度,他还利用 FPGA 开发了语言和工具来根据高级规范,对其进行有效配置。

不仅如此,他也将自己毕生所学倾囊相授,推动 ETH 大学内部所有计算机科学专业的学生和教师使用内部生产的硬件、操作系统和编程工具。在 Wirth 看来,学生在尝试编写自己的系统之前应该阅读并理解真实系统的代码。

1984 年,因为开发了这些语言带来了极大的影响力,Wirth 荣获了图灵奖。此外,他也是集诸多奖项于一身,如 IEEE 计算机协会计算机先驱奖(1988 年);1988 年 IBM 欧洲科技奖(1989 年);瑞士工程院院士(1992 年);美国工程院外籍院士(1994 年);Orden Pour le merite(1996 年);ACM SIGSOFT 软件工程杰出研究奖(1999 年)。

5、出版物

除此之外,Wirth 一直也对编程方法有着很深的研究。早些时候,他参加了 IFIP 编程方法论工作组,提出了逐步细化代码的想法,作为对他们提出的“结构化编程”各种愿景的补充。


他出版的书《系统编程》和《算法 + 数据结构 = 程序》 是对编程方法和概念文献最有影响力的贡献之一。

6、向 Niklaus Wirth 致敬

Niklaus Wirth 不仅是一位优秀的图灵奖得主,更是让很多程序员感到十分亲切的良师与挚友。正如 tasty_freeze 留言道:除了对语言设计的贡献,他还创作了有史以来最好的双关语之一。他的姓氏正确的发音是“Virt”,但在美国,大家都叫他“Worth”。

一代巨星Niklaus Wirth陨落,让很多人感到难过。

Google AI 首席科学家 Jeff Dean 表示:听到很伤心。Niklaus Wirth 对计算领域做出了许多巨大的贡献。Pascal 是我认真使用的第一种语言(最初在 UCSD p-System 上,后来通过 Turbo Pascal),我在中学时接触到了他写的这本伟大的书。后来,我喜欢使用 Modula-2 来做一些事情(他对 Modula-3 的间接影响很大)。

当被问到如何发音他的名字时,我也喜欢这个轶事:“欧洲人通常以正确的方式发音我的名字(‘Ni-klows Wirt’),而美国人总是把它改成‘Nick-les Worth’。这就是说,欧洲人用名字来称呼我,而美国人则用价值来称呼我。

lukego 表示:除了数不胜数的成就之外,他还是 Joe Armstrong 心目中的英雄,并对他的简约品牌产生了重大影响。

Joe 经常引用 Wirth 的话说,是的,重叠窗口可能比平铺窗口更好,但好的不足以证明其实施复杂性的代价是值得的。

他是我心目中的英雄,因为在他于 ETH 举办的 80 岁生日研讨会上,他展示了他将 Oberon 移植到自制 CPU 上的新成果,该 CPU 可在带有 USB peropherals 的随机 FPGA 开发板上运行。我的理想就是有一天也能成为这样的 80 岁老人。

斯人已逝,其光永存。R.I.P