首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Delphi DCU文件?

什么是Delphi DCU文件?
EN

Stack Overflow用户
提问于 2014-07-10 08:47:04
回答 3查看 16.1K关注 0票数 20

什么是Delphi DCU文件?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-10 09:31:25

我相信.dcu通常的意思是"Delphi编译单元“,而不是简单的"Pascal源代码”的.pas文件。

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

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

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

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

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

例如,无论如何,Java.Net都会编译成一种称为"byte-code“的中间表示形式。

Pascal最初是written as a single-pass compiler,而Turbo Pascal (起源于PolyPascal) -具有不同的CP/MCP/M-86DOS版本-直接生成在这些操作系统下运行的二进制可执行(COM)文件。

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

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

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

同时,cVAXUnix环境中发展,并编译成.o文件,这意味着“目标代码”,而不是“源代码”。注意:这与我们今天所说的"objects“完全无关。

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

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

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

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

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

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

票数 32
EN

Stack Overflow用户

发布于 2014-07-10 17:15:57

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

票数 7
EN

Stack Overflow用户

发布于 2017-05-25 14:35:12

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24665856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档