荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Minatl (Minatl), 信区: Program
标  题: 新一代32位Delphi编译器
发信站: BBS 荔园晨风站 (Wed Jan 20 19:02:51 1999), 转信




--------------------------------------------------------------------------------

1996年 .第47期 .软件编程版


--------------------------------------------------------------------------------

新一代32位Delphi编译器
自从1995年2月份推出以来,Borland公司的Delphi和Delphi客户机/服务器开发工具在高 性
能的快速应用程序开发领域已经成为新的标准。由于Borland公司32位Delphi编译器采用 了
独特的本机代码(native code)编译器、可视工具、可扩展的数据库技术,已获得了众多的
世界级大奖,并成为最畅销的十大软件之一。同时,Borland公司也赢得了相当数量的第三方
 厂商的支持。现在,第三方厂商已经开发出几十种程序库和兼容工具,有关Delphi的技术参
考 书已有30多种,杂志六种,以及众多的Delphi技术培训机构也应运而生。

现在,Borland正在开发第二代的32位Delphi开发环境,已进入beta测试。新的32位版本 将引
入若干新的技术,以进一步提高开发人员的开发效率和应用软件的性能。新版的Delphi 采用
了新的32位本机代码优化技术,极大地提高了应用程序的性能。新版的Delphi还包括一
个新的32位配有可扩展查询引擎的高性能的Borland Database Engine。

本文的重点是新版的Delphi的特色和32位本机代码优化带来的好处。新版的Delphi为了 充
分利用Windows 95和Windows NT提供的功能,在许多方面做了改进工作。新版的Delphi完 全
支持Windows 95用户界面,包括许多新的界面构件,支持全部的Windows 95的API,包括多线
程、MAPI,支持OLE控件(OCX)。这些功能都将极大地方便Windows 95下的开发人员和提高应
 用程序的性能。

新版的32位Delphi的目标是:

通过新的32位优化编译器进一步提高性能;通过新的32位Borland Database En-gine 进一步
提高客户机/服务器应用程序的可扩展性和性能;支持OLE控件(OCX)和OLE automatio n,提高
对象的重用功能;全面支持Windows 95界面和API;全面支持32位应用程序的开发和Wi ndows
95及Windows
NT的部署;和已有的Delphi应用程序完全兼容。

32位编译器优化
由于采用了一系列新代的码优化技术,新版的32位本机代码编译器的性能得到大幅度提 高。
过去,优化编译器需要和复杂的原编译器进行交互操作才能提高性能,并且还要对代码实 施
额外的"pass",这显然降低了编译器的速度,妨碍快速的应用程序开发。新版的32位Delph
i采用了许多新的技术,在优化时不需要猜测,直接生成高性能代码。此外,新版的32位Delph
i编译器仍然是世界上最快的本机代码编译器,在奔腾机器上每秒编译350,000行程序。结果
,开发人员不仅提高了开发效率,同时改进了应用程序的性能。

新版的32位编译器采用了一系列的自动优化技术,包括寄存器优化、消除过度栈调用、 共用
子表达式消除、循环引入变量等。所有这些优化不仅保证执行的正确性,并且不改变源 代码
的语义。

新版的32位编译器的优化选项可以关闭,以用于基准测试的比较。新版的32位编译器可 以生
成"Pentium-safe FDIV"代码,保证了Delphi应用程序的浮点运算即使在有错误的奔腾芯 片
也可以正确运行。

寄存器优化
经常使用的变量和参数将会被自动放在CPU的寄存器中,这样便减少了访问该变量而必须 执
行的指令的数目。由于程序不再从内存中读取变量放入寄存器中,不仅是代码紧凑,而且提
高了执行速度。这种优化是由编译器自动完成的,开发人员无需指定把哪一个变量或参数放
在寄存器中。编译器会自动分析变量的生命周期,进行寄存器优化。例如:如果变量I和J分别
 仅用在独立的程序段中,编译器会把I和J放在同一个寄存器。

消除过度栈调用
在尽可能的情况下,传给函数和过程的参数最好放在CPU的寄存器中。这样一方面可以减 少
对内存的访问,另一方面减少了栈空间为零时存储变量和栈空间的管理,提高了执行速度, 降
低了内存开销。

共用子表达式消除
在编译器翻译复杂的数据表达式时,会自动找出相同的子表达式,以防止运算多次。这样 一
来,开发人员可以自由地、清晰地书写他们的数据表达式而无需考虑优化,把这一工作留给
编译器。

循环引入变量
编译器会自动使用循环引入变量来加速对数组或字符串的访问。如果一个变量仅用来索 引
一个数组,例如在一个for循环中,编译器会自动引入一个变量,以指针的方式来访问数组。
如果变量的尺寸是1,4或8,Intel的基数索引(scale indexing)会进一步提高性能。

新的优化连接器
作为编译过程的一个部分,Delphi使用一种新的32位连接技术。这种新的32位连接技术 也将
提供若干优化,提高代码运行效率。因为新的智能连接器将消除无用的函数和过程,以及 无
用的静态和虚方法,这样,Delphi应用程序不仅代码紧凑,而且执行速度快。通过消除虚方
法,应用程序的对象束定速度更快,因为不必要的代码已被自动删除。新的连接器由于采用了
 单元缓冲的方法,连接速度提高了20%到50%。这意味着第一次编译后,程序未发生改变的部
分 可以直接从内存读,而不是从硬盘。

