web-dev-qa-db-ja.com

Delphi DCUファイルとは何ですか?

Delphi DCUファイルとは何ですか?

「DelphiCompiledUnit」の略だと思います。オブジェクトコードが含まれていると仮定して正しいのでしょうか。したがって、C/C++ソースコードファイルからコンパイルされた「.o」ファイルに対応しますか?

16
magnus

.dcuは、単に「Pascalソースコード」である.pasファイルとは対照的に、一般的に「Delphiコンパイル済みユニット」を意味すると思います。

.dcuファイルは、DCCコンパイラが.pasファイルのコンパイル後に生成するファイルです(.dfmファイルはバイナリリソースに変換され、リンカによって直接処理されます)。

これは、他のコンパイラが生成する 。o および 。obj ファイルに類似していますが、シンボルに関する詳細情報が含まれています(したがって、 ユニットのインターフェイスセクションをリバースエンジニアリングすることができます コメントを省略してコンパイラディレクティブ)。

.dcuファイルは技術的には「キャッシュ」ファイルではありませんが、削除しない場合や再コンパイルする必要がない場合は、ビルドの実行速度が速くなります。 .dcuファイルは、それを生成したコンパイラバージョンに関連付けられています。その意味で、.oまたは.objファイルよりも移植性が低くなります(互換性の問題もありますが)

それが何かを追加する場合のいくつかの歴史があります。

コンパイラは伝統的にソースコード言語をいくつかの中間形式に翻訳してきました。通訳者はそれをしません-彼らは言語を直接解釈し、すぐにアプリケーションを実行するだけです。 BASICは、インタープリター言語の典型的な例です。 DOSおよびWindowsの「コマンドライン」には、拡張子が.batの「 バッチファイル 」」というファイルに記述できる言語があります。ただし、コマンドラインに入力すると直接実行されます。* nix環境では、は、 shcshbashkshなど などのさまざまなコマンドラインインタープリター( CLI ))です。 。それらすべてからバッチファイルを作成できます。これは通常「スクリプト言語」と呼ばれます。しかし、現在、解釈とコンパイルの両方が行われている言語は他にもたくさんあります。

とにかく、 Java and 。Net 、たとえば、中間の「 バイトコード 」表現と呼ばれるものにコンパイルします。

Pascal は元々 シングルパスコンパイラ として記述され、 Turbo Pascal (PolyPascalから発信)- CP/MCP/M- 86 および [〜#〜] dos [〜#〜] -これらのオペレーティングシステムで実行されるバイナリ実行可能ファイル( [〜#〜] com [〜#〜] )ファイルを直接生成しました。

Pascalは元々、構造化プログラミングとデータ構造化を使用した優れたプログラミング手法を奨励することを目的とした、小さくて効率的な言語として設計されました。 Turbo Pascal 1 はもともと [〜#〜] ide [〜#〜] として設計されており、非常に高速なコンパイラが組み込まれており、DOSおよびCP/M市場で手頃な価格の競合製品です。当時の長い編集/コンパイル/リンクサイクル。TurboPascalとPascalには、当時のプログラミング環境と同様の制限がありました。メモリとディスク容量は キロバイト 、プロセッサ速度は メガヘルツ )で測定されました。

実行可能バイナリにリンクすると、個別にコンパイルされたユニットやライブラリにリンクできなくなりました。

Turbo Pascalの前には、疑似マシンのバイトコード(呼ばれる)にコンパイルされた CSD p-System オペレーティングシステム(Pascalを含む多くの言語をサポートします。UCSDPascalコンパイラはすでにPascal言語をユニットで拡張していました)がありました。 p-code)複数のユニットをリンクできる形式ですが、低速でしたが、

一方、 c[〜#〜] vax [〜#〜] および nix 環境で進化し、.oファイルにコンパイルされました。これは「オブジェクトコード」ではなく「オブジェクトコード」を意味します。注:これは、今日「 objects 」と呼ばれるものとはまったく関係ありません。

Turbo Pascalは、バージョン3までの直接生成された.comバイナリ出力ファイル(ただし、これらのオーバーレイファイルの修正を使用できます)を含み、バージョン4以降、最終的な実行可能バイナリにリンクされる前に最初に.tpuファイルにコンパイルされるユニットへのコードの分離をサポートしていました。 。 Turbo Cコンパイラはバイトコードではなく.obj(オブジェクトコード)ファイルを生成し、Delphi2はC++ Builderと連携するために.objファイルの生成を導入しました。

オブジェクトファイルは、各ユニット内で相対アドレス指定を使用し、後で実行するには「修正」(または 再配置 )と呼ばれるもの)が必要です。修正は、他のオブジェクトファイルに存在すると予想されるシンボリックラベルを指します。ライブラリ。

「修正」には2種類あります。1つは「 linker 」と呼ばれるツールによって静的に実行されます。リンカーは一連のオブジェクトファイルを取得し、それらをつなぎ合わせてパッチワークキルトに似たものにします。外部で定義されたすべてのラベルへのポインタをプラグインすることにより、すべての相対参照を「修正」します。

2番目の修正は、プログラムがロードされて実行されるときに動的に実行されます。それらは「ローダー」と呼ばれるものによって実行されますが、それは決してわかりません。コマンドラインでコマンドを入力すると、 loader が呼び出されてEXEファイルがメモリにロードされ、ファイルがロードされた場所に基づいて残りのリンクが修正され、制御がのエントリポイントに移されます。アプリケーション。

そのため、.dcuファイルはBorlandがTurbo Pascalにユニットを導入したときに.tpuファイルとして作成され、Delphiの導入により拡張子が変更されました。 Turbo PascalおよびDelphiから.objファイルにリンクできますが、これらは.objファイルとは大きく異なります。

Delphiもリンカーを完全に非表示にしているため、コンパイルと実行を行うだけです。ただし、すべてのリンカ設定は、Delphiのオプションペインの1つにあります。

27
David Schwartz

David Schwartzの答えに加えて、dcuが実際に他の言語で生成された典型的なobjファイルとまったく異なる場合が1つあります。それは、ジェネリック型の定義です。ジェネリック型がDelphiユニットで定義されている場合、コンパイラはこのコードをマシンコードではなく構文ツリー表現にコンパイルします。この構文ツリー表現は、dcuファイルに保存されます。ジェネリック型が使用され、別のユニットでインスタンス化されると、コンパイラはこの表現を使用し、ジェネリック型を使用するユニットの構文ツリーと「マージ」します。これは、メソッドのインライン化にいくぶん類似していると考えることができます。これは、ジェネリック型がdcuファイルから「リンク」されているにもかかわらず、ジェネリックを多用するユニットのコンパイルにはるかに長い時間がかかる理由でもあります。

7
iamjoosy

Delphiコンパイル済みユニットには、オブジェクトコードとプリコンパイル済みヘッダーが含まれているため、objファイルと.pch /.gchファイルの両方にいくらか匹敵します。

Delphiソースファイルの「interface」セクションはヘッダーに対応し、「implementation」セクションはオブジェクトコードを作成します。

プリコンパイル済みヘッダーファイルは、コンパイルとリンクの時間を大幅に短縮する可能性があります。 DCUヘッダーセクションは、他の参照ユニットへのリンク情報を提供します。これは、再検出する必要はありません。

Delphi/Turbo Pascal環境では、プリコンパイル済みヘッダーは厳密な型チェックをサポートします。これには、.coffや.objなどのオブジェクトファイル形式が使用されていた場合にソースコード参照が必要でした。 (C++では、名前マングリングは同様の機能を提供しますが、完全ではありません)。

1
david