Edited at

Delphi で最少のソースコードを書いてみる


はじめに

Delphi で最少のソースコードってどれだけ短くなるのかを調べてみました。

ここで言う最少のソースコードとはバイト数が最も少なくなるソースコードファイルの事です。

実行ファイルを作れる最小限のソースコードであり、生成される実行ファイルサイズの事ではありません。


やってみよう

では始めます。検証に使う環境は Delphi 10.3.1 Rio です。


コンソールアプリケーション

フォームのあるアプリケーションはそれだけでコード量がありますので、コンソールアプリケーションを選択します。

[ファイル | 新規作成 | その他...] から

image.png

コンソールアプリケーション を選択します。

image.png

この時点のソースコードは以下の通りです。

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

begin
try
{ TODO -oUser -cConsole メイン : ここにコードを記述してください }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

※ この辺で一旦読むのをやめて答えを予想してみるのもいいかもしれません!


例外処理のコードを削る

今回の用途だったら例外処理は不要ですねー♪

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils;

begin
end.


コンパイラ指令のコードを削る

今回の用途だったらコンパイラ指令も不要ですねー♪

program Project1;

uses
System.SysUtils;

begin
end.

{$APPTYPE CONSOLE} を削ってもコンソールアプリケーションになります。設定はプロジェクトオプションにあるからです。

image.png

普通のコンソールアプリケーションでは {$APPTYPE CONSOLE} を付けておくべきです。これを付けておけば *.dpr を単独で配布したとしてもコンソールアプリケーションとみなされます。

*.dpr を単独で配布された場合、これを開くとプロジェクトオプション用のファイル (*.dproj) が自動生成されます。しかしながら自動生成されたプロジェクトオプションではコンソールアプリケーション生成のスイッチが常にオフになっているため {$APPTYPE CONSOLE} のないソースコードはコンソールアプリケーションとみなされません。

{$APPTYPE CONSOLE} があったとしても、プロジェクトオプションではコンソールアプリケーション生成のスイッチはオフのままですが {$APPTYPE CONSOLE} 指令があるため、コンソールアプリケーションとしてコンパイルされます。

{$R *.res} はバージョン情報などのリソースを含めるかどうかなのですが、これも今回の目的には不要です。でも、普段は実行ファイルにバージョン情報リソースを含めておかないとウィルス対策ソフトに誤検知される事があります。バージョン情報リソースの有無で結果が異なるって...なんて杜撰なウィルスチェックなのだろう。


Sysutils を削る

今回の用途だったら Sysutils は不要ですねー♪ そうなると uses 句も不要です!

program Project1;

begin
end.

uses に何もなくてもアプリケーションを作ることが可能です。何故なら Delphi (Pascal) には組み込み手続き/関数が用意されているからです。これだけでもアプリケーションは作れます。

SysUtils は外部ライブラリで、これを使えばもっと簡単にアプリケーションが作れるというだけの事だったりします。

そういえばドキュメントに書かれていない組み込み手続き/関数があるのだとか。


program ヘッダーを削る

比較的モダンな Pascal では program ヘッダーは形骸化しており、Delphi もその例外ではありません。program ヘッダーは削れます。

begin

end.

標準 Pascal では Program ヘッダーにパラメータを指定できますが、Delphi はこれを無視します。


もう削るものは...

Delphi だと begin も削れます。

end.

構造ペインが文句を垂れますが削れます (w

image.png

ちなみに FreePascal だと begin は必要です。

image.png

{$mode DELPHI} 付けても通りません。

image.png


end は...

end は削れません (w


おわりに

ちなみに、この end. だけのプロジェクトをリリースビルドでコンパイルした時の実行ファイルのサイズは 42KB でした。

image.png