什么是Delphi DCU文件?

时间:2014-07-10 00:47:04

标签: c++ c delphi compilation dcu

什么是Delphi DCU文件?

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

3 个答案:

答案 0 :(得分:25)

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

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

它类似于其他编译器生成的.o.obj文件,但包含有关符号的更多信息(因此您可以reverse engineer the interface section of a unit from it省略注释和编译器指令。)

.dcu文件在技术上不是“缓存”文件,尽管如果不删除它们并且不需要重新编译它们,构建将运行得更快。 .dcu文件与生成它的编译器版本相关联。从这个意义上说,它比.o或.obj文件更不便携(虽然它们也有兼容性问题)

以下是一些历史记录,以防它添加任何内容。

编译器传统上将源代码语言翻译成某种中间形式。口译员不这样做 - 他们只是直接解释语言并立即运行应用程序。 BASIC是解释语言的经典例子。 DOS和Windows中的“命令行”有一种语言,可以用名为“batch files”的文件写入,扩展名为.bat。但是在命令行输入内容直接执行它们。在* nix环境中,有许多不同的命令行解释器(CLIs),例如shcshbashksh,{ {3}}。您可以从所有这些文件创建批处理文件 - 这通常称为“脚本语言”。但现在有很多其他语言都被解释和编译。

无论如何and so onJava,例如,编译成称为中间“.Net”表示的东西。

byte-code最初为Pascalwritten as a single-pass compiler(来自PolyPascal) - Turbo PascalCP/MCP/M-86的不同版本 - 直接生成在这些操作系统下运行的二进制可执行文件(DOS)。

Pascal最初设计为一种小巧,高效的语言,旨在鼓励使用结构化编程和数据结构的良好编程实践; COM最初设计为Turbo Pascal 1,内置非常快速的编译器,是DOS和CP / M市场上负担得起的竞争对手,对抗当时的长编辑/编译/链接周期。 Turbo Pascal和Pascal与当时的任何编程环境都有类似的限制:内存和磁盘空间以IDE为单位,处理器速度为kilobytes

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

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

同时,UCSD p-SystemcVAX环境中进化,并编译成.o文件,这意味着“目标代码”而不是“源代码”。注意:这与我们今天称之为“Unix”的任何内容完全无关。

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

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

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

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:1)

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

&#39;界面&#39; Delphi源文件的一部分对应于标题,以及&#39;实现&#39; section创建目标代码。

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

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