连接器还采用了一种所谓的智能版本检查技术,尽量避免重新编译,从而加快编译速度。 例
如,一个库单元的一个函数被四个不同表使用,一旦这个函数发生变化,这四个表都要重新 编
译,因为编译后的代码存储在硬盘上,符号表发生变化,整个代码必须重新编译。而现在采
用了智能编译和内置版本检查,在DCU文件中的被编译的代码采用更安全和灵活的格式,只有
 那些被修改的函数才被重新编译。这给第三方的厂商也带来好处,他们的函数库在新版的
De lphi发表后,也不需要重新编译。

此外,新版的32位Delphi支持OBJ文件格式,这便允许在Delphi和C/C++之间方便地共享代 码
,以及创建和共享DLL。由于市场上有大量的商业函数库,这一功能使Delphi可以充分利用 它
们。

增强的32位功能
新的32位本机代码编译器运行在32位"平板"地址空间,完全消除了16位分割的段地址空 间带
来的限制。对程序员来说,这意味着无需求助于Windows API,便可充分利用机器的内存 空间
。例如,程序员可以自由地声明大尺寸的数据结构,在Windows 95下甚至可以创建一个1
G的数组。而以前用16位时,数据结构不可能超过64K的限制。

新的32位数据类型
新的32位本机代码编译器引入了几个新的数据类型,以充分利用32位的大地址空间,但又 不
丧失对16位代码控制。新的数据类型包括:长字符串,仅受制于操作系统内存;宽字符,双字
节字符;变体,为数据库访问和OLE automation提供运行时刻的变量类型改变的机制。

改进的编译器错误消息和诊断
对于一个本机代码编译器,人们常常忽视的一个优点是,它可以在程序执行前,向程序员 提供
完全的程序检查。编译器通常可以不通过解释器发现由于错误代码导致的逻辑错误。因 为
Object Pascal语言是一种强类型的语言,它可以防止程序员在类型转换方面的错误。新的
32位编译器还有一个"mutil-error"体系,在发现错误之后,可以继续编译以发现更多的错误
 。这对大程序的开发非常有利。

新的32位编译器改进了错误消息和诊断,方便了程序员查错,防止了许多错误的发生,包 括:
使用没有初始化的变量和指针;无用的变量;无用的函数返回值;空循环;类型不匹配。

在语法错误方面,编译器也提供了更好的诊断信息,这对于刚学习Object Pascal的程序 员非
常有价值。编译器提供的诊断信息不仅是在哪一行出现错误,而且有对错误的解释。诊 断信
息包括一般性的语法错误,例如:忘记了分号;在ELSE语句前加了分号等。

本机代码编译器的优点
一般的4GL系统生成C代码,然后用C编译器进行编译。而Delphi直接生成优化后的本机代 码
,这使得Delphi开发速度快,生成代码执行效率高。它比两阶段代码生成方法的优越之处在
于:快速反复,Delphi采用了世界上最快的本机代码编译器,提高了开发效率,鼓励快速应用程

序开发RAD(Rapid Application Development);易于测试,在开发环境中开发的代码和实际运
 行的代码完全一样,开发人员无需担心解释器和编译后执行的代码效果不一样;高层调试,由
 于程序员写的代码直接编译成机器代码,调试器允许在源代码级上调试,而不是在系统生成

C代码上进行调试;维护简单,开发人员仅在Object Pas-cal层维护代码,而不是在4GL和C两个
 层次上进行维护。

P-code系统和代码生成器在历史上曾发挥过作用,例如:早期在Apple II上运行的语言采 用
了UCSD P-code系统。但是由于的它的执行效率低,现在许多开发人员不再愿意采用这样的
代码。

同样,以前许多C++版本都是先生成C代码,然后借助C编译器编译成可执行代码,但是,这 样做
的缺点是编译速度慢,难以调试。所以,现在大多数C++编译器均直接生成本机代码。

和16位兼容
32位的Delphi和16位代码完全兼容。16位代码程序转变成32位代码程序必须重新编译 ,但是
,要作改写的程序非常少。在大多数情况下,开发人员仅需把16位代码程序装入开发环 境,重
新编译就行了。Delphi会自动处理Windows消息类型的改变,而控制代码却不需要修改
。需要改变的是那些依赖于物理表示的代码,包括:16位嵌入汇编;在Win32中改变的Windows
API;依赖于整数物理大小的记录和子程序。

在32位的Delphi中,整数类型的大小为4个字节,而不是16位中的2个字节。为了保持兼容 ,
Delphi提供了一个新的类型SmallInt。

新的32位的Delphi还提供了单位别名(unit aliasing)机制,可以为同一个单位起多个名 字
。这将有助于动态地修改一个单位,而充分利用32位的优势。例如,在16位的Delphi中有两
个分开的单位:WinTypes和WinProcs。在32位版本中,这两个单位可以联合成一个单位。为了

保证兼容性,单位别名被引入,使得老的代码无需修改。

用新的32位的Delphi开发的应用程序,如果没有利用32位的功能可以在16位下编译,运行 在
Windows 3.1上。如果采用了32位的功能,例如:Windows 95界面,Win32 API函数等,则必需
修改后才能编译成16位代码。

结论
新的32位的Delphi是一个崭新的产品,它建立在高性能的优化编译器之上,充分挖掘了W
indows 95/NT的32位功能。由于采用了编译优化,连接优化,新的32位数据类型,它明显胜过
P-code解释系统。此外,32位的Delphi拥有众多的封装了Windows 95界面的构件,完全支持3
2位OLE控件(OCX)和OLE automation,以及强大的Borland Database Engine。(韦编译)

本版责任编辑 刘晓龙


--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.240]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店