什么是Delphi DCU文件?

mag*_*nus 14 c c++ delphi compilation dcu

什么是Delphi DCU文件?

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

Dav*_*rtz 25

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

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

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

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

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

编译器传统上将源代码语言翻译成某种中间形式.口译员不这样做 - 他们只是直接解释语言并立即运行应用程序.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的一个选项窗格中,所有链接器设置仍然存在.

  • +1.然而,虽然这是一个有趣的"历史",但问题的实际答案是"是的,它们是Delphi编译单元,它几乎与C/C++目标文件完全相同".那应该是第一个,然后是历史课(这样那些能够清楚地找到答案的人,即使他们对历史不感兴趣). (6认同)
  • "DCU"文件在Turbo Pascal 4.0中作为"TPU"文件引入.Turbo Pascal从未生成或"链接"目标文件.在交付新的32位编译器时,Delphi 2中引入了目标文件创建. (5认同)
  • 是的,@ user1420752,它是一个模糊且专有的**目标文件**格式,就像你熟悉的OMF和COFF一样.已经对它进行了一些逆向工程http://hmelnov.icc.ru/DCU/FAQ.htm (3认同)
  • 行"_Pascal最初是作为单通道编译器编写的,它直接生成了一个在DOS_下运行的可执行文件(COM或EXE)." 有些瑕疵.帕斯卡在DOS之前大约10年. (3认同)
  • 在 Turbo Pascal 4 中引入单位之前,它是 UCSD P-System,而不是 USCS Pascal 和原始 Turbo Pascal(最高版本 3)生成的 COM 文件。 (2认同)

iam*_*osy 7

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

  • @ David,C ++模板和Delphi泛型之间有巨大的区别。前一个实际上是真实的源代码替换,因此需要模板源代码在另一个文件中使用时才可用,而Delphi泛型是预编译的,使用时不需要源代码。假设C ++ Builder与C ++标准兼容,我将假定C ++ Builder处理模板的方式与Delphi泛型的方式大不相同。 (2认同)