(57)【特許請求の範囲】
【請求項１】
電子装置が遅延束縛関数を遅延束縛プログラミング環境外の外部プログラミング環境に組み込むための方法であって、
前記遅延束縛関数を含むファイルを前記電子装置が受け取る段階と、
前記電子装置に実装されたコンパイラが、前記ファイルを自動的に調べ、前記遅延束縛関数を実行するために必要な一組の付加的な遅延束縛関数を特定する段階と、
前記コンパイラが、特定された前記遅延束縛関数を呼び出すためのインターフェースを前記外部プログラミング環境に自動的に生成する段階とを含む、方法。
【請求項２】
前記外部プログラミング環境は初期束縛プログラミング環境である、請求項1に記載の方法。
【請求項３】
前記インターフェースが前記初期束縛プログラミング環境内から前記遅延束縛関数呼び出しを実行する段階を更に含む、請求項２に記載の方法。
【請求項４】
前記外部プログラミング環境は遅延束縛プログラミング環境である、請求項１に記載の方法。
【請求項５】
前記インターフェースが前記遅延束縛プログラミング環境内から前記遅延束縛関数呼び出しを実行する段階を更に含む、請求項４に記載の方法。
【請求項６】
前記電子装置が遅延束縛実行エンジンを含み、該遅延束縛実行エンジンが前記遅延束縛関数を実行する、請求項1に記載の方法。
【請求項７】
前記遅延束縛関数の内容が暗号化されている、請求項６に記載の方法。
【請求項８】
前記遅延束縛関数の内容が、公開キー暗号化手段を用いて暗号化されている、請求項７に記載の方法。
【請求項９】
前記公開キー暗号化手段は、先進暗号化規格(AES)公開キー暗号化手段である、請求項８に記載の方法。
【請求項１０】
前記遅延束縛実行エンジンが、前記遅延束縛関数の内容を実行するため該内容を復号する、請求項７に記載の方法。
【請求項１１】
前記遅延束縛関数の内容は、実行時に必要なときのみに復号される、請求項１０に記載の方法。
【請求項１２】
暗号化／復号スキーマが、複数のユーザ間での安全なファイルの共有を可能とする、請求項１０に記載の方法。
【請求項１３】
暗号化／復号スキーマが、前記遅延束縛関数の実行で使用されるコンパイラにより生成される一意のキーを用いる、請求項１０に記載の方法。
【請求項１４】
前記暗号化／復号スキーマは、遅延束縛関数の実行で使用されるコンパイラにより生成される前記一意のキーを用いて海賊版ソフトウェアを追跡可能とする、請求項１３に記載の方法。
【請求項１５】
前記遅延束縛プログラミング環境における前記遅延束縛関数呼び出しの実行に続いて、前記遅延束縛実行エンジンを終了する段階を更に含む、請求項６に記載の方法。
【請求項１６】
前記初期束縛プログラミング環境はＣ言語プログラミング環境である、請求項２に記載の方法。
【請求項１７】
前記初期束縛プログラミング環境はＣ++言語プログラミング環境である、請求項２に記載の方法。
【請求項１８】
前記初期束縛プログラミング環境はFORTRANプログラミング環境である、請求項２に記載の方法。
【請求項１９】
前記遅延束縛プログラミング環境はLISPプログラミング環境である、請求項４に記載の方法。
【請求項２０】
前記遅延束縛プログラミング環境はPrologプログラミング環境である、請求項４に記載の方法。
【請求項２１】
前記遅延束縛プログラミング環境はMATLABプログラミング環境である、請求項４に記載の方法。
【請求項２２】
前記インターフェースが、前記外部プログラミング環境で利用可能なアプリケーションプログラム・インタフェース(API)である、請求項１に記載の方法。
【請求項２３】
前記APIは、前記外部プログラミング環境から前記遅延束縛プログラミング環境の関数を呼び出す際に利用される、請求項２２に記載の方法。
【請求項２４】
前記インターフェースが、外部プログラミング環境で実行可能なソフトウェア構成要素である、請求項１に記載の方法。
【請求項２５】
前記インターフェースが、外部プログラミング環境で実行可能なソフトウェア・アプリケーションである、請求項１に記載の方法。
【請求項２６】
前記遅延束縛実行エンジンが、前記遅延束縛関数の実行時に前記外部プログラミング環境から遅延束縛関数を呼び出す段階を更に含む、請求項６に記載の方法。
【請求項２７】
遅延束縛関数を遅延束縛プログラミング環境外の外部プログラミング環境に組み込むためのシステムであって、
前記遅延束縛関数を含むファイルを受け取り、該ファイルを自動的に調べ、前記遅延束縛関数を実行するために必要な一組の付加的な遅延束縛関数を特定する電子装置と、
特定された前記遅延束縛関数を前記外部プログラミング環境に呼び出すためのインターフェース機構とを備えた、システム。
【請求項２８】
前記外部プログラミング環境は初期束縛プログラミング環境である、請求項２７に記載のシステム。
【請求項２９】
前記外部プログラミング環境は遅延束縛プログラミング環境である、請求項２７に記載のシステム。
【請求項３０】
前記遅延束縛プログラミング環境は遅延束縛実行エンジンを含む、請求項２７に記載のシステム。
【請求項３１】
前記遅延束縛実行エンジンが、前記外部プログラミング環境からの関数呼び出しを前記遅延束縛プログラミング環境において実行する、請求項３０に記載のシステム。
【請求項３２】
前記遅延束縛プログラミング環境における前記関数呼び出しに続いて、前記遅延束縛実行エンジンが終了される、請求項３１に記載のシステム。
【請求項３３】
前記初期束縛プログラミング環境はＣ言語プログラミング環境である、請求項２８に記載のシステム。
【請求項３４】
前記初期束縛プログラミング環境はＣ++言語プログラミング環境である、請求項２８に記載のシステム。
【請求項３５】
前記初期束縛プログラミング環境はFORTRANプログラミング環境である、請求項２８に記載のシステム。
【請求項３６】
前記初期束縛プログラミング環境はVisual Basicプログラミング環境である、請求項２８に記載のシステム。
【請求項３７】
前記遅延束縛プログラミング環境はLISPプログラミング環境である、請求項２９に記載のシステム。
【請求項３８】
前記遅延束縛プログラミング環境はPrologプログラミング環境である、請求項２９に記載のシステム。
【請求項３９】
前記遅延束縛プログラミング環境はMATLABプログラミング環境である、請求項２９に記載のシステム。
【請求項４０】
前記インターフェース機構が、前記外部プログラミング環境で利用可能なアプリケーションプログラム・インタフェース(API)である、請求項２７に記載のシステム。
【請求項４１】
前記APIは、前記外部プログラミング環境から前記遅延束縛プログラミング環境の関数を呼び出す際に利用される、請求項４０に記載のシステム。
【請求項４２】
前記インターフェース機構が、外部プログラミング環境で実行可能なソフトウェア構成要素である、請求項２７に記載のシステム。
【請求項４３】
前記インターフェース機構が、実行時に前記遅延束縛プログラミング環境の意味論を前記外部プログラミング環境で表現する、請求項２７に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、その内容を引用して本明細書に援用する2005年6月2日付けの米国特許出願第11/144411号の利益を主張する。
【０００２】
本発明はアプリケーション及びソフトウェア構成要素に関し、より詳細には、初期束縛アプリケーションから遅延束縛関数を呼び出すための方法及びシステムに関する。
【背景技術】
【０００３】
アプリケーションで関数呼び出しを束縛するには、その関数を実機械語アドレスに置換する必要がある。従って、この束縛がどの関数(すなわち、当該関数を実現するコードのセクション)を実行時に実行するか決定する。コンパイル時に束縛が起これば、それは「初期束縛」である。対照的に、実行時に束縛が起これば、それは「遅延束縛」である。プログラミング言語は、一般に初期束縛又は遅延束縛として分類できる。
【０００４】
どちらの関数呼び出し束縛時を選択するかは(すなわち、初期束縛か遅延束縛か)、実行時のコードのパフォーマンス(初期束縛は実行時に高速である)と、プログラマーのプログラミング容易さ(遅延束縛プログラムは書くのが容易である)との兼ね合いである。現状では、プログラマーは、プログラムを書くのに要する時間か、プログラムを実行するのに要する時間かのどちらが重要かを決定しなければならない。残念ながら、これは容易な選択ではないことが多い。従来のシステムでは、この兼ね合いのバランスを効果的にとる機構は存在しない。
発明の概要
【０００５】
本発明は、遅延束縛プログラム関数を外部プログラミング環境に組み込むための方法及びシステムを提供する。この外部プログラミング環境は、初期束縛環境、遅延束縛環境、或いはそれらの組合せの何れでもよい。
【０００６】
本発明の第1の様態によれば、遅延束縛アプリケーションが外部プログラミング環境に組み込む方法が提供される。遅延束縛プログラム及び遅延束縛環境が与えられ、後に、外部環境に使用可能とすべきどのような遅延束縛呼び出しが遅延束縛プログラム及び環境内に存在するかを特定するために遅延束縛プログラム及び環境が調べられる。次にインターフェースが生成され、このインターフェースにより遅延束縛関数呼び出しを外部プログラミング環境内で組み込み可能となる。本発明の実施に用いられる外部環境は、遅延束縛環境、初期束縛環境、或いはそれらの組合せの何れでもよい。
【０００７】
本発明の別の様態では、遅延束縛プログラム言語を外部環境に組み込むシステムが提供され、このシステムは外部環境と遅延束縛プログラム及びプログラミング環境とを含む。この外部環境は、遅延束縛プログラミング環境、初期束縛プログラミング環境、或いはそれらの組合せの何れでもよい。この遅延束縛プログラミング環境はモジュラー実行エンジンとインターフェース機構とを含み、インターフェース機構は、外部環境と互換性がある形式で遅延束縛意味論を表現できる。
【０００８】
本発明の更なる様態では、実行可能な遅延束縛内容を外部プログラミング環境で使用するために再配布可能なアプリケーションにパッケージ化する方法が提供される。この外部環境は、遅延束縛プログラミング環境、初期束縛プログラミング環境、或いはそれらの組合せの何れでもよい。この方法は、先ず、遅延束縛内容のうちどのファイルが遅延束縛アプリケーションを表すかを特定するため遅延束縛内容を調べる。更に、遅延束縛アプリケーションをサポートするのに必要な関数のみを含む遅延束縛モジュラー実行エンジンが提供される。このモジュラー実行エンジンは、遅延束縛アプリケーションをサポートするのに必要な関数のみを実行するよう構成されている。
【０００９】
Ｍａ本発明の別の様態では、クライアントとサーバを含むネットワークが与えられ、サーバは遅延束縛プログラミング環境と外部プログラミング環境とを実行できる。適切な外部環境には、遅延束縛プログラミング環境、初期束縛プログラミング環境、又はそれらの組合せが含まれるがそれらに限定されない。クライアントはネットワークを介してサーバと通信する。インターフェースが生成され、それにより遅延束縛プログラム及びプログラミング環境と外部プログラミング環境との間でデータ交換が可能であり、遅延束縛プログラムアプリケーションを外部プログラミング環境に組み込むことができる。
【００１０】
本発明の代替的な様態では、遅延束縛アプリケーションを外部環境に組み込むシステムが記載され、ここでは情報をクライアント装置に与えるため配布(原語：distribution)サーバが使用される。更に、インターフェース機構が与えられ、このインターフェース機構により遅延束縛関数呼び出しを外部プログラミング環境に組み込み可能となる。
【発明を実施するための最良の形態】
【００１１】
本発明の例示的な実施形態は、外部プログラミング環境内に存在するアプリケーションが遅延束縛言語で存在する関数を呼び出すための機構を提供する。例示目的の以下の説明は、遅延束縛関数の初期束縛外部プログラミング環境への組み込みに関するものである。初期束縛言語、遅延束縛言語、或いはそれらの組合せを含むがそれらに限定されない、上記以外の外部環境が存在する。この例では、初期束縛環境内における遅延束縛関数の組み込みにより、プログラマーは実行時間と符号化の容易さとの兼ね合いを決定する時期を選択できる。従って、プログラマーは、パフォーマンスが非常に重要なアプリケーション部分には初期束縛関数呼び出しを使用する一方、プログラムが困難な関数には遅延束縛関数呼び出しを使用できる。
【００１２】
遅延束縛関数呼び出しを初期束縛プログラミング環境に組み込むことで、上述した兼ね合いの釣り合い取り以外にも多くの利点がもたらされる。第1に、この組み込みにより、初期束縛プログラミング環境が遅延束縛の表現力を利用できるようになる。第2に、この組み込みにより、初期束縛プログラミング環境が、初期束縛関数呼び出しを1つ又は複数の遅延束縛関数呼び出しの組に結び付けることができる。第3に、大きなレガシーシステムが、遅延束縛関数呼び出しなどに関わるより近代的なプログラミング方法を組み込むことを可能とする。
【００１３】
或いは、遅延束縛関数を遅延束縛プログラミング環境に組み込むと、遅延束縛関数を初期束縛言語に組み込んだときには容易に認識されない多くの利点が得られる。例えば、ほとんどの遅延束縛言語は特定の問題領域内の演算に特化されている。リスプ遅延束縛言語は、例えばストリングのリストの記号処理に最も適している。一方、遅延束縛PROLOGプログラミング言語は、定理の証明や論理的推論問題に適している。遅延束縛MATLABプログラミング言語は、対照的に、数値線形代数領域内での演算に適している。上述の遅延束縛プログラム言語は、本発明で利用するのに妥当な遅延束縛プログラミング環境の代表的な例に過ぎない。当業者であれば、本発明に適用できる多くの代替的な遅延束縛プログラミング環境が存在することが分かるはずであり、ここに挙げた例は決定的なものではない。
【００１４】
遅延束縛環境内で遅延束縛関数呼び出しを組み込む際に、本発明は、未処理の計算問題を解くにあたって最適な言語が使用されるように、呼び出しを多数の遅延束縛言語に結合するプログラムをユーザにより作成可能とする。
【００１５】
この例示的な実施形態は、MATLAB(登録商標)環境に関連して例示的な目的のみで説明する。この例示的な実施形態はMATLAB(登録商標)に基づいたアプリケーションに関連して説明するが、本発明は、National
Instruments社のLabview、LISP、又はPROLOGを含むがそれに限定されない様々なプログラミング及び開発環境で生成されたアプリケーションをデプロイ(原語：deploy)且つ配布するために応用できる。
【００１６】
MATLAB(登録商標)は、直感的に使用できる高性能言語及び技術計算環境である。MATLAB(登録商標)は、データ解析、視覚化、及びアプリケーション開発用の数学的ツール及びグラフィカルツールを提供する。MATLAB(登録商標)は、問題及び解が親しみある数学的表記法で表現される使い勝手がよい環境で計算とプログラミングとを組み込むものである。MATLAB(登録商標)は、その基本データ要素がディメンショニングを必要としないアレーである対話形システムである。これによりユーザは、特に行列やベクトル公式を含む多くの技術計算問題を、CやFORTRANなどのスカラ非対話形言語でプログラムを書く場合に比べ非常に短い時間で解くことが可能となる。MATLAB(登録商標)は、MATLAB(登録商標)コンパイラを含むアプリケーション開発ツールを提供する。MATLAB(登録商標)Builder for COM及びMATLAB(登録商標)Builder for ExcelはMATLAB(登録商標)コンパイラと協働してCOM及びExcel環境で実行するオブジェクトを自動的に生成する。これらアプリケーション開発ツールを用いることで、ユーザはMATLAB(登録商標)アプリケーションを作成且つ配布し、更にMATLAB(登録商標)又は他の環境を使用する同僚とMATLAB(登録商標)作業を共有できる。
【００１７】
図１は、本発明の例示的な実施形態を実施するのに適した電子装置100の代表的な一実施形態である。電子装置100は、パーソナルコンピュータ(PC)、ラップトップコンピュータ、ワークステーション、個人情報端末(PDA)、インターネット機器、携帯電話などの様々な異なる技術を表す。図示した実施形態では、電子装置100は、中央処理装置(CPU)102と表示装置104とを含んでいる。表示装置104は、電子装置100による視覚ディスプレーを通じたユーザへの直接的な通信を可能とする。電子装置100は、キーボード106とマウス108などの入力装置とを更に含んでいる。他の使用可能な入力装置としては、スタイラス、トラックボール、ジョイスティック、タッチパッド、タッチスクリーンなどが含まれるがそれらに限定されない。電子装置100は、主記憶装置110とデータ及び命令を記憶しておく補助記憶装置112とを含む。記憶装置110及び112は、フロッピー（登録商標）（登録商標）ドライブ、ハードドライブ、テープドライブ、光学ドライブ、読出し専用記憶素子(ROM)、ランダムアクセス記憶装置(RAM)などの技術を含むがそれらに限定されない。ブラウザのようなアプリケーション、JAVA（登録商標）（登録商標）仮想計算機、並びに他のユーティリティ及びアプリケーションが記憶装置110及び112の一方又は両方に常駐できる。電子装置100は、図示した電子装置100外部にある1つ又は複数の電子装置と通信するためのネットワークインターフェース114も含むことができる。モデムが外部の電子装置又はネットワークと接続を確立するためのネットワークインターフェース114の一形態である。CPU102には、上述の構成要素の1つ又は複数が内部的又は外部的に接続されている。上述のアプリケーション以外にも、MATLAB(登録商標)116のようなモデリングアプリケーションを電子装置100にインストールし、動作させることができる。
【００１８】
電子装置100は、本発明を実装するための1つの構成を表すものにすぎないことに注目されたい。しかし、通常の技能を備えた当業者であれば、本発明は、上述の装置100での実装には限定されないことは理解するはずである。ユーザ入力や表示装置を全く必要としない埋込みコードに部分的又は完全に基づいた実装を含む他の実装も利用できる。すなわち、プロセッサは、別のプロセッサ又は他の装置と直接通信できる。
【００１９】
図2は、本発明を実施するために使用する分散形ネットワークの例示的実施形態である。このシステムは、ネットワーク200に関連付けられたクライアント装置202を含む。このネットワークには、更にサーバ装置204、インターフェース機構210、及び記憶装置206が関連付けられている。インターフェース機構210は、遅延束縛関数呼び出しを初期束縛プログラミング環境内で組み込むことができる。
【００２０】
オブジェクト指向環境でのプログラミングにおいて遅延束縛関数呼び出しを用いる利点の1つは、開発者の書くコードが、操作対象となるオブジェクトの正確なオブジェクトタイプに特定的である必要がないことである。言い換えれば、遅延束縛関数呼び出しは多相性をサポートできる。
【００２１】
本発明のインターフェース機構210を用いると、コンパイル時に、初期束縛コンパイラが遅延束縛環境に存在する遅延束縛関数に遭遇すると、初期束縛環境のこのコンパイラは、インターフェース機構210を用いて遅延束縛環境に存在するこの遅延束縛関数の実行時実行を可能にする。インターフェース機構210は一組の遅延束縛関数の一種のプロキシとして機能し、それらのうち１つが(実行時での入力のタイプに依存するが)実行時に呼び出される。
【００２２】
更に、例示目的でこのインターフェース機構はネットワーク200と関連付けられているように図示されているが、当業者であればインターフェース機構210をクライアント装置202、サーバ204、又はそれらの組合せとも付加的に関連付け可能であることは容易に理解するはずである。当業者であれば、上述のネットワークの実施形態は代表的な実例に過ぎず、その機能性をネットワークにおいて多くの方法で分割してよいことは理解するはずである。例えば、複数のクライアントをこのサーバに関連付けたり、単一のクライアントを複数サーバに関連付けたり又はそれらの組合せを採用してもよい。
【００２３】
図3は、本発明の例示的な実施形態を実施するのに用いられる構成要素を示す。この例示的な実施形態で示した構成要素によって、遅延束縛関数を初期束縛環境300に組み込み可能となる。1つの代表的なケースでは、この初期束縛プログラミング環境は、ワシントン州レッドモンド所在のマイクロソフト社が販売するVisual Studio(登録商標)プログラミング環境であり、この遅延束縛関数はMATLAB(登録商標)関数である。ここでMATLAB(登録商標)及びVisual
Studio(登録商標)は単に例示目的で選択したに過ぎない。これ以外の多くの初期及び遅延束縛言語を用いて本発明を実施できる。
【００２４】
図示した例では、遅延束縛関数がMATLAB(登録商標)関数であれば、MATLAB(登録商標)コンパイラが、初期束縛環境300内に存在する初期束縛関数である遅延束縛インターフェース関数304及び306を生成する。これらインターフェース関数304及び306の名前及び実装はコンパイル時に完全に決定される。実行時には、これらインターフェース関数304及び306は遅延束縛関数を呼び出す。具体的には、遅延束縛インターフェース関数304は、モジュラー遅延束縛実行エンジン302(後に詳述する)を介して1つ又は複数の遅延束縛関数308の組を呼び出す。同様に、遅延束縛インターフェース関数306は、モジュラー遅延束縛実行エンジン302を介して1つ又は複数の遅延束縛関数310の組を呼び出す。こうして、初期束縛環境300が、選択した関数に関して実行時まで関数束縛を延期可能な機構が提供される。
【００２５】
図3から分かるように、遅延束縛インターフェース関数304及び306は複数の遅延束縛関数(308及び310を参照)の実行を引き起こすこともできる。１つの遅延束縛インターフェース関数が単一の遅延束縛関数に関連付けられている場合もありうるし、複数の遅延束縛関数が単一の遅延束縛インターフェース関数に関連付けられている場合もありうる。更に、インターフェース関数に与えられる入力のタイプによっては、それぞれの呼び出しが、関連付けられた組内の異なる遅延束縛関数への呼び出しとなることもありうる。
【００２６】
一実施形態では、このインターフェース機構を、初期束縛アプリケーションから呼び出し可能な関数を備えたアプリケーションプログラム・インタフェース(API)を介して実現してもよい。このAPIを用いて遅延束縛環境内の関数呼び出しを開始できる。例えば、Cプログラミング環境で実行しているAPIは、MATLAB(登録商標)遅延束縛環境の関数を呼び出すことができる。或いは、APIは、動作するのに2次プログラムを必要としない独立実行可能プログラムでもよい。初期束縛C言語で実行するアプリケーションの視点からは、例えば、遅延束縛MATLAB(登録商標)アプリケーションで呼び出される関数は、従来型の関数呼び出しのように見える。ここでは、この関数及び引数が理解され、出力が既存の関数と類似した様態で渡される。
【００２７】
インターフェース機構は例示的にAPIとして説明してあるが、APIとの使用に限定されない。別法としては、このインターフェース機構は、初期又は遅延束縛環境で実行するソフトウェア又はハードウェア構成要素でもよい。このインターフェース機構は、遅延束縛プログラミング環境の意味論を、実行時に初期束縛プログラミング環境によって容易に識別される形式で自動的に表現でき、又、上述したように、上記の意味論を表現するための適切な形式を取ることができる。
【００２８】
モジュラー遅延束縛実行エンジン302は、遅延束縛環境内に存在する関数を実行する機構を提供する。これらは遅延束縛関数なので、遅延束縛環境において実行時に束縛される。遅延束縛環境がMATLAB(登録商標)環境である場合は、モジュラー遅延束縛実行エンジンはMATLAB(登録商標)構成要素ランタイムエンジンでよい。MATLAB(登録商標)構成要素ランタイムエンジンは、Mファイル、MEXファイル、及び他のタイプのMATLAB実行可能内容の実行を可能とする共有ライブラリのスタンドアロンセットである。MATLAB(登録商標)構成要素ランタイムエンジンをモジュラー実行エンジンとすれば、遅延束縛環境で関数を実行する時に、MATLAB(登録商標)計算ランタイムエンジンをユーザに見える新たなウィンドウに開く必要はない。むしろ、構成要素ランタイムエンジンはユーザには見えないように背景で実行できる。
【００２９】
本発明は、MATLAB(登録商標)アプリケーション及びMATLAB(登録商標)構成要素ランタイムエンジンのみに限定されるものでなく、多数の代替的な遅延束縛環境及び実行エンジンを用いて実施できる。
【００３０】
モジュラー遅延束縛実行エンジン302の構成によって、初期束縛環境300における遅延束縛インターフェース関数呼び出し304又は306の実行に続き、モジュラー遅延束縛実行エンジン302は実行を継続することも、終了することも可能である。モジュラー遅延束縛実行エンジン302の実行を継続させることにより、遅延束縛環境における後続の関数実行が可能となり、初期束縛環境300内からの呼び出しがより迅速に行われ、モジュラー遅延束縛実行エンジン302を開始する必要がなくなる。或いは、初期束縛環境300内から制御される、遅延束縛関数を実行した後のモジュラー遅延束縛実行エンジン302の終了により、プロセッサ要求及びリソース配分が減少し、又、モジュラー遅延束縛実行エンジン302に関連付けられたリソースは、モジュラー実行エンジン300が終了されると解放される。(それが存在する)
【００３１】
例示的な実施形態の動作を説明するには実例が役立つはずである。この実例は、任意の入力数に10を加えるために使われる、遅延束縛プログラミング環境(例えば、MATLAB(登録商標))内からのMATLAB(登録商標)関数である。この関数はplus10と名付けられ、次のとおり定義される。
【００３２】
【数１】
0005412108.tif 000002
【００３３】
次に記述したのは、MATLAB(登録商標)コンパイラにより関数plus10を含むMファイルplus10.mから自動的に生成されたC関数ライブラリのソースファイルである。下記の第1のファイルはヘッダファイルlibplus.hである。このヘッダファイルの後にはファイルlibplus.cを記載する。関数mlfPlus10は、plus10関数が与えるMATLAB(登録商標)機能にアクセスするためCプログラムが呼び出すインターフェース関数の一例である。
【００３４】
次がヘッダファイルである。
#ifndef__libplus_h
#define__libplus_h 1
#include "mclmcr.h"
#ifdef__cplusplus
extern "C"{
#endif
extern bool
libplusInitializeWithHandlers(mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler);
extern bool libplusInitialize(void);
extern void libplusTerminate(void);
extern void mlxPlus10(int nlhs, mxArray  *plhs[], int nrhs, mxArray *prhs[];
extern void mlfPlus10(int nargout, mxArray **s,
mxArray *x);
#ifdef __cplusplus
}
#endif
#endif
【００３５】
次がlibplus.cファイルである。
#include <stdio.h>
#include"mclmcr.h"
#include "libplus.h"
#ifdef  cplusplus
extern "C" {
#endif
extern const unsigned char __MCC
COMPONENT_public_data[];
extern const char *__MCC_COMPONENT_name_data;
extern const char *__MCC_COMPONENT_root_data;
extern const unsigned char
__MCC_COMPONENT_session_data[];
extern const char *__MCC_COMPONENT_matlabpath_data[];
extern const int __MCC_COMPONENT_matlabpath_data_count;
extern const char
*__MCC_COMPONENT_mcr_runtime_options[];
extern const int
__MCC_COMPONENT_mcr_runtime_option_count;
extern const char
*__MCC_COMPONENT_mcr_application_options[];
extern const int
__MCC_COMPONENT_mcr_application_option_count;
#ifdef __cplusplus
} 
#endif
static HMCRINSTANCE _mcr_inst = NULL;
static int mclDefaultErrorHandler(const char *s)
{
return fprintf(stderr, s);
}
static int mclDefaultPrintHandler(const char *s)
{ 
return fprintf(stdout, s);
}
bool libpluslnitializeWithHandlers( 
mclOutputHandlerFcn error_handler,
mclOutputHandlerFcn print_handler
) 
{ 
return (_mcr_inst == NULL ?
mcllnitializeComponentlnstance(&_mcr_inst,
__MCC_COMPONENT_public_data, 
__MCC_COMPONENT_name_data, 
__MCC_COMPONENT_root_data,
__MCC_COMPONENT_session_data,
__MCC_COMPONENT_matlabpath_data, 
__MCC_COMPONENT_matlabpath_data_count,
__MCC_COMPONENT_mcr_runtime_options,
__MCC_COMPONENT_mcr_runtime_option_count,
true, NoObjectType, LibTarget, 
NULL, error_handler, print_handler)
:
true);
}
bool libpluslnitialize(void)
{
return
libpluslnitializeWithHandlers(mclDefaultErrorHandler, 
mclDefaultPrintHandler);
}
void libplusTerminate(void)
{
if (_mcr_inst != NULL)
mclTerminatelnstance(&_mcr_inst);
}
void mlxPlus10(int nlhs, mxArray *plhs[], int nrhs,
mxArray*prhs[])
{ 
mclFeval(_mcr_inst, "plus10", nlhs, plhs,
nrhs, prhs);
}
void mlfPlus10(int nargout, mxArray **s, mxArray *x)
{
mclMlfFeval(_mcr_inst,
"plusiO", nargout, 1, 1, s, x);
}
【００３６】
Cのような初期束縛プログラミング環境内からの上述のインターフェース関数mlxPlus10の呼び出しは次のコードに例示した。
#include <stdio.h> 
#include "matrix. h"
#include "libplus.h"
void usage(char *name)
{
printf("Usage: %s integer\n", name); 
printf("\tAdds 10 to the given integer\n");
exit(-1);
}
int main(int ac, char *av[])
{
mxArray *input = mxCreateDoubleScalar(atoi(av[1])); 
mxArray *output = NULL; 
double result;
if (ac != 2) usage(av[0]);
mcllnitializeApplication(NULL, 0); 
libpluslnitialize(); 
mlxPlus10(1, &output, 1, &input); 
libplusTerminate();
result = mxGetScalar(output);
printf("%s + 10 = %.0f\n", av[1], result);
mclTerminateApplication(); 
return 0;
}
【００３７】
上述のコードはCプログラミング言語で使用するために書かれたものだが、当業者なら、本発明の実施に使用できる多くの代替的な初期束縛環境が存在することは容易に理解するはずである。
【００３８】
上述の遅延束縛関数を呼び出すための方法から明らかなように、このプロセスは簡素化されていると同時に、ユーザ対話を最小限にしつつ遅延束縛関数を初期束縛環境に組み込む適切な機構を提供する。元々の遅延束縛関数(plus10.m)の呼び出しは、初期束縛環境内からの他の通常の関数呼び出しと同一に見える。更に、この初期束縛環境は初期束縛関数を通常どおり処理し続けるので、関数の実行速度が向上する。
【００３９】
図4は、例示的な実施形態の構成要素間の相互作用をより詳細に示す。先ず初めに、ユーザは、遅延束縛環境400を用いて遅延束縛アプリケーション又は構成要素を開発する。図4では、このアプリケーション又は構成要素は、遅延束縛関数404A及び404Bを備えたユーザが作成した遅延束縛関数のスイート402として表されている。例示目的で、遅延束縛環境400はMATLAB(登録商標)であり、遅延束縛関数はMATLAB(登録商標)関数であると仮定する。次に、ユーザはMATLAB(登録商標)コンパイラ406を呼び出して、自分のアプリケーション又は構成要素をデプロイ可能な形式で生成させる。MATLAB(登録商標)コンパイラ406は入力ファイルを調べて、遅延束縛関数404A及び404Bを呼び出すために生成されることになる初期束縛インターフェースファイルに適した形式を特定する。更に、初期束縛環境の選択が、生成される初期束縛インターフェースの形式にも付加的に影響を与える。MATLAB(登録商標)コンパイラは入力ファイルを調べて、遅延束縛環境400における他の遅延束縛関数への依存性を特定する。次に、MATLAB(登録商標)コンパイラは、必要な遅延束縛関数を全て構成要素技術ファイル(CTF)アーカイブ410にパッケージ化し、又適切な初期束縛インターフェース関数408を生成する。CTFアーカイブは、ある構成要素に関連付けられている全ての実行可能な内容(すなわち、Mファイル又はMexファイル)を入れるためのものである。プログラム実行に必要な全情報の「スナップショット」が生成されるように、CTFアーカイブはアプリケーションが必要とする任意のデータファイルも含む。CTFアーカイブの内容は暗号化されている。
【００４０】
図5は、他の遅延束縛関数への依存性を特定するために実行されるステップを示したフローチャートである。一実施形態では、図5に示したステップは、関数呼び出しツリーの推移閉包を計算するために利用できる。それぞれが1つ又は複数の遅延束縛関数を含む一組の入力ファイルをユーザが与えることでこのプロセスは開始される(ステップ500)。MATLAB(登録商標)コンパイラは、ステップ500で一組の入力ファイルで与えられた遅延束縛関数それぞれを調べて、これら遅延束縛関数によってどの付加的な関数が呼び出されるかを特定する(ステップ502)。コンパイラは、コンパイル時に生成される関数呼び出しツリーを調べる。ステップ502で識別された各関数は、依存性データベースに明示的に記録された依存性を備えていることがある。このデータベースは、例えば、ある関数が適切に動作するためには1つ又は複数の付加的関数を必要とすることを示すことがある。依存性解析器はこれらの関数を必要な関数のリストに加える(ステップ504)。ステップ502及び504はこのリストに加える関数が無くなるまで繰り返される（ステップ506）。ステップ508では、幾つかの関数又は複数の関数グループがこのリストから明示的に排除される。こうして関数を排除するには多くの理由が考えられる。例えば、関数の排除は予め定めた事業上の理由に基づくことがあり、それには、特定のファイル又は関数がセキュリティ上の懸念及び知的財産保護のため最終的にデプロイしたアプリケーションで配布されないことなどがある。更に、不要と分かっている関数を偶然含めてしまわないように関数を排除することもある。依存性特定機構によっては内在する不正確さが原因となり、時としてこれら関数が必要な関数リスト（ステップ504）に不用意に含まれることがある。最後に、「遅延束縛モジュラー実行エンジン」は、当該遅延束縛モジュラー実行エンジンに関連付けられた、固定した基本の組の遅延束縛関数を典型的に含む。従って、この基本組の関数は実行エンジンがインストールされた全ての場所で利用可能であるため、これらの関数をデプロイしたアプリケーションに含める必要はない。この排除機構を用いれば、デプロイした最終アプリケーションはそのサイズがかなり小さくなり、ユーザによる取扱いがより容易となりうる。ユーザは、それぞれ依存性及び排除を明言するステップ504及び508で入力を与えることができる。更に、必要な関数のリストの管理は、部分的にせよ全体的にせよユーザの操作にまかせてもよい。
【００４１】
依存性解析器の出力が、アプリケーションを構成する遅延束縛関数の最終リストである。これら関数は入力データやスイッチなどのユーザ定義データと共にコンパイラにより使用され、どのインターフェース関数を生成すべきかと、これら生成された関数の形式とを決定する。
【００４２】
生成された初期束縛インターフェース関数408（図4）はオプションのユーザ作成初期束縛言語コード416及びデータ型作成API418と組み合わされ、初期束縛アプリケーション又は構成要素414を作成する。
【００４３】
実行時に、最終ユーザアプリケーション又は構成要素414はデータ型作成API418を呼び出して、外部環境内に含まれるデータから遅延束縛環境に互換性があるデータを作成する。本実施形態では、外部環境は初期束縛プログラミング環境である。次に、データ型作成API418は、この新たに作成したデータを最終ユーザアプリケーション又は構成要素414に識別する。当業者であれば理解するように、このデータ識別は「ハンドル」又は「プロキシ」を用いて行うことができる。
【００４４】
次に、最終ユーザアプリケーション又は構成要素414が初期束縛インターフェース関数408を呼び出し、するとこのインターフェース関数408がモジュラー遅延束縛実行エンジン420を呼び出す。初期束縛インターフェース関数408の名前に加え、外部環境データから作成された互換性データが次にモジュラー実行エンジン420に渡されて、モジュラー実行実行エンジン420はこのデータと関数名を組み合わせて（すなわち遅延束縛）CTFアーカイブ410に含まれた組から適切な関数を選択できる。すると、モジュラー遅延束縛実行エンジン420の結果は最終ユーザアプリケーション又は構成要素414に返される。
【００４５】
本発明の例示的な実施形態は、遅延束縛関数を初期環境から呼び出し可能とするデータ型を提供する。これらデータ型により、初期言語は遅延束縛言語に存在するデータ型を表すことができる。これらデータ型は、ユーザに与えられるインターフェースライブラリの一部でもよい。
【００４６】
更に、暗号化／復号スキーマをコンパイラ406の各呼び出しに関連付けることができる。一実施形態では、コンパイラが呼び出された後、一意の暗号化／復号キーが生成される。このキーは、米国政府が使用している先進暗号化規格(AES)のような利用可能な公開キー暗号化手段を用いて保護することができる。当業者であれば、本発明で使用するために容易に利用できる多数の代替的な暗号化／復号手段が存在することは理解するはずである。実行時に、一意のキーは復号され、CTFアーカイブで必要なファイルを復号するのに用いられる。一実施形態では、ファイルが復号されるのはそうしたファイルが必要となるときのみであり、それにより復号情報がディスクに記憶されないようにする。
【００４７】
こうした暗号化／復号スキームを使用することによって、アプリケーションをビルドする人物が開発したコードの保護が可能となる。CTFアーカイブで使用されるファイルは暗号化されているので、ファイルに含まれた内容を保護しつつファイルを共有又は配布可能である。例えば企業のトレードシークレットを含んだファイルは、このトレードシークレットがユーザに明かされないように、暗号化した様態で配布される。更に、アプリケーションで使用されるファイルは暗号化されているので、エンドユーザはプログラム実行に影響を与える様態でファイルを容易に変更できない。更に、ファイルはコンパイラが生成した一意のキーに基づいて暗号化且つ復号されるので、1つのアプリケーションで使用したファイルを別のアプリケーションで使用できない。最後に、生成された各アプリケーションを分析してどのコンパイラ・ライセンスキーがそのアプリケーションを生成したかを特定できるので、上述の暗号化／復号機構を使用して海賊版ソフトウェアを追跡できる。従って、コンパイラ・ライセンスキーが分かれば、そのライセンスキーを被許諾者のリストと相互参照してその海賊版ソフトウェアのソースを特定できる。
【００４８】
図6は、遅延束縛関数呼び出しを遅延束縛プログラミング環境600に組み込むのに必要な構成要素の例示的な実施形態である。1つの事例では、遅延束縛プログラミング環境はLISPプログラミング環境であり、遅延束縛関数はMATLAB(登録商標)関数である。こうした遅延束縛関数及び言語は例示目的のみで選ばれたもので、当業者であれば多数の代替的な遅延束縛関数及び言語が存在することは容易に理解するはずである。
【００４９】
図示した例では、遅延束縛関数がMATLAB(登録商標)関数であれば、MATLAB(登録商標)コンパイラが、遅延束縛環境600内の遅延束縛関数である遅延束縛インターフェース関数604及び606を生成する。実行時には、これらインターフェース関数604及び606はモジュラー遅延束縛実行エンジン602を使って遅延束縛関数を呼び出すのに用いられる。図6に更に示したように、遅延束縛インターフェース関数604及び606は複数の遅延束縛関数(608及び610を参照)の実行を引き起こすこともできる。１つの遅延束縛インターフェース関数が単一の遅延束縛関数に関連付けられている場合もありうるし、複数の遅延束縛関数が単一の遅延束縛インターフェース関数に関連付けられている場合もありうる。更に、インターフェース関数に与えられる1つ又は複数の入力タイプに基づいて、それぞれの呼び出しが、関連付けられた関数組内の異なる遅延束縛関数への呼び出しとなることもありうる。
【００５０】
一実施形態では、このインターフェース機構を、遅延束縛アプリケーションから呼び出し可能な関数を備えたアプリケーションプログラム・インタフェース(API)とすることができる。或いは、APIは、動作するのに2次プログラムを必要としない独立実行可能プログラムでもよい。更に、インターフェース関数はソフトウェア又はハードウェア構成要素でもよい。
【００５１】
モジュラー遅延束縛実行エンジン602は、遅延束縛環境内に存在する関数を実行時に実行する機構を提供する。MATLAB(登録商標)環境では、モジュラー遅延束縛実行エンジンは、Mファイル、MEXファイル、及び他のMATLAB実行可能内容を実行可能なMATLAB(登録商標)構成要素ランタイムエンジンでよい。本発明は、MATLAB(登録商標)アプリケーション及びMATLAB(登録商標)構成要素ランタイムエンジンのみに限定されるものでなく、多数の代替的な遅延束縛環境及び実行エンジンを用いて実施できる。
【００５２】
モジュラー遅延束縛実行エンジン602の構成によって、遅延束縛環境600における遅延束縛インターフェース関数呼び出し604又は606の実行に続き、モジュラー遅延束縛実行エンジン602はその実行を継続することで遅延束縛環境での後続の関数実行を容易に可能としてもよいし、終了することも可能である。
【００５３】
例を用いて本発明を説明してきたが、説明した実施形態の本発明の精神から逸脱しない範囲での修正及び変更は、通常の技能を備えた当業者には自明であろう。上述の実施形態の諸局面及び特徴は、互いに組み合わせて使用してもよい。上述の実施形態は単に例示的なものであり、いかなる意味でも限定的に解釈されるべきではない。本発明の範囲は、上述の記載からでなく添付の特許請求の範囲から判断すべきであり、特許請求の範囲に入る全ての変更及び等価物は、そこに包含するよう意図されている。
【図面の簡単な説明】
【００５４】
【図１】本発明の例示的な実施形態を実施するのに適した電子装置のブロック図である。
【図２】本発明の例示的な実施形態を実施するのに適した代表的なクライアント・サーバ環境であって、遅延束縛関数を外部プログラミング環境に組み込み可能なクライアント・サーバ環境を示す。
【図３】本発明の例示的な実施形態を実施するのに用いられる構成要素を示す。
【図４】例示的な実施形態の構成要素間の相互作用をより詳細に示す図式例である。
【図５】他の遅延束縛関数への依存性を特定するために実行されるステップを示したフローチャートである。
【図６】遅延束縛関数呼び出しを遅延束縛プログラミング環境に組み込む際に使用される必要な構成要素の例示的な実施形態である。
【図１】
0005412108.tif 000003
【図２】
0005412108.tif 000004
【図３】
0005412108.tif 000005
【図４】
0005412108.tif 000006
【図５】
0005412108.tif 000007
【図６】
0005412108.tif 000008