配布可能な MATLAB コードの記述

パッケージ化されたアプリケーションは実行時に MATLAB ファイルを処理しない

コンパイラではコードが無断で変更されないように保護されます。配布可能な MATLAB® ファイルはコンパイルの時点で停止または凍結されます。これは柔軟なアプリケーションを配布できないということではなく、柔軟性を念頭に置いてアプリケーションを設計しなければならないことを意味します。たとえばエンド ユーザーが 2 つの異なる方法から選択できるようにする場合、配布可能なアーカイブ内で両方の方法とも利用できなければなりません。

MATLAB Runtime は、配布可能なアーカイブのビルド時に暗号化された MATLAB コードでのみ動作します。新しい MATLAB コードを動的に生成する関数またはプロセスは、MATLAB Runtime で機能しません。

Deep Learning Toolbox™ 製品など一部の MATLAB ツールボックスでは、MATLAB コードが動的に生成されます。MATLAB Runtime は暗号化された MATLAB ファイルのみを実行し、Deep Learning Toolbox は暗号化されていない MATLAB ファイルを生成するため、Deep Learning Toolbox の一部の関数は配布できません。

同様に、MATLAB 関数ファイルのコンテンツを調べる必要がある関数も配布できません。たとえば HELP は動的なため、配布モードでは使用できません。MATLAB 関数プロトタイプを共に提供すると、配布モードで LOADLIBRARY を使用できます。

MATLAB コードを生成する関数をコンパイルして配布せずに、次のタスクを実行します。

  1. MATLAB でコードを 1 回実行して、生成された関数を取得します。

  2. 生成された関数を含め、MATLAB コードをパッケージ化します。

ヒント

EVAL または FEVAL を使用する代わりに、無名関数ハンドルを使用することもできます。

動的なランタイム処理を行うために MATLAB コードの作成機能が必要な場合、エンド ユーザーのコンピューターに MATLAB のコピーがインストールされていなければなりません。

MATLAB ファイルの実行をディレクトリまたはパスの変更で制御しない

一般に、プログラミング手法では、コード内のプログラム検索パスを動的にリダイレクトしない方が良いとされています。多くの開発者は、通常コマンド ラインで実行されるアクションに似ているため、この動作を行いやすい傾向があります。ただし、これはコードを配布するときに、問題の原因となる可能性があります。

たとえば、配布アプリケーションでは、MATLAB パスと Java® パスは固定されており、変更できません。そのため、これらのパスを (cd コマンドまたは addpath コマンドを使用して) 変更しようとしても、失敗します。

addpath の呼び出しを MATLAB コードに配置する以外に方法がない場合は、ismcc および isdeployed を使用してください。詳細は、関数 isdeployed を使用して、配布固有のコード パスを実行するを参照してください。

関数 isdeployed を使用して、配布固有のコード パスを実行する

関数 isdeployed を使用すると、MATLAB コードのどの部分が配布可能でどの部分が配布可能でないかを指定できます。そのように指定することで、コンパイルのエラーを減らし、効率的で維持可能なコードを作成しやすくなります。

たとえば、startup.m を記述する場合、addpath を使用することは避けられません。ismccisdeployed を使用することで、いつ何をパッケージ化し、実行するかを指定します。

コンパイル不可能な関数に依存するアプリケーションを徐々にリファクタリングする

isdeployed を使用する、コンパイルや配布が不可能な関数の含まれた MATLAB コードを徐々にリファクタリングし、合理化し、モジュール化します。最終的な目標は、配布不可能なコードを「正常に下位変換」していくことにあります。言い換えれば、コードがもつ配布時の障害を、エンド ユーザーに対してできるだけ減らしていき、最終的には実質的にそのような障害が無くなるようにしなければなりません。

コードを設計時コード セクションと実行時コード セクションに分割します。

  • "設計時コード" は現在まだ発展中のコードです。ほぼすべてのコードは、頻繁に書き換え、デバッグ、最適化を行う段階を経ていきます。Deep Learning Toolbox 製品のような一部のツールボックスでは、コードはさまざまなデータ置換やデータ パターンに反応して自己学習を重ねます。そのようなコードはほとんどの場合、配布を対象としたものではありません。

  • "実行時コード" は一方、固まっている、または安定しているコードです。完成した状態であり、エンド ユーザーによる配布を行う準備が整っています。

配布対象ではないコードや、配布不可能なコードを呼び出すコード用に別のディレクトリを作成することを検討してください。

一定でない静的状態変数を作成または使用しない

以下の使用は控えてください。

  • MATLAB コード内のグローバル変数

  • MEX ファイルの静的変数

  • Java コードの静的変数

これらの変数の状態は永続的であり、プロセス内のすべてで共有されます。

アプリケーションを配布するときに永続変数を使用すると、MATLAB Runtime プロセスが 1 つのスレッドで実行されるため、問題の発生することがあります。複数のこれらの一定しない静的変数を同じプロセスに読み込むことはできません。さらに、これらの静的変数はマルチスレッド アプリケーションではうまく機能しません。

パッケージ化後の MATLAB コードを念頭に置いてプログラミングするときには、新しいクラスのインスタンスごとに MATLAB Runtime のインスタンスが 1 つ作成されることを覚えておく必要があります。別の変数名を使用して同じクラスが再度インスタンス化されると、同じクラスの前のインスタンスによって作成された MATLAB Runtime に追加されます。つまり、アセンブリに一意のクラスが n 個含まれている場合、MATLAB Runtime のインスタンスが最大 n 個生成され、そのそれぞれがクラスのいずれかの 1 つ以上のインスタンスに対応します。

静的変数を使用しなければならない場合は、インスタンスにバインドしてください。たとえば、Java クラスでインスタンス変数を定義した方が、変数を static として定義するよりも好ましいと言えます。

配布するツールボックスの機能の適切なライセンスの入手

配布可能な MATLAB コードの作成にツールボックスを使用する場合は、ツールボックスの有効な MathWorks® ライセンスがなければなりません。

参考

|

関連するトピック