プログラムの配布#
プログラムを配布する際には、いくつかの選択肢があります。
ソースコード全体を配布する
事前にビルドされた実行可能プログラムを配布する
ユーザーが使用できる静的または動的ライブラリを配布する
オプション 1: ソースコード全体を配布する
プログラマーであるあなたにとって、これは間違いなく最も簡単な方法です。ユーザーが各自のコンピューターでビルドできるようにします。残念ながら、これはユーザーフレンドリーなビルドシステムを用意する必要があり、ユーザーが適切なコンパイラにアクセスできる必要があることを意味します。ビルドシステムについては、前のセクションを参照してください。
オプション 2: 事前にビルドされた実行可能プログラムを配布する
入力以外にカスタマイズする必要のない事前にビルドされたプログラムは、さまざまなランタイムライブラリを付属する必要があり、ビルドされたオペレーティングシステム/環境に固有のものになります。
ランタイムライブラリのセットは、オペレーティングシステムとコンパイラバージョンによって異なります。gfortran のような自由に利用できるコンパイラの場合、最も簡単な方法は、ユーザーにシステムにそのコンパイラをインストールするように依頼することです。Windows の場合、Cygwin 環境が必要になる場合があります。
あるいは、プログラムと一緒にランタイムライブラリの複写を提供することもできます。実行時にそれらが見つかるディレクトリに配置します。
注: Windows では、Intel Fortran には *再頒布可能* ライブラリのセットが付属しています。これらを使用可能にする必要があります。
一般的に、「ldd」または「依存関係ウォーカー」などのツールを使用して、必要なライブラリを特定し、コンパイラのドキュメントを参照してください。
プログラムでカスタマイズを許可する場合は、これに対して動的ライブラリを使用することを検討してください。これについては、以下で詳しく説明します。
オプション 3: ユーザーが使用できる静的または動的ライブラリを配布する
このオプションは、最初の 2 つのオプションを組み合わせたものです。ユーザーは、適切な方法でルーチンを呼び出すメインプログラムを作成する必要がありますが、使用したビルドシステムについてあまり知る必要がないため、ユーザーに負担がかかります。ただし、ランタイムライブラリを処理する必要があります。
このオプションを選択する場合は、コンパイルされたライブラリに加えて、モジュール中間ファイルも提供する必要があります。これらのファイルはコンパイラ固有ですが、ビルドする静的ライブラリも同様です。
集計プログラムの配布#
上記のように、集計プログラムは、ユーザー定義関数を動的ライブラリでビルドできます。これにより、以下が可能になります。
実行可能ファイル(適切なランタイムライブラリを含む)を出荷する
モジュールのスケルトンバージョンを提供する(例:)
module user_functions
implicit none
contains
real function f( x )
!DEC$ ATTRIBUTES DLLEXPORT :: f
real, intent(in) :: x
! your function body goes here
end function f
end module user_functions
次のコマンドなどの基本的なビルドスクリプトを提供する
gfortran -o functions.dll functions.f90 -shared
または
ifort -exe:functions.dll functions.f90 -dll
前述のように、ユーザーが正しいことを行っているかどうかを制御することはできません。関数 f
を持つ任意の DLL「functions.dll」が受け入れられますが、必ずしも実行が成功するとは限りません。
別の設定としては、メインプログラムをサブルーチンに変更し、関数を引数として渡す方法があります。
module tabulation
implicit none
contains
subroutine tabulate( f )
interface
real function f( x )
real, intent(in) :: x
end function f
end interface
! your implementation goes here
end subroutine tabulate
end module tabulation
次に、スケルトンメインプログラムを提供します。
program tabulate_f
use tabulation
call tabulate( func1 )
contains
real function func1( x )
real, intent(in) :: x
! your function body goes here
end function func1
end program tabulate_f
利点は、コンパイラが渡される関数のインターフェースをチェックでき、ユーザーはライブラリによって提供される機能の使用においてより多くの自由度を持つことができることです。