(57)【要約】【課題】文字列を出力する処理を効率化する。【解決手段】本発明のシステムは、複数の文字列出力命令を順次実行して複数の出力文字列を結合したテキストを出力するプログラムを取得し、プログラムの実行前に、文字列定数を出力する少なくとも一の文字列出力命令について、文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換し、プログラムの実行中に、２以上の文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のままバッファリングし、バッファリングされた２以上の文字列変数の変数値を第１コード体系から第２コード体系に一括して変換させ、文字コード体系を変換した文字列定数と、文字コード体系を変換した２以上の文字列変数の変数値とをテキストの少なくとも一部として出力させる。【選択図】図３
2008059279.tif 000002
【特許請求の範囲】
【請求項１】
文字列出力処理を最適化するシステムであって、
複数の文字列出力命令を順次実行して複数の出力文字列を結合したテキストを出力する出力プログラムを取得する取得部と、
前記出力プログラムの実行前に、文字列定数を出力する少なくとも一の前記文字列出力命令について、前記文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換する静的変換部と、
前記出力プログラムの実行中に、２以上の前記文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のままバッファリングする第１バッファと、
前記第１バッファにバッファリングされた前記２以上の文字列変数の変数値を前記第１コード体系から前記第２コード体系に一括して変換させる動的変換部と、
前記静的変換部が文字コード体系を変換した前記文字列定数と、前記動的変換部が文字コード体系を変換した前記２以上の文字列変数の変数値とを前記テキストの少なくとも一部として出力させる出力制御部と
を備えるシステム。
【請求項２】
第２コード体系に変換された文字列定数および文字列変数の変数値を、前記出力制御部により出力させるために一時的に格納する第２バッファを更に備え、
前記静的変換部は、
文字列定数を出力する文字列出力命令のそれぞれについて、出力される文字列の文字コード体系を前記出力プログラムの実行前に予め第２コード体系に変換するか否かを判断する判断部と、
文字コード体系を予め第２コード体系に変換する文字列出力命令を、予め第２コード体系に変換した文字列を前記第２バッファに追加する第２バッファリング命令に置換する第２置換部と
を有し、
前記動的変換部は、
前記第２バッファリング命令に変換されなかった複数の文字列出力命令のそれぞれを、出力すべき文字列を第１コード体系のまま前記第１バッファに追加する第１バッファリング命令に置換する第１置換部と、
前記出力プログラムの前記第２バッファリング命令より先に実行され、複数の前記第１バッファリング命令より後に実行される部分に、前記第１バッファに格納された複数の文字列を一括して第２コード体系に変換して前記第２バッファに追加する変換命令を挿入する命令挿入部と
を有する請求項１に記載のシステム。
【請求項３】
前記判断部は、文字列定数を出力する文字列出力命令のそれぞれについて、出力される文字列の文字数に基づいて、前記文字列定数の文字コード体系を予め変換するか否かを判断する
請求項２に記載のシステム。
【請求項４】
前記判断部は、文字列定数を出力する少なくとも一の前記文字列出力命令について、当該少なくとも一の文字列出力命令が他の文字列出力命令を含まずに連続して実行され、かつ、出力される文字の合計数が予め定められた基準値以上であることを条件に、出力される文字列の文字コード体系を予め変換すると判断する
請求項３に記載のシステム。
【請求項５】
前記判断部は、出力する文字列定数の合計の文字数が予め定められた基準値未満であって連続して実行される少なくとも１つの文字列出力命令が、文字列変数の変数値を出力する文字列出力命令の次に連続して実行され、かつ、文字列変数の変数値を出力する文字列出力命令に先立って連続して実行されることを条件に、出力される文字列の文字コード体系を前記出力プログラムの実行前に予め変換しないと判断する
請求項３に記載のシステム。
【請求項６】
前記取得部は、出力文字列としてタグ付き文書を出力する出力プログラムを取得し、取得した出力プログラムにおいて出力するべきとして指定された文字列から、終了タグと後続の開始タグとの間の空白およびタグ付き文書の表示に影響しないコメント部分を除外する
請求項１に記載のシステム。
【請求項７】
前記静的変換部は、
取得した前記出力プログラムのうち文字列出力命令および文字列出力命令を実行し得る関数の呼び出しを選択して、選択した文字列出力命令および関数の呼び出しについての制御フローグラフを生成するフローグラフ生成部を更に有し、
前記判断部は、前記制御フローグラフに基づいて、文字列定数を出力するそれぞれの文字列出力命令について、出力する文字列を前記出力プログラムの実行前に予め第２コード体系に変換するか否かを判断する
請求項２に記載のシステム。
【請求項８】
前記判断部は、
前記制御フローグラフにおけるそれぞれの基本ブロックについて、当該基本ブロック中で連続して実行される複数の文字列出力命令について、出力される文字列の合計の文字数に基づいて、文字コード体系を前記出力プログラムの実行前に予め変換するか否かを判断するブロック内判断部と、
出力される文字列の合計の文字数が予め定められた基準値よりも小さい文字列出力命令の集合であって基本ブロックの先頭または末尾で実行される文字列出力命令については、他の基本ブロックに含まれる文字列出力命令によって出力される文字数に更に基づいて、文字コード体系を前記出力プログラムの実行前に予め変換するか否かを判断するブロック間判断部と
を有する請求項７に記載のシステム。
【請求項９】
前記ブロック間判断部は、前記ブロック内判断部によっては文字コード体系を予め変換するか否かが定められていない文字列出力命令を含む基本ブロックを少なくとも１つ有するブロックグループについて、当該ブロックグループ内の複数の基本ブロックを順次経由する複数の実行パスのそれぞれの実行確率、および、それぞれの実行パスにおいて出力する文字列を予め変換した場合に向上する性能の見積もりに基づいて、当該ブロックグループ内の基本ブロックにおいて出力する文字列を予め変換するか否かを判断する
請求項８に記載のシステム。
【請求項１０】
前記判断部によって出力する文字列を予め変換しないと判断された文字列出力命令を含む実行パスのそれぞれについて、他の実行パスへの分岐または合流が無いと仮定したならば連続して出力する文字列の合計文字数が前記基準値を超えることを条件に、出力する文字列を予め変換して当該実行パスを実行させる命令列と、出力する文字列を予め変換せずに他の実行パスを実行させる命令列とを生成し、何れかの命令列を選択的に実行させる特殊化制御部を更に備える
請求項８に記載のシステム。
【請求項１１】
前記命令挿入部は、前記文字列出力命令を置換して生成したそれぞれの第２バッファリング命令の直前に実行される部分に、前記変換命令を挿入し、
前記第１バッファリング命令を含まずに連続して実行される複数の前記変換命令のうち、最初に実行される変換命令を除く他の変換命令を削除する冗長性削除部
を更に備える請求項２に記載のシステム。
【請求項１２】
前記冗長性削除部は、少なくとも何れか１つが前記変換命令を含む複数の実行パスが１つの実行パスに合流する場合において、合流した実行パスに前記変換命令が含まれることを条件に、合流した実行パスに含まれる前記変換命令を削除して、合流する前記複数の実行パスのうち前記変換命令を含まない実行パスに前記変換命令を挿入する
請求項１１に記載のシステム。
【請求項１３】
文字列出力処理を最適化する方法であって、
複数の文字列出力命令を順次実行して複数の出力文字列を結合したテキストを出力する出力プログラムを取得するステップと、
前記出力プログラムの実行前に、文字列定数を出力する少なくとも一の前記文字列出力命令について、前記文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換するステップと、
前記出力プログラムの実行中に、２以上の前記文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のままバッファリングするステップと、
バッファリングされた前記２以上の文字列変数の変数値を前記第１コード体系から前記第２コード体系に一括して変換させるステップと、
文字コード体系を変換した前記文字列定数と、文字コード体系を変換した前記２以上の文字列変数の変数値とを前記テキストの少なくとも一部として出力させるステップと
を備える方法。
【請求項１４】
文字列出力処理を最適化するシステムとして、情報処理装置を機能させる最適化プログラムであって、
前記情報処理装置を、
複数の文字列出力命令を順次実行して複数の出力文字列を結合したテキストを出力する出力プログラムを取得する取得部と、
前記出力プログラムの実行前に、文字列定数を出力する少なくとも一の前記文字列出力命令について、前記文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換する静的変換部と、
前記出力プログラムの実行中に、２以上の前記文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のままバッファリングする第１バッファと、
前記第１バッファにバッファリングされた前記２以上の文字列変数の変数値を前記第１コード体系から前記第２コード体系に一括して変換させる動的変換部と、
前記静的変換部が文字コード体系を変換した前記文字列定数と、前記動的変換部が文字コード体系を変換した前記２以上の文字列変数の変数値とを前記テキストの少なくとも一部として出力させる出力制御部と
して機能させる最適化プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、文字列出力処理を最適化する技術に関する。特に、本発明は、プログラム中に含まれる複数の文字列出力命令の実行を最適化する技術に関する。
【背景技術】
【０００２】
ＪＳＰ（Ｊａｖａ  Ｓｅｒｖｅｒ  Ｐａｇｅｓ）およびＰＨＰ（Ｈｙｐｅｒｔｅｘｔ  Ｐｒｏｃｅｓｓｏｒ）は、ウェブページとして表示させる文字列を動的に生成するための技術である。文字列を表示させるためのプログラムを予め作成してウェブサーバに設定しておくと、ウェブページ閲覧者の要求に応じてそのプログラムが実行され、閲覧者に適したウェブページがその都度動的に作成されて表示される。その内部動作は、設定されたプログラムがＪａｖａ（登録商標）言語などのプログラムに変換され、そのプログラムがコンパイルされて実行されるといった処理である。
【０００３】
Ｊａｖａの言語処理系で用いる文字の文字コード体系と、ウェブページとして表示される文字の文字コード体系とは異なる場合がある。例えば、Ｊａｖａにおいて文字列変数に格納する文字の文字コード体系はＵｎｉｃｏｄｅであり、ウェブページとして一般的なＳｈｉｆｔ  ＪＩＳコードとは異なっている。このため、Ｊａｖａプログラムにおいては、文字列操作をＵｎｉｃｏｄｅで行ったあとに、文字列出力時にその文字コード体系をＳｈｉｆｔ  ＪＩＳコードに変換する必要が生じる。このような、文字コード体系の変換処理は、頻繁に行うと処理の効率を低下させるおそれがある。
【０００４】
これに対し、文字コード体系の変換処理を効率化する技術が提案されている（特許文献１および非特許文献１を参照。）。非特許文献１の技術は、変換前の文字列と変換後の文字列とを対応付けてキャッシュしておくことで、同一文字列を次回に変換する場合には変換処理を省略してキャッシュの内容を出力することを内容とする。特許文献１の技術は、文字列定数を出力する文字列出力命令については、コンパイル時またはクラスロード時に予め変換を行い、プログラム実行中には変換処理を省略することを内容とする。また、通常のＪＳＰでは、プログラム中の文字列出力命令の毎に変換処理は行わず、ウェブページの１ページ分のテキストが確定してから一括して変換処理を行うことで、変換処理の回数を減らして処理を効率化している。
【０００５】
【特許文献１】特開２００５−３３２１４６号公報
【非特許文献１】ウェブマクロ、製品トップページ、ホームページＵＲＬ「ＨＴＴＰ：／／ｗｗｗ．ｗｅｂｍａｃｒｏ．ｏｒｇ／」
【発明の開示】
【発明が解決しようとする課題】
【０００６】
特許文献１および非特許文献１の技術は、文字列定数が多い場合には特に有効である。しかしながら、文字列変数の変数値を出力する命令が多い場合には、それらの命令を実行するたびに変換処理を行わなければならない場合が多く効率的ではなかった。さらに、特許文献１の技術によって文字列定数を予め変換した結果、プログラム実行中に変換すべき文字列が細分化され、通常のＪＳＰであれば一括して変換できる処理が複数の処理に分断される場合があった。この場合、変換処理には、文字数が少ない場合であっても一定の時間がかかるため、変換処理の回数が増加してプログラムの実行効率を低下させてしまうおそれがあった。
【０００７】
そこで本発明は、上記の課題を解決することのできるシステム、方法およびプログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００８】
上記課題を解決するために、本発明においては、文字列出力処理を最適化するシステムであって、複数の文字列出力命令を順次実行して複数の出力文字列を結合したテキストを出力するプログラムを取得する取得部と、プログラムの実行前に、文字列定数を出力する少なくとも一の文字列出力命令について、文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換する静的変換部と、プログラムの実行中に、２以上の文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のままバッファリングする第１バッファと、第１バッファにバッファリングされた２以上の文字列変数の変数値を第１コード体系から第２コード体系に一括して変換させる動的変換部と、静的変換部が文字コード体系を変換した文字列定数と、動的変換部が文字コード体系を変換した２以上の文字列変数の変数値とをテキストの少なくとも一部として出力させる出力制御部とを備えるシステムを提供する。また、当該システムとして情報処理装置を機能させるプログラムおよび方法を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明を実施するための最良の形態】
【０００９】
以下、発明を実施するための最良の形態（以下、実施形態と称す）を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【００１０】
図１は、情報システム１０の全体構成を示す。情報システム１０は、コンパイル部３０と、ランタイム部７０とを備える。コンパイル部３０は、テキストを出力するための出力プログラム２０を取得し、出力プログラム２０をコンパイルすることによりコンパイル済プログラム６０を生成する。出力プログラム２０は、例えば、ＪＳＰ（Ｊａｖａ  Ｓｅｒｖｅｒ  Ｐａｇｅｓ）や（Ｈｙｐｅｒｔｅｘｔ  Ｐｒｏｃｅｓｓｏｒ）などで記述されたプログラムであり、コンパイル部３０は、このプログラムをＪＳＰコンパイラやＪａｖａｃコンパイラでコンパイルすることによってＪａｖａのバイトコードを生成してもよい。生成されたコンパイル済プログラム６０はランタイム部７０に対し出力される。
【００１１】
ランタイム部７０は、コンパイル済プログラム６０を、予め設定されたランタイムライブラリを用いて実行することにより、ウェブページ９０を生成する。ランタイム部７０は、必要に応じて、実行時コンパイルの技術により、Ｊａｖａのバイトコードであるコンパイル済プログラム６０を機械語に更にコンパイルしてもよい。コンパイル済プログラム６０の実行により生成されたウェブページ９０は、ウェブページの閲覧者に対し出力される。
本実施の形態に係る情報システム１０は、このようなテキストを出力するためのプログラムにおいて、内部処理用の文字コード体系と出力用の文字コード体系とが異なっている場合に、文字コード体系を変換する処理を効率化することを目的とする。
【００１２】
図２ａは、出力プログラム２０の一例を示す。出力プログラム２０は、ＨＴＭＬ（Ｈｙｐｅｒ  Ｔｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）のテキストを出力するためのＪＳＰプログラムである。具体的には、出力プログラム２０は、＜ｏｌ＞タグの出力を指示する文字列出力命令２００を１行目に含み、＜／ｏｌ＞タグの出力を指示する文字列出力命令２３０を５行目に含む。また、出力プログラム２０は、繰返しの制御命令を２行目に含み、＜ｌｉ＞タグの出力を指示する文字列出力命令２１０を３行目先頭に含み、バックエンドのビジネスロジックに応じた動的テキストを生成する文字列出力命令２２０を３行目後尾に含む。動的テキストとは、プログラムを実行しないと内容の定まらない文字列であり、典型的には、文字列変数の変数値として与えられる文字列である。
【００１３】
図２ｂは、出力プログラム２０に基づき生成されたサーブレットプログラムの第１例を示す。出力プログラム２０は実行に際しＪａｖａ言語のサーブレットプログラムにコンパイルされる。例えば、図２ａの文字列出力命令２００は、３行目に示すｏｕｔ．ｗｒｉｔｅ（"＜ｏｌ＞"）にコンパイルされる。ｏｕｔとは、ＪＳＰＷｒｉｔｅｒクラスのインスタンスを示す変数であり、その実体は２行目に示すコンストラクタによって生成されている。また、ｗｒｉｔｅとは、ＪＳＰＷｒｉｔｅｒクラスのメソッドであり、内部処理用の第１コード体系の文字列を格納するｃｈａｒ型の変数を引数とし、その文字コード体系を変換して出力する機能を有する。
【００１４】
同様に、図２ａの文字列出力命令２１０は、５行目に示すｏｕｔ．ｗｒｉｔｅ（"＜ｌｉ＞"）にコンパイルされ、文字列出力命令２２０は、６行目に示すｏｕｔ．ｗｒｉｔｅ（動的テキスト）にコンパイルされる。動的テキストの部分には、実際には、データベースサーバその他のサーバに対し変数ｉを用いて問い合わせを行い、その結果を文字列データとして取得するメソッド呼び出しが記述される。この部分はプログラムの目的に応じて様々な記述となり得る。また、文字列出力命令２３０は、８行目に示すｏｕｔ．ｗｒｉｔｅ（"＜／ｏｌ＞"）にコンパイルされる。
【００１５】
本実施形態に係るコンパイル部３０は、出力プログラム２０を、このようなサーブレットプログラムにコンパイルすることもできる。しかし、このサーブレットプログラムが実行されると、動的テキストのみならず文字列定数についても、文字列出力処理に対応した文字コード体系の変換が必要となり、変換すべき文字の文字数が多く効率が悪い。例えば、５行目のｏｕｔ．ｗｒｉｔｅにより出力される文字列定数＜ｌｉ＞は、１００回繰り返して出力され、その出力に対応して文字コード体系が変換される。つまり、＜ｌｉ＞の４文字分を１００回であるから、４００文字分の変換処理が行われる。しかし、この文字列定数はプログラムの実行前に予め定まるものであるから、一度文字コード体系を変換してしまえばその変換結果をその後再利用できるはずであり、効率が悪い。
【００１６】
図２ｃは、出力プログラム２０に基づき生成されたサーブレットプログラムの第２例を示す。第２例において、図２ａの文字列出力命令２００は、７行目に示すｏｕｔ．ｗｒｉｔｅ（ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ１）にコンパイルされる。ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ１は、ｂｙｔｅ型の変数であり、その内容は１行目で生成されている。１行目の命令は、文字列定数＜ｏｌ＞の文字コード体系を内部処理用の第１コード体系から出力用の第２コード体系に変換して、ｂｙｔｅ型の変数に代入する処理を示す。また、ｗｒｉｔｅとは、図２ｂの例と同様にＪＳＰＷｒｉｔｅｒクラスのメソッドであるが、図２ｂの例とは異なり、引数としてｂｙｔｅ型の変数をとる。そして、このメソッドｗｒｉｔｅは、引数として与えられた変数の内容を、文字コード体系を変換することなくそのまま出力する。
【００１７】
同様に、図２ａの文字列出力命令２１０は、９行目に示すｏｕｔ．ｗｒｉｔｅ（ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ２）にコンパイルされる。ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ２は、ｂｙｔｅ型の変数であり、その内容は２行目で生成されている。２行目の命令は、文字列定数＜ｌｉ＞の文字コード体系を内部処理用の第１コード体系から出力用の第２コード体系に変換して、ｂｙｔｅ型の変数に代入する処理を示す。また、図２ａの文字列出力命令２３０は、１２行目に示すｏｕｔ．ｗｒｉｔｅ（ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ３）にコンパイルされる。ｔｅｍｐｌａｔｅ＿ｔｅｘｔ＿ａｒｒａｙ３は、ｂｙｔｅ型の変数であり、その内容は３行目で生成されている。３行目の命令は、文字列定数＜／ｏｌ＞の文字コード体系を内部処理用の第１コード体系から出力用の第２コード体系に変換して、ｂｙｔｅ型の変数に代入する処理を示す。
このように、文字列定数については文字コード体系の変換を初めに１回だけ行っておけば、変換すべき文字の文字数が少なくて効率的である。
【００１８】
また、図２ａの文字列出力命令２２０は、１０行目に示すｏｕｔ．ｗｒｉｔｅ（動的テキスト）にコンパイルされる。この動的テキストの内容は、プログラムを実行するまで分からないから、予め文字コード体系を変換しておくことはできない。したがって、このメソッドｗｒｉｔｅは、図２ｂの例と同様にｃｈａｒ型の変数を引数とし、実行の度に文字コード体系を第２コード体系に変換して出力する。
本実施形態に係るコンパイル部３０は、出力プログラム２０を、このようなサーブレットプログラムにコンパイルすることもできる。しかしながら、このサーブレットプログラムが実行されると、文字コード体系の変換の回数が多く効率が悪い場合がある。例えば、１０行目に示す命令によって、文字コード体系の変換は１００回行われる。仮に９行目の出力文字列が静的に変換されていなかったとすれば、９行目の出力文字列と１０行目の出力文字列とを一括して変換でき、さらには、前回のループによって出力されるべき文字列と今回のループによって出力されるべき文字列とを結合して一括して変換できるので、変換処理の回数は１００回未満に低減し得る。文字コード体系の変換には、変換対象の文字の文字数のみならず、変換処理の回数に応じて時間がかかるから、図２ｃのプログラムでは効率が悪く、文字列定数の事前変換による効率化の影響を相殺して、却って処理効率を低下させてしまう場合がある。
これに対し、本実施形態に係る情報システム１０は、変換の対象となる文字の数のみならず変換処理の回数をもバランスよく減少させ、出力プログラム２０の実行効率を向上させることができる。以下、その詳細について説明する。
【００１９】
図３は、コンパイル部３０の機能構成を示す。コンパイル部３０は、中央処理装置による演算処理や実行順序の制御処理によって実現され、取得部３００と、静的変換部３１０と、動的変換部３２０とを有する。取得部３００は、出力プログラム２０を取得する。出力プログラム２０は、例えば、出力文字列としてタグ付き文書、例えばＨＴＭＬ文書などを出力するプログラムであってよい。この場合、取得部３００は、取得した出力プログラム２０において出力するべきとして指定された文字列から、終了タグとその後続の開始タグとの間にある空白を除外してもよい。さらに、取得部３００は、タグ付き文書の表示に影響しないコメント部分を除外してもよい。
【００２０】
静的変換部３１０は、取得した出力プログラム２０の実行前に、文字列定数を出力する少なくとも一の文字列出力命令について、文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換する。具体的には、静的変換部３１０は、そのようなコード体系の変換を行うための命令を、出力プログラム２０の冒頭部分に挿入してもよい。なお、「出力プログラム２０の実行前」とは、最適化前の出力プログラム２０に記述されていた処理の開始前という意味であり、実行前に行うべき命令はコンパイル済プログラム６０に挿入されてもよいし、コンパイル済プログラム６０の実行開始前（例えばクラスロード時など）にランタイム部７０により実行されてもよい。さらに、静的変換部３１０は、そのような命令によってコード体系が変換された文字列定数を出力するために命令を出力プログラム２０中に生成してもよい。静的変換部３１０による処理済の出力プログラム２０は動的変換部３２０に対し出力される。
【００２１】
動的変換部３２０は、プログラムの実行中に、２以上の文字列出力命令が出力すべき２以上の文字列変数の変数値を第１コード体系のまま第１バッファ７１２にバッファリングさせる。また、動的変換部３２０は、第１バッファ７１２にバッファリングされた２以上の文字列変数の変数値を第１コード体系から第２コード体系に一括して変換させる。ここで、一括した変換の処理とは、複数の文字列を結合した文字列について、少なくともその文字列の個数未満の回数の変換処理によって、望ましくは１回の変換処理によって、文字コード体系を変換することをいう。具体的には、動的変換部３２０は、文字列変数の変数値を第１バッファ７１２にバッファリングさせる第１バッファリング命令を出力プログラム２０中に生成してもよいし、第１バッファ７１２中の文字列を第２コード体系に変換させる変換命令を出力プログラム２０中に挿入してもよい。命令が生成・挿入された出力プログラム２０は、コンパイル済プログラム６０としてランタイム部７０に対し出力される。
【００２２】
図４は、静的変換部３１０の機能構成を示す。静的変換部３１０は、フローグラフ生成部４００と、判断部４１０と、第２置換部４２０とを有する。フローグラフ生成部４００は、取得した出力プログラム２０のうち文字列出力命令および文字列出力命令を実行し得る関数の呼び出しを選択して、選択した文字列出力命令および関数の呼び出しについての制御フローグラフを生成する。判断部４１０は、この制御フローグラフに基づいて、文字列定数を出力するそれぞれの文字列出力命令について、出力する文字列を出力プログラム２０の実行前に予め第２コード体系に変換するか否かを判断する。具体的には、判断部４１０は、ブロック内判断部４１２およびブロック間判断部４１５を有する。
【００２３】
ブロック内判断部４１２は、制御フローグラフにおけるそれぞれの基本ブロックについて、当該基本ブロック中で連続して実行される複数の文字列出力命令について、出力される文字列の合計の文字数に基づいて、文字コード体系を出力プログラム２０の実行前に予め変換するか否かを判断する。ここでの判断は、文字列変数を出力する文字列出力命令が文字列定数を出力する文字列出力命令を含まずに連続して複数実行される場合において、連続するこれらの文字列定数の合計の文字の数に基づく。
【００２４】
より詳細には、いま、文字コード体系の変換処理１回には、どんなに文字の数が少なくとも、文字Ｈ個分の変換処理に要する時間を要するとすると、Ｈ個に満たない文字の変換のために文字コード体系の変換処理を行うのは効率が悪い。従って、Ｈ個未満の文字の変換については、それが例え文字列定数の変換であっても、他の文字と結合して一括して変換する機会を利用するために、プログラム実行前にはコード変換しない方が望ましい場合がある。一方で、Ｈ個以上の文字の変換については、プログラムの実行中に行えばその文字数に応じた時間がかかってしまうので、それが文字列定数であれば、プログラムの実行前に変換することが望ましい。したがって、ブロック内判断部４１２は、文字列定数を出力する文字列出力命令が、文字列変数を出力する文字列出力命令を含まずに連続して複数実行される場合において、それらによって出力される文字の数が予め定められた基準値Ｈ以上であれば、それらそれぞれの文字列定数の文字コード体系を出力プログラム２０の実行前に予め変換すると判断する。文字の個数がＨ未満であれば、ブロック内判断部４１２は、それぞれの文字列定数の文字コード体系を出力プログラム２０の実行前には変換しないと判断する。
【００２５】
ブロック間判断部４１５は、出力される文字列の合計の文字数が予め定められた基準値よりも小さい文字列出力命令の集合であって基本ブロックの先頭または末尾で実行される文字列出力命令については、他の基本ブロックに含まれる文字列出力命令によって出力される文字数に更に基づいて、文字コード体系を出力プログラム２０の実行前に予め変換するか否かを判断する。例えば、ブロック間判断部４１５は、当該基本ブロックが他の複数の基本ブロックのそれぞれと連続して実行される確率を見積もったうえで、当該基本ブロックと他の複数の基本ブロックのそれぞれとが連続して実行された場合に連続して出力される文字列定数の文字の数を算出し、算出した確率および当該文字の数に基づき連続する文字列定数の文字の数の期待値を算出する。当該期待値が基準値Ｈ以上であれば、ブロック間判断部４１５は、文字コード体系を予め変換すると判断し、当該期待値が基準値Ｈ未満であれば、文字コード体系を変換しないと判断する。
【００２６】
第２置換部４２０は、文字コード体系を予め第２コード体系に変換すると判断された文字列出力命令を、第２バッファリング命令に置換する。第２バッファリング命令とは、出力プログラム２０の実行中に文字列を後述の第２バッファ７１５に追加する命令である。また、第２バッファ７１５とは、第２コード体系に変換された文字列定数および文字列変数の変数値を一括して変換して出力制御部７１０により出力させるために一時的に格納するものである。
【００２７】
図５は、動的変換部３２０の機能構成を示す。動的変換部３２０は、第１置換部５００と、命令挿入部５１０とを有する。第１置換部５００は、第２バッファリング命令に変換されなかった複数の文字列出力命令のそれぞれを第１バッファリング命令に置換する。第２バッファリング命令に変換されなかった文字列出力命令には、出力する定数文字列の文字数が基準値Ｈ未満の文字列出力命令の他、文字列変数の変数値を出力する文字列出力命令が含まれる。また、第１バッファリング命令とは、出力プログラム２０の実行中に第１バッファ７１２に文字列を追加する命令である。
【００２８】
命令挿入部５１０は、出力プログラム２０の第２バッファリング命令よりも先に実行され、複数の第１バッファリング命令より後に実行される部分に、変換命令を挿入する。変換命令とは、第１バッファ７１２に格納された複数の文字列を一括して第２コード体系に変換して第２バッファ７１５に追加する変換命令である。即ち、変換前の文字列は、既に変換された文字列の出力が必要となるまで第１バッファ７１２に順次追加され、その後一括して変換されて第２バッファ７１５に変換される。これにより、文字列の出力順序を保持しつつも、できるだけ多くの文字列を第１バッファ７１２に蓄積して一括して変換することで、変換の回数を減少させることができる。
【００２９】
図６ａは、コンパイル済プログラム６０の一例を示す。コンパイル済プログラム６０は、実際には、Ｊａｖａ言語のバイトコードなどの命令コード列であったり、ＰＨＰの中間コードなどのバイナリデータであるが、図６ａには、説明の都合上、その意味を示す擬似コードを示す。第２置換部４２０は、図２ａの文字列出力命令２００を、７行目の第２バッファリング命令６１０に置換する。第２バッファリング命令６１０は、１行目で既に文字コード体系の変換された文字列を第２バッファ７１５に追加する命令である。また、第１置換部５００は、図２ａの文字列出力命令２１０を、９行目の第１バッファリング命令６２０に置換する。第１バッファリング命令６２０は、出力するべき文字列＜ｌｉ＞を、変換前の第１コード体系のまま第１バッファ７１２に追加する命令である。また、第１置換部５００は、図２ａの文字列出力命令２２０を、１０行目の第１バッファリング命令６３０に置換する。第１バッファリング命令６３０は、出力プログラム２０の実行中に定まる動的テキストを、変換前の第１コード体系のまま第１バッファ７１２に追加する命令である。また、第２置換部４２０は、図２ａの文字列出力命令２３０を、１２行目の第２バッファリング命令６４０に置換する。第２バッファリング命令６４０は、３行目で既に文字コード体系の変換された文字列を第２バッファ７１５に追加する命令である。また、この第２バッファリング命令６４０は、変換命令としての役割も果たす。これについては図６ｂを参照して説明する。
【００３０】
図６ｂは、コンパイル済プログラム６０の実行に伴い呼び出されるランタイムプログラムの一例を示す。ランタイムプログラムもまた、実際には、Ｊａｖａ言語のバイトコードなどの命令コード列であったり、バイナリデータであってよいが、図６ｂにはその意味を示す擬似コードを示す。１行目から４行目は、ｃｈａｒ型の変数、即ち変換前の文字列を引数にとるメソッドｗｒｉｔｅを示す。５行目から８行目は、ｂｙｔｅ型の変数、即ち変換後の文字列を引数にとるメソッドｗｒｉｔｅを示す。即ち、図６ａの第２バッファリング命令６１０および第２バッファリング命令６４０は、５行目から８行目に示すメソッドを呼び出し、図６ａの第１バッファリング命令６２０および第１バッファリング命令６３０は、１行目から４行目に示すメソッドを呼び出す。１行目から４行目に示すメソッドは、呼び出されると、第１バッファ７１２を表す変数ｃｈａｒＢｕｆｆｅｒに対し、引数ｓｔｒで与えられる文字列を追加し（２行目）、第１バッファ７１２の長さを示す変数ｃｂ＿ｉｎｄｅｘを増加させる（３行目）。
【００３１】
一方で、５行目から８行目に示すメソッドは、呼び出されると、変換命令であるメソッドｆｌｕｓｈＣＢを呼び出した後に、第２バッファリング命令であるメソッドｗｒｉｔｅＢＢを呼び出す。１３行目から２１行目は、メソッドｆｌｕｓｈＣＢを示す。１４行目において、第１バッファ７１２が空でないと判断されると、１７行目から１９行目が実行される。１７行目では、第１バッファ７１２中の文字列が第２コード体系に変換され、変換結果は、第２バッファ７１５を示す変数ｂｙｔｅＢｕｆｆｅｒの要素ｂｂ＿ｉｎｄｅｘ番目以降に格納される。１８行目において、第２バッファ７１５の長さを示す変数ｂｂ＿ｉｎｄｅｘが増加され、１９行目において第１バッファ７１２の長さを示すｃｂ＿ｉｎｄｅｘが０にリセットされる。また、９行目から１２行目は、メソッドｗｒｉｔｅＢＢを示す。このメソッドは、呼び出されると、第２バッファ７１５を示す変数ｂｙｔｅＢｕｆｆｅｒに対し、引数ａｒｒａｙで与えられる文字列を追加し（１０行目）、第２バッファ７１５の長さを示す変数ｂｂ＿ｉｎｄｅｘを増加させる。
このように、ｂｙｔｅ型の変数を引数にとるメソッドｗｒｉｔｅは、第１変数のバッファリングの前に変換命令を実行するので、第１バッファリング命令および変換命令のそれぞれの役割を果たす。
【００３２】
図７は、コンパイル済プログラム６０の実行に伴う第１バッファ７１２の状態遷移を示す。第１バッファ７１２が空の状態において、第２バッファリング命令が実行されると、文字列は第２バッファ７１５に追加されるので第１バッファ７１２は空のままで状態遷移しない。第１バッファ７１２が空の状態において、第１バッファリング命令が実行されると、文字列が第１バッファ７１２に追加され、第１バッファ７１２は空でない状態に遷移する。第１バッファ７１２が空でない状態において、第１バッファリング命令が実行されると、第１バッファ７１２に対して文字列が更に追加されるので、状態遷移しない。第１バッファ７１２が空でない状態において、変換命令および第２バッファリング命令が実行されると、第１バッファ７１２に格納された文字列が一括して変換されて第２バッファ７１５に追加され、さらに第２バッファ７１５に対し第２バッファリング命令による変換後の文字列が追加される。そして、第１バッファ７１２は空の状態に遷移する。
【００３３】
図８は、ランタイム部７０の機能構成を示す。ランタイム部７０は、実行時コンパイル部７００と、出力制御部７１０と、第１バッファ７１２と、第２バッファ７１５とを有する。ランタイム部７０は、コンパイル済プログラム６０を取得して実行するものであり、Ｊａｖａ言語でいうバーチャルマシンおよびクラスライブラリの役割を果たす。ランタイム部７０は、コンパイル済プログラム６０をインタプリタにより実行してもよいし、実行時コンパイラによって実行してもよいが、図８では実行時コンパイラとして機能する実行時コンパイル部７００を有するものとする。ランタイム部７０は、このほかに、クラスライブラリによって実現される出力制御部７１０を有し、クラスライブラリの実行中や実行前にメモリ内に確保される領域である第１バッファ７１２および第２バッファ７１５を有する。
【００３４】
実行時コンパイル部７００は、冗長性削除部７０６および特殊化制御部７０８を有し、また、コンパイラの最適化技術として一般的なその他の機能を有する。実行時コンパイル部７００が、インライン展開などの最適化処理を行った後に、冗長性削除部７０６は、第１バッファリング命令を間に含まずに連続して実行される複数の変換命令のうち、最初に実行される変換命令を除く他の変換命令を削除する。例えば、図６ｂに示したように、図６ｂの６行目の変換命令は変換済み文字列の出力の度に毎回実行される。しかしながら、変換命令は第１バッファ７１２が空では実行する意味が無く、変換済みの文字列定数が連続して出力される場合には初回以外は無駄となる。冗長性削除部７０６は、このような冗長な変換命令を削除する。さらに、冗長性削除部７０６は、部分冗長性の削除技術によって、冗長な変換命令を削除してもよい。
【００３５】
特殊化制御部７０８は、コンパイル済プログラム６０中の複数の実行パスの中から、他の実行パスへの分岐または合流が無いと仮定したならば連続して出力する文字列の合計文字数が基準値を超える実行パスを検出する。そして、特殊化制御部７０８は、検出されたその実行パスのみを実行する命令列を選択して、その命令列中の文字列定数の文字コード体系をコンパイル済プログラム６０の実行前に予め変換する。そして、特殊化制御部７０８は、選択したその命令列と、他のそれぞれの実行パスを実行する命令列とを生成し、所定の条件判断によりそれら何れかの命令列を選択的に実行させるように制御する。実行時コンパイル部７００は、その他、実行時コンパイラとして一般的な最適化を行ってもよい。
【００３６】
出力制御部７１０は、図６ｂに示すランタイムプログラムなどによって実現され、文字列の出力処理を制御する。具体的には、出力制御部７１０は、文字列変数の変数値、および、予め変換されなかった文字列定数を、対応する文字列出力命令を実行する度に第１バッファ７１２に格納する。また、出力制御部７１０は、変換命令の実行に応じ、第１バッファ７１２に格納された文字列の文字コード体系を変換して第２バッファ７１５に格納する。そして、出力制御部７１０は、静的変換部３１０が文字コード体系を変換した文字列定数と、動的変換部３２０が文字コード体系を変換した２以上の文字列変数の変数値とを、所定のタイミングによって第２バッファ７１５から取り出して出力する。所定のタイミングとは、例えば、ウェブページのページごとであってもよいし、第２バッファ７１５のデータサイズが所定の上限値に達するごとであってもよい。
【００３７】
図９は、ウェブページ９０の一例を示す。コンパイル済プログラム６０が実行された結果、ＨＴＭＬ文書であるウェブページ９０が出力される。ウェブページ９０は、１行目に開始タグである＜ｏｌ＞を含み、２行目からＸ行目までのそれぞれに＜ｌｉ＞タグおよび動的テキストを含む。動的テキストは、例えば、データベースサーバからプログラム実行時に検索された企業名データおよび価格データである。そして、ウェブページ９０は、Ｘ＋１行目に終了タグである＜／ｏｌ＞を含む。
【００３８】
図１０は、出力プログラム２０がコンパイルされて実行される処理のフローチャートを示す。コンパイル部３０は、出力プログラム２０をコンパイルし、必要に応じて文字列出力命令の置換および変換命令の挿入を行う（Ｓ１０００）。ランタイム部７０は、出力プログラム２０をコンパイルしたコンパイル済プログラム６０を実行することにより、文字列であるウェブページなどを出力する（Ｓ１０１０）。
【００３９】
図１１は、Ｓ１０００における処理のフローチャートを示す。取得部３００は、出力プログラム２０を取得し、取得した出力プログラム２０において出力するべきとして指定された文字列から、終了タグと後続の開始タグとの間にある空白等を除外する（Ｓ１１００）。空白に加えて、タブなどのＨＴＭＬのタグに影響しない制御文字を除外してもよい。さらに、取得部３００は、＜！−−で始まり−−＞で終わるＨＴＭＬのコメント部分を除外してもよい。
【００４０】
次に、静的変換部３１０は、出力プログラム２０の実行前に文字列定数を出力する少なくとも一の文字列出力命令について、文字列定数の文字コード体系を、内部処理用の第１コード体系から出力用の第２コード体系に変換する（Ｓ１１１０）。文字コード体系の事前変換の対象となる文字列定数は、変換対象となる文字列の文字数などに応じて選択される。次に、動的変換部３２０は、第１バッファ７１２にバッファリングされた２以上の文字列変数の変数値を第１コード体系から第２コード体系に一括して変換させるべく、出力プログラム２０を変更する（Ｓ１１２０）。例えば、動的変換部３２０は、第１バッファ７１２に文字列を追加する命令を生成し、第１バッファ７１２中の文字列の文字コード体系を一括して変換する変換命令を挿入する。
【００４１】
図１２は、Ｓ１１１０における処理のフローチャートを示す。フローグラフ生成部４００は、取得した出力プログラム２０のうち文字列出力命令および文字列出力命令を実行し得る関数の呼び出しを選択して、選択した文字列出力命令および関数の呼び出しについての制御フローグラフを生成する（Ｓ１２００）。図１３から図１５までを参照して、制御フローグラフを生成するための処理を説明する。
【００４２】
図１３は、生成される制御フローグラフの一例を示す。フローグラフ生成部４００は、図１３左に示す出力プログラム２０の制御構造を解析して、図１３右に示す制御フローグラフを生成する。この制御フローグラフにおいて、各ノードが基本ブロックを示し、各辺が制御の流れを示す。制御フローグラフを生成するためには、例えば、フローグラフ生成部４００は、ＪＳＰなどで記述された出力プログラム２０を一旦Ｊａｖａ言語にコンパイルした後に、コンパイルされたそのプログラムをＪａｖａ言語用のフロー解析器で解析することにより、右図の制御フローグラフを生成してもよい。
【００４３】
この制御フローグラフを生成するために、まず、フローグラフ生成部４００は、文字列出力命令、および、文字列出力命令を実行し得る関数の呼び出しを含む基本ブロックを選択し、選択されなかった基本ブロックを取り除く。そして、フローグラフ生成部４００は、取り除いた基本ブロックの入辺と出辺とを接続する。また、フローグラフ生成部４００は、選択した基本ブロックの中から、制御の分岐に影響する命令、文字列出力命令、および、文字列出力命令を実行し得る関数の呼び出しのみを選択し、他の命令を取り除く。このようにして図１３右の制御フローグラフが生成される。グラフ中で、文字列定数を出力する文字列出力命令をＴＴと表し、文字列変数の変数値を出力する文字列出力命令をＤＴと表す。続いて、フローグラフ生成部４００は、解析を容易にするべく制御フローグラフを簡略化する。
【００４４】
図１４は、制御フローグラフの簡略化の第１例を示す。図１４左の関数呼び出しは、呼び出し先においてＤＴ命令が実行されるか否か不明である。このため、フローグラフ生成部４００は、この関数呼び出しを、ＤＴ命令を実行する実行パスとＤＴ命令を実行しない実行パスとを有する制御の流れに変換する。変換後の制御フローグラフを図１４右に示す。これに代えて、フローグラフ生成部４００は、呼び出し先の関数を静的に定められる場合においては、呼び出し先の関数をインライン展開することにより、正確な制御フローグラフを生成してもよい。
【００４５】
図１５は、制御フローグラフの簡略化の第２例を示す。呼び出し先の関数において、ＤＴ命令が高頻度で実行されることが解析できる場合には、フローグラフ生成部４００は、関数呼び出しをＤＴ命令に置換して、図１５右に示す制御フローグラフを生成してもよい。このような近似的な制御フローグラフを用いれば、制御フローグラフの構造を単純化してその後の判断を迅速に行うことができる。
【００４６】
図１２に戻る。続いて、ブロック内判断部４１２は、制御フローグラフにおけるそれぞれの基本ブロックについて、基本ブロック内の局所的な構造の解析により、当該基本ブロック中の文字列定数の文字コード体系を出力プログラム２０の実行前に予め変換するか否かを判断する（Ｓ１２１０）。この判断の詳細を、図１６を参照して説明する。
図１６は、ブロック内判断部４１２による判断結果の一例を示す。Ｓ１２００の処理によって、各基本ブロックでは複数の文字列出力命令が連続して配列されることとなっている。この様子を図１６左に示す。ブロック内判断部４１２は、まず、それぞれの文字列出力命令を、実行順に先頭側から走査することで、文字列定数を出力する命令（ＴＴ命令）を検出する。ＴＴ命令が検出されると、ブロック内判断部４１２は、そのＴＴ命令に連続する全てのＴＴ命令を選択する。即ち、これらの命令によって出力される文字列定数は、間に文字列変数の変数値を含むことなく、連続して出力される文字列の一部ずつを構成する。そして、ブロック内判断部４１２は、これら全てのＴＴ命令によって出力される文字列定数の文字の数の合計を算出する。
【００４７】
ブロック内判断部４１２は、算出した文字の数の合計が、基準値Ｈ以上か否かを判断する。そして、ブロック内判断部４１２は、出力される文字の合計数が基準値Ｈ以上であることを条件に、出力される文字列の文字コード体系を予め変換すると判断する。例えば、図１６の左図において、先頭のＴＴ命令は、文字列定数としてＨ以下の数の文字を出力する。このため、ブロック内判断部４１２は、このＴＴ命令については、出力される文字列の文字コード体系を予め変換するとは判断しない。先頭から３番目に実行されるＴＴ命令についても同様である。一方で、先頭から５番目に実行されるＴＴ命令は、６番目および７番目のＴＴ命令と連続して実行され、出力文字列の合計数は基準値Ｈ以上である。このため、ブロック内判断部４１２は、これらそれぞれのＴＴ命令について、出力される文字列の文字コード体系を予め変換すると判断する。
【００４８】
また、ブロック内判断部４１２は、出力する文字列定数の合計の文字数が予め定められた基準値未満であって連続して実行される少なくとも１つの文字列出力命令が、文字列変数の変数値を出力する文字列出力命令の次に連続して実行され、かつ、文字列変数の変数値を出力する文字列出力命令に先立って連続して実行されることを条件に、出力される文字列の文字コード体系を出力プログラム２０の実行前に予め変換しないと判断する。例えば、先頭から３番目に実行されるＴＴ命令は、２番目と４番目のＤＴ命令と連続しているので、文字コード体系を予め変換しないと判断される。
【００４９】
判断結果に基づく置換結果を図１６右に示す。先頭から３番目のＴＴ命令は、第１バッファリング命令に置換されている。同じＴＴ命令であっても、先頭から５番目から７番目までに連続するそれぞれのＴＴ命令は、第２バッファリング命令に置換されている。また、先頭のＴＴ命令は、何れの条件にも当てはまらないので、未確定のまま保持される。判断結果は、ブロック内判断部４１２によってメモリ中に保持される。
なお、図１６の説明において「連続する」とは、図１３から図１５を参照して説明した制御フローグラフにおいて連続するという意味であり、出力プログラム２０において連続して実行するように記述されていたという意味ではない。即ち、「連続する」とは、条件分岐命令、合流命令、および、文字列出力命令のみに着目した場合に連続して実行されることを意味する。
【００５０】
図１２に戻る。続いて、ブロック間判断部４１５は、出力される文字列の合計の文字数が予め定められた基準値よりも小さい文字列出力命令の集合であって基本ブロックの先頭または末尾で実行される文字列出力命令については、他の基本ブロックに含まれる文字列出力命令によって出力される文字数に更に基づいて、文字コード体系を出力プログラム２０の実行前に予め変換するか否かを判断する（Ｓ１２２０）。この判断の具体例を図１７を参照して説明する。
【００５１】
図１７は、ブロック間判断部４１５による判断の対象となる制御フローグラフの一例を示す。この時点で、判断結果が未確定なＴＴ命令は、ＤＴ命令または第２バッファリング命令に挟まれ、制御の合流点または分岐点を必ず通過するか、あるいは、制御の合流点または分岐点に隣接することとなっている。図１７では、既に第２バッファリング命令に置換すると判断されたＴＴ命令も他のＴＴ命令と区別せず、ＴＴ命令と表記するが、ブロック間判断部４１５は、既に判断済みのＴＴ命令について判断を変更することはせず、判断が未確定のＴＴ命令について判断を行うこととする。
【００５２】
まず、ブロック間判断部４１５は、ＴＴ命令を連続して含むそれぞれの実行パスを、互いに非連結な複数のグループＧに分類する。なお、ここでいうグループＧとは、本発明に係るブロックグループの一例であり、ブロック内判断部４１２によっては文字コード体系を予め変換するか否かが定められていない文字列出力命令を含む基本ブロックを少なくとも１つ有するグループをいう。即ち、ブロック間判断部４１５は、このような基本ブロックを少なくとも１つ有するグループのみを生成すれば十分であるが、処理を単純化するべく、ＴＴ命令を含む全ての基本ブロックをグループ分類の対象としてもよい。図１７の左において、ブロック間判断部４１５は、［２，３，４］、［２，３，３，４］、［２，３，３，３，４］…という無限の実行パスを、１つ目のグループＧ１に分類する。但し、カッコ［］は１つの実行パスを示し、カッコ内の数字は、基本ブロックを識別するための番号を示す。これらの実行パスは、何れも、先頭のＤＴ命令および先頭から５番目のＤＴ命令に挟まれており、他のグループとは非連結である。また、ブロック間判断部４１５は、［６，７］および［７］を、２つ目のグループＧ２に分類する。［６，７］は、先頭から５番目のＤＴ命令および８番目のＤＴ命令に挟まれている。また［７］は、前回の繰返しにおける８番目のＤＴ命令および今回の繰返しにおける８番目のＤＴ命令に挟まれている。
【００５３】
また、図１７右図に示すように、ブロック間判断部４１５は、［１０］、［１０，１３］、［１０，１３，１５］、［１２，１３］、［１２，１３，１５］および［１５］のそれぞれの実行パスを、３番目のグループＧ３に分類する。実行パス［１０］は、９番目のＤＴ命令および１１番目のＤＴ命令に挟まれ、実行パス［１０，１３］は、９番目のＤＴ命令および１４番目のＤＴ命令に挟まれ、実行パス［１０，１３，１５］は、９番目のＤＴ命令および１６番目のＤＴ命令に挟まれる。また、実行パス［１２，１３］は、１１番目のＤＴ命令および１４番目のＤＴ命令に挟まれ、実行パス［１２，１３，１５］は、１１番目のＤＴ命令および１６番目のＤＴ命令に挟まれ、実行パス［１５］は、１４番目のＤＴ命令および１６番目のＤＴ命令に挟まれる。
【００５４】
次に、ブロック間判断部４１５は、それぞれのグループに対して以下の処理を行う。まず、ブロック間判断部４１５は、当該グループ中の全ての実行パスにおいて、連続して出力される文字列定数の文字数が基準値Ｈ以上であれば、そのグループ内の全ての文字列定数の文字コード体系を予め変換すると判断し、それぞれの文字列出力命令を第２バッファリング命令に置換する。また、ブロック間判断部４１５は、当該グループ中の全ての実行パスにおいて、連続して出力される文字列定数の文字数が基準値Ｈ未満であれば、そのグループ内の全ての文字列定数の文字コード体系を予め変換しないと判断し、それぞれの文字列出力命令を第１バッファリング命令に置換する。
【００５５】
文字列定数の文字数が基準値Ｈ以上の実行パスと基準値Ｈ未満の実行パスとが混在する場合には以下の処理を行う。ブロック間判断部４１５は、それぞれの実行パスの実行確率およびそれぞれの関数が文字列出力処理を行う確率の確率値を取得する。実行確率は、例えば、制御フローの分岐先や合流元に処理の実行回数をカウントするカウンタを設け、出力プログラム２０を予備的に実行させることによって算出することができる。さらに、ある関数が文字列出力命令を実行するか否かは、文字列を出力するためのバッファの長さが、関数の呼び出し前と呼出し後で変化したかを監視することで判断できる。また、出力プログラム２０を実行しなくとも、制御フローの構造から経験的に導かれる実行確率が従来知られている。このように、実行確率を見積もる技術は、実行時トレース収集技術やプロファイリング技術として従来公知であるので、その説明を省略する。
【００５６】
実行確率は、グループＧ内のそれぞれの実行パスを拡張したグループＧ´内のそれぞれについて、当該グループ内の複数の基本ブロックを順次経由する複数の実行パスについて取得される。このグループＧ´の定め方について説明する。実行確率を求めるには、パスの入口と出口とを共通とする複数の実行パスについてその実行回数を観測する必要がある。このため、ブロック間判断部４１５は、グループＧ中のそれぞれの実行パスを、互いにパスの入口と出口とが共通となるように拡張し、拡張後の実行パスの集合をグループＧ´とする。具体的には、ブロック間判断部４１５は、グループＧ１はそのままグループＧ１´となる。一方、グループＧ２については、実行パス［６，７］または実行パス［７］を拡張して実行パス［６，７，８］を生成する。重複した実行パスについては１つのみをグループＧ´に含めさせ、その他のパスは削除する。また、グループＧ２´には、［６，７，８，７，８］、［６，７，８、…，７，８］など、ループの繰返し回数を増やした無限の実行パスが含まれる。また、グループＧ３については、実行パス［１０，１３，１５］、実行パス［１０，１３，１４，１５］、実行パス［１０，１１，１２，１３，１５］、および実行パス［１０，１１，１２，１３，１４，１５］が含まれる。
【００５７】
そして、ブロック間判断部４１５は、ある拡張グループＧ´内のパスｐ´ｉ（１≦ｉ≦ｎ）について、ｐ´ｉ内の各ＴＴ命令を第２バッファリング命令または第１バッファリング命令の何れかに置換した場合において、その拡張グループ内の各ＴＴ命令を全て第１バッファリング命令に置換した場合と比べて向上する性能の見積もり、例えば短縮される処理時間の期待値などを算出する。その算出式は、以下の式（１）のように表される。
【数１】
2008059279.tif 000003
【００５８】
式（１）において、パスｐ´ｉが実行される確率をＱ（ｐ´ｉ）とし、ｐ´ｉにおいて第２バッファリング命令により出力される文字列定数の合計の文字数をｌｅｎ（ｐ´ｉ）とし、文字コード体系を第１コード体系から第２コード体系に変換する処理について１文字当たりの所要時間をｅとし、実行パスｐ´ｉにおける変換処理の回数、つまり、第１バッファリング命令に挟まれた第２バッファリング命令の連続列の個数をｄ（ｐ´ｉ）とする。
【００５９】
拡張グループＧ´内にＴＴ命令がｋ個含まれている場合には、それぞれのＴＴ命令について第１バッファリング命令または第２バッファリング命令に置換する選択が可能となるから、合計で２ｋの組合せが存在する。このため、ブロック間判断部４１５は、これらの組合せのそれぞれについて、式（１）を用いて短縮される処理時間の期待値を算出する。そして、この期待値を最も大きくする組合せを、判断結果として採用し、第２置換部４２０に対し出力する。
【００６０】
なお、ＴＴ命令の個数ｋの大きさによっては、組合せの数が大きいため現実的な時間で処理が完了しないことが想定される。このような場合には、ブロック間判断部４１５は、以下の各ステップに従って、それぞれのＴＴ命令について近似的な判断を行ってもよい。
【００６１】
１．Ｑ（ｐ´ｉ）の降順に実行パスｐ´ｉを配列する。
２．実行パスを先頭から１つ選択する。選択する実行パスが無ければステップ５へ処理を移す。
３．選択した実行パス中で、判断が未確定であって、かつ、合計文字数が基準値Ｈ以上である文字列定数を出力する連続したＴＴ命令のそれぞれを、第２バッファリング命令に置換すると判断する。
４．選択した実行パスを取り除き、ステップ２に処理を戻す。
５．未確定のそれぞれのＴＴ命令を、第１バッファリング命令または第２バッファリング命令に置換する全ての組合せについて、式（１）によって処理時間短縮の期待値を算出する。最大値が負の数であれば、未確定のそれぞれのＴＴ命令を、第１バッファリング命令に置換すると判断する。
【００６２】
図１２に戻る。最後に、第２置換部４２０は、文字コード体系を予め第２コード体系に変換すると判断された文字列出力命令を、第２バッファリング命令に置換する（Ｓ１２３０）。ＪＳＰプログラムの例では、第２置換部４２０は、＜ＨＴＭＬ＞などとＨＴＭＬのタグがそのまま記述された部分を、Ｊａｖａ言語のＪＳＰＷｒｉｔｅｒクラスのｗｒｉｔｅ（ｂｙｔｅ［］）メソッドの呼び出しに置換する。
【００６３】
図１８は、Ｓ１１２０における処理のフローチャートを示す。第１置換部５００は、第２バッファリング命令に変換されなかった複数の文字列出力命令のそれぞれを第１バッファリング命令に置換する（Ｓ１８００）。ＪＳＰプログラムの例では、第１置換部５００は、＜％＝…＞などのタグを、Ｊａｖａ言語のＪＳＰＷｒｉｔｅｒクラスのｗｒｉｔｅ（ｃｈａｒ［］）メソッドの呼び出しに置換する。また、第１置換部５００は、＜ＨＴＭＬ＞などとＨＴＭＬのタグがそのまま記述された部分も、判断部４１０の判断結果によっては、第２バッファリング命令ではなく第１バッファリング命令に置換する。
【００６４】
命令挿入部５１０は、出力プログラム２０の第２バッファリング命令よりも先に実行され、複数の第１バッファリング命令より後に実行される部分に、変換命令を挿入する（Ｓ１８１０）。この処理ステップは、上述のＪＳＰの例ではＳ１２３０と併合されて実行されてもよい。即ち、ＪＳＰＷｒｉｔｅｒクラスのｗｒｉｔｅ（ｂｙｔｅ［］）メソッドの中で、第２バッファリング処理に先立ち文字コード体系の変換処理が行われるので、文字列出力命令をｗｒｉｔｅ（ｂｙｔｅ［］）メソッドに置換することによって、変換命令も挿入されることとなる。
【００６５】
このように、ｗｒｉｔｅ（ｂｙｔｅ［］）メソッドの中で必ず変換処理を行わせるようにすることは、以下のような利点がある。まず、命令挿入部５１０は、出力プログラム２０中のどの部分に変換命令を挿入するべきかを判断する処理を要しないので、コンパイル部３０による処理時間を短縮できる。さらに、第１バッファリング命令の直前まで変換処理を遅らせることができるので、できる限り多くの文字列を一括して変換でき、変換処理の回数を低減できる。
【００６６】
一方で、このような実装では、ｗｒｉｔｅ（ｂｙｔｅ［］）メソッドが連続して実行される場合に不必要な変換処理が複数回実行されて効率が悪いとも考えられる。しかしながら、この不都合は、以下のように解消できる。ｗｒｉｔｅ（ｂｙｔｅ［］）メソッドをコンパイル済プログラム６０中にインライン展開すると、変換命令であるｆｌｕｓｈＣＤ（）メソッドの呼び出しはコンパイル済プログラム６０中に明示的に出現する。複数のｆｌｕｓｈＣＤ（）の呼び出しが、ｗｒｉｔｅ（ｃｈａｒ［］）を間に含まずに連続して実行されることとなると、第１バッファは空であるから２回目以降の変換処理は無駄になる。このようなｆｌｕｓｈＣＤ命令の冗長性は、後に説明する部分冗長性削除の技術を用いて、実行時コンパイル部７００により除去することができる。
【００６７】
これに代えて、命令挿入部５１０は、文字列出力命令のｗｒｉｔｅ（ｂｙｔｅ［］）メソッドへの置換とは別に、変換命令を明示的にコンパイル済プログラム６０内に挿入してもよい。この場合、命令挿入部５１０は、生成したそれぞれの第２バッファリング命令の直前に実行される部分に、変換命令を挿入することが望ましい。これにより、ｗｒｉｔｅ（ｂｙｔｅ［］）メソッドの中で変換処理を行う場合と同様、できるだけ多くの文字列を第１バッファに蓄積してから一括して変換できるので効率がよい。
【００６８】
図１９は、Ｓ１０１０における処理のフローチャートを示す。実行時コンパイル部７００は、メソッドのインライン展開を行う（Ｓ１９００）。次に、冗長性削除部７０６は、第１バッファリング命令を間に含まずに連続して実行される複数の変換命令のうち、最初に実行される変換命令を除く他の変換命令を削除する（Ｓ１９１０）。さらに、冗長性削除部７０６は、部分冗長性の削除技術によって、冗長な変換命令を削除してもよい。図２０を参照して、部分冗長性の削除技術の一例を説明する。
【００６９】
図２０は、冗長性削除部７０６による処理の一例を示す。冗長性削除部７０６は、コンパイル済プログラム６０の制御フローにおいて、少なくとも何れか１つが変換命令を含む複数の実行パスが１つの実行パスに合流し、かつ合流した実行パスに変換命令が含まれる部分を検出する。例えば、図２０左上の制御フローは、インライン展開の結果図２０右の制御フローに変更される。この結果、合流部分における合流元の実行パスのうち右側の実行パスのみが変換命令を含み、合流先の実行パスも変換命令を含む状態となる。
【００７０】
冗長性削除部７０６は、合流した実行パスに含まれる変換命令を削除して、合流する複数の実行パスのうち変換命令を含まない実行パスに変換命令を挿入する。即ち、冗長性削除部７０６は、図２０左下のように、合流元の実行パスの左側に変換命令を新たに挿入する。そして、冗長性削除部７０６は、合流先の実行パスに含まれる変換命令を削除する。この処理の結果、制御フローは図２０左下のような状態となる。これにより、右側の実行パスから合流した場合に実行される変換処理の冗長性が削除される。
【００７１】
図１９に戻る。続いて、特殊化制御部７０８は、実行パスの特殊化（スペシャライゼーション、specialization）による変換処理の最適化を試みる（Ｓ１９２０）。この最適化の一例を、図２１を参照して説明する。
図２１は、特殊化制御部７０８による処理の一例を示す。図２１に示す制御フローは、図１７右側に示す制御フローを特殊化によって最適化した後の状態を示す。図１７右側の制御フローにおいて、文字列定数を出力する文字列出力命令（ＴＴ命令）が、第１または第２バッファリング命令の何れに置換されるかは、それぞれの実行パスの実行確率によって異なる。しかしながら、分岐しない直線状の実行パス［９，１０，１３，１５，１６］が仮に実行されるとするならば、文字列定数のみが連続して出力されるのであるから、それらの文字列定数を実行前に予め変換し、文字列出力命令は第２バッファリング命令に置換されることが望ましい。もちろん、その他の実行パスが実行される場合を考慮すると、このような置換が効率を最大化するとは限らない。
【００７２】
このような場合には、この実行パス［９，１０，１３，１５，１６］が実行される場合と、その他の実行パスが実行される場合とで、文字列出力命令を異なるバッファリング命令に置換する最適化が有効である。図２１の例では、特殊化制御部７０８は、まず、最適化対象の制御フローの中から、それぞれの条件判断部分、すなわち、基本ブロック１０および１３を選択する。そして、特殊化制御部７０８は、それらの条件判断をまとめて実行する命令を、基本ブロックの先に実行される部分に生成する（判断命令の部分）。
【００７３】
次に、特殊化制御部７０８は、その条件判断の結果、実行パス［９，１０，１３，１５，１６］が実行されると判断された場合の分岐先の部分に、実行パス［９，１０，１３，１５，１６］について特殊化された命令列を生成する。特殊化された命令列とは、即ち、全ての文字列出力命令を第２バッファリング命令に置換した命令列である。一方で、特殊化制御部７０８は、実行パス［９，１０，１３，１５，１６］を実行するための条件のうち少なくとも１つが成立しない場合に実行される部分に、特殊化されていない命令列を生成する。図２１右には、全ての文字列出力命令を第１バッファリング命令に置換した命令列を例示したが、実行パスの実行確率によっては、何れかの文字列出力命令を第２バッファリング命令に置換してもよい。
【００７４】
図１９に戻る。続いて、ランタイム部７０は、最適化後のコンパイル済プログラム６０を実行する（Ｓ１９３０）。本実施形態の処理に関する部分としては、出力制御部７１０は、第１バッファリング命令の実行に応じ第１バッファ７１２に対し文字列を追加する。また、出力制御部７１０は、第２バッファリング命令の実行に応じ第２バッファ７１５に文字列を追加する。また、出力制御部７１０は、変換命令の実行に応じ第１バッファ７１２から文字列を取りだし、文字コード体系を一括して変換して第２バッファ７１５に追加する。
【００７５】
以上、図１から図２１を参照して説明したように、本実施形態に係る情報システム１０によれば、一部の文字列定数についてはプログラムの実行中に文字コード体系の変換をすることで、プログラムの実行中に文字コード体系を変換する文字の数を低減しつつも、変換処理の回数を低減することができる。また、それぞれの文字列定数を予め変換するべきか否かの判断は、変換することにより変換対象の文字数を低減できる効果と、変換しないことによって変換処理の回数を低減できる効果とを、実行パスの実行確率に基づいて比較考量することによって実現される。これにより、プログラム全体として処理の効率を高めることができる。さらに、インライン展開、部分冗長性の除去、または、特殊化などの最適化技術と組み合わせることで、プログラムの処理効率を一層高めることができる。
【００７６】
以下、ＪＳＰプログラムの最適化についてまとめる。
図２２は、ＪＳＰプログラムにおいて文字列出力命令に該当する部分とその具体例を示す。文字列定数を出力する文字列出力命令（ＴＴ命令）とは、ＪＳＰプログラムでは、ＨＴＭＬで記述されたタグやテキスト、および、＜ｊｓｐ：ｔｅｘｔ＞タグの内容に相当する。例えば、＜ｔｉｔｌｅ＞タグなどのＨＴＭＬタグがそのまま記述された部分やその内容がこれに相当する。また、＜ｊｓｐ：ｔｅｘｔ＞タグの開始タグから終了タグの間に記述されたテキストがこれに相当する。
【００７７】
文字列変数の変数値を出力する文字列出力命令（ＤＴ命令）とは、ＪＳＰプログラムでは、式およびｓｃｒｉｐｔｌｅｔ内のｏｕｔオブジェクトへの出力命令に相当する。例えば、＜％タグ内の＝の右辺や、＜％タグ内でｏｕｔオブジェクトに対するｐｒｉｎｔｌｎメソッドの呼び出しがこれに相当する。
【００７８】
文字列を出力し得る関数の呼び出しとは、ＪＰＳプログラムでは、ｏｕｔオブジェクト、ｐａｇｅＣｏｎｔｅｘｔオブジェクト、または、ｒｅｓｐｏｎｓｅオブジェクトに到達可能なユーザ定義関数の呼び出しに相当する。また、タグライブラリの呼び出しもこれに相当する。例えば、＜％タグ内に記述され、ＰａｇｅＣｏｎｔｅｘｔオブジェクトを引数にとるユーザ定義関数の呼び出しなどがこれに相当する。
【００７９】
また、第１バッファリング命令とは、ＪＰＳプログラムでは、ＪＳＰＷｒｉｔｅｒクラスのｗｒｉｔｅ（ｃｈａｒ［］）メソッドに相当する。第２バッファリング命令とは、ＪＳＰプログラムでは、ＪＳＰＷｒｉｔｅｒクラスのｗｒｉｔｅ（ｂｙｔｅ［］）メソッドに相当する。これらは、もとのＪＳＰプログラムには存在せず、文字列出力命令を置換することによって情報システム１０により生成される。
【００８０】
続いて、図２３から図２６を参照して、出力プログラム２０としてのＰＨＰプログラムを最適化する場合について、ＪＳＰプログラムの場合との相違点を説明する。
ＰＨＰプログラムを実行するＺｅｎｄ  Ｅｎｇｉｎｅという処理系では、マルチバイト文字についての処理を設定ファイルｐｈｐ．ｉｎｉによって指定可能となっている。ＰＨＰプログラムにおいては、実行時に出力のための文字コード体系を動的に変更できるようになっている。このように文字コード体系が変更されるプログラムや、変更され得るプログラムについては、本実施形態による最適化の対象から除外する。ｐｈｐ．ｉｎｉの設定によっては、処理系内部の文字コード体系と出力のための文字コード体系が異なっている場合があり、この場合には本実施形態の情報システム１０により処理を効率化できる。
【００８１】
即ち、情報システム１０の動作に置換えて説明すると、情報システム１０は、まず、ｐｈｐ．ｉｎｉから、処理系内部の文字コード体系の設定、および、出力のための文字コード体系の設定を読み出す。そして、情報システム１０は、これらの文字コード体系が互いに異なる場合には、文字列出力処理を最適化し得ると判断し、それ以外の場合には既存のＺｅｎｄ  Ｅｎｇｉｎｅによりプログラムを実行させる。次に、情報システム１０は、ＰＨＰプログラムを走査して、処理系内部の文字コード体系または出力のための文字コード体系の設定を変更する命令が含まれているか判断する。そのような命令が含まれていれば、情報システム１０は、既存のＺｅｎｄ  Ｅｎｇｉｎｅによりプログラムを実行させる。含まれていなければ、情報システム１０は、文字列出力処理を最適化するための処理を行う。
【００８２】
また、Ｚｅｎｄ  Ｅｎｇｉｎｅでは、ＰＨＰプログラムを中間コードにコンパイルしてから実行する。したがって、本実施形態に係るコンパイル部３０は、ＰＨＰプログラムを中間コードにコンパイルするコンパイラとしての役割を果たす。この中間コードは、Ｊａｖａ言語でいうバイトコードに相当する。また、Ａｌｔｅｒｎａｔｉｖｅ  ＰＨＰ  Ｃｃａｃｈｅを導入すれば、同一プログラムを２回目以降に実行する場合に１回目のコンパイル結果が再利用される点でＪＳＰプログラムの例と同様である。更に、この中間コードには、文字列出力命令であるｅｃｈｏ文やｐｒｉｎｔ文からコンパイルされたＺＥＮＤ＿ＥＣＨＯやＺＥＮＤ＿ＰＲＩＮＴという命令が含まれる。したがって、情報システム１０は、このようなＺＥＮＤ＿ＥＣＨＯやＺＥＮＤ＿ＰＲＩＮＴなどの命令を最適化の対象とすればよい。
【００８３】
ただし、Ｊａｖａ言語のバイトコードとは異なりこの中間コードはバイナリコードである。バイナリコードをそのまま例示しても説明上不都合であるので、以下の説明においてはこの中間コードについて説明する場合にはこのバイナリコードの示すプログラム上の意味を示す。まず、図２３および図２４を参照して、ＰＨＰの処理系における第１および第２バッファリング命令について述べる。
【００８４】
図２３は、第１および第２バッファリング命令の第１の実装例を示す。４行目から６行目の関数は、ＰＨＰプログラムの中間コードから呼び出される関数であり、第２バッファリング命令に相当する。この関数は、引数として与えられた第２コード体系の文字列を、第２バッファ７１５である＄ｂｙｔｅＢｕｆｆｅｒに追加する。一方、１行目から３行目の関数は、ＰＨＰプログラムの中間コードから読み出される関数であり、第１バッファリング命令に相当する。この関数は、引数として与えられた第１コード体系の文字列を、ｍｂ＿ｃｏｎｖｅｒｔ＿ｅｎｃｏｄｉｎｇという関数を呼び出すことによって変換し、変換後の文字列を第２バッファリング命令に与える。
【００８５】
本実施形態に係るコンパイル部３０は、文字列定数を出力する文字列出力命令を、図２３に例示した第２バッファリング命令に置換し、文字列変数の変数値を出力する文字列出力命令を、図２３に例示した第１バッファリング命令に置換することもできる。しかしながら、この場合、プログラムの実行中にまとめて一括して変換可能な複数の文字列が、一部の文字列が静的に変換されてしまうため、複数回の変換を必要とする。文字コード体系の変換には、文字数が少なくとも変換処理の回数に応じた時間がかかるため、効率を低下させてしまう場合があった。したがって、本実施形態に係るコンパイル部３０は、以下の第２の実装例を採用する。
【００８６】
図２４は、第１および第２バッファリング命令の第２の実装例を示す。１行目から３行目の関数は、第１バッファリング命令に相当する。この命令は、引数として与えられた文字列を第１バッファ７１２である＄ｃｈａｒＢｕｆｆｅｒに追加する。４行目から７行目は、メソッドｗｒｉｔｅ＿ｂを示す。このメソッドは、変換命令および第２バッファリング命令双方の役割を果たす。５行目は変換命令であり、その実体は１１行目から１６行目で定義される。１２行目は、第１バッファ７１２が空かどうかをチェックする命令であり、空でなければ１３および１４行目の命令が実行される。１３行目は、第１バッファ７１２に格納された文字列の文字コード体系を第２コード体系に変換して第２バッファ７１５に追加する命令である。１４行目は、第１バッファ７１２を空にする命令である。６行目は第２バッファリング命令であり、その実体は１８行目から１０行目で定義される。即ち９行目において、引数として与えられた文字列を第２バッファ７１５に追加している。
【００８７】
本実施形態に係る情報システム１０は、第１および第２バッファリング命令についてこのような実装を採用することで、文字コード体系変換前の文字列を第１バッファ７１２に蓄積したうえで一括して文字コード体系を変換でき、変換処理の回数を低減して処理を効率化できる。
【００８８】
なお、ＰＨＰプログラムでは、変換前の文字列がｃｈａｒ型であり変換後の文字列がｂｙｔｅ型であるとは限らない。本実施形態においては、ＪＳＰプログラムと対応付けて理解を容易とするため、便宜上、変換前の内部用の第１コード体系をｃｈａｒ型とし、この型の文字列を格納するバッファを変数＄ｃｈａｒＢｕｆｆｅｒによって示した。同様に、変換後の出力用の第２コード体系をｂｙｔｅ型とし、この型の文字列を格納するバッファを変数＄ｂｙｔｅＢｕｆｆｅｒによって示した。したがって、本実施形態においては、変換前後の文字コード体系が異なっていれば良く、その具体的な文字コード体系は問わない。
【００８９】
図２５は、ＰＨＰプログラムにおいて文字列出力命令に該当する部分とその具体例を示す。文字列定数を出力する文字列出力命令（ＴＴ命令）は、ＰＨＰプログラムにおいては、ＨＴＭＬとして記述されたタグやテキストに相当する。また、ＴＴ命令は、ＰＨＰプログラムのｅｃｈｏ文またはｐｒｉｎｔ式に相当する。具体的には、＜ｔｉｔｌｅ＞タグなどのＨＴＭＬのタグがそのまま記述された部分や、＜？ｐｈｐ  ｅｃｈｏタグなどで記述された部分が文字列出力命令となる。
【００９０】
文字列変数の変数値を出力する文字列出力命令（ＤＴ命令）は、ＰＨＰプログラムにおいては、変数を引数とするＥｃｈｏ文またはＰｐｒｉｎｔ式に相当する。たとえば、＜？ｐｈｐ  ｅｃｈｏタグによって、＄で始まる変数名が与えられている場合には、そのタグはＤＴ命令に相当する。
【００９１】
文字列を出力し得る関数呼び出しは、ＰＨＰプログラムでは、全ての関数呼出に相当する。また、第２バッファリング命令は、ＰＨＰプログラムの中間コードでは、上述の関数ｗｒｉｔｅ＿ｂを中間コードから呼び出すためのＺＥＮＤ＿ＥＣＨＯ＿ＷＩＴＨＯＵＴ＿ＥＮＣ命令に相当する。この命令は、中間コードの書式に合致させたものであり、その実体（機能・作用）は、ｗｒｉｔｅ＿ｂ関数と同一である。また、第１バッファリング命令は、ＰＨＰプログラムの中間コードでは、上述の関数ｗｒｉｔｅ＿ｃを中間コードから呼び出すためのＺＥＮＤ＿ＥＣＨＯ＿ＷＩＴＨ＿ＥＮＣ命令に相当する。同様に、この命令の実体はｗｒｉｔｅ＿ｃと同一である。
【００９２】
図２６ａは、ＰＨＰプログラムにおける制御フローグラフの第１生成例を示す。ＪＰＳプログラムにおいては、ＪＳＰプログラムを一旦Ｊａｖａプログラムにコンパイルしたうえで、そのＪａｖａプログラムに対し既存の解析器を適用することで、ＪＳＰプログラムの制御フローグラフを生成することができた。ＰＨＰプログラムについては、そのような解析器が存在しないため同様の手法を用いることができない。したがって、フローグラフ生成部４００は、ＰＨＰプログラムを走査した上で、その制御構造を解析することにより制御フローグラフを生成する。図２６ａおよび図２６ｂを参照して、フローグラフ生成部４００がＰＨＰプログラムから検出した制御用の命令から、制御フローグラフを生成する処理例を説明する。
【００９３】
フローグラフ生成部４００は、ＩＦ文を検出すると、その条件節を示す基本ブロックと、条件成立時の処理を示す基本ブロックとを生成する。そして、条件節を示す基本ブロックを、条件成立時の制御の流れを示す辺によって、条件成立時の処理を示す基本ブロックに接続する。未接続の入辺は、ＩＦ文の直前に実行される基本ブロックに接続し、未接続の出辺は、ＩＦ分の直後に実行される基本ブロックに接続する。未接続の辺についての接続は、以降の全ての処理において同様であるから以降説明を省略する。
【００９４】
フローグラフ生成部４００は、Ｅｌｓｅ節を伴うＩＦ文を検出すると、条件節を示す基本ブロックと、条件成立時の処理を示す基本ブロックと、条件不成立時の処理を示す基本ブロックとを生成する。そして、条件節を示す基本ブロックを、条件成立時の制御の流れを示す辺によって、条件成立時の処理を示す基本ブロックに接続する。また、条件節を示す基本ブロックを、条件不成立時の制御の流れを示す辺によって、条件不成立時の処理を示す基本ブロックに接続する。なお、ＥｌｓｅＩｆ文の制御フローは、ＩＦ文を検出した場合の処理と、Ｅｌｓｅ節を伴うＩＦ文を検出した場合の処理との組合せによって生成される。
【００９５】
フローグラフ生成部４００は、Ｄｏ−ｗｈｉｌｅ文を検出すると、条件成立時の処理を示す基本ブロックと、条件節を示す基本ブロックとを生成する。そして、条件成立時の処理を示す基本ブロックを、次の命令に処理を移す制御フローを示す辺によって、条件節を示す基本ブロックに接続する。更に、条件節を示す基本ブロックを、条件成立時の制御の流れを示す辺によって、条件成立時の処理を示す基本ブロックに接続する。
【００９６】
フローグラフ生成部４００は、Ｆｏｒ文を検出すると、初期化処理を示す基本ブロックと、条件節を示す基本ブロックと、後処理を示す基本ブロックと、条件成立時の処理を示す基本ブロックとを生成する。そして、初期化処理を示す基本ブロックを、制御を次の命令に移す制御フローを示す辺によって、条件節を示す基本ブロックに接続する。また、条件節を示す基本ブロックを、条件成立時の制御の流れを示す辺によって、条件成立時の処理を示す基本ブロックに接続する。また、条件成立時の処理を示す基本ブロックを、制御を次の命令に移す制御フローを示す辺によって、後処理を示す基本ブロックに接続する。さらに、後処理を示す基本ブロックを、制御を次の命令に移す制御フローを示す辺によって、条件節を示す基本ブロックに接続する。
【００９７】
図２６ｂは、ＰＨＰプログラムにおける制御フローグラフの第２生成例を示す。フローグラフ生成部４００は、Ｆｏｒｅａｃｈ文を検出すると、初期化処理を示す基本ブロックと、条件節を示す基本ブロックと、条件成立時の処理を示す基本ブロックとを生成する。そして、初期化処理を示す基本ブロックを、制御を次の命令に移す制御フローを示す辺によって、条件節を示す制御フローに接続する。また、条件節を示す基本ブロックを、条件成立時の制御の流れを示す辺によって、条件成立時の処理を示す基本ブロックに接続する。また、条件成立時の処理を示す基本ブロックを、制御を次の命令に移す制御フローによって、条件節を示す基本ブロックに接続する。
【００９８】
フローグラフ生成部４００は、ｂｒｅａｋ文を検出すると、検出した基本ブロックを、ループの終了後の処理を示す基本ブロックに接続する辺を生成する。ｂｒｅａｋ文がオプションのパラメータを有する場合には、その数値に応じて、入れ子となっている複数のループのうち接続先となるループを選択する。フローグラフ生成部４００は、ｃｏｎｔｉｎｕｅ文を検出すると、検出した基本ブロックを、ループの開始位置にある基本ブロックに接続する。ｃｏｎｔｉｎｕｅ文がオプションのパラメータを有する場合には、ｂｒｅａｋ文と同様、その数値に応じて、入れ子となっている複数のループのうち接続先と成るループを選択する。
【００９９】
フローグラフ生成部４００は、ｓｗｉｔｃｈ文を検出すると、式を評価する基本ブロックと、それぞれの評価値に応じて異なる処理を行う複数の基本ブロックとを生成する。そして、フローグラフ生成部４００は、式を評価する基本ブロックを、式の評価値が予め定められた複数の値のそれぞれであった場合の制御を示す辺によって、対応するそれぞれの基本ブロックに接続する。フローグラフ生成部４００は、ｒｅｔｕｒｎ文を検出すると、検出したその基本ブロックから、その基本ブロックが属している関数・メソッドの終端に至る辺を生成する。
【０１００】
以上、ＰＨＰプログラムを最適化する処理の例を、ＪＳＰプログラムを最適化する処理の例との相違点に注目して説明した。これにより、コンパイル部３０は、ＪＳＰプログラムのみならずＰＨＰプログラムについても同様に、文字列出力処理を効率化することができる。また、他のプログラム言語によって記述されたプログラムについても同様である。コンパイル部分とランタイム部分が分離された言語処理系であれば、本実施形態で例示したような処理を行うことで、文字列定数を予め変換するべきか否かの判断、第１および第２バッファへの文字列の追加処理、および、文字コード体系の変換処理を実現できる。
【０１０１】
図２７は、情報システム１０として機能する情報処理装置６００のハードウェア構成の一例を示す。情報処理装置６００は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【０１０２】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラム、例えば本発明に係る最適化プログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【０１０３】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、情報処理装置６００が使用する最適化プログラムや出力プログラム２０及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又はハードディスクドライブ１０４０に提供する。
【０１０４】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、情報処理装置６００の起動時にＣＰＵ１０００が実行するブートプログラムや、情報処理装置６００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０またはハードディスクドライブ１０４０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【０１０５】
情報処理装置６００に提供されるプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記録媒体から読み出され情報処理装置６００にインストールされて実行される。最適化プログラムが情報処理装置６００等に働きかけて行わせる動作は、図１から図２６において説明した情報システム１０における動作と同一であるから、説明を省略する。
【０１０６】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムを情報処理装置６００に提供してもよい。
【０１０７】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。例えば、静的変換部３１０は、出力プログラムの実行前に、文字列定数の文字コード体系を予め変換すると共に、文字列定数を出力する文字列出力命令を、変換済みの文字列を文字列の出力順序を示す情報に対応付けて第２バッファ７１５に追加する第２バッファリング命令に置換する。また、動的変換部３２０は、文字列変数の変数値を出力する文字列出力命令を、文字列の出力順序を示す情報に対応付けて第１コード体系のまま第１バッファ７１２に追加する。そして、動的変換部３２０は、第１バッファ７１２に格納された複数の文字列を一括して変換した上で、変換後のそれぞれの文字列と第２バッファ７１５中のそれぞれの文字列を対応する出力順序に並べ替えて配列し、第２バッファ７１５に更に格納させる命令を、変換命令として挿入する。このような形態であっても、連続して出力されない２以上の文字列変数の変数値を一括して変換でき、変換処理の回数を低減して処理を効率化できる。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【０１０８】
【図１】図１は、情報システム１０の全体構成を示す。
【図２ａ】図２ａは、出力プログラム２０の一例を示す。
【図２ｂ】図２ｂは、出力プログラム２０に基づき生成されたサーブレットプログラムの第１例を示す。
【図２ｃ】図２ｃは、出力プログラム２０に基づき生成されたサーブレットプログラムの第２例を示す。
【図３】図３は、コンパイル部３０の機能構成を示す。
【図４】図４は、静的変換部３１０の機能構成を示す。
【図５】図５は、動的変換部３２０の機能構成を示す。
【図６ａ】図６ａは、コンパイル済プログラム６０の一例を示す。
【図６ｂ】図６ｂは、コンパイル済プログラム６０の実行に伴い呼び出されるランタイムプログラムの一例を示す。
【図７】図７は、コンパイル済プログラム６０の実行に伴う第１バッファ７１２の状態遷移を示す。
【図８】図８は、ランタイム部７０の機能構成を示す。
【図９】図９は、ウェブページ９０の一例を示す。
【図１０】図１０は、出力プログラム２０がコンパイルされて実行される処理のフローチャートを示す。
【図１１】図１１は、Ｓ１０００における処理のフローチャートを示す。
【図１２】図１２は、Ｓ１１１０における処理のフローチャートを示す。
【図１３】図１３は、生成される制御フローグラフの一例を示す。
【図１４】図１４は、制御フローグラフの簡略化の第１例を示す。
【図１５】図１５は、制御フローグラフの簡略化の第２例を示す。
【図１６】図１６は、ブロック内判断部４１２による判断結果の一例を示す。
【図１７】図１７は、ブロック間判断部４１５による判断の対象となる制御フローグラフの一例を示す。
【図１８】図１８は、Ｓ１１２０における処理のフローチャートを示す。
【図１９】図１９は、Ｓ１０１０における処理のフローチャートを示す。
【図２０】図２０は、冗長性削除部７０６による処理の一例を示す。
【図２１】図２１は、特殊化制御部７０８による処理の一例を示す。
【図２２】図２２は、ＪＳＰプログラムにおいて文字列出力命令に該当する部分とその具体例を示す。
【図２３】図２３は、第１および第２バッファリング命令の第１の実装例を示す。
【図２４】図２４は、第１および第２バッファリング命令の第２の実装例を示す。
【図２５】図２５は、ＰＨＰプログラムにおいて文字列出力命令に該当する部分とその具体例を示す。
【図２６ａ】図２６ａは、ＰＨＰプログラムにおける制御フローグラフの第１生成例を示す。
【図２６ｂ】図２６ｂは、ＰＨＰプログラムにおける制御フローグラフの第２生成例を示す。
【図２７】図２７は、情報システム１０として機能する情報処理装置６００のハードウェア構成の一例を示す。
【符号の説明】
【０１０９】
１０  情報システム
２０  出力プログラム
３０  コンパイル部
６０  コンパイル済プログラム
７０  ランタイム部
９０  ウェブページ
２１０  文字列出力命令
２２０  文字列出力命令
２３０  文字列出力命令
３００  取得部
３１０  静的変換部
３２０  動的変換部
４００  フローグラフ生成部
４１０  判断部
４１２  ブロック内判断部
４１５  ブロック間判断部
４２０  第２置換部
５００  第１置換部
５１０  命令挿入部
６００  情報処理装置
６１０  第２バッファリング命令
６２０  第１バッファリング命令
６３０  第１バッファリング命令
６４０  第２バッファリング命令
７００  実行時コンパイル部
７０６  冗長性削除部
７０８  特殊化制御部
７１０  出力制御部
７１２  第１バッファ
７１５  第２バッファ
【図１】
2008059279.tif 000004
【図２ａ】
2008059279.tif 000005
【図２ｂ】
2008059279.tif 000006
【図２ｃ】
2008059279.tif 000007
【図３】
2008059279.tif 000008
【図４】
2008059279.tif 000009
【図５】
2008059279.tif 000010
【図６ａ】
2008059279.tif 000011
【図６ｂ】
2008059279.tif 000012
【図７】
2008059279.tif 000013
【図８】
2008059279.tif 000014
【図９】
2008059279.tif 000015
【図１０】
2008059279.tif 000016
【図１１】
2008059279.tif 000017
【図１２】
2008059279.tif 000018
【図１３】
2008059279.tif 000019
【図１４】
2008059279.tif 000020
【図１５】
2008059279.tif 000021
【図１６】
2008059279.tif 000022
【図１７】
2008059279.tif 000023
【図１８】
2008059279.tif 000024
【図１９】
2008059279.tif 000025
【図２０】
2008059279.tif 000026
【図２１】
2008059279.tif 000027
【図２２】
2008059279.tif 000028
【図２３】
2008059279.tif 000029
【図２４】
2008059279.tif 000030
【図２５】
2008059279.tif 000031
【図２６ａ】
2008059279.tif 000032
【図２６ｂ】
2008059279.tif 000033
【図２７】
2008059279.tif 000034