FreeBASIC の
再利用可能な手続きを、
ソースモジュールを含めるのではなく、
コンパイル済みモジュールを含めることで
管理する方法。
(Josep Roca氏の投稿を参考に作成しました。)
序文:
昔の OS(DOSなど)を使っていた頃は、コンパイラに使えるメモリサイズが小さかったため(Quick Basic 4.5で200KB程度)、プログラムが大きくならないうちに、モジュールごとにコンパイルすることが必須でした。
しかし、最近の PC や OS では、このコンパイルの限界が 1万分の1になり、特に FreeBASIC では、大きなファイルを一度にコンパイルする時間が許容できるようになりました。
これにより、再利用可能なユーザー手続きの管理に、(コンパイル済みファイルのライブラリと)別の方法を用いることができます。
まず、再利用可能なユーザー手続きのソースコードを、機能別などでソースモジュールをグループ化します。
この場合、使用する方法に応じてプロセスが異なります。
ここでは、説明を簡単にするために、メインプログラムを含むソースファイルが 1つだけで、そのメインプログラムがソースモジュールに含まれる様々なユーザー手続きを呼び出して再利用するものとします。
しかし、メインプログラムが複数のソースファイルにまたがっていることを考慮して、これらの方法を簡単に完成させることができます。
第一の方法: ライブラリ・ファイルに格納されたコンパイル済みモジュールを、コンパイル済みのメイン・プログラムとのリンク処理に含める
この方法の原則は、コンパイルされたユーザー手続きにだけアクセスすることです。
各モジュール(再利用されるユーザー手続きのソースを含む)はオブジェクト・ファイルに変換され、ライブラリ・ファイルに格納されます(
-lib コンパイル・オプションを使う)。
最後に、メインプログラムのソース・ファイルがコンパイルされ、ライブラリにリンクされて実行ファイルが作成されます(
-l < libname > コンパイルオプション、またはメインプログラムのソースコードの先頭に
#inclib "libname" 指示を使う)。
コンパイルされたモジュール毎に、少なくとも 1つの手続きが呼び出されると、そのモジュール全体が最終的な実行ファイルに追加されます。
このように、実行ファイルに追加されるコードの粒度は、モジュールレベル(粗い粒度)です。
第二の方法: ソース・モジュールをメイン・ソース・プログラムに直接組み込み、一度にコンパイルする
この方法の原則は、ユーザー手続きのソースに完全にアクセスすることです。
さまざまなモジュール(再利用されるユーザー手続きのソースを含む)は、メインプログラムのソースに直接含まれます(メインプログラムのソースコードの最初に置かれた、各モジュールの
#include "file" 指示を使う)。
最後に、出来上がった大きなソースファイルを一度にコンパイルして実行ファイルにします。
コンパイラは単一のソースファイルを処理するので、再利用可能なユーザー手続きはすべて
Private として宣言することができます(ライブラリを使う場合は、リンク時に外部リンクが必要なので、明らかに不可能です)。
その結果、実際に呼び出された
Private 手続きだけが実行ファイルに残されます。
このように、実行ファイルに追加されるコードの粒度は、基本手続きレベル(細かい粒度)になります。
注意:
コンパイラは呼び出されないプライベート手続きを削除しますが、最初の手続きが呼び出されているように見えるため、現在、自分自身が呼び出されていない他のプライベート手続きによってのみ呼び出されるプライベート手続きでは機能しません。
問題は、ワンパスコンパイラが単純なフラグだけを使って、手続きの「使用済み」状態を追跡することです。このフラグは、どこからでも、手続きにアクセスするたびに設定されます。
参照: