ユニット(Units)

ユニット(Unit)は共有する型、関数、プロシージャ、定数、変数などの宣言をひとまとめにし、他のユニットまたはメインプログラムから呼び出せるようにする仕組みで、他のプログラミング言語におけるモジュール / パッケージに相当します。

ユニットの作成

ユニットは大きく2つのコアブロックに分かれます。

interface インターフェース領域:外部に公開する内容。他ファイルから読み込むと直接アクセス可能;

implementation 実装領域:内部の非公開コード。自身のユニットからのみ参照でき、外部から呼び出せません。

MyUnit.pas というファイルを作成し、1つのユニットを記述します。

unit MyUnit;

{$ifdef FPC}
{$mode objfpc}{$H+}{$J-}
{$endif}

// インターフェース領域:外部公開
interface

procedure MyProcedure(const A: Integer);
function MyFunction(const S: string): string;

// 実装領域:非公開の処理コード
implementation

procedure MyProcedure(const A: Integer);
begin
  WriteLn('A + 10 is: ', A + 10);
end;

function MyFunction(const S: string): string;
begin
  Result := S + 'strings are automatically managed';
end;

end.Code language: JavaScript (javascript)

よく見ると末尾の end. に対応する begin がないことに気づくでしょう?

Pascal のユニット(unit)の文法構造はプログラム(program)と異なります

program メインプログラム:実行開始点として begin ... end. が必須

unit ユニット:グローバルな begin は不要

ユニット全体の終端は end.(ドット付きでファイル終了を示し、対応するグローバル begin は存在しない)

  • interface には関数/プロシージャのプロトタイプ、型、定数、グローバル変数を記述。外部ファイルが uses で読み込むと呼び出し可能;
  • implementation には関数の完全な実装のみ記述。ここで定義したローカルプロシージャ、非公開変数は他ユニットから参照不可;
  • ユニットファイルは unit 名称; で始まり、end. で終了します。

メインプログラムにユニットを読み込む

メインプログラムファイルは mydemo.pas です

uses キーワードで自作ユニットを読み込みます

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

program MyProgram;

// 自作ユニット MyUnit を読み込む
uses
  MyUnit;

begin
  WriteLn(MyFunction('Note: '));
  MyProcedure(5);
  ReadLn;
end.Code language: PHP (php)

uses 配下の MyUnit; はファイル名ではなくユニット名を指します。

この名前は MyUnit.pas の1行目 unit MyUnit; で定義された名前のことです。

ファイル名とユニット名を一致させないことも可能ですが、同名にすることを推奨します。名前が異なる場合でも uses にはユニット名を記述し、ファイル名は使用しません。

ここでコンパイルし実行すると、メインプログラムからユニット内の関数が呼び出されます。

ここでコンパイルし実行

コンパイル完了後、プロジェクトフォルダに2つのファイルが新たに生成されます

.ppu(Pascal Unit File、ユニットコンパイル情報ファイル)

ユニットファイル(unit)をコンパイルした場合のみ生成され、メインプログラム program では ppu ファイルは作成されません

  • ユニット interface 領域のコンパイルメタデータを保存:関数プロトタイプ、型、定数、エクスポートシンボル;
  • 他ファイルが uses MyUnit を実行する際、コンパイラはMyUnit.pas の完全なソースコードを再解析せず、.ppu を直接読み込んでインターフェースを高速検証;
  • 大規模プロジェクトのコンパイル速度を大幅に向上、FPC の増分コンパイルを担う中核ファイル。

MyUnit.o:MyUnit.pas からコンパイルされたバイナリ機械語命令(実装領域の完全なコード)

mydemo.o:mydemo.pas メインプログラムの機械語バイナリ

コンパイラはまず各 pas ファイルを独立したバイナリ .o オブジェクトファイルに変換し、最後にリンカーがすべての .o ファイルを統合して実行ファイル .exe を生成します。

ユニット(Units)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です