什么是Delphi DCU文件?

什么是Delphi DCU文件?

我相信它代表“Delphi Compiled Unit”。 假设它包含目标代码,我是否正确,因此对应于从C / C ++源代码文件编译的“.o”文件?

.dcu文件是DCC编译器在编译.PAS / .DFM文件后生成的文件。

它类似于其他编译器生成的.o和.obj文件。

我相信.DCU通常意味着“Delphi编译单元”而不是.PAS文件,它只是“Pascal源代码”。

它在技术上不是一个“缓存”文件,虽然如果你不删除它们并且不需要重新编译它们,你的构建将运行得更快。

这是一些历史,以防它添加任何东西。

编译器传统上将源代码语言翻译成某种中间forms。 口译员不这样做 – 他们只是直接解释语言并立即运行应用程序。 BASIC是解释语言的典型例子。 DOS和Windows中的“命令行”有一种语言可以写成名为“批处理文件”的文件,扩展名为.BAT。 但是在命令行上键入内容会直接执行它们。 在* nix环境中,有许多不同的命令行解释器(CLI),例如sh,csh,bash,ksh等。 您可以从所有这些文件创建批处理文件 – 这通常称为“脚本语言”。 但是现在有许多其他语言都被解释和编译。

无论如何,Java和.Net编译成称为“字节码”表示的东西。

Pascal最初是作为单通道编译器编写的,它直接生成了一个在DOS下运行的可执行文件(COM或EXE)。 (Pascal最初是为学术目的而设计的,用于教授编程,而不是构建大型应用程序。因此,它的局限性在这方面是有意的。)

该过程阻止您链接到单独编译的单元和库。 UCSD Pascal出现并通过编译为允许将多个单元链接在一起的字节码格式来纠正问题。

同时,c在VAX和Unix环境中发展,并且它被编译成.o文件,这意味着“目标代码”被选为“源代码”。 注意:这与我们今天称之为“对象”的任何内容完全无关。

TurboPascal出现了,如果我没弄错的话,生成.obj(目标代码)文件而不是字节码。

对象文件在每个单元中使用相对寻址,并且稍后需要所谓的“修复”以使它们运行。 修复指向预期存在于其他目标文件或库中的符号标签。

有两种“修复”:一种是通过一种称为“链接器”的工具静态完成的。 链接器接受一堆目标文件并将它们连接在一起,形成类似于拼凑被子的东西。 然后通过插入指向所有外部定义标签的指针来“修复”所有相关引用。

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

我认为DCU文件源于Borland引入Delphi时,为了区别于TurboPascal生成的OBJ文件。 也就是说,您无法将TP的OBJ文件直接链接到Delphi的DCU文件。 它们是不同的格式。

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

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

Delphi编译单元包含目标代码和预编译的头文件,因此可以与obj文件和.pch / .gch文件进行比较。

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

预编译的头文件可能会显着减少编译和链接时间。 DCU标题部分向其他引用单元提供链接信息,不必重新发现。

在Delphi / Turbo Pascal环境中,预编译头文件支持严格类型检查,如果使用了.coff或.obj等Object文件格式,则需要源代码引用。 (在C ++中,名称修改提供了类似但不太完整的function)。