level 1
来自 en%2Ewikipedia%2Eorg/wiki/Comparison_of_Pascal_and_Delphi
2017年01月31日 18点01分
1
level 1
Pascal 是 Niklaus Wirth 在 1960 年代后期和 1970 年代前期发明的程序语言。Embarcadero Delphi 是最初由 Borland 软件公司生产的 IDE、标准库集以及基于 Pascal 的语言的集合。Delphi 所用的语言通称 Object Pascal 、Delphi Pascal 或简单的“Delphi”(Embarcadero 的当前文档指代之为“Delphi 语言(Object Pascal)”)。从首次发布起,该语言就是最流行的商业 Pascal 实现。
在发明 Pascal 时,Wirth 使用了自举过程,即每个新版本的 Pascal 编译器都是以其前任写就和编译的。从而,“P2”编译器以“P1”的可编译方言写就,“P3”进而以“P2”写就,以此类推,一路直到“P5”。“P5”编译器以 Wirth 所定义的最终状态实现了 Pascal ,继而该版本被标准化为“ISO 7185 Pascal”。
Borland 方言,类似之前流行的 UCSD Pascal ,以语言的“P4”版本为其基础,而非 Wirth 的最终版本。在多次独立于标准 Pascal 的进化后,Borland 方言成为了 Delphi 的基础。此页面查看 Delphi 与标准 Pascal 的差异。此页面不介绍 Delphi 限定的,为数众多并且仍在增加的语言扩展。
2017年01月31日 18点01分
3
level 1
标准 Pascal 与 Delphi 间的差异
1. 过程和函数能作为参数传递的方式有别:Delphi 要求声明显示的过程型类型,而标准 Pascal 不需要。
2. Delphi 不支持“过程外 goto”,这是指 goto 语句可以引用在当前过程/函数体外的目标。
3. 标准 Pascal 拥有“缓冲区变量”,以及操作它们的“get”和“put”标准过程。Delphi 不支持任何一项。
4. 给定标准 Pascal 的变体记录,可以指定具体的变体大小【注:原文为 size,这里应该是 tag】。Delphi 不支持有大小这种形式的“带大小”动态内存分配:
new(p, t) // 其中 t 是变体记录的类型标签;无法在 Delphi 中编译
5. 函数“pack”和“unpack”在 Delphi 中未实现。【注:Free Pascal 有实现】
6. Delphi 编译器不像标准 Pascal 所要求一样把 { 与 (* 、 } 与 *) 当做同意语。换言之,
{ comment *)
在 Delphi 中非法。Delphi 使用了允许不同注释类型以指示嵌套注释的方案以替代。
7. Delphi 不将换行符(EoLn)替换成空格,这为 Pascal 标注所要求。在读过行尾时,换行符在 ISO 7185 中假定被替换成空格。而在 Delphi 中读过 EoLn 给出回车的字符码(13),后随换行(10)。【注:即 Windows 的换行符
#13#
10 ,或称 \r\n】
8. Delphi 版本的 Write 和 WriteLn 标准过程不将数字和布尔值以其“默认”域宽打印,而是以最小空位打印。例如,Delphi 中,
write(5);
write(55);
等价于:
write(5:1);
write(55:2);
但是标准 Pascal 要求它等价于下者(TotalWidth 是实现定义的):
write(5:TotalWidth);
write(55:TotalWidth);
同样的,对于布尔值,Delphi中
write(false);
write(true);
等价于
write('false':5);
write('true':4); // 【注:应该是全大写,原文可能有误】
但在 ISO 7185 中为
write('false':TotalWidth);
write('true':TotalWidth); // 【注:大小写是实现定义的】
9. Delphi 使用的传统 Pascal I/O 不支持临时文件——执行 Reset() 或 Rewrite() 导致错误【注:无参数】,而标准 Pascal 下它会打开在程序执行期间存在的临时文件,并在之后自动删除。
10. 尽管 Delphi 仍然允许使用大量传统 Pascal RTL,Delphi 限定的库函数广泛地以通常的 Delphi 代码实现,它们倾向使用而非添加到编译器提供的内建子程序。这种哲学与标准 Pascal 对立,其 RTL 必须由编译器提供。例如,标准 Pascal 中,“file”是内建类型——一种类似 record 的,却是与 record 并行的编译器定义类型。与之相反,Delphi 中的 TFileStream 类是以通常 Delphi 代码书写的。类似地 Read、 ReadLn、 Write 及 WriteLn 标准过程拥有的签名自身并非合法的 Pascal 签名。尽管 Delphi 仍然实现它们,但 Delphi 限定的 RTL 只在非常少见的情况下要求类似的特殊处理:语言宁可引入包含类似“开放数组”、默认参数及过程重载,这些可由用户书写的程序所用的特征。
2017年01月31日 19点01分
5