什么是Delphi DCU文件

What is a Delphi DCU file?

本文关键字:文件 DCU Delphi 什么      更新时间:2023-10-16

什么是Delphi DCU文件?

我相信它代表"Delphi编译单元"。假设它包含目标代码,因此对应于一个"。o"文件编译从C/c++源代码文件?

我相信。dcu通常意味着"Delphi编译单元",而不是。pas文件,它只是"Pascal源代码"。

.dcu文件是DCC编译器在编译.pas文件后生成的文件。DFM文件被转换成二进制资源,然后由链接器直接处理)。

它类似于其他编译器生成的。o和。obj文件,但包含更多关于符号的信息(因此您可以从中反向工程单元的接口部分,省略注释和编译器指令)。

.dcu文件从技术上讲不是一个"缓存"文件,尽管如果不删除它们,构建将运行得更快,并且不需要重新编译它们。.dcu文件绑定到生成它的编译器版本。从这个意义上说,它的可移植性不如。o或。obj文件(尽管它们也有各自的兼容性问题)

这里有一些历史记录,以防它添加任何内容。

编译器传统上将源代码语言翻译成某种中间形式。解释器不这样做——它们只是直接解释语言并立即运行应用程序。BASIC是解释性语言的典型例子。DOS和Windows中的"命令行"有一种语言,可以写在名为"批处理文件"的文件中,扩展名为。bat。但是在命令行上输入东西会直接执行它们。在*nix环境中,有许多不同的命令行解释器(cli),如sh、csh、bash、ksh等。您可以从所有这些语言中创建批处理文件——这通常被称为"脚本语言"。但是现在有很多其他的语言既是解释的又是编译的。

无论如何,Java和。net,例如,编译成所谓的中间"字节码"表示。

Pascal最初是作为单遍编译器编写的,而Turbo Pascal(起源于PolyPascal) -具有不同版本的CP/M, CP/M-86和DOS -直接生成在这些操作系统下运行的二进制可执行文件(COM)。

Pascal最初被设计为一种小型、高效的语言,旨在鼓励使用结构化编程和数据结构的良好编程实践;Turbo Pascal 1最初是作为一个内置快速编译器的IDE设计的,是DOS和CP/M市场上一个价格合理的竞争对手,反对当时漫长的编辑/编译/链接周期。Turbo Pascal和Pascal与当时的任何编程环境都有类似的限制:内存和磁盘空间以千字节为单位测量,处理器速度以兆赫兹为单位。

链接到可执行二进制文件阻止链接到单独编译的单元和库。

在Turbo Pascal之前,有UCSD p- system操作系统(支持多种语言,包括Pascal)。UCSD Pascal编译器当时已经扩展了Pascal语言的单元,它被编译成一种伪机器字节码(称为p码)格式,允许将多个单元连接在一起。虽然速度很慢,

与此同时,c语言在VAX和Unix环境中进化,它被编译成。o文件,意思是"目标代码"而不是"源代码"。注意:这与我们今天所说的"对象"完全无关。

Turbo Pascal直到并包括版本3直接生成。com二进制输出文件(尽管您可以使用修改这些覆盖文件),并且作为版本4支持将代码分成单元,这些单元首先编译成。tpu文件,然后链接到最终的可执行二进制文件中。Turbo C编译器生成。obj(目标代码)文件而不是字节码,Delphi 2引入。obj文件生成是为了与c++ Builder协作。

目标文件在每个单元中使用相对寻址,并且需要在后面进行所谓的"修复"(或重新定位)以使它们运行。修复指向的符号标签应该存在于其他目标文件或库中。

有两种"修复":一种是由一个叫做"链接器"的工具静态地完成的。链接器获取一堆目标文件,并将它们拼接成类似于拼接被子的东西。然后,它通过插入指向所有外部定义标签的指针来"修复"所有的相对引用。

第二次修复是在程序加载运行时动态完成的。它们是由一种叫做"装载机"的东西完成的,但你从来没有见过它。当您在命令行上键入命令时,将调用加载器将EXE文件加载到内存中,根据加载文件的位置修复剩余的链接,然后将控制权转移到应用程序的入口点。

所以,当Borland在Turbo Pascal中引入单元时,。dcu文件起源于。tpu文件,然后随着Delphi的引入改变了扩展名。它们与。obj文件非常不同,尽管你可以从Turbo Pascal和Delphi中链接到。obj文件。

Delphi也完全隐藏了链接器,所以你只需要编译和运行即可。所有的链接器设置仍然存在,但是,在Delphi的一个选项窗格中。

除了David Schwartz的回答之外,还有一种情况dcu实际上与其他语言生成的典型obj文件非常不同:泛型类型定义。如果在Delphi单元中定义了泛型类型,则编译器将该代码编译成语法树表示,而不是机器码。然后将此语法树表示存储在dcu文件中。当在另一个单元中使用并实例化泛型类型时,编译器将使用此表示并将其与使用泛型类型的单元的语法树"合并"。您可以认为这有点类似于方法内联。顺便说一句,这也是为什么大量使用泛型的单元需要更长的编译时间的原因,尽管泛型类型是从dcu文件"链接"进来的。

Delphi编译单元包含目标代码和预编译头,因此在某种程度上可与obj文件和.pch/.gch文件相比较。

Delphi源文件的'interface'部分对应于头文件,'implementation'部分创建目标代码。

预编译头文件可以显著减少编译和链接时间。DCU头节提供到其他引用单元的链接信息,这些信息不需要重新发现。

在Delphi/Turbo Pascal环境中,预编译的头文件支持严格的类型检查,如果使用了。coff或。obj这样的对象文件格式,则需要引用源代码。(在c++中,名称mangling提供了类似但不太完整的功能)。