(57)【要約】【課題】分散処理プログラムの開発効率を向上させる。【解決手段】記憶部１１は、コードパターン１３と、処理要求に応じてシステム２１が特定の処理を実行するよう規定するプログラムの書式を示すテンプレート１４ａと、システム２１にネットワーク経由で処理要求を送信するプログラムの書式を示すテンプレート１４ｂとを記憶する。処理部１２は、プログラム１５を取得し、プログラム１５の中からコードパターン１３に該当する第１のコードを検出し、第１のコードおよびテンプレート１４ａを用いて、システム２１が第１のコードに対応する処理を実行するよう規定するプログラム１６ａを生成し、プログラム１５の中から第１のコードに依存する第２のコードを検出し、第２のコードおよびテンプレート１４ｂを用いて、システム２１と異なるシステム２２に実行させるプログラム１６ｂを生成する。【選択図】図１
2018190261.tif 000002
【特許請求の範囲】
【請求項１】
コードパターンと、処理要求に応じてシステムが特定の処理を実行するよう規定するプログラムの書式を示す第１のテンプレートと、前記システムにネットワーク経由で前記処理要求を送信するプログラムの書式を示す第２のテンプレートとを記憶する記憶部と、
第１のプログラムを取得し、前記第１のプログラムの中から前記コードパターンに該当する第１のコードを検出し、前記第１のコードおよび前記第１のテンプレートを用いて、前記システムが前記第１のコードに対応する処理を実行するよう規定する第２のプログラムを生成し、前記第１のプログラムの中から前記第１のコードに依存する第２のコードを検出し、前記第２のコードおよび前記第２のテンプレートを用いて、前記システムと異なる他のシステムに実行させる第３のプログラムを生成する処理部と、
を有する情報処理装置。
【請求項２】
前記処理部は更に、前記第２のプログラムを前記システムに送信するか、または、前記第２のプログラムに基づいて設定情報を前記システムに送信する、
請求項１記載の情報処理装置。
【請求項３】
前記記憶部は、前記システムにアクセスする権利を示す認証情報を記憶し、
前記第３のプログラムの生成では、前記処理部は、前記第２のテンプレートに基づいて前記認証情報を前記第３のプログラムに埋め込む、
請求項１記載の情報処理装置。
【請求項４】
前記記憶部は、前記コードパターンに対応付けて前記第１のテンプレートと優先度とを記憶し、他のコードパターンに対応付けて第３のテンプレートと他の優先度とを記憶し、
前記処理部は更に、前記第１のコードが前記コードパターンと前記他のコードパターンの両方に該当する場合、前記優先度と前記他の優先度とを比較し、前記優先度が前記他の優先度より高い場合に前記第１のテンプレートを優先的に使用する、
請求項１記載の情報処理装置。
【請求項５】
前記処理部は更に、前記第２のプログラムを前記システムに適用するとき、前記システムで実行される他の処理と重複しない識別情報を割り当て、前記第２のプログラムの中に記載された処理名称を前記識別情報を用いて書き換える、
請求項１記載の情報処理装置。
【請求項６】
前記コードパターンは変数の定義を示し、前記システムは前記処理要求に含まれるデータを保存するストレージサービスを提供する、
請求項１記載の情報処理装置。
【請求項７】
前記コードパターンは変数の値を用いた演算を示し、前記システムは前記処理要求で指定された関数を実行する関数実行サービスを提供する、
請求項１記載の情報処理装置。
【請求項８】
情報処理装置が実行する情報処理方法であって、
第１のプログラムを取得し、
前記第１のプログラムの中から所定のコードパターンに該当する第１のコードを検出し、処理要求に応じてシステムが特定の処理を実行するよう規定するプログラムの書式を示す第１のテンプレートと前記第１のコードとを用いて、前記システムが前記第１のコードに対応する処理を実行するよう規定する第２のプログラムを生成し、
前記第１のプログラムの中から前記第１のコードに依存する第２のコードを検出し、前記システムにネットワーク経由で前記処理要求を送信するプログラムの書式を示す第２のテンプレートと前記第２のコードとを用いて、前記システムと異なる他のシステムに実行させる第３のプログラムを生成する、
情報処理方法。
【請求項９】
コンピュータに、
第１のプログラムを取得し、
前記第１のプログラムの中から所定のコードパターンに該当する第１のコードを検出し、処理要求に応じてシステムが特定の処理を実行するよう規定するプログラムの書式を示す第１のテンプレートと前記第１のコードとを用いて、前記システムが前記第１のコードに対応する処理を実行するよう規定する第２のプログラムを生成し、
前記第１のプログラムの中から前記第１のコードに依存する第２のコードを検出し、前記システムにネットワーク経由で前記処理要求を送信するプログラムの書式を示す第２のテンプレートと前記第２のコードとを用いて、前記システムと異なる他のシステムに実行させる第３のプログラムを生成する、
処理を実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置、情報処理方法および情報処理プログラムに関する。
【背景技術】
【０００２】
近年、アプリケーションソフトウェアを実行する情報処理環境を自ら所有する代わりに、サービス事業者のもつ情報処理環境をネットワーク経由で利用することが増えている。ネットワーク経由で情報処理環境を利用させるサービスはクラウドサービスと言われることがある。クラウドサービスとして利用可能な情報処理環境には、プロセッサやメモリなどの計算ハードウェア、ローカルネットワーク、ＯＳ（Operating System）やデータベースなどの基盤ソフトウェア、セキュリティ機構などが含まれ得る。
【０００３】
クラウドサービスの種類には様々なものがある。例えば、物理マシンや仮想マシンなどの単位計算リソースを利用者に貸し出し、利用者が作成したアプリケーションプログラムをその単位計算リソース上で実行するサービスがある。また、利用者が作成した軽量プログラムを配備し、特定のイベントが発生したときに短時間だけ当該軽量プログラムを実行するサービスや、ネットワークから受信したデータを保存するサービスがある。
【０００４】
クラウドサービスは、利用者から予めプログラムや設定情報などを受け付け、利用者が望む処理をクラウドサービス側の情報処理環境で実行可能になるよう設定しておく。そして、クラウドサービスは、処理要求に応じて上記の設定された処理を実行する。クラウドサービスはＡＰＩ（Application Programming Interface）を提供しており、当該クラウドサービスの外部のプログラムからはＡＰＩを用いて処理を要求することができる。そのため、あるクラウドサービスと当該クラウドサービスの外部のプログラムとが連携するような分散処理ソフトウェアを開発することができる。あるクラウドサービスの外部のプログラムは別のクラウドサービスの中で実行されることもある。
【０００５】
なお、ソースコードをモデル検査ツール用の検査コードに変換する変換装置が提案されている。提案のソースコード変換装置は、ソースコードと変換ルールと処理時間や記憶容量の制約を示す非機能要件とを受け付ける。ソースコード変換装置は、ソースコードに変換ルールを適用して、非機能要件を満たすか否か検査するための検査コードを生成する。また、複数のクラウドサービスを組み合わせてアプリケーションを開発する際に、アプリケーション全体のサービス品質（ＱｏＳ：Quality of Service）が最適化されるようにクラウドサービスの組み合わせを選択する方法が提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】国際公開第２０１２／０５７１７０号
【非特許文献】
【０００７】
【非特許文献１】Anja Strunk, "QoS-Aware Service Composition: A Survey", Proc. of the 8th IEEE European Conference on Web Services (ECOWS), pp. 67-74, 2010年12月1日
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかし、クラウドサービスを利用する分散処理プログラムを直接記述する場合、断片的なプログラムや設定情報が複数の情報処理環境に分かれて配備されることになるため、全体の情報処理手順が理解しづらくなってしまう。また、クラウドサービスを利用するには、サービス事業者が規定する独自のＡＰＩや規約に従ってプログラムを記述することになる。このため、分散処理プログラムの開発効率が低くなるおそれがある。
【０００９】
１つの側面では、本発明は、分散処理プログラムの開発効率を向上させる情報処理装置、情報処理方法および情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、記憶部と処理部とを有する情報処理装置が提供される。記憶部は、コードパターンと、処理要求に応じてシステムが特定の処理を実行するよう規定するプログラムの書式を示す第１のテンプレートと、システムにネットワーク経由で処理要求を送信するプログラムの書式を示す第２のテンプレートとを記憶する。処理部は、第１のプログラムを取得し、第１のプログラムの中からコードパターンに該当する第１のコードを検出し、第１のコードおよび第１のテンプレートを用いて、システムが第１のコードに対応する処理を実行するよう規定する第２のプログラムを生成し、第１のプログラムの中から第１のコードに依存する第２のコードを検出し、第２のコードおよび第２のテンプレートを用いて、システムと異なる他のシステムに実行させる第３のプログラムを生成する。
【００１１】
また、１つの態様では、情報処理装置が実行する情報処理方法が提供される。また、１つの態様では、コンピュータに実行させる情報処理プログラムが提供される。
【発明の効果】
【００１２】
１つの側面では、分散処理プログラムの開発効率を向上できる。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態の情報処理装置を説明する図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】開発サーバのハードウェア例を示すブロック図である。
【図４】開発サーバの機能例を示すブロック図である。
【図５】環境設定管理テーブルの例を示す図である。
【図６】変換前プログラムと制約情報の例を示す図である。
【図７】変換前プログラムに対応する抽象構文木の例を示す図である。
【図８】変換ルールテーブルの例を示す図である。
【図９】変換ルールテーブルに含まれるテンプレート例を示す図である。
【図１０】変換後プログラムの例を示す図である。
【図１１】変換後プログラムに含まれるコンポーネント例を示す図である。
【図１２】実行状態管理テーブルの例を示す図である。
【図１３】インスタンスの配備例を示す図である。
【図１４】コンパイルサービスの手順例を示すフローチャートである。
【図１５】変換ルール適用の手順例を示すフローチャートである。
【図１６】起動サービスの手順例を示すフローチャートである。
【図１７】起動サービスの手順例を示すフローチャート（続き）である。
【発明を実施するための形態】
【００１４】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
第１の実施の形態を説明する。
【００１５】
図１は、第１の実施の形態の情報処理装置を説明する図である。
第１の実施の形態の情報処理装置１０は、システム２１，２２に適用される分散処理プログラムの開発を支援する。情報処理装置１０は、記憶部１１および処理部１２を有する。記憶部１１は、ＲＡＭ（Random Access Memory）などの揮発性の半導体メモリでもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性のストレージでもよい。処理部１２は、例えば、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサである。ただし、処理部１２は、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路を含んでもよい。プロセッサは、ＲＡＭなどのメモリ（記憶部１１でもよい）に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うこともある。
【００１６】
記憶部１１は、コードパターン１３、テンプレート１４ａ（第１のテンプレート）およびテンプレート１４ｂ（第２のテンプレート）を記憶する。コードパターン１３は、開発者が作成するプログラムの中に出現し得るコード（命令の集合）のうち、システム２１に実行させる処理に置換することが可能な処理を示すコードのパターンである。コードパターン１３は、テンプレート１４ａに対応付けて記憶されてもよい。
【００１７】
テンプレート１４ａは、処理要求に応じてシステム２１が特定の処理を実行するよう規定するプログラムの書式（雛形）を示す。テンプレート１４ａは、システム２１の設定を行うにあたってシステム２１特有のプログラム記載方法を採用していることがある。テンプレート１４ａは、例えば、システム２１に実行させるプログラムの書式や、システム２１に設定情報を送信するためのプログラムの書式などである。テンプレート１４ｂは、システム２１にネットワーク経由で処理要求を送信するプログラムの書式（雛形）を示す。テンプレート１４ｂは、システム２１に処理を実行させる処理要求を送信するにあたってシステム２１特有のプログラム記載方法を採用していることがある。
【００１８】
第１の実施の形態のシステム２１は、例えば、クラウドサービスを提供するクラウドシステムである。システム２１は、ネットワーク経由で受信した処理要求に応じて、予め設定されたプログラムや設定情報などを用いて処理を実行する。システム２１が実行可能な処理としては、ネットワークから受信したメッセージを処理するもの、ネットワークからの要求に応じて関数を実行するもの、ネットワークから受信したデータを保存するものなどが挙げられる。例えば、テンプレート１４ａが関数プログラムの書式を示し、テンプレート１４ｂが関数を呼び出すプログラムの書式を示す。また、例えば、テンプレート１４ａがデータ保存場所を設定するプログラムの書式を示し、テンプレート１４ｂがデータの書き込みや読み出しを要求するプログラムの書式を示す。
【００１９】
なお、システム２２が、他のクラウドサービスを提供する他のクラウドシステムであってもよい。その場合、テンプレート１４ｂは、システム２２が特定の処理を実行するよう規定するプログラムの書式を兼ねている。これにより、システム２１，２２の上の複数のクラウドサービスが連携するような分散処理プログラムを生成することができる。
【００２０】
処理部１２は、プログラム１５（第１のプログラム）を取得する。プログラム１５は、開発者が作成したものである。プログラム１５は、システム２１の設定やネットワーク経由での処理要求を意識せずに作成されたものであってよい。
【００２１】
処理部１２は、プログラム１５の中から、パターンマッチングによりコードパターン１３に該当するコード（第１のコード）を検出する。すると、処理部１２は、第１のコードとテンプレート１４ａとを用いてプログラム１６ａを生成する。プログラム１６ａは、第１のコードに対応する処理をシステム２１が実行するよう規定する。例えば、第１のコードから抽出した値をテンプレート１４ａの引数に代入することでプログラム１６ａが生成される。プログラム１６ａはシステム２１に適用される。例えば、プログラム１６ａがシステム２１に送信され、システム２１によってプログラム１６ａが実行される。また、例えば、プログラム１６ａが規定する手順に従って設定情報がシステム２１に送信される。
【００２２】
また、処理部１２は、プログラム１５の中から、第１のコードに依存する他のコード（第２のコード）を検出する。例えば、第１のコードが変数の定義を示す場合、第２のコードは変数への値の代入や変数の値を用いた演算などを示す。テンプレート１４ｂと対応付けて他のコードパターンを記憶部１１に記憶しておき、パターンマッチングにより第２のコードを検出するようにしてもよい。処理部１２は、第２のコードとテンプレート１４ｂとを用いてプログラム１６ｂを生成する。例えば、第２のコードから抽出した値をテンプレート１４ｂの引数に代入することでプログラム１６ｂが生成される。プログラム１６ｂは、システム２１と異なるシステム２２に適用される。例えば、プログラム１６ｂがシステム２２に送信され、システム２２によってプログラム１６ｂが実行される。
【００２３】
第１の実施の形態の情報処理装置１０によれば、プログラム１５からコードパターン１３に該当する第１のコードが検出され、テンプレート１４ａを用いて、システム２１上で第１のコードに対応する処理が実行されるよう規定するプログラム１６ａが生成される。また、プログラム１５から第１のコードに依存する第２のコードが検出され、テンプレート１４ｂを用いて、システム２１に処理を要求するプログラム１６ｂが生成される。
【００２４】
これにより、開発者はシステム２１，２２に適用される断片的なプログラムや設定情報を直接記述しなくてよく、全体の情報処理手順の理解が容易となり、全体の情報処理手順の定義に注力することができる。また、システム２１の設定やシステム２１に送信する処理要求に特有の書式を学習しなくてもよく、学習コストを低減することができる。よって、システム２１，２２を利用する分散処理プログラムの開発効率が向上する。
【００２５】
［第２の実施の形態］
次に、第２の実施の形態を説明する。
図２は、第２の実施の形態の情報処理システムの例を示す図である。
【００２６】
第２の実施の形態の情報処理システムは、複数のクラウドサービスを組み合わせることで実装されるアプリケーションソフトウェアの開発を支援する。情報処理システムは、クライアント３１、クラウドシステム４０および開発サーバ１００を含む。クライアント３１、クラウドシステム４０および開発サーバ１００は、ネットワーク３０に接続されている。ネットワーク３０は、例えば、インターネットなどの広域データ通信ネットワークである。なお、開発サーバ１００は、第１の実施の形態の情報処理装置１０に対応する。
【００２７】
クライアント３１は、アプリケーションソフトウェアを開発する開発者が使用するクライアントコンピュータである。クライアント３１は、ネットワーク３０を介して開発サーバ１００にアクセスし、開発サーバ１００と対話的にアプリケーションソフトウェアの開発を進める。また、クライアント３１は、開発したアプリケーションソフトウェアをクラウドシステム４０に配備するよう開発サーバ１００に指示する。例えば、クライアント３１にはＷｅｂブラウザがインストールされている。その場合、クライアント３１は、Ｗｅｂブラウザを通じて開発サーバ１００にアクセスし、開発者がＷｅｂブラウザ上でプログラムのソースコードを編集できるようにする。また、クライアント３１は、アプリケーションソフトウェアの配備をＷｅｂブラウザを通じて指示する。
【００２８】
開発サーバ１００は、クラウドシステム４０に配備可能なアプリケーションソフトウェアの開発を支援するサーバコンピュータである。特に、開発サーバ１００は、クラウドシステム４０によって提供される複数のクラウドサービスを連携させた分散処理ソフトウェアの開発を支援する。開発サーバ１００は、ネットワーク３０を介してクライアント３１から開発者の入力を受け付け、入力に応じてプログラムを作成して保存する。
【００２９】
このとき開発者は、複数のクラウドサービスを連携させるためのクラウドサービス特有の処理をプログラム中に直接記述しなくてよく、本質的な情報処理手順（コアロジック）の定義に注力することができる。すなわち、開発者は、コアロジックの全体が１つのコンピュータ上で閉じて実行されるようなプログラムを作成すればよい。開発サーバ１００は、開発者からの入力によって作成されたプログラムを、複数のクラウドサービスを組み合わせた分散処理ソフトウェア用のプログラム群に変換する。
【００３０】
開発サーバ１００は、クライアント３１から配備の指示を受け付ける。すると、開発サーバ１００は、変換後のプログラム群を用いて、そのアプリケーションソフトウェアから起動されるサービス実体（「サービスインスタンス」と言うことがある）を、クラウドシステム４０に配備する。サービスインスタンスを構成する複数のインスタンスが、クラウドシステム４０に含まれる複数のサーバコンピュータに分散して配備される。
【００３１】
インスタンスの中には、サーバコンピュータ上で予め起動して待機し、リクエストメッセージの受信などのイベント発生を待つものが含まれ得る。また、インスタンスの中には、イベント発生を契機として起動し、当該イベントに対する処理が完了すると破棄されるものが含まれ得る。サービスインスタンスの配備では、開発サーバ１００は、変換後プログラムをサーバコンピュータに送信し、当該サーバコンピュータに変換後プログラムを実行させるかまたは実行可能な状態に設定する場合がある。また、開発サーバ１００は、変換後プログラムに従って（例えば、変換後プログラムを実行して）、サービスインスタンスの設定を示す設定情報をサーバコンピュータに送信する場合がある。クラウドシステム４０のサーバコンピュータに対して変換後プログラムや設定情報を送信する方法は、利用するクラウドサービスの規約に従うことになる。
【００３２】
また、開発サーバ１００は、クライアント３１からサービスインスタンスの停止の指示を受け付けると、変換後のプログラム群を用いて、クラウドシステム４０にサービスインスタンスを停止させる。また、開発サーバ１００は、クライアント３１からサービスインスタンスの削除の指示を受け付けると、変換後のプログラム群を用いて、サービスインスタンスに関するデータをクラウドシステム４０から削除する。このように、クライアント３１が複数のクラウドサービスに対して個別に配備・停止・削除を指示しなくても、開発サーバ１００が全体の配備・停止・削除を一括で実行することができる。
【００３３】
クラウドシステム４０は、１つのクラウド事業者が保有する情報処理システムであり、例えば、データセンタに設置されている。図２では１つのクラウド事業者が保有する１つのクラウドシステムのみがネットワーク３０に接続されているが、複数のクラウド事業者が保有する複数のクラウドシステムがネットワーク３０に接続されていてもよい。
【００３４】
クラウドシステム４０は、ＰａａＳ（Platform as a Service）システム４１、ＦａａＳ（Function as a Service）システム４２およびストレージシステム４３を含む。ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３は、それぞれ１以上のサーバコンピュータを含む。ＰａａＳシステム４１は、利用者に対してＰａａＳサービスを提供する。ＦａａＳシステム４２は、利用者に対してＦａａＳサービスを提供する。ストレージシステム４３は、利用者に対してオブジェクトストレージサービスを提供する。このように、クラウドシステム４０は、種類の異なる複数のクラウドサービスを提供している。クラウドシステム４０は、データベースサービスやメッセージキューサービスなど他の種類のクラウドサービスを更に提供してもよい。
【００３５】
ＰａａＳシステム４１は、アプリケーションソフトウェアを実行する基盤となるプラットフォームを利用者に使用させる。プラットフォームには、例えば、ＣＰＵやメモリなどのハードウェア、ＯＳおよびミドルウェアが含まれる。利用者に使用させるプラットフォームは仮想マシンである場合がある。ＰａａＳシステム４１の利用者は、プラットフォーム上にアプリケーションプログラムを配備し、ＰａａＳシステム４１に当該アプリケーションプログラムを実行させる。
【００３６】
ＦａａＳシステム４２は、リクエストメッセージの受信やデータ更新などのイベント発生に応じて動的に「関数」を実行する。ＦａａＳの関数は比較的小規模な処理単位であり、比較的小さなプログラムによって実装される。ＦａａＳシステム４２の利用者は、予め関数のプログラムをＦａａＳシステム４２にアップロードしておく。ＦａａＳシステム４２は、イベントを検出すると、検出したイベントに対応する関数のプログラムをメモリにロードして関数を実行する。関数が終了するとその関数のプログラムをメモリから削除してもよい。このように、関数は予め起動して待機するものではなく、イベント発生に応じて自動的に起動して短時間だけ実行される。Ｗｅｂフックにより、ストレージシステム４３上のデータの更新を、関数が起動される契機となるイベントとすることもできる。
【００３７】
ストレージシステム４３は、キーバリュー形式でオブジェクトデータを保存する軽量の不揮発性ストレージシステムである。ストレージシステム４３の利用者は、「コンテナ」というデータ保存場所をストレージシステム４３に登録しておく。コンテナは、例えば、ディレクトリに対応する。ストレージシステム４３は、ネットワーク経由でコンテナにオブジェクトデータを書き込むためのＰＵＴ用のＡＰＩと、ネットワーク経由でコンテナからオブジェクトデータを読み出すためのＧＥＴ用のＡＰＩを提供する。ストレージシステム４３は、ＰＵＴ用のＡＰＩの呼び出しに応じてオブジェクトデータをコンテナに書き込み、ＧＥＴ用のＡＰＩの呼び出しに応じてオブジェクトデータをコンテナから読み出す。
【００３８】
なお、ＦａａＳシステム４２の関数とストレージシステム４３のコンテナの連携にあたり、ＦａａＳシステム４２がストレージシステム４３の更新を監視してもよいし、ストレージシステム４３がＦａａＳシステム４２にデータ更新を通知してもよい。
【００３９】
以下では、このようなＰａａＳサービス、ＦａａＳサービスおよびオブジェクトストレージサービスを組み合わせたアプリケーションソフトウェアの開発例を説明する。このアプリケーションソフトウェアは、ＰａａＳシステム４１がリクエストメッセージを受信したことを契機として、ＰａａＳシステム４１のプログラム、ＦａａＳシステム４２の関数およびストレージシステム４３のコンテナを連携させて情報処理を行うものである。
【００４０】
図３は、開発サーバのハードウェア例を示すブロック図である。
開発サーバ１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。クライアント３１も、開発サーバ１００と同様のハードウェアを用いて実装できる。また、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３に用いられるサーバコンピュータも、開発サーバ１００と同様のハードウェアを用いて実装できる。なお、ＣＰＵ１０１は、第１の実施の形態の処理部１２に対応する。ＲＡＭ１０２またはＨＤＤ１０３は、第１の実施の形態の記憶部１１に対応する。
【００４１】
ＣＰＵ１０１は、プログラムの命令を実行するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを含んでもよく、開発サーバ１００は複数のプロセッサを有してもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【００４２】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、開発サーバ１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【００４３】
ＨＤＤ１０３は、ＯＳやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、開発サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００４４】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、開発サーバ１００に接続されたディスプレイ１１１に画像を出力する。ディスプレイ１１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなど、任意の種類のディスプレイを用いることができる。
【００４５】
入力信号処理部１０５は、開発サーバ１００に接続された入力デバイス１１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１１２としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、開発サーバ１００に、複数の種類の入力デバイスが接続されていてもよい。
【００４６】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、磁気ディスク、光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤが含まれる。光ディスクには、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）が含まれる。
【００４７】
媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータを、ＲＡＭ１０２やＨＤＤ１０３などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、ＣＰＵ１０１によって実行される。なお、記録媒体１１３は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体１１３やＨＤＤ１０３を、コンピュータ読み取り可能な記録媒体と言うことがある。
【００４８】
通信インタフェース１０７は、ネットワーク３０に接続され、ネットワーク３０を介してクライアント３１、ＰａａＳシステム４１、ＦａａＳシステム４２、ストレージシステム４３などと通信を行うインタフェースである。通信インタフェース１０７は、例えば、スイッチやルータなどの通信装置とケーブルで接続される。
【００４９】
図４は、開発サーバの機能例を示すブロック図である。
開発サーバ１００は、環境設定記憶部１２１、プログラム記憶部１２２、変換ルール記憶部１２３、実行状態記憶部１２４、開発ＵＩ（User Interface）部１３１、コンパイル部１３２および起動制御部１３３を有する。環境設定記憶部１２１、プログラム記憶部１２２、変換ルール記憶部１２３および実行状態記憶部１２４は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域を用いて実装される。開発ＵＩ部１３１、コンパイル部１３２および起動制御部１３３は、例えば、プログラムを用いて実装される。
【００５０】
環境設定記憶部１２１は、クラウドシステム４０を利用するための設定を示す環境設定情報を記憶する。通常、ある開発者が作成したアプリケーションソフトウェアをクラウドシステム４０に配備するには、予め契約などによって当該開発者がクラウドシステム４０を利用する権利を有していることを要する。そこで、環境設定記憶部１２１は、開発者から入力された環境設定情報を記憶する。環境設定情報は、クラウドシステム４０の利用者を認証するための認証情報を含む。認証情報は、例えば、利用者ＩＤ・パスワード・アクセスキー・アクセストークン・クレデンシャルなどと呼ばれる各種の情報を含む。
【００５１】
同一のクラウド事業者が提供する複数のクラウドサービス、すなわち、クラウドシステム４０の複数のクラウドサービスは、同一の認証情報を用いて利用できる。ただし、同一のクラウド事業者が提供する異なるクラウドサービスに対して異なる認証情報が使用されてもよい。また、クラウドシステム４０以外のクラウドシステムが利用可能である場合、そのクラウドシステムに対応する環境設定情報が環境設定記憶部１２１に記憶される。
【００５２】
プログラム記憶部１２２は、開発者からの入力に応じて作成された変換前プログラムのソースコードを記憶する。また、プログラム記憶部１２２は、変換前プログラムから生成されたクラウドシステム４０用の変換後プログラム群を記憶する。また、プログラム記憶部１２２は、開発者から入力された制約情報を記憶する。制約情報は、変換後プログラムを生成するにあたって開発者から指定される要求や制約条件を示す。
【００５３】
変換ルール記憶部１２３は、単一サーバ用のプログラムをクラウドシステム４０用の分散処理プログラムに変換するための複数の変換ルールを記憶する。各変換ルールは、コードパターンやテンプレートを含む。テンプレートは、クラウドサービスを利用するための処理を引数を用いて記述したプログラムの雛形である。テンプレートの引数に、変換前プログラムから抽出した値や環境設定情報を代入することで、変換後プログラムを生成することができる。コードパターンは、変換前プログラムに含まれるどの様なコード（命令の集合）に対して当該テンプレートを適用可能かを示す。変換前プログラムの中のコードパターンに該当するコードが、テンプレートを用いてクラウド用に変換される。
【００５４】
実行状態記憶部１２４は、サービスインスタンスの実行状態を示す実行状態情報を記憶する。ある変換後プログラム群から１以上のサービスインスタンスを起動することができる。各サービスインスタンスにはユニークな識別情報が付与される。サービスインスタンスの実行状態は、未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）、停止中（ｔｅｒｍｉｎａｔｅｄ）および削除済み（ｒｅｍｏｖｅｄ）の何れかである。
【００５５】
開発ＵＩ部１３１は、クライアント３１に対してユーザインタフェースを提供し、クライアント３１から各種の入力を受け付ける。例えば、開発ＵＩ部１３１は、Ｗｅｂブラウザ上で表示される開発用Ｗｅｂページを示す画面情報をクライアント３１に送信し、そのＷｅｂページ上で入力されたデータをクライアント３１から受信する。開発ＵＩ部１３１は、クライアント３１に統合開発環境（ＩＤＥ：Integrated Development Environment）を提供していると言うことができ、そのＩＤＥをクラウドＩＤＥと言うこともできる。
【００５６】
開発ＵＩ部１３１は、クライアント３１から環境設定情報を受信し、受信した環境設定情報を環境設定記憶部１２１に保存する。また、開発ＵＩ部１３１は、クライアント３１からプログラムの入力を受け付け、プログラム記憶部１２２に記憶された変換前プログラムを更新する。また、開発ＵＩ部１３１は、クライアント３１からプログラム変換リクエストを受け付け、コンパイル部１３２にプログラム変換を指示する。また、開発ＵＩ部１３１は、クライアント３１から実行状態変更リクエストを受け付け、起動制御部１３３にサービスインスタンスの配備、停止または削除を指示する。
【００５７】
コンパイル部１３２は、プログラム変換サービス（コンパイラサービス）を提供する。図４では開発ＵＩ部１３１とコンパイル部１３２が共に開発サーバ１００に配置されているが、コンパイル部１３２を開発ＵＩ部１３１とは異なるサーバコンピュータに配置してもよい。コンパイル部１３２は、開発ＵＩ部１３１からの指示に応じて、単一サーバ用のプログラムをクラウドシステム４０用の分散処理プログラムに変換する。このとき、コンパイル部１３２は、プログラム記憶部１２２から変換前プログラムを読み出し、環境設定記憶部１２１および変換ルール記憶部１２３を参照して変換後プログラム群を生成し、生成した変換後プログラム群をプログラム記憶部１２２に保存する。
【００５８】
コンパイル部１３２は、ルールマッチング部１３４およびコード生成部１３５を有する。ルールマッチング部１３４は、変換前プログラムの中から、変換ルール記憶部１２３に記憶された変換ルールを適用可能なコードをパターンマッチングによって検出する。コード生成部１３５は、変換ルールのテンプレートに、検出されたコードから抽出した値や環境設定記憶部１２１に記憶された環境設定情報を適用して変換後プログラムを生成する。
【００５９】
起動制御部１３３は、サービスインスタンスの起動サービス（ランチャーサービス）を提供する。図４では開発ＵＩ部１３１と起動制御部１３３が共に開発サーバ１００に配置されているが、起動制御部１３３を開発ＵＩ部１３１とは異なるサーバコンピュータに配置してもよい。また、コンパイル部１３２と起動制御部１３３とが異なるサーバコンピュータに配置されてもよい。起動制御部１３３は、開発ＵＩ部１３１からの指示に応じて、プログラム記憶部１２２から変換後プログラム群を読み出し、変換後プログラム群を用いてサービスインスタンスの配備、停止または削除を実行する。また、起動制御部１３３は、実行状態記憶部１２４に記憶された実行状態情報を更新する。
【００６０】
新たなサービスインスタンスをクラウドシステム４０に配備する際には、起動制御部１３３は、当該サービスインスタンスに対してユニークなサービスインスタンスＩＤを付与する。また、起動制御部１３３は、クラウドシステム４０に配備された既存のサービスインスタンスと競合が生じないように、変換後プログラム群の中に記載されている関数名やコンテナ名などの構成要素名をユニークな名称に変換する。例えば、起動制御部１３３は、付与されたサービスインスタンスＩＤを含むように構成要素名を変換する。
【００６１】
サービスインスタンスの配備では、起動制御部１３３は、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３それぞれに対して、所定の規約に従って（例えば、所定のＡＰＩを用いて）作成リクエストを送信する。作成リクエストには、生成された変換後プログラムやその他の設定情報が含まれ得る。例えば、ＰａａＳシステム４１に対しては、プラットフォーム上で実行されるアプリケーションプログラムが送信され、ＦａａＳシステム４２に対しては、関数プログラムが送信される。
【００６２】
サービスインスタンスの停止では、起動制御部１３３は、ＰａａＳシステム４１およびＦａａＳシステム４２それぞれに対して、所定の規約に従って消去リクエストを送信する。これにより、ＰａａＳシステム４１およびＦａａＳシステム４２からサービスインスタンスに関する情報が消去される。停止状態のサービスインスタンスは再配備される可能性があるため、ストレージシステム４３に保存されたオブジェクトデータはまだ消去されない。サービスインスタンスの削除では、起動制御部１３３は、ストレージシステム４３に対して所定の規約に従って消去リクエストを送信する。これにより、ストレージシステム４３に保存されたオブジェクトデータが消去される。
【００６３】
図５は、環境設定管理テーブルの例を示す図である。
環境設定管理テーブル１４１は、環境設定記憶部１２１に記憶される。環境設定管理テーブル１４１は、クラウドシステム名および認証情報の項目を有する。クラウドシステム名の項目には、クラウドシステムの名称またはクラウド事業者の名称が登録される。図５の「Ａシステム」はクラウドシステム４０を示している。認証情報の項目には、開発者から入力された認証情報が登録される。図５では、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３が同一の認証情報によって利用可能であることを想定している。環境設定管理テーブル１４１には、複数のクラウドシステムの認証情報が登録されてもよく、異なる開発者から入力された認証情報が登録されてもよい。
【００６４】
認証に用いる情報の種類はクラウドシステムによって異なる。例えば、クラウドシステム４０について、アクセスキーＩＤが「ｘｘｘ」、秘密アクセスキーが「ｙｙｙ」、地域が「ｕｓ−ｗｅｓｔ−２」、アカウントＩＤが「１２３」という情報が登録される。
【００６５】
図６は、変換前プログラムと制約情報の例を示す図である。
プログラム１４２は、プログラム記憶部１２２に記憶される。プログラム１４２は、開発者からの入力によって作成された変換前プログラムである。図６ではプログラム１４２は、Ｎｏｄｅ．ｊｓ形式のサーバサイドスクリプトとして作成されている。
【００６６】
プログラム１４２は、ＨＴＴＰ（Hypertext Transfer Protocol）を用いた通信を制御するＥｘｐｒｅｓｓモジュールと、ＨＴＴＰリクエストからＰＯＳＴメソッドのデータを抽出するＢｏｄｙＰａｒｓｅｒモジュールを使用している。プログラム１４２によれば、ＴＣＰ（Transmission Control Protocol）の３０００番ポートでＨＴＴＰリクエストを待ち受け、ＵＲＬに「／ｃｓｖ」を含むＰＯＳＴメソッドのＨＴＴＰリクエストが受信されたときに関数「ａｐｐ．ｐｏｓｔ」を実行することになる。
【００６７】
「ａｐｐ．ｐｏｓｔ」では、ＨＴＴＰリクエストからデータ名とＣＳＶ（Comma Separated Value）形式テキストが抽出され、変数「ｃｓｖ」にデータ名と対応付けてＣＳＶ形式テキストが代入される。ＣＳＶ形式テキストから１行ずつカンマ区切り文字列が抽出されて変数「ｒｅｃｏｒｄ」に代入され、カンマを分割位置として当該カンマ区切り文字列が複数部分に分割される。そして、所定のメールアドレス宛てに電子メールが送信され、ＨＴＴＰリクエストに対応するＨＴＴＰレスポンスが返信される。
【００６８】
制約情報１４３は、プログラム記憶部１２２に記憶されている。制約情報１４３は、クライアント３１から受信された情報である。図６では制約情報１４３は、パラメータとして「ｒｕｎＯｎＤｅｍａｎｄ」と「ｓｃａｌａｂｌｅ」を含む。
【００６９】
「ｒｕｎＯｎＤｅｍａｎｄ」は、ＦａａＳサービスを利用するようにプログラムを変換するか否かを示すフラグである。図６では「ｒｕｎＯｎＤｅｍａｎｄ」がｔｒｕｅに設定されており、ＦａａＳサービスが利用されることになる。「ｓｃａｌａｂｌｅ」は、負荷に応じて自動的に並列度が変化するようにプログラムを変換するか否かを示すフラグである。図６では「ｓｃａｌａｂｌｅ」がｔｒｕｅに設定されている。よって、負荷が高いときは並列度を上げるスケールアウトが自動的に行われ、負荷が低いときは並列度を下げるスケールインが自動的に行われることになる。
【００７０】
なお、開発サーバ１００はクラウドシステム４０にアプリケーションソフトウェアを配備することを想定しているが、ユーザが配備先のクラウドシステムを選択できるようにしてもよい。制約情報１４３に配備先のクラウドシステムの名称を記載してもよい。
【００７１】
図７は、変換前プログラムに対応する抽象構文木の例を示す図である。
コンパイル部１３２は、プログラム１４２から変換後プログラム群を生成するにあたり、プログラム１４２を解析して抽象構文木１４４を生成する。抽象構文木１４４は、木構造に連結された複数のノードを含む。図７には、図６のプログラム１４２から生成されるノード群の一部を記載している。抽象構文木１４４は、ノード１４４ａ，１４４ｂ，１４４ｃ，１４４ｄ，１４４ｅ，１４４ｆ，１４４ｇ，１４４ｈ，１４４ｉを含む。
【００７２】
ノード１４４ａはルートノードである。ノード１４４ａはプログラム型であり、その配下に本文に関するノードが接続される。ノード１４４ｂはノード１４４ａ配下のノードである。ノード１４４ｂは宣言文型であり、「ｕｓｅ  ｓｔｒｉｃｔ」という命令を示している。ノード１４４ｃはノード１４４ｂ配下のノードである。ノード１４４ｃはリテラル型であり、「ｕｓｅ  ｓｔｒｉｃｔ」という文字列を示している。ノード１４４ｂ，１４４ｃは、図６のプログラム１４２の１行目に対応する。
【００７３】
ノード１４４ｄはノード１４４ａ配下のノードである。ノード１４４ｄは変数宣言型であり、その配下に変数宣言文に関するノードが接続される。ノード１４４ｅはノード１４４ｄ配下のノードである。ノード１４４ｅは変数宣言文型であり、その配下に変数名と初期値に関するノードが接続される。ノード１４４ｆはノード１４４ｅ配下のノードである。ノード１４４ｆは識別子型であり、「ｅｘｐｒｅｓｓ」という変数名を示している。ノード１４４ｇはノード１４４ｅ配下のノードである。ノード１４４ｇは呼び出し文型であり、その配下に関数名と引数に関するノードが接続される。
【００７４】
ノード１４４ｈはノード１４４ｇ配下のノードである。ノード１４４ｈは識別子型であり、「ｒｅｑｕｉｒｅ」という関数名を示している。ノード１４４ｉはノード１４４ｇ配下のノードである。ノード１４４ｉはリテラル型であり、「ｅｘｐｒｅｓｓ」という引数を示している。ノード１４４ｅ，１４４ｆ，１４４ｇ，１４４ｈ，１４４ｉは、図６のプログラム１４２の２行目に対応する。このように、プログラム１４２の字句解析や構文解析が行われ、プログラム１４２の構造を示す抽象構文木１４４が生成される。
【００７５】
図８は、変換ルールテーブルの例を示す図である。
変換ルールテーブル１４５は、変換ルール記憶部１２３に記憶される。変換ルールテーブル１４５には、配備先のクラウドシステム４０について、予め複数の変換ルールが登録されている。変換ルールテーブル１４５は、ルールＩＤ、ルール名、コードパターン、適用条件、テンプレートおよび優先度の項目を有する。
【００７６】
ルールＩＤの項目には、変換ルールを識別する識別情報が登録される。ルール名の項目には、変換ルールの特徴を表す名称が登録される。コードパターンの項目には、変換前プログラムに含まれるコードのうちテンプレートの適用対象とするコードの特徴が登録される。コードパターンは正規表現を用いて記載されてもよい。適用条件の項目には、テンプレートを適用する条件のうちコードパターン以外の条件が登録される。適用条件は、制約情報１４３に特定の値が記載されていることを含む場合がある。
【００７７】
テンプレートの項目には、引数を用いて記述された変換後プログラムの雛形が登録される。テンプレートの引数に値を代入することで、実行可能な変換後プログラムとなる。引数の値として、変換前プログラムから抽出される値や環境設定管理テーブル１４１に登録された認証情報が用いられることがある。図８では説明を簡単にするため、テンプレートをプログラム形式で記述していない。優先度の項目には、変換ルールの優先度が登録される。優先度は、例えば、高・中・低のように複数レベルで表現される。あるコードに対して複数の変換ルールのコードパターンが当てはまる場合、最も優先度の高い変換ルールのテンプレートが当該コードに対して優先的に適用される。
【００７８】
例えば、変換ルール１〜５が変換ルールテーブル１４５に登録される。変換ルール１は「ＲｕｎＯｎＳｅｒｖｅｒ」であり、抽象構文木の中のルートノードに対して適用される。変換ルール１は、サーバ実行環境上で呼び出されるサーバ関数の中でコード全体が実行されるように変換するテンプレートをもつ。変換ルール２は「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒ」であり、制約情報１４３に記載された「ｒｕｎＯｎＤｅｍａｎｄ」がｔｒｕｅである場合に、空の変数宣言に対して適用される。変換ルール２は、変数に対応するコンテナをストレージシステム４３に作成するテンプレートをもつ。
【００７９】
変換ルール３は「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」であり、ある変数に変換ルール２を適用済みである場合に、その変数に値を代入する代入文に対して適用される。変換ルール３は、変換ルール２で作成されるコンテナに値を書き込むためにＰＵＴ用のＡＰＩを呼び出すテンプレートをもつ。変換ルール３は変換ルール２に依存している。変換ルール４は「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒ」であり、ある変数の代入文に変換ルール３を適用済みである場合に、その代入文の後にその変数の値を用いた演算を行う文に対して適用される。変換ルール４は、ＦａａＳシステム４２用の関数を作成するテンプレートをもつ。変換ルール４は変換ルール３に依存している。
【００８０】
変換ルール５は「ＰａｒａｌｌｅｌｉｚｅＦｏｒＯｆ」であり、制約情報１４３に記載された「ｒｕｎＯｎＤｅｍａｎｄ」がｔｒｕｅかつ「ｓｃａｌａｂｌｅ」がｔｒｕｅである場合に、ｆｏｒ−ｏｆブロックに対して適用される。ｆｏｒ−ｏｆブロックはループ変数（ｉｔｅｒａｔｏｒ変数）を用いたループ処理を示す。変換ルール５は、ループ変数に対応するコンテナをストレージシステム４３に作成するテンプレートと、ループ処理に対応するＦａａＳシステム４２用の関数を作成するテンプレートをもつ。
【００８１】
図９は、変換ルールテーブルに含まれるテンプレート例を示す図である。
テンプレート１４５ａは、図８の変換ルール３に含まれるテンプレートである。テンプレート１４５ａは、引数として「ａｃｃｅｓｓＫｅｙＩｄ」、「ｓｅｃｒｅｔＡｃｃｅｓｓＫｅｙ」および「ｒｅｇｉｏｎ」を含む。この３つの引数は、環境設定管理テーブル１４１に登録されたアクセスキーＩＤ、秘密アクセスキーおよび地域に対応する。また、テンプレート１４５ａは、引数として「ｏｂｊｅｃｔ．ｎａｍｅ」、「ｐｒｏｐｅｒｔｙ．ｎａｍｅ」および「ｒｉｇｈｔ」を含む。この３つの引数は、変換前プログラムから抽出される変数名、キーおよび代入値に対応する。
【００８２】
テンプレート１４５ａによれば、アクセスキーＩＤや秘密アクセスキーを用いてクラウドシステム４０のストレージシステム４３にアクセスし、変数に対応するコンテナにキーバリュー形式のデータを書き込む変換後プログラムが得られる。
【００８３】
図１０は、変換後プログラムの例を示す図である。
プログラム１４６は、プログラム記憶部１２２に記憶される。プログラム１４６は、環境設定管理テーブル１４１、プログラム１４２およびテンプレート１４５ａから生成された変換後プログラムである。引数「ａｃｃｅｓｓＫｅｙＩｄ」に環境設定管理テーブル１４１の「ｘｘｘ」が代入されている。引数「ｓｅｃｒｅｔＡｃｃｅｓｓＫｅｙ」に環境設定管理テーブル１４１の「ｙｙｙ」が代入されている。引数「ｒｅｇｉｏｎ」に環境設定管理テーブル１４１の「ｕｓ−ｗｅｓｔ−２」が代入されている。また、引数「ｏｂｊｅｃｔ．ｎａｍｅ」にプログラム１４２の「ｃｓｖ」が代入されている。引数「ｐｒｏｐｅｒｔｙ．ｎａｍｅ」にプログラム１４２の「ｎａｍｅ」が代入されている。引数「ｒｉｇｈｔ」にプログラム１４２の「ｏｂｊｅｃｔ」が代入されている。
【００８４】
プログラム１４６によれば、アクセスキーＩＤ「ｘｘｘ」と秘密アクセスキー「ｙｙｙ」を用いてストレージシステム４３にアクセスし、変数「ｎａｍｅ」の値に対応付けて変数「ｏｂｊｅｃｔ」の値をコンテナ「ｃｓｖ」に書き込むことになる。このプログラム１４６は、例えば、ＰａａＳシステム４１に配備されて実行される。
【００８５】
図１１は、変換後プログラムに含まれるコンポーネント例を示す図である。
プログラム１４２から生成される変換後プログラム群によれば、アプリケーションソフトウェアはコンポーネント１４７ａ，１４７ｂ，１４７ｃ，１４７ｄ，１４７ｅを含む。
【００８６】
コンポーネント１４７ａは、ＨＴＴＰリクエストの受信に応じて一連の処理を開始するアプリケーションプログラムである。コンポーネント１４７ａは、「／ｃｓｖ」を含むＵＲＬを指定したＰＯＳＴメソッドのＨＴＴＰリクエストを受信するインタフェースと、このＨＴＴＰリクエストを処理する関数を含む。コンポーネント１４７ｂは、コンテナ名が「ｃｓｖ」であるコンテナである。コンポーネント１４７ｂは、データを書き込むＰＵＴ用のＡＰＩとデータを読み出すＧＥＴ用のＡＰＩをもつ。コンポーネント１４７ｃは、関数名が「ｓｐｌｉｔＣｓｖ」であるＦａａＳ用の関数である。コンポーネント１４７ｄは、コンテナ名が「ｒｅｃｏｒｄ」であるコンテナである。コンポーネント１４７ｄは、データを書き込むＰＵＴ用のＡＰＩとデータを読み出すＧＥＴ用のＡＰＩをもつ。コンポーネント１４７ｅは、関数名が「ｓｅｎｄＥｍａｉｌ」であるＦａａＳ用の関数である。
【００８７】
コンポーネント１４７ａは、ＰａａＳシステム４１で実行される。コンポーネント１４７ｃ，１４７ｅは、ＦａａＳシステム４２で実行される。コンポーネント１４７ｂ，１４７ｄは、ストレージシステム４３で実行される。コンポーネント１４７ａは、コンポーネント１４７ｂのＡＰＩを呼び出してデータを書き込む。データが書き込まれると、Ｗｅｂフックによりコンポーネント１４７ｃが起動する。コンポーネント１４７ｃは、コンポーネント１４７ｂのＡＰＩを呼び出してデータを読み出し、コンポーネント１４７ｄのＡＰＩを呼び出してデータを書き込む。データが書き込まれると、Ｗｅｂフックによりコンポーネント１４７ｅが起動する。コンポーネント１４７ｅは、コンポーネント１４７ｄのＡＰＩを呼び出してデータを読み出し、電子メールを送信する。
【００８８】
プログラム１４２からは、まず図８の変換ルール１が適用されてコンポーネント１４７ａが生成される。次に、プログラム１４２の「ｖａｒ  ｃｓｖ＝｛｝」に対して図８の変換ルール２が適用され、コンポーネント１４７ｂが生成される。次に、プログラム１４２の「ｃｓｖ［ｎａｍｅ］＝ｏｂｊｅｃｔ」に対して図８の変換ルール３が適用され、コンポーネント１４７ａがコンポーネント１４７ｂを呼び出すように更新される。
【００８９】
次に、プログラム１４２の「ｃｓｖ［ｎａｍｅ］．ｓｐｌｉｔ」に対して図８の変換ルール４が適用され、コンポーネント１４７ｃが生成される。次に、プログラム１４２の「ｆｏｒ（…ｒｅｃｏｒｄ  ｏｆ…）｛…｝」に対して図８の変換ルール５が適用され、コンポーネント１４７ｄ，１４７ｅが生成される。また、コンポーネント１４７ｃがコンポーネント１４７ｄを呼び出すように更新される。
【００９０】
図１２は、実行状態管理テーブルの例を示す図である。
実行状態管理テーブル１４８は、実行状態記憶部１２４に記憶される。実行状態管理テーブル１４８は、サービスインスタンスＩＤおよび実行状態の項目を有する。サービスインスタンスＩＤの項目には、サービスインスタンスを識別する識別情報が登録される。サービスインスタンスＩＤは、あるサービスインスタンスを最初に配備するときに、他のサービスインスタンスと重複しないように当該サービスインスタンスに対して付与される。
【００９１】
実行状態の項目には、サービスインスタンスの状態が登録される。実行状態は、未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）、停止中（ｔｅｒｍｉｎａｔｅｄ）および削除済み（ｒｅｍｏｖｅｄ）の何れかである。未配備は、サービスインスタンスがクラウドシステム４０に配備されたことがないことを示す。実行中は、サービスインスタンスがクラウドシステム４０に配備されて実行可能であることを示す。停止中は、サービスインスタンスは停止しているものの、データはまだ削除されておらず再配備が可能であることを示す。削除済みは、データが削除されて再配備が不能であることを示す。
【００９２】
図１３は、インスタンスの配備例を示す図である。
クラウドシステム４０には、サービスインスタンスの構成要素としてインスタンス１４９ａ，１４９ｂ，１４９ｃ，１４９ｄ，１４９ｅが形成される。インスタンス１４９ａはＰａａＳシステム４１で実行される。インスタンス１４９ｂ，１４９ｃはＦａａＳシステム４２で実行される。インスタンス１４９ｄ，１４９ｅはストレージシステム４３で実行される。インスタンス１４９ａはコンポーネント１４７ａから起動される。インスタンス１４９ｂはコンポーネント１４７ｃから起動される。インスタンス１４９ｃはコンポーネント１４７ｅから起動される。インスタンス１４９ｄはコンポーネント１４７ｂから起動される。インスタンス１４９ｅはコンポーネント１４７ｄから起動される。
【００９３】
インスタンス１４９ａは、ＨＴＴＰリクエストを受信すると処理を開始し、インスタンス１４９ｄにデータを送信する。インスタンス１４９ｂは、インスタンス１４９ｄがデータを保存すると処理を開始し、インスタンス１４９ｄからデータを受信し、インスタンス１４９ｅにデータを送信する。インスタンス１４９ｃは、インスタンス１４９ｅがデータを保存すると処理を開始し、インスタンス１４９ｅからデータを受信する。
【００９４】
開発サーバ１００がクライアント３１から配備リクエストを受信した場合、図１３のようにインスタンス１４９ａ，１４９ｂ，１４９ｃ，１４９ｄ，１４９ｅが形成される。ここでは、配備するサービスインスタンスのサービスインスタンスＩＤが「１２３」であるとする。すると、例えば、インスタンス１４９ｂの関数名が、サービスインスタンスＩＤを含むように「ｓｐｌｉｔＣｓｖ＿１２３」と変更される。また、インスタンス１４９ｃの関数名が、サービスインスタンスＩＤを含むように「ｓｅｎｄＥｍａｉｌ＿１２３」と変更される。また、インスタンス１４９ｄのコンテナ名が、サービスインスタンスＩＤを含むように「ｃｓｖ＿１２３」と変更される。また、インスタンス１４９ｅのコンテナ名が、サービスインスタンスＩＤを含むように「ｒｅｃｏｒｄ＿１２３」と変更される。
【００９５】
その後、開発サーバ１００がクライアント３１から停止リクエストを受信した場合、ＰａａＳシステム４１からインスタンス１４９ａが消去され、ＦａａＳシステム４２からインスタンス１４９ｂ，１４９ｃが消去される。ただし、ストレージシステム４３のインスタンス１４９ｄ，１４９ｅは、データを保持しておくため消去されない。その後、開発サーバ１００がクライアント３１から削除リクエストを受信した場合、ストレージシステム４３からインスタンス１４９ｄ，１４９ｅが消去される。
【００９６】
次に、開発サーバ１００の処理手順について説明する。
図１４は、コンパイルサービスの手順例を示すフローチャートである。
（Ｓ１０）コンパイル部１３２は、変換前プログラムと制約情報１４３を取得する。
【００９７】
（Ｓ１１）ルールマッチング部１３４は、字句解析や構文解析などにより変換前プログラムを解析して、変換前プログラムの構造を示す抽象構文木を生成する。
（Ｓ１２）ルールマッチング部１３４は、着目位置を抽象構文木のルートに移動する。
【００９８】
（Ｓ１３）ルールマッチング部１３４は、直近のステップＳ１２以降に行った、ルートから始まる深さ優先探索によって、抽象構文木に含まれる全てのノードを選択したか判断する。抽象構文木の全てのノードを選択した場合はステップＳ２０に処理が進み、未選択のノードがある場合はステップＳ１４に処理が進む。
【００９９】
（Ｓ１４）ルールマッチング部１３４は、現在の着目位置から深さ優先探索によって次のノードを選択し、選択したノードに着目位置を移動する。現在の着目位置がルートである場合、ルートノードを選択する。現在の着目位置が何れかのノードであり、そのノードの配下に子ノードが存在する場合、当該子ノードを選択する。現在の着目位置がルートノード以外のノードであり、そのノードの配下に子ノードが存在しない場合、未選択の子ノードが存在する親ノードまで着目位置を戻し、当該未選択の子ノードを選択する。
【０１００】
（Ｓ１５）ルールマッチング部１３４は、ステップＳ１４で選択したノードに対して、変換ルールテーブル１４５に登録されている全ての変換ルールを選択したか判断する。全ての変換ルールを選択した場合はステップＳ１９に処理が進み、未選択の変換ルールが存在する場合はステップＳ１６に処理が進む。
【０１０１】
（Ｓ１６）ルールマッチング部１３４は、変換ルールテーブル１４５に登録されている複数の変換ルールの中から未選択の変換ルールを１つ選択する。
（Ｓ１７）ルールマッチング部１３４は、ステップＳ１４で選択したノードが、ステップＳ１６で選択した変換ルールのコードパターンを満たすか判断する。また、ルールマッチング部１３４は、制約情報１４３やその他のプログラム変換状況が、ステップＳ１６で選択した変換ルールの適用条件を満たすか判断する。コードパターンと適用条件の両方を満たす場合はステップＳ１８に処理が進み、コードパターンと適用条件の少なくとも一方を満たさない場合はステップＳ１５に処理が進む。
【０１０２】
（Ｓ１８）ルールマッチング部１３４は、ステップＳ１６で選択した変換ルールを適用候補として選択する。そして、ステップＳ１５に処理が進む。
（Ｓ１９）コード生成部１３５は、ステップＳ１８で選択された適用候補のうちの１つを、ステップＳ１４で選択されたノードに対して適用して変換後プログラムを生成する。そして、ステップＳ１３に処理が進む。変換ルール適用の詳細は後述する。
【０１０３】
（Ｓ２０）ルールマッチング部１３４は、直近のステップＳ１２以降に行った深さ優先探索の間に、抽象構文木の１以上のノードに対して変換ルールが適用されたか判断する。変換ルールが適用されたノードがある場合、ルールマッチング部１３４は、ステップＳ１２に戻って抽象構文木の深さ優先探索を再実行する。変換ルールが適用されたノードがない場合、コンパイルサービスが終了する。
【０１０４】
図１５は、変換ルール適用の手順例を示すフローチャートである。
この変換ルール適用は、上記のステップＳ１９で実行される。
（Ｓ２１）コード生成部１３５は、着目するノードに対して選択された適用候補の変換ルールが１つ以上あるか判断する。適用候補の変換ルールがある場合はステップＳ２２に処理が進み、適用候補の変換ルールがない場合は変換ルール適用が終了する。
【０１０５】
（Ｓ２２）コード生成部１３５は、適用候補の変換ルールのうち最も優先度の高い変換ルールを選択する。適用候補が１つしかない場合はその変換ルールを選択すればよい。
（Ｓ２３）コード生成部１３５は、ステップＳ２２で選択した変換ルールに含まれるテンプレートの引数を特定する。コード生成部１３５は、着目するノードの中から、特定した引数に対応する値を抽出する。抽出する値としては、例えば、変換前プログラムで使用されている変数名や関数名などが挙げられる。また、コード生成部１３５は、抽出した値を、変換後プログラムの中でユニークな値になるように変更する。
【０１０６】
（Ｓ２４）コード生成部１３５は、環境設定管理テーブル１４１から、利用するクラウドシステム４０に対応する認証情報を読み出す。コード生成部１３５は、読み出した認証情報の中から、ステップＳ２３で特定した引数に対応する値を抽出する。
【０１０７】
（Ｓ２５）コード生成部１３５は、ステップＳ２３，Ｓ２４で抽出した値をテンプレートの引数に対して代入し、変換後プログラムを生成する。例えば、コード生成部１３５は、引数を示す所定の文字列を、ステップＳ２３，Ｓ２４で抽出した値に置換する。
【０１０８】
（Ｓ２６）コード生成部１３５は、ステップＳ２５で生成した変換後プログラムを、変換後プログラム群に挿入する。なお、１つの変換前プログラムから、複数のクラウドサービスを利用するための複数の断片的プログラムが生成され得る。
【０１０９】
図１６は、起動サービスの手順例を示すフローチャートである。
（Ｓ３０）開発ＵＩ部１３１は、実行状態変更リクエストを受信する。実行状態変更リクエストは、配備リクエスト、停止リクエストまたは削除リクエストである。
【０１１０】
（Ｓ３１）起動制御部１３３は、実行状態変更リクエストが指定するサービスインスタンスに対してサービスインスタンスＩＤが既に割り当てられているか判断する。配備されたことのない新規のサービスインスタンスに対してはサービスインスタンスＩＤが未割り当てである。既存のサービスインスタンスの再配備、停止または削除の際には、実行状態変更リクエストにサービスインスタンスＩＤが含まれていてもよい。サービスインスタンスＩＤが割り当て済みである場合はステップＳ３４に処理が進み、サービスインスタンスＩＤが未割り当てである場合はステップＳ３２に処理が進む。
【０１１１】
（Ｓ３２）起動制御部１３３は、新規のサービスインスタンスＩＤを生成し、生成したサービスインスタンスＩＤを実行状態管理テーブル１４８に登録する。
（Ｓ３３）起動制御部１３３は、ステップＳ３２のサービスインスタンスＩＤに対応する実行状態を未配備（ｎｏｎｅ）に初期化する。
【０１１２】
（Ｓ３４）起動制御部１３３は、実行状態を変更するサービスインスタンスに対応する変換後プログラム群から、ＦａａＳの関数名やコンテナ名などの構成要素名を検索する。起動制御部１３３は、他のサービスインスタンスと競合しないように、その構成要素名をユニークな名称に変更する。例えば、変換後プログラム群に記載された関数名やコンテナ名の末尾に、サービスインスタンスＩＤなどのリテラルを付加する。
【０１１３】
（Ｓ３５）起動制御部１３３は、受け付けた実行状態変更リクエストが配備リクエストであるか判断する。実行状態変更リクエストが配備リクエストである場合はステップＳ３６に処理が進み、それ以外の場合はステップＳ４０に処理が進む。
【０１１４】
（Ｓ３６）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が未配備（ｎｏｎｅ）または停止中（ｔｅｒｍｉｎａｔｅｄ）であるか判断する。実行状態が未配備または停止中である場合、ステップＳ３７に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が実行中（ｒｕｎｎｉｎｇ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ３９に処理が進む。
【０１１５】
（Ｓ３７）起動制御部１３３は、ステップＳ３４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３と通信し、サービスインスタンスをクラウドシステム４０に配備する。例えば、起動制御部１３３は、ＰａａＳシステム４１やＦａａＳシステム４２に実行させたい変換後プログラムを送信することがある。送信された変換後プログラムはすぐに実行される場合もあるし、所定のイベントが発生したときに実行される場合もある。また、起動制御部１３３は、変換後プログラムに規定された手順で設定情報を送信することがある。例えば、起動制御部１３３は、ストレージシステム４３にコンテナ名を含む設定情報を送信する。
【０１１６】
（Ｓ３８）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を実行中（ｒｕｎｎｉｎｇ）に変更する。そして、起動サービスが終了する。
（Ｓ３９）起動制御部１３３は、実行状態変更リクエストが拒否されたことを示すエラーメッセージを生成する。開発ＵＩ部１３１は、エラーメッセージを返信する。
【０１１７】
図１７は、起動サービスの手順例を示すフローチャート（続き）である。
（Ｓ４０）起動制御部１３３は、受け付けた実行状態変更リクエストが停止リクエストであるか判断する。実行状態変更リクエストが停止リクエストである場合はステップＳ４１に処理が進み、それ以外の場合はステップＳ４４に処理が進む。
【０１１８】
（Ｓ４１）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が実行中（ｒｕｎｎｉｎｇ）であるか判断する。実行状態が実行中である場合、ステップＳ４２に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備（ｎｏｎｅ）、停止中（ｔｅｒｍｉｎａｔｅｄ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ３９に処理が進む。
【０１１９】
（Ｓ４２）起動制御部１３３は、ステップＳ３４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３と通信し、クラウドシステム４０にサービスインスタンスを停止させる。起動制御部１３３は、変換後プログラムに規定された手順で設定情報を送信することがある。例えば、ＰａａＳシステム４１のアプリケーションやＦａａＳシステム４２の関数が消去される。
【０１２０】
（Ｓ４３）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を停止中（ｔｅｒｍｉｎａｔｅｄ）に変更する。そして、起動サービスが終了する。
（Ｓ４４）起動制御部１３３は、起動制御部１３３は、受け付けた実行状態変更リクエストが削除リクエストであるか判断する。実行状態変更リクエストが削除リクエストである場合はステップＳ４５に処理が進み、それ以外の場合は起動サービスが終了する。
【０１２１】
（Ｓ４５）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が停止中（ｔｅｒｍｉｎａｔｅｄ）であるか判断する。実行状態が停止中である場合、ステップＳ４６に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ３９に処理が進む。
【０１２２】
（Ｓ４６）起動制御部１３３は、ステップＳ３４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム４１、ＦａａＳシステム４２およびストレージシステム４３と通信し、クラウドシステム４０にサービスインスタンスを削除させる。例えば、ストレージシステム４３のコンテナが消去される。
【０１２３】
（Ｓ４７）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を削除済み（ｒｅｍｏｖｅｄ）に変更する。そして、起動サービスが終了する。
第２の実施の形態の情報処理システムによれば、コアロジック全体が１つのコンピュータ上で閉じて実行されるようなプログラムを開発者が作成すれば、そのプログラムから複数のクラウドサービスを利用し連携させるプログラム群が生成される。よって、開発者はクラウド事業者が独自に規定したＡＰＩや規約を学習しなくてもよく、学習コストを低減することができる。また、開発者は複数のクラウドサービスに分散する断片的なプログラムや設定情報を直接記述しなくてよく、コアロジックの定義に注力することができる。よって、複数のクラウドサービスを利用するアプリケーションソフトウェアの開発効率が向上する。また、複数のクラウドサービスに対するプログラムや設定情報の送信が、開発者に代わって開発サーバ１００によって一括して行われる。よって、開発者が個別にクラウドサービスにアクセスしなくてよく、サービスインスタンスの配備を効率化できる。
【符号の説明】
【０１２４】
１０  情報処理装置
１１  記憶部
１２  処理部
１３  コードパターン
１４ａ，１４ｂ  テンプレート
１５，１６ａ，１６ｂ  プログラム
２１，２２  システム
【図１】
2018190261.tif 000003
【図２】
2018190261.tif 000004
【図３】
2018190261.tif 000005
【図４】
2018190261.tif 000006
【図５】
2018190261.tif 000007
【図６】
2018190261.tif 000008
【図７】
2018190261.tif 000009
【図８】
2018190261.tif 000010
【図９】
2018190261.tif 000011
【図１０】
2018190261.tif 000012
【図１１】
2018190261.tif 000013
【図１２】
2018190261.tif 000014
【図１３】
2018190261.tif 000015
【図１４】
2018190261.tif 000016
【図１５】
2018190261.tif 000017
【図１６】
2018190261.tif 000018
【図１７】
2018190261.tif 000019