(57)【要約】【課題】  文字コード体系の変換を最適化する。【解決手段】  最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を第１の文字コード体系から第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、文字変数に第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部とを備えるコンパイラを提供する。【選択図】図１
2005293386.tif 000002
【特許請求の範囲】
【請求項１】
最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、
第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、
前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部と
を備えるコンパイラ。
【請求項２】
前記変換命令生成部は、ＸＭＬ文書における文字の文字コード体系であるUTF8から、Ｊａｖａプログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する
請求項１記載のコンパイラ。
【請求項３】
前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納されない場合に、当該実行パスに変換命令を生成し、当該変換命令を除去することにより変換命令の部分冗長性を除去する
請求項１記載のコンパイラ。
【請求項４】
前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字コード体系を設定するコンストラクタにより生成され、
前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第２の文字コード体系に設定する場合に、当該実行パスにおいて前記文字変数に前記第２の文字コード体系の文字が格納されると判断する
請求項１記載のコンパイラ。
【請求項５】
前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第２の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、当該実行パスにおいて前記文字変数に前記第２の文字コード体系の文字が格納されると判断する
請求項１記載のコンパイラ。
【請求項６】
前記第２の文字コード体系の文字を戻り値とするメソッドの識別情報を格納するメソッド情報格納部と、
前記コンストラクタにより前記第２の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第２の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記メソッド情報格納部に格納するメソッド再帰判断部と
を更に備え、
前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、当該実行パスにおいて前記第２の文字コード体系の文字が前記文字変数に格納されると判断する
請求項５記載のコンパイラ。
【請求項７】
前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第１の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第２の文字コード体系である場合に当該文字を前記第１の文字コード体系に戻して出力する命令列を生成する出力処理命令列生成部
を更に備える請求項１記載のコンパイラ。
【請求項８】
最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、
第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第２の文字コード体系である場合に当該処理を実行し、当該文字が前記第１の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、
前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部と
を備えるコンパイラ。
【請求項９】
前記文字操作処理生成部は、前記文字変数の文字を読み出して操作する前記複数の処理の各々について、当該処理に入力される文字が前記第２の文字コード体系である確率が、予め定められた基準確率より高い場合に、前記例外付命令列を生成する
請求項８記載のコンパイラ。
【請求項１０】
前記文字変数は、当該文字変数が前記第１の文字コード体系及び前記第２の文字コード体系の何れであるかを示すコード体系情報と、第１の文字コード体系の文字を格納する第１文字格納領域と、第２の文字コード体系の文字を格納する第２文字格納領域とを管理し、
前記文字操作処理生成部は、第１の文字コード体系の文字が前記文字変数に格納された場合に、前記第２文字格納領域のアドレスを示すポインタを無効なアドレスに設定することにより前記例外付命令列に例外を発生させる命令列と、前記第２の文字コード体系の文字が前記文字変数に格納された場合に前記第２文字格納領域のアドレスを有効なアドレスに設定する命令列と、前記例外付命令列として前記第２文字格納領域を読み出す命令列とを生成する
請求項８記載のコンパイラ。
【請求項１１】
最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラであって、
変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、
前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、
前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部と
を備えるコンパイラ。
【請求項１２】
前記文字コードのデータサイズは、前記文字コードの値の範囲に応じて異なり、
前記取得処理生成部は、前記文字コードを含む予め定められたサイズの単位データを取得する命令列を生成し、
前記変換検出処理生成部は、前記文字コードのデータサイズ毎に、前記単位データに当該データサイズの複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、前記単位データに当該データサイズの複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令列を生成する
請求項１１記載のコンパイラ。
【請求項１３】
前記変換検出処理生成部は、前記文字コードのデータサイズ毎に実行する前記検出処理として、前記単位データのうち何れの文字コードが当該データサイズであるかを更に検出する命令列を生成し、
前記選択処理生成部は、前記変換処理の処理結果のうち、前記検出処理により当該データサイズであると検出された文字コードについての処理結果を選択して出力する命令列を生成する
請求項１２記載のコンパイラ。
【請求項１４】
前記変換検出処理生成部は、前記複数の変換処理の各々として、当該変換処理の処理結果を当該変換処理に対応して予め定められた記憶領域に格納する命令列を生成し、
前記選択処理生成部は、前記検出処理により検出された前記文字コードの値の範囲に基づいて、当該文字コードを変換した処理結果を格納する記憶領域のアドレスを生成し、生成した当該アドレスから処理結果を読み出す命令列を生成する
請求項１１記載のコンパイラ。
【請求項１５】
文字の種類に応じてデータサイズの異なる第１の文字コード体系の文字を第２の文字コード体系の文字に変換する変換処理を実行する中央処理装置であって、
前記文字の文字コードのデータサイズ毎に、当該データサイズの複数の文字コードがレジスタに連続して配列される場合に実行すべき前記変換処理と並行して、当該データサイズの複数の文字コードが前記レジスタに連続して配列されるか否かを検出する検出処理を実行する命令を有する中央処理装置。
【請求項１６】
最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとしてコンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、
前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部と
して機能させるコンパイラプログラム。
【請求項１７】
最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第２の文字コード体系である場合に当該処理を実行し、当該文字が前記第１の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、
前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部と
して機能させるコンパイラプログラム。
【請求項１８】
最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、
前記コンピュータを、
変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、
前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、
前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部と
して機能させるコンパイラプログラム。
【請求項１９】
請求項１６から請求項１８の何れかに記載のコンパイラプログラムを記録した記録媒体。
【請求項２０】
最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラを、コンピュータにより制御する制御方法であって、
前記コンピュータにより、
第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成段階と、
前記変換命令生成段階において生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去段階と
を備える制御方法。
【請求項２１】
最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラを、コンピュータにより制御する制御方法であって、
前記コンピュータにより、
変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成段階と、
前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成段階と、
前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成段階と
を備える制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置に関する。特に、本発明は、文字変数の文字コード体系を変換するコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置に関する。
【背景技術】
【０００２】
近年、各種のデータを構造化して統一的に取扱う技術として、XML(eXtensible Markup Language)が注目さている。XMLでは、世界各国で使われる文字を統一的に扱う文字コード体系であるUTF8(8-bit UCS Transformation Format)を用いることが推奨されている。UTF8は、頻繁に使われることが予想されるアルファベットを１バイトで表現できる一方、日本語の文字を３バイト程度で表現する。このように、UTF8は、文字の種類等に応じてデータサイズが異なっている。
【０００３】
また、近年、Ｊａｖａ（登録商標）言語において、XMLの文書を効率的に解析・編集する多くのＡＰＩが用意されている。しかしながら、Ｊａｖａ言語は、通常、文字をUTF16(16-bit UCS Transformation Format)のデータとして取扱う。このため、Java(登録商標)言語で記述されたプログラムがXML文書を操作するには、UTF8をUTF16に変換する処理が必要である。更に、Java(登録商標)言語で記述されたプログラムにより処理された文字をXML文書として出力するためには、UTF16をUTF8に変換する処理が必要である。
【０００４】
従来、連続して配列されたUTF8の文字列をUTF16の文字列に変換する技術が用いられている（非特許文献１参照。）。この技術は、UTF8の文字を文字列から１つずつ読み出し、読み出した当該文字のデータ長や文字の種類を判断し、判断結果により異なる変換処理を行う。また、従来、Java（登録商標）言語において、UTF8の文字をUTF16に変換することなく操作するためのライブラリプログラムが提案されている（非特許文献２参照。）。
【０００５】
非特許文献３及び４については後述する。
【非特許文献１】インターネットＵＲＬ「http://cvs.apache.org/viewcvs.cgi/xml-xerces/java/src/org/apache/xerces/impl/io/UTF8Reader.java?rev=1.7&content-type=text/vnd.viewcvs-markup」
【非特許文献２】S. Makino, K. Tamura, T. Imamura, and Y. Nakamura. Implementation and Performance of WS-Security, IBM Research Report RT0546, 2003.
【非特許文献３】J. Knoop, O. Ruthing, and B. Steffen. Optimal code motion: theory & practice. ACM TOPLAS,18(3): 300-324, 1996.
【非特許文献４】R. Bodik, R. Gupta, and M.L Soffa. Complete removal of redundant expressions. In Proceedings of the ACM SIGPLAN 1998 Conference on Programming Language Design and Implementation, pages 1-14, 1998.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
非特許文献２の技術によれば、UTF8の文字をUTF16に変換する処理を省略できる。しかしながら、UTF16の文字を操作する多数のAPIは、既に広く開発されており、これらの既存のAPIを使って効率的にプログラムを開発することができない。また、UTF8を対象とする処理は、UTF16を対象とする処理と比較して効率が悪い場合も多い。従って、従来既に開発されているAPIを有効活用しつつ、UTF8からUTF16への変換処理を効率化することが第１の課題となる。
【０００７】
また、非特許文献１の技術を用いれば、UTF8の文字列をUTF16の文字列に適切に変換できる。しかしながら、操作する対象の文字を全てUTF16に変換するのは効率的でない。例えば、UTF8で入力された文字をそのまま出力する場合には、UTF8からUTF16に変換し、再度UTF8に戻すという冗長な処理となってしまう場合がある。従って、変換すべき文字を適切に選択することが第２の課題となる。
【０００８】
また、非特許文献１のプログラム例によれば、UTF8の各文字をUTF16の各文字に変換するために、UTF8のデータサイズ等の条件に応じて異なる処理が必要となる。このため、UTF8のデータサイズ等の条件を判断する条件分岐命令が生成される。近年の中央処理装置においては、条件分岐命令により命令パイプラインがフラッシュされ処理効率が悪化する場合があり、好ましくない。従って、変換処理において条件分岐をできるだけ減らすことが第３の課題となる。
【０００９】
そこで本発明は、上記の課題を解決することのできるコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明の第１の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を第１の文字コード体系から第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、文字変数に第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部とを備えるコンパイラ、当該コンパイラの制御方法、当該コンパイラとしてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
【００１１】
また、本発明の第２の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々として、文字変数に格納される文字が第２の文字コード体系である場合に当該処理を実行し、当該文字が第１の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、例外が発生した場合に実行され、文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換して当該文字変数に格納し、例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ、当該コンパイラの制御方法、当該コンパイラとしてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
【００１２】
また、本発明の第３の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラであって、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、複数の変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部とを備えるコンパイラ、当該コンパイラの制御方法、当該コンパイラとしてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
【００１３】
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明の効果】
【００１４】
本発明によれば、文字コード体系の変換を最適化することができる。
【発明を実施するための最良の形態】
【００１５】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【実施例１】
【００１６】
図１は、コンパイラ１０のブロック図である（実施例１）。コンパイラ１０は、文字変数に格納される文字の文字コード体系の変換を最適化することを目的とする。特に、コンパイラ１０は、ＸＭＬ文書における文字の文字コード体系であるUTF8から、Ｊａｖａ（登録商標）プログラムとして記述された処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する変換命令を最適化することを目的とする。
【００１７】
コンパイラ１０は、文字コード体系判定部１００と、変換命令生成部１０５と、変換命令除去部１１０と、メソッド情報格納部１２０と、メソッド再帰判断部１３０と、文字操作処理生成部１４０と、例外ハンドラ生成部１４５と、出力処理命令生成部１５０とを備える。文字コード体系判定部１００は、Ｊａｖａ（登録商標）言語で記述された最適化対象の対象プログラムを、例えば最適化対象のメソッド毎に受け取る。そして、文字コード体系判定部１００は、そのメソッドに対して入力される文字がUTF16である確率が、予め定められた基準確率より高いか否か判断する。UTF16である確率が基準確率より高い場合に、文字コード体系判定部１００は、そのメソッドを文字操作処理生成部１４０に送る。一方、基準確率より低い場合に、文字コード体系判定部１００は、そのメソッドを変換命令生成部１０５に送る。
【００１８】
変換命令生成部１０５は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々に先立って、その文字をUTF8からUTF16に変換してその文字変数に格納する変換命令を生成する。変換命令除去部１１０は、変換命令生成部１０５により生成された各変換命令について、その変換命令に先立って実行される全ての実行パスにおいて、その文字変数にUTF16の文字が格納される場合に、その変換命令を除去する。
【００１９】
具体的には、変換命令除去部１１０は、各実行パスについて、以下の何れかの条件が満たされる場合に、その実行パスにおいて文字変数にUTF16の文字が格納されると判断する。
１．その実行パスにおいて変換命令が実行される場合
２．その実行パスにおいて、その文字変数に対してUTF16の文字の記憶領域を確保すると共に文字コード体系をUTF16に設定するコンストラクタが実行される場合
３．その実行パスにおいて、UTF16の文字を戻り値として文字変数に格納するメソッドが実行される場合
例えば、メソッド情報格納部１２０は、UTF16の文字を戻り値とするメソッドの識別情報を格納し、変換命令除去部１１０は、各実行パスにおいて、メソッド情報格納部１２０に格納された識別情報に対応するメソッドの戻り値が文字変数に格納されるか否かを判断してもよい。
【００２０】
更に、変換命令除去部１１０は、変換命令生成部１０５により生成された各変換命令について、その変換命令に先立って実行される何れかの実行パスにおいて、その文字変数にUTF16の文字が格納されない場合には、その実行パスに新たに変換命令を生成し、その変換命令を除去することにより、変換命令の部分冗長性を除去する。
【００２１】
メソッド再帰判断部１３０は、最適化対象のメソッドが、UTF16を戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部１２０に格納する。具体的には、メソッド再帰判断部１３０は、最適化対象のメソッドが、コンストラクタによりUTF16に設定された文字変数に格納された文字と、変換命令により既にUTF16に変換された文字と、メソッド情報格納部１２０に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部１２０に格納する。
【００２２】
文字操作処理生成部１４０は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々として、その文字変数に格納される文字がUTF16である場合にその処理を実行し、その文字がUTF8である場合に例外を発生させる例外付命令列を生成する。そして、例外ハンドラ生成部１４５は、例外が発生した場合に実行され、その文字変数に格納される文字をUTF8からUTF16に変換してその文字変数に格納し、その例外を発生させた処理に復帰させる例外ハンドラを生成する。
【００２３】
出力処理命令生成部１５０は、文字変数に格納される文字を出力する処理として、その文字変数に格納された文字がUTF8である場合にその文字を出力し、その文字変数に格納された文字がUTF16である場合にその文字をUTF8に戻して出力する命令列を生成する。そして、出力処理命令生成部１５０は、生成した命令列を、上記処理により最適化された他の各メソッドと共に、最適化されたプログラムである結果プログラムとして出力する。
【００２４】
図２は、文字変数２０のデータ構造の一例である（実施例１）。文字変数２０は、文字変数２０の格納する文字がUTF8及びUTF16の何れであるかを示すコード体系情報２１０と、UTF8の文字を格納する第１文字格納領域２２５と、UTF16の文字を格納する第２文字格納領域２３５とを管理する。具体的には、文字変数２０は、コード体系情報２１０と、第１文字格納領域２２５のアドレスを示す第１ポインタ２２０と、第２文字格納領域２３５のアドレスを示す第２ポインタ２３０と、第１文字格納領域２２５又は第２文字格納領域２３５に格納された文字のデータの長さを示すデータ長情報２４０とを有する。
【００２５】
対象プログラムにおいて、文字変数２０を生成するコンストラクタは、文字を格納する記憶領域である第１文字格納領域２２５及び／又は第２文字格納領域２３５を確保すると共に、その文字変数における文字コード体系を設定する。例えば、コンストラクタは、その文字変数の文字がUTF8又はUTF16である旨を示すコード体系情報２１０を生成する。これにより、コンパイラ１０の変換命令除去部１１０は、文字変数のコンストラクタがその文字変数をUTF8及びUTF16の何れに設定したか判断できる。
【００２６】
本図に係る文字変数２０の具体的な実現方法としては、Ｊａｖａ（登録商標）プログラムの実行環境であるＪＶＭ（Ｊａｖａ仮想マシン）において、Ｊａｖａ（登録商標）言語標準のStringオブジェクトの定義を、本図に係るStringオブジェクトの定義に置き換える。そして、UTF8の文字を操作するクラスであるUTF8Stringを定義する。UTF8Stringのクラスは、例えば、以下のメソッドを含む。
Boolean isUTF8(String str);  コード体系情報２１０を読み出すＡＰＩ。
Byte [] getRawBytes(String str);  第１文字格納領域２２５又は第２文字格納領域２３５を読み出すＡＰＩ。
Int getRawLength(String str);  データ長情報２４０を読み出すＡＰＩ。
【００２７】
また、ＪＶＭにおいて、UTF8のStringオブジェクトを生成するメソッドであるcreateを以下のように定義する。
String create(byte []date, int start, int length)
このメソッドは、第１引数として取得した文字データのうち、第２引数及び第３引数で指定される部分を取り出して、UTF8の文字を有するオブジェクトとして生成する。
【００２８】
図３は、コンパイラ１０が変換処理を最適化する処理フローを示す（実施例１）。文字コード体系判定部１００は、各メソッドに対して入力される文字がUTF8である確率が、基準確率より高いか否か判断する（Ｓ３００）。例えば、文字コード体系判定部１００は、UTF8の文字を入力することが予め定められているメソッドについて、そのメソッドに入力される文字がUTF16である確率が、基準確率より低いと判断する。より具体的には、以下の各メソッド群は、ＸＭＬ文書を入力とすることが予め定められているので、文字コード体系判定部１００は、これらのメソッド群にUTF8が入力されると判断する。
【００２９】
ＳＡＸアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。（サブクラスを含む）
org.xml.sax.Parser.parse(..)
org.xml.sax.XMLReader.parse(..)
javax.xml.parsers.SAXParser.parse(..)
ＤＯＭアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。（サブクラスを含む）
Javax.xml.parsers.DocumentBuilder.parse(..)
Org.apache.xml.serialize.XMLserializer.serialize(..)
Javax.xml.parsers.DocumentBuilderFactory.newInstance(..)
Ｐｕｌｌ  Ｐａｒｓｅｒアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。（サブクラスを含む）
Org.xmlpull.v1.XmlPullParser.next()
Org.xmlpull.v1.XmlPullParser.nextToken()
Org.xmlpull.v1.XmlPullParser.nextTag()
Org.xmlpull.v1.XmlPullParser.nextText()
【００３０】
UTF16である確率が基準確率より低い場合に、変換命令生成部１０５は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々に先立って、その文字をUTF8からUTF16に変換してその文字変数に格納する変換命令を生成する（Ｓ３１０）。ここで、上記複数の処理とは、例えば、UTF16の文字変数をインスタンスに持つ予め定められたクラスにおけるメソッド群である。一例として、Ｊａｖａ（登録商標）言語において、上記複数の処理とは、java/lang/Stringクラスにおける、文字出力用メソッド等、UTF16形式の文字内容を操作する必要のないメソッドを除いた全てのメソッドをいう。即ち、変換命令生成部１０５は、これらのメソッドの呼び出し処理の各々に先立って実行される位置、例えば呼び出し処理の直前に実行される位置に、変換命令を生成する。
【００３１】
変換命令除去部１１０は、変換命令生成部１０５により生成された各変換命令について、その変換命令に先立って実行される全ての実行パスにおいて、その文字変数にUTF16の文字が格納される場合に（条件Ａとする）、その変換命令を除去する（Ｓ３２０）。更に、変換命令除去部１１０は、変換命令生成部１０５により生成された各変換命令について、その変換命令に先立って実行される何れかの実行パスにおいて、その文字変数にUTF16に文字が格納されない場合には（条件Ａが不成立）、その実行パスに新たな変換命令を生成し、その変換命令を除去することにより、変換命令の部分冗長性を除去する。この場合、その実行パスの何れかの実行位置において、その実行位置を起点とする全ての実行パスにおいて文字変数にUTF16の文字が格納されることが条件となる（条件Ｂとする）。
【００３２】
この処理の実現方法として、例えば、変換命令除去部１１０は、非特許文献３及び４に例示された方法により部分冗長性を除去してもよい。ここでは、非特許文献３に記載された方法を応用して変換命令の部分冗長性を除去する処理の一例を説明する。まず、変換命令除去部１１０は、最適化対象のメソッドにおける各々の基本ブロックについて、以下の述語を計算する。但し、変換命令のうち、変換対象の文字変数にUTF8の文字が格納されているか否かチェックする処理部分を、フォーマットチェック処理と呼ぶ。
【００３３】
TRANSP(bb):基本ブロックbbにおいて、フォーマットチェック処理の処理対象の文字変数の内容が破壊されていないか否か
N-COMP(bb):基本ブロックbbにフォーマットチェック処理が存在し、そのフォーマットチェック処理をその基本ブロックbbの入口に配置しても安全か否か（即ち、対象プログラムの意味が変わらないか否か）
X-COMP(bb):基本ブロックbbにフォーマットチェック処理が存在し、そのフォーマットチェック処理をその基本ブロックの出口に配置しても安全か否か（即ち、対象プログラムの意味が変わらないか否か）
【００３４】
次に、変換命令除去部１１０は、Busy Code Motionにより、同一の文字変数に２度以上実行されるフォーマットチェック処理のうち最初に実行されるフォーマットチェック処理が配置される部分を求める。具体的には、まず、変換命令除去部１１０は、フォーマットチェック処理の上方配置安全性と、下方配置安全性とを求める。
【００３５】
各基本ブロックの入口における上方配置安全性：
【数１】
2005293386.tif 000003
各基本ブロックの出口における上方配置安全性：
【数２】
2005293386.tif 000004
各基本ブロックの入口における下方配置安全性：
【数３】
2005293386.tif 000005
各基本ブロックに出口における下方配置安全性：
【数４】
2005293386.tif 000006
【００３６】
次に、変換命令除去部１１０は、以上の方程式を解くことにより、N-D-SAFE(), X-D-SAFE(), N-U-SAFE(), X-U-SAFE()の不動点解を求める。次に、変換命令除去部１１０は、浮動点解を用いて、フォーマットチェック処理を配置するべき位置を以下のように決定する。そして、この際、元々配置されていたフォーマットチェック処理は、原理上全て冗長となるので、変換命令除去部１１０は、これらのフォーマットチェック処理を削除する。
【００３７】
入口にフォーマットチェック処理を配置するべき基本ブロック＝以下の式（５）をtrueとする基本ブロック。
【数５】
2005293386.tif 000007
出口にフォーマットチェック処理を配置するべき基本ブロック＝以下の式（６）をtrueとする基本ブロック。
【数６】
2005293386.tif 000008
【００３８】
更に、変換命令除去部１１０は、Lazy Code Motionにより、不必要に上方に配置されたフォーマットチェック処理を冗長性除去の効果が失われない限り下方に移動してもよい。この方法については、非特許文献３に記載の方法を上記のBusy Code Motionの場合と同様に応用したものであるから、説明を省略する。
【００３９】
更に他の例として、変換命令除去部１１０は、変換命令をより多く除去するべく、制御フローが変更されるように対象プログラムを変形してもよい。例えば、変換命令除去部１１０は、各変換命令について、その変換命令に至る一部の実行パスにおいて文字変数にUTF16の文字が格納されず（条件Ａが不成立）、かつその実行パスの何れの実行位置においても、その実行位置を起点とする全ての実行パスにおいて文字変数にUTF16の文字が格納されない場合に（条件Ｂが不成立）、次の処理を行う。
【００４０】
まず、変換命令除去部１１０は、UTF16の文字が格納される実行パスと格納されない実行パスとの合流地点を求める。次に、変換命令除去部１１０は、その合流地点から変換命令に至るパスにおいて、UTF16の文字が格納される実行パスと格納されない実行パスとの分岐地点を求める。次に、変換命令除去部１１０は、その合流地点からその分岐地点の間のパスをコピーする。次に、変換命令除去部１１０は、コピー元のパスとコピー先のパスとの各々に、合流地点に合流していたパスの各々を接続する。この結果、条件Ｂが満たされるので、変換命令除去部１１０は、例えばbusy code motionを応用した上記の方法により、変換命令の部分冗長性を除去できる。
【００４１】
続いて、メソッド再帰判断部１３０は、最適化対象のメソッドがUTF16を戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部１２０に格納する（Ｓ３３０）。具体的には、メソッド再帰判断部１３０は、最適化対象のメソッドが、コンストラクタによりUTF16に設定された文字変数に格納された文字と、変換命令により既にUTF16に変換された文字と、メソッド情報格納部１２０に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部１２０に格納する。
【００４２】
一方、UTF16である確率が基準確率より高い場合に、文字操作処理生成部１４０は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々として、その文字変数に格納される文字がUTF16である場合にその処理を実行し、その文字がUTF8である場合に例外を発生させる例外付命令列を生成する（Ｓ３４０）。
【００４３】
具体的には、文字操作処理生成部１４０は、例外付命令列として、UTF16の文字が格納される第２文字格納領域２３５を読み出す命令列を生成する。そしてこの場合、文字操作処理生成部１４０は、UTF8の文字が文字変数に格納された場合に実行される命令列であって、第２文字格納領域２３５のアドレスを示す第２ポインタ２３０を無効なアドレスに設定することにより、例外付命令列に例外を発生させる命令列を生成する。また、文字操作処理生成部１４０は、UTF16の文字が文字変数に格納された場合に実行される命令列であって、第２ポインタ２３０を有効なアドレスに設定する命令列を生成する。なお、Ｊａｖａ（登録商標）言語においては、例えば、文字変数を操作するjava/lang/Stringクラス内のメソッドを予め書き換えておき、コンパイラ１０は、書き換えられたこれらのメソッドをコンパイルすることにより上記の命令列を生成してもよい。
【００４４】
そして、例外ハンドラ生成部１４５は、例外が発生した場合に実行され、その文字変数に格納される文字をUTF8からUTF16に変換してその文字変数に格納し、その例外を発生させた処理に復帰させる例外ハンドラを生成する（Ｓ３５０）。なお、他のメソッドについて既に生成した例外ハンドラを利用できる場合には、例外ハンドラ生成部１４５は、Ｓ３５０において再度例外ハンドラを生成しなくともよい。
【００４５】
続いて、出力処理命令生成部１５０は、最適化対象が文字変数に格納される文字を出力する出力処理を行うメソッドである場合には、その文字変数に格納された文字がUTF8である場合にその文字を出力し、その文字変数に格納された文字がUTF16である場合にその文字をUTF8に戻して出力する命令列を生成する（Ｓ３６０）。
【００４６】
図４は、出力処理命令生成部１５０が出力処理として生成する命令列の動作を示すプログラム例である（実施例１）。このプログラムは、図２で説明したＡＰＩを用いて記述されている。具体的には、出力処理は、出力するべき文字コード体系がUTF8であってかつ出力する文字がUTF8である場合には、UTF8の文字をそのまま出力する。一方、出力するべき文字コード体系がUTF8であってかつ出力する文字がUTF16である場合には、UTF16をUTF8に戻して出力する。
【００４７】
出力処理命令生成部１５０が本図に係る命令列を生成する方法としては、具体的には、コンパイラ１０が対象プログラムと共にコンパイルするライブラリプログラムのうち、出力処理を行うメソッド（例えば、OutputStreamWriter.write）を予め変更する。この結果、出力処理命令生成部１５０は、変更されたこのライブラリプログラムをコンパイルすることにより、本図に係る出力処理を実現する適切な命令列を生成できる。
【００４８】
図５は、本実施例に係るコンパイラ１０をSAX入力ライブラリに適用したプログラム例である（実施例１）。（ａ）は、SAX(The Simple API for XML)ハンドラのインターフェイスを示し、（ｂ）は、本実施例におけるSAXパーサの一例を示す。
【００４９】
SAXパーサは、入力したXML文書の各要素に対して、ContentHandlerインターフェイスで定義されたメソッドを実装するオブジェクトのstartElementを読み出す。そして、本実施例におけるSAXパーサは、入力されたXML文書の文字コード体系がUTF8である場合に、UTF8の文字のデータを有するStringオブジェクトを生成し、生成したこのオブジェクトを引数としてメソッドstartElementを呼び出す。
【００５０】
（ｃ）は、本実施例におけるSAXパーサを用いたアプリケーションプログラムの断片を示す。StartElementの引数であるqNameは、UTF8のまま変換されることなくPrintWriter.printを介してOutputStreamWriter.writer()に渡されている。この結果、UTF8の文字は、UTF16に変換されることなくUTF8のまま出力される。このように、SAXパーサを用いるアプリケーションプログラムを何ら変更することなく、UTF16及びUTF8間の変換処理を最適化することができる。
【００５１】
図６は、本実施例に係るコンパイラ１０をDOM入力ライブラリに適用したプログラム例である（実施例１）。DOM(Document Object Model)において、アプリケーションプログラムは、Nodeインターフェイスで定義されるメソッドを呼び出すことにより、要素名などの文字列を取得する。本実施例に係るDOM入力ライブラリは、Documentオブジェクトを生成する場合に、Nodeインターフェイスを実装するオブジェクトの構成要素として、UTF8のStringオブジェクトを生成する。本図は、Nodeインターフェイスを継承するElementインターフェイスを実装するクラスのオブジェクトを生成するライブラリの実装例である。
【００５２】
以上、図１から図６に示す実施例１によれば、コンパイラプログラムとライブラリプログラムの協働により、UTF8からUTF16への文字コード体系の変換処理を、必要最小限に減らすことができる。この結果、例えば入力されたUTF8をそのまま出力する場合に、不要な変換処理を省略することができる。また、UTF16において文字を操作するメソッドは、入力された文字が既にUTF16に変換されたか確認するフォーマットチェック処理を省略できる。
【００５３】
更に、UTF16の文字が入力される確率がより高いメソッドにおいては、変換処理を通常の実行パスに生成せず、例外ハンドラのみに生成することができるので、更に効率が高い。更に、上記の処理は、アプリケーションプログラムを変更することなく、ライブラリプログラム及び／又はコンパイラプログラムにより実現される。従って、既存のアプリケーションプログラムを有効に利用することができる。
【実施例２】
【００５４】
図７は、コンパイラ７０及び中央処理装置８０のブロック図である（実施例２）。コンパイラ７０は、最適化対象の対象プログラムにおいて文字変数に格納される文字をUTF8からUTF16に変換する変換処理、又は、UTF16からUTF8に変換する変換処理を最適化することを目的とする。コンパイラ７０は、取得処理生成部７００と、変換検出処理生成部７１０と、選択処理生成部７２０とを備える。
【００５５】
取得処理生成部７００は、対象プログラムを入力すると、まず、変換対象の文字の文字コードを取得する処理の命令列を生成する。以降、この命令列による処理を取得処理と呼ぶ。次に、変換検出処理生成部７１０は、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、その文字コードに値の範囲を検出する検出処理とを並行して実行する命令列を生成する。以降、この命令列による処理を変換検出処理と呼ぶ。
【００５６】
選択処理生成部７２０は、複数の上記変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する選択処理の命令列を生成する。そして、中央処理装置８０は、出力された命令列を実行して、UTF8に変換された文字コードを生成し、出力する。
【００５７】
図８は、コンパイラ１０が変換処理を最適化する処理フローを示す（実施例２）。コンパイラ１０は、UTF8の文字をUTF16の文字に変換する変換処理の各々に対して、以下の処理を繰り返す。まず、取得処理生成部７００は、取得処理の命令列を生成する（Ｓ８００）。例えば、取得処理生成部７００は、文字コードを含む予め定められたサイズの単位データを取得する命令列を生成してもよい。より具体的には、文字コードが８から３２ビットの可変長である場合には、その文字コードを含む３２ビット又は６４ビットの単位データを取得してもよい。次に、変換検出処理生成部７１０は、変換検出処理の命令列を生成する（Ｓ８１０）。そして、選択処理生成部７２０は、選択処理の命令列を生成する（Ｓ８２０）。
【００５８】
図９は、UTF16及びUTF8の文字コード体系を比較して示す（実施例２）。本発明に係る第１の文字コード体系の一例であるUTF8は、16進数で0から7Fまでの文字コードを、１バイトのデータサイズの文字コードにおける下位の７ビットとして表す。これに対して、本発明に係る第２の文字コード体系の一例であるUTF16は、16進数で0から7Fまでの文字コードを、２バイトのデータサイズの文字コードにおける下位の7ビットとして表す。このように、16進数で0から7Fまでの文字コードについては、UTF8の方がUTF16よりメモリの使用効率が良い。
【００５９】
UTF8は、16進数で80から7FFまでの文字コードを、２バイトのデータサイズの文字コードにおける、１バイト目の下位５ビットと、２バイト目の下位６ビットとに分割して表す。その他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、２バイトのデータサイズの文字コードにおける下位の11ビットとして表す。
【００６０】
UTF8は、16進数で800から0FFFまでの文字コードを、３バイトのデータサイズの文字コードにおける、２バイト目の下位５ビットと、３バイト目の下位６ビットとに分割して表す。１バイト目のデータと、２バイト目及び３バイト目のその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、２バイトのデータサイズの文字コードにおける下位の12ビットとして表す。
【００６１】
UTF8は、16進数で1000からDF77まで、又は、E000からFFFFまでの文字コードを、３バイトのデータサイズの文字コードにおける、１バイト目の下位４ビットと、２バイト目の下位６ビットと、３バイト目の下位６ビットとに分割して表す。一方、UTF16は、この文字コードを、２バイトのデータサイズの文字コードにおける16ビットとして表す。
【００６２】
UTF8は、16進数で10000から3FFFFまでの文字コードを、４バイトのデータサイズの文字コードにおける、２バイト目の下位６ビットと、３バイト目の下位６ビットと、４バイト目の下位６ビットとに分割して表す。１バイト目と、２から４バイト目のその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、20ビットの文字コードにおける下位18ビットとして表す。
【００６３】
UTF8は、16進数で40000からFFFFFまでの文字コードを、４バイトのデータサイズの文字コードにおける、１バイト目の下位２ビットと、２バイト目の下位４ビットと、３バイト目の下位６ビットと、４バイト目の下位６ビットとに分割して表す。その他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、20ビットの文字コードにおける20ビットとして表す。
【００６４】
UTF8は、16進数で100000から10FFFFまでの文字コードを、４バイトのデータサイズの文字コードにおける、２バイト目の下位４ビットと、３バイト目の下位６ビットと、４バイト目の下位６ビットとに分割して表す。１バイト目のデータ、及びその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、24ビットの文字コードにおける16ビットとして表す。
【００６５】
このように、UTF8においては、格納する文字コードの値又は文字の種類に応じて、文字コードのデータサイズが異なる。一方、UTF16においては、16進数で10000を超える文字を除いて、データサイズが２バイトで一定である。この結果、データサイズの小さい文字が連続した場合には、UTF8の方がメモリの使用効率が高い。一方、UTF16は、UTF8と比較して、文字の種類に応じてデータサイズが変化しにくい。このため、UTF16を対象とする処理の方が、UTF8を対象とする処理より高速である場合が多い。
【００６６】
そして、UTF8をUTF16に変換するには、UTF8の文字コードにおける制御用データを読み出して、その制御用データに応じて適切な変換処理を選択する必要がある。続いて、図１０を用いて、UTF16をUTF8に変換するこの処理の一例を示す。なお、本図の以降の説明において、特に断らない限り、演算に用いる定数を16進数で示す。
【００６７】
コンピュータの中央処理装置は、メモリその他のハードウェアと協働して、まず、文字コードの最初の8ビットを、変数b0に読み出す（Ｓ１０００）。以降の説明において、「コンピュータの中央処理装置は、メモリその他のハードウェアと協働して、」を単に「コンピュータは、」と略記する。そして、コンピュータは、読み出した文字コードを80でマスクした結果が0である場合に（Ｓ１００５：ＹＥＳ）、変数b0と2進数の00000000との論理和、即ちb0自体を算出し（Ｓ１０１０）、Ｓ１１４０に処理を移す。
【００６８】
一方、変数b0を80でマスクした結果が0以外の値の場合において（Ｓ１００５：ＮＯ）、コンピュータは、変数b0をe0でマスクした結果がc0になる場合に（Ｓ１０１５：ＹＥＳ）、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す（Ｓ１０２０）。そして、変数b1をc0でマスクした結果が80にならなければ（Ｓ１０２５：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１０３０）。例えば、入力となる文字がUTF8に準拠していない場合がこれに該当する。
【００６９】
一方、変数b1をc0でマスクした結果が80であれば（Ｓ１０２５：ＹＥＳ）、コンピュータは、変数b0を6ビット左シフトして7c0でマスクした値と、変数b1を3fでマスクした値との論理和を変数cに格納して、Ｓ１１４０において出力させる（Ｓ１０３５）。コンピュータは、変数b0をe0でマスクした結果がc0でない場合に（Ｓ１０１５：ＮＯ）、変数b0をf0でマスクした結果がe0であるか否か判断する（Ｓ１０４０）。e0である場合に（Ｓ１０４０：ＹＥＳ）、コンピュータは、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す（Ｓ１０４５）。
【００７０】
そして、変数b1をc0でマスクした結果が80にならなければ（Ｓ１０５０：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１０５５）。一方、変数b1をc0でマスクした結果が80である場合に（Ｓ１０５０：ＹＥＳ）、コンピュータは、b1として読み出した文字コードに連続する次の8ビットを、変数b2に読み出す（Ｓ１０６０）。
【００７１】
変数b2をc0でマスクした結果が80にならなければ（Ｓ１０６５：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１０７０）。変数b2をc0でマスクした結果が80である場合に（Ｓ１０６５：ＹＥＳ）、コンピュータは、変数b0を12ビット左シフトしてf000でマスクした値と、変数b1を6ビット左シフトしてfc0でマスクした値と、変数b2を3fでマスクした値との論理和を、変数cに格納する（Ｓ１０７５）。
【００７２】
コンピュータは、変数b0をf0でマスクした結果がe0でない場合に（Ｓ１０４０：ＮＯ）、変数b0をf8でマスクした結果がf0であるか判断する（Ｓ１０８０）。f0でない場合に（Ｓ１０８０：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１０８５）。変数b0をf8でマスクした結果がf0である場合に（Ｓ１０８０：ＹＥＳ）、コンピュータは、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す（Ｓ１０９０）。
【００７３】
変数b1をc0でマスクした結果が80でない場合に（Ｓ１０９５：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１１００）。一方、変数b1をc0でマスクした結果が80である場合に（Ｓ１０９５：ＹＥＳ）、コンピュータは、b1として読み出した文字コードに連続する次の8ビットを、変数b2に読み出す（Ｓ１１０５）。
【００７４】
続いて、変数b2をc0でマスクした結果が80でない場合に（Ｓ１１１０：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する（Ｓ１１１５）。変数b2をc0でマスクした結果が80である場合に（Ｓ１１１０：ＹＥＳ）、コンピュータは、b2として読み出した文字コードに連続する次の8ビットを、変数b3に読み出す（Ｓ１１２０）。
【００７５】
続いて、変数b3をc0でマスクした結果が80でない場合に（Ｓ１１２５：ＮＯ）、コンピュータは、変換処理においてエラーが生じた旨を利用者に通知する（Ｓ１１３０）。変数b3をc0でマスクした結果が80である場合に（Ｓ１１２５：ＹＥＳ）、コンピュータは、次の計算をする（Ｓ１１３５）。まず、変数b0を2ビット左シフトして1cでマスクした値と、変数b1を4ビット右シフトして3でマスクした値との論理和を求め、１減じた値を、変数wに格納する。
【００７６】
次に、コンピュータは、定数d800と、変数wを6ビット左シフトして3c0でマスクした値と、変数b1を2ビット左シフトして3cでマスクした値と、変数b2を4ビット右シフトして3でマスクした値との論理和を、変数c_highに格納する。更に、コンピュータは、定数dc00と、変数b2を6ビット左シフトして3c0でマスクした値と、変数b3を3fでマスクした値との論理和を、変数c_lowに格納する。
【００７７】
最後に、コンピュータは、変数cに格納された値か、又は、c_highを上位ビットとし、c_lowを下位ビットとする値をUTF16の文字コードとして出力する（Ｓ１１４０）。
【００７８】
このように、UTF8をUTF16に変換するには、UTF8の文字コードにおける制御用データを読み出して、その制御用データに応じて適切な変換処理を選択する必要がある。即ち例えば、コンピュータは、制御用データがどのような値であるか判断して条件分岐する必要がある。本図のように条件分岐が頻繁に行なわれる場合には、次に実行される命令群を的確に予測できないので、コンピュータは、実行中の命令より後に実行される命令を先読みして実行しにくい。このため、コンピュータの中央処理装置が処理可能な命令の並列度を有効に利用できず、対象プログラムの実行効率が悪くなってしまう。更に、近年の中央処理装置は、レジスタに６４ビットのデータを格納できる一方、本例の処理においてはレジスタに８ビットのデータしか格納されない場合も多く、効率的でない。
これに対して、本実施例におけるコンパイラ１０は、条件分岐の数を減らして変換命令の実行効率を高めることができる。以降、本実施例におけるコンパイラ１０が生成する変換命令の一例を説明する。
【００７９】
図１１は、本実施例におけるコンパイラ７０が生成する変換処理の処理フロー図を示す（実施例２）。本図においても、特に断らない限り、演算対象の定数を16進数で示す。コンピュータは、まず、取得処理として、32ビットのデータを読み出して、変数wに格納する（Ｓ１１４５）。そして、コンピュータは、変換検出処理として、Ｓ１１５０からＳ１１９０に示す８つの処理を並行に行う。
【００８０】
具体的には、コンピュータは、第１の変換処理として、変数wを２４ビット右シフトして7fでマスクした値を変数c0に格納する（Ｓ１１５０）。また、コンピュータは、第２の変換処理として、変数ｗを18ビット右シフトして7c0でマスクした値と、変数wを16ビット右シフトして3fでマスクした値との論理和を、変数c1に格納する（Ｓ１１５５）。また、コンピュータは、第３の変換処理として、変数wを12ビット右シフトしてf000でマスクした値と、変数wを10ビット右シフトしてfc0でマスクした値と、変数wを8ビット右シフトして3fでマスクした値との論理和を、変数c2に格納する（Ｓ１１６０）。
【００８１】
更に、コンピュータは、第４の変換処理として、まず、変数wを22ビット右シフトして1cでマスクした値と、変数wを20ビット右シフトして3でマスクした値との論理和を求め、１減じた値を、変数xに格納する（Ｓ１１６５）。次に、第４の変換処理として、コンピュータは、定数d800と、変数xを6ビット左シフトして3c0でマスクした値と、変数wを14ビット右シフトして3cでマスクした値と、変数wを12ビット右シフトして3でマスクした値との論理和を、変数c_highに格納する。次に、コンピュータは、定数dc00と、変数wを2ビット右シフトして3c0でマスクした値と、変数wを3fでマスクした値との論理和を、変数c_lowに格納する。
【００８２】
また、コンピュータは、検出処理として、変数wを80000000でマスクした値が0である場合に、変数f0に真を格納する（Ｓ１１７０）。また、コンピュータは、変数wをe0c00000でマスクした値がc0800000である場合に、変数f1に真を格納する（Ｓ１１８０）。また、コンピュータは、変数wをf0c0c000でマスクした値がe0808000である場合に、変数f2に真を格納する（Ｓ１１８５）。また、コンピュータは、変数wをf8c0c0c0でマスクした値がf0808080である場合に、変数f3に真を格納する（Ｓ１１９０）。
【００８３】
コンピュータは、上記第１から第４の変換処理と、検出処理と互いに並行に実行してもよいし、これらのうち少なくとも２つの処理を並行に実行してもよい。続いて、コンピュータは、選択処理として、Ｓ１１９５からＳ１２２０の処理を実行する。
【００８４】
具体的には、コンピュータは、まず、変数f0が真である場合に、変数cに変数c0を格納する（Ｓ１１９５）。また、変数f1が真である場合に、変数cに変数c1を格納する（Ｓ１２００）。また、変数f2が真である場合に、変数cに変数c2を格納する（Ｓ１２０５）。これらの場合には、コンピュータは、変数cの内容を変換結果として出力する（Ｓ１２２０）。また、変数f3が真である場合に、c_highを上位ビットとし、c_lowを下位ビットとする値をUTF16の文字コードとして出力する（Ｓ１２２０）。なお、f0からf3の何れも真でない場合には、変換処理においてエラーが発生した旨を通知する（Ｓ１２１５）。
【００８５】
このように、本実施例によけるコンパイラ７０が生成した命令列によれば、何れかを選択して実行すべき複数の変換処理を、条件判断に先立って投機的に実行できる。そして、変換処理及び検出処理を条件分岐を処理することなく互いに並列に実行できる。これにより、複数の命令を並行して実行可能な中央処理装置の性能を有効に活用して、文字コード体系を効率的に変換させることができる。
【００８６】
以降、この変換処理を更に効率良く実行させる方法として、連続して配列されたデータサイズの等しい複数の文字コードを一括して変換する処理について説明する。まず、この処理を更に効率的に実行するためには、中央処理装置８０が、変換処理に適した命令群を有していることが好ましい。以降、図１２及び図１３を用いて、中央処理装置８０が有する命令群を説明する。そして、図１４において、コンパイラ７０がこれらの命令群を含む命令列を生成する例を説明する。
【００８７】
図１２は、中央処理装置８０が有する、UTF8をUTF16に変換する命令群の一例を示す（実施例２）。（ａ）は、命令UTF81toUTF16の詳細を示す。変換検出処理生成部７１０は、命令UTF81toUTF16として、64ビットのレジスタrsに、データサイズが8ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが8ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【００８８】
より詳細には、命令UTF81toUTF16により、中央処理装置８０は、レジスタrsの第１ビットから第７ビットと、第９ビットから第１５ビットと、第１７ビットから第２３ビットと、第２５ビットから第３１ビットとを、それぞれ、レジスタrtの第９ビットから第１５ビットと、第２５ビットから第３１ビットと、第４１ビットから第４７ビットと、第５７ビットから第６３ビットとにコピーする。
【００８９】
更に、命令UTF81toUTF16により、中央処理装置８０は、レジスタrsの第０ビットが０であり、第８ビットが０であり、第１６ビットが０であり、かつ第２４ビットが０である場合に、データサイズが8ビットである複数の文字コードが連続され配列されている旨の検出結果を示すべく、レジスタcrに１を格納する。
【００９０】
（ｂ）は、命令UTF82toUTF16の詳細を示す。変換検出処理生成部７１０は、命令UTF82toUTF16として、64ビットのレジスタrsに、データサイズが16ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが16ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【００９１】
より詳細には、命令UTF82toUTF16により、中央処理装置８０は、レジスタrsの第３ビットから第７ビット、及び、第１０ビットから第１５ビットを結合してレジスタrtの第５ビットから第１５ビットにコピーする。また、中央処理装置８０は、レジスタrsの第１９ビットから第２３ビット、及び、第２６ビットから第３１ビットを結合してレジスタrtの第２１ビットから第３１ビットにコピーする。
【００９２】
また、中央処理装置８０は、レジスタrsの第３５ビットから第３９ビット、及び、第４２ビットから第４７ビットを結合してレジスタrtの第３７ビットから第４７ビットにコピーする。また、中央処理装置８０は、レジスタrsの第５１ビットから第５５ビット、及び、第５８ビットから第６３ビットを結合してレジスタrtの第５３ビットから第６３ビットにコピーする。
【００９３】
更に、命令UTF82toUTF16により、中央処理装置８０は、レジスタrsの第０から第２ビット、第１６ビットから第１８ビット、第３２ビットから第３４ビット、及び第４８から第５０ビットの各々が、2進数の110である条件を満たすか否か判断する。更に、中央処理装置８０は、第８及び第９ビット、第２４及び第２５ビット、第４０及び第４１ビット、並びに第５６及び第５７ビットが、2進数の10である条件を満たすか判断する。
【００９４】
更に、中央処理装置８０は、レジスタrsの第３ビットが０でないか、又は、第４から第７ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置８０は、レジスタrsの第１９ビットが０でないか、又は、第２０から第２３ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置８０は、レジスタrsの第３５ビットが０でないか、又は、第３６から第３９ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置８０は、レジスタrsの第５１ビットが０でないか、又は、第５２から第５５ビットが000でも001でもないという条件を満たすか否か判断する。以上の条件が全て満たされる場合に、中央処理装置８０は、レジスタcrに１を格納する。
【００９５】
（ｃ）は、命令UTF83toUTF16の詳細を示す。変換検出処理生成部７１０は、命令UTF83toUTF16として、64ビットのレジスタrsに、データサイズが24ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが24ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【００９６】
より詳細には、命令UTF83toUTF16により、中央処理装置８０は、レジスタrsの第４ビットから第７ビット、第１０ビットから第１５ビット、及び第１８から第２３ビットを結合してレジスタrtの第３２ビットから第４７ビットにコピーする。また、中央処理装置８０は、レジスタrsの第２８ビットから第３１ビット、第３４ビットから第３９ビット、及び第４２から第４７ビットを結合してレジスタrtの第４８ビットから第６３ビットにコピーする。
【００９７】
更に、命令UTF83toUTF16により、中央処理装置８０は、レジスタrsの第０から第３ビット、及び、第２４ビットから第２７ビットの各々が、2進数の1110である条件を満たすか否か判断する。更に、命令UTF83toUTF16により、中央処理装置８０は、レジスタrsの第８及び第９ビット、第１６及び第１７ビット、第３２及び第３３ビット、並びに、第４０及び第４１ビットの各々が、2進数の10である条件を満たすか否か判断する。
【００９８】
更に、中央処理装置８０は、レジスタrsの第４ビットから第７ビットが2進数の1101でないか、又は、第１０ビットが1でないという条件を満たすか判断する。更に、中央処理装置８０は、レジスタrsの第２８ビットから第３１ビットが2進数の1101でないか、又は、第３４ビットが1でないという条件を満たすか判断する。以上の条件が全て満たされる場合に、中央処理装置８０は、レジスタcrに１を格納する。
【００９９】
以上、本図に示すように、変換検出処理生成部７１０は、文字コードのデータサイズである８ビット、１６ビット、及び２４ビット毎に、単位データにそのデータサイズの複数の文字コードが連続して配列される場合に実行するべき変換処理と並行して、その単位データにそのデータサイズの複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成することができる。
【０１００】
更に、これらの命令の処理を論理回路で実現した場合、２〜３段のＮＡＮＤゲートを要する。従って、ＮＡＮＤゲートを実装した場合の信号遅延を考慮しても、これらの命令は、それぞれ、単純な加算命令等と同様、１サイクルのレイテンシ及び１サイクルのスループットで実行される。即ち、本図の命令によれば、コンピュータは、１サイクルで最大４文字程度のUTF8の文字列を、UTF16の文字列に変換できる。
【０１０１】
図１３は、中央処理装置８０が有するその他の命令を示し、（ａ）は、UTF16をUTF8に変換する命令群の１つである命令UTF16toUTF81の詳細を示す（実施例２）。変換検出処理生成部７１０は、命令UTF16toUTF81として、64ビットのレジスタrsに、データサイズが8ビットのUTF8に変換すべき文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが8ビットのUTF8に変換すべき文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【０１０２】
より詳細には、命令UTF16toUTF81により、中央処理装置８０は、レジスタrtの第９ビットから第１５ビットと、第２５ビットから第３１ビットと、第４１ビットから第４７ビットと、第５７ビットから第６３ビットとを、それぞれ、レジスタrtの第３３ビットから第３９ビットと、第４１ビットから第４７ビットと、第４９ビットから第５５ビットと、第５７ビットから第６３ビットとにコピーする。
【０１０３】
更に、命令UTF16toUTF81により、中央処理装置８０は、レジスタrsの第０から第８ビット、第１６から第２４ビット、第３２から第４０ビット、及び、第４８から第５６ビットの全てが０である条件を満たす場合に、レジスタcrに１を格納する。
【０１０４】
（ｂ）は、中央処理装置８０が有する、UTF16をUTF8に変換する命令群の１つである命令UTF16toUTF82の詳細を示す。変換検出処理生成部７１０は、命令UTF16toUTF82として、64ビットのレジスタrsに、16ビットのUTF8に変換するべきUTF16の文字コードが連続して配列される場合に実行すべき変換処理と並行して、16ビットのUTF8に変換するべきUTF16の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【０１０５】
より詳細には、命令UTF16toUTF82により、中央処理装置８０は、レジスタrsの第５ビットから第１５ビットを分割して、レジスタrtの第３ビットから第７ビット、及び、第１０ビットから第１５ビットにコピーする。また、中央処理装置８０は、レジスタrsの第２１ビットから第３１ビットを分割して、レジスタrtの第１９ビットから第２３ビット、及び、第２６ビットから第３１ビットにコピーする。
【０１０６】
更に、命令UTF16toUTF82により、中央処理装置８０は、レジスタrsの第３７ビットから第４７ビットを分割して、レジスタrtの第３５ビットから第３９ビット、及び、第４２ビットから第４７ビットにコピーする。また、中央処理装置８０は、レジスタrsの第５３ビットから第６３ビットを分割して、レジスタrtの第５１ビットから第５５ビット、及び、第５８ビットから第６３ビットにコピーする。
【０１０７】
更に、命令UTF16toUTF82により、中央処理装置８０は、レジスタrsの第０から第４ビット、第１６ビットから第２０ビット、第３２ビットから第３６ビット、及び第４８から第５２ビットの各々が、全て０である条件を満たすか否か判断する。更に、中央処理装置８０は、第５から第７ビット、第２１から第２３ビット、第３７から第３９ビット、及び第５３から第５５ビットの何れもが、2進数の000でないという条件を満たすか否か判断する。以上の条件を全て満たす場合に、中央処理装置８０は、レジスタcrに１を格納する。
【０１０８】
（ｃ）は、中央処理装置８０が有する、UTF16をUTF8に変換する命令群の１つである命令UTF16toUTF82の詳細を示す。変換検出処理生成部７１０は、命令UTF16toUTF83として、64ビットのレジスタrsに、24ビットのUTF8に変換すべきUTF16の文字コードが連続して配列される場合に実行すべき変換処理と並行して、24ビットのUTF8に変換すべきUTF16の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
【０１０９】
より詳細には、UTF16toUTF83により、中央処理装置８０は、レジスタrsの第３２ビットから第４７ビットを分割して、レジスタrtの第４ビットから第７ビット、第１０ビットから第１５ビット、及び第１８から第２３ビットにコピーする。また、中央処理装置８０は、レジスタrsの第４８ビットから第６３ビットを分割して、レジスタrtの第２８ビットから第３１ビット、第３４ビットから第３９ビット、及び第４２から第４７ビットにコピーする。
【０１１０】
更に、命令UTF16toUTF83により、中央処理装置８０は、レジスタrsの第３２から第３６ビットが2進数の00001であるか、又は、第３２から第３５ビットが、2進数の0000でないという条件を満たすか判断する。また、中央処理装置８０は、レジスタrsの第４８から第５２ビットが2進数の00001であるか、又は、第４８から第５１ビットが、2進数の0000でないという条件を満たすか判断する。以上の条件を全て満たす場合に、中央処理装置８０は、レジスタcrに１を格納する。
【０１１１】
（ｄ）は、中央処理装置８０が有する条件付き加算命令の一例を示す。この命令により、コンピュータは、レジスタcrが１の場合に、レジスタrsに定数immを加えた結果をレジスタrtに格納する。
【０１１２】
図１４は、コンパイラ１０が変換処理を最適化して生成した命令列の処理フローを示す（実施例２）。取得処理生成部７００により生成された取得処理の命令列により、コンピュータは、予め定められたサイズの単位データ、例えば６４ビットのデータをレジスタに読み込む（Ｓ１５００）。読み込み先のレジスタをレジスタr6とする。次に、コンピュータは、取得処理生成部７００により生成された変換検出処理により、以下の処理を並行に行う。
【０１１３】
まず、コンピュータは、レジスタr6に１バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に１バイトのUTF8が連続して配列されているか否かを検出する検出処理を実行する（Ｓ１５１０）。また、コンピュータは、レジスタr6に２バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に２バイトのUTF8が連続して配列されているか否かを検出する検出処理を実行する（Ｓ１５５０）。
【０１１４】
更に、コンピュータは、レジスタr6に３バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に３バイトのUTF8が連続して配列されているか否かを検出検出処理を実行する（Ｓ１５７０）。Ｓ１５００、Ｓ１５１０、Ｓ１５５０、及びＳ１５７０の処理については、図１５において詳述する。
【０１１５】
レジスタr6に１バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を１文字づつ４文字出力する（Ｓ１５２０）。この場合、コンピュータは、レジスタr6のうち未変換の32ビットのデータを、UTF16に変換し（Ｓ１５３０）、変換後の文字を１文字づつ更に４文字出力する（Ｓ１５４０）。
【０１１６】
レジスタr6に２バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を１文字づつ４文字出力する（Ｓ１５６０）。一方、レジスタr6に３バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を１文字づつ２文字出力する（Ｓ１５８０）。
【０１１７】
一方、コンピュータは、何れのデータサイズの文字コードもレジスタr6に連続して配列されていない場合には、UTF81toUTF16等の命令を用いずに文字コード体系を変換する予め準備された命令列を処理し（Ｓ１５９０）、変換結果を１文字づつ出力する（Ｓ１５９５）。
【０１１８】
以上、本図の処理によれば、６４ビットの単位データにおいて、データサイズが等しいUTF8の文字コードが連続して配列されている場合に、これらの文字コードをまとめてUTF16に変換する。この結果、データサイズが等しい文字コードが連続する場合に、変換処理の効率を向上させることができる。例えば、１バイトのUTF8の文字が連続して配列される場合には、本図の太線で示す経路で処理が進むので、データを一度読み出すことにより８文字の文字コードを変換でき、効率が良い。これにより、例えばXML文書のような、タグ部分には１バイトのUTF8の文字が連続して配列し、テキスト部分には日本語の文字を示す特定のコードが連続して配列される文書を、特に効率良く変換できる。
【０１１９】
更に、本図の処理によれば、複数の文字を一度に変換した場合であっても、他のメソッドから呼び出しを受ける毎に変換後の文字を１文字づつ出力する。これにより、本図の処理を呼び出し他のメソッドを変更する必要がないので、従来のプログラムとの親和性が高い。
【０１２０】
図１５は、コンパイラ１０が変換処理を最適化して生成した命令群５０の一例を示す（実施例２）。取得処理生成部７００は、変換対象の文字の文字コードを取得する処理の命令を２行目に生成する。この命令は、レジスタr3により指されるアドレスから６４ビットのデータをレジスタｒ６に読み込む。そして、変換検出処理生成部７１０は、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、その文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を、第４、第５、及び第７行目に生成する。
【０１２１】
これらの命令は、UTF8が採り得るデータサイズ毎に、レジスタr6にそのデータサイズの文字コードが連続して配列されている場合に実行するべき複数の変換処理を実行し、変換結果をレジスタr7、レジスタr8、及びレジスタr9にそれぞれ格納する。更にこれらの命令は、レジスタr6にそのデータサイズの文字コードが連続して配列されているか否かを検出した検出結果を、レジスタcr0.lt、レジスタcr1.lt、及びレジスタcr2.ltにそれぞれ格納する。
【０１２２】
続いて、選択処理生成部７２０は、何れのデータサイズの文字コードもレジスタr6に連続して配列されていないか検出する命令列を、第１１行、第１３行、及び第２２行目に生成する。即ち例えば、この命令列は、レジスタr6中にデータサイズの異なる複数の文字コードが配列されているか判断し、そのように判断した場合には、UTF81toUTF16等の命令を用いずに文字コード体系を変換する予め準備された命令列に処理を移す。
【０１２３】
また、選択処理生成部７２０は、複数の変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する命令列を、第９、第１５、及び第２０行目に生成する。これらの命令列は、レジスタcr0、cr1、及びcr2の値に応じて、レジスタr7、r8、及びr8の何れかを選択してレジスタr4に格納する。即ちレジスタr4に変換結果が出力される。
【０１２４】
更に、好ましくは、選択処理生成部７２０は、文字コードを取得する後続する命令に備えて、文字コードの読み出し先を指すレジスタr3をインクリメントする命令を、第１４、第１８、第２５行目に生成する。また、好ましくは、選択処理生成部７２０は、変換後の文字コードを使用する処理に備えて、変換した文字の文字数を計算して出力する命令を、第１０、第１７、及び第２１行目に生成する。これらの命令は、変換した文字の文字数をレジスタr5に出力する。
【０１２５】
上記の命令をＩＢＭコーポレーション（登録商標）のＰＯＷＥＲ４（登録商標）アーキティクチャにより実行する場合について、実行に要するサイクル数を説明する。このアーキティクチャにおいて、固定小数点命令２命令、分岐命令２命令、及びコンディショナルレジスタ命令１命令が、１サイクルで並行に実行される。また、このアーキティクチャにおいて、ロード命令のレイテンシは３サイクルである。
【０１２６】
また、このアーキティクチャにおいて、通常の加算命令のレイテンシは２サイクルであり、スループットは１サイクルである。従って、UTF81to16、UTF82to16、及びUTF83to16の各命令も、同様のスループット及びレイテンシを有しているものとして取扱う。このような前提の下、本図の命令列は、１１サイクルで実行される。即ち、本図の命令列によれば、２から４文字のUTF8の文字列を、１１サイクルで、UTF16の文字列に変換することができる。
【０１２７】
これに対して、例えば図１０の例によれば、１文字の変換に最短１０サイクルを要する。具体的には、１バイトのUTF8をUTF16に変換する場合において、ロード命令（３サイクル）、比較命令（２サイクル）、分岐命令（１サイクル）、シフト命令（２サイクル）、及びＡＮＤ命令（２サイクル）が実行される。この様に、本図の命令列は、図１０の例と比較して文字数あたりの変換効率を高めることができる。
【０１２８】
なお、上記処理に代えて、変換検出処理生成部７１０は、文字コードのデータサイズ毎に実行する検出処理として、単位データのうち何れの文字コードがそのデータサイズであるかを更に検出する命令列を生成してもよい。そしてこの場合、選択処理生成部７２０は、その検出処理に対応する変換処理の処理結果のうち、その検出処理によりそのデータサイズであると検出された文字コードについての処理結果のみを選択して出力する命令列を生成する。この場合、単位データに同一サイズの文字コードが配列されている場合のみならず、異なるサイズの文字コードが配列されている場合であっても、処理を高速化できる。
【０１２９】
また、本図において、各変換処理の変換結果は、レジスタcr0.lt、レジスタcr1.lt、及びレジスタcr2.ltの値に応じて選択され、レジスタr4に出力される。これに代えて、各変換処理の処理結果を記憶領域の連続したアドレスに格納し、検出処理の処理結果に応じて定まるアドレスから取得した処理結果をレジスタr4に出力してもよい。即ちこの場合、変換検出処理生成部７１０は、複数の変換処理の各々として、その変換処理の処理結果をその変換処理に対応して予め定められた記憶領域に格納する命令列を生成する。そして、選択処理生成部７２０は、検出処理により検出された文字コードの値の範囲に基づいて、読み出すべき処理結果を格納する記憶領域のアドレスを生成し、生成したそのアドレスから処理結果を読み出す命令列を生成する。この場合、処理結果をレジスタr4に読み込む処理を１命令に集約することができる。
【０１３０】
図１６は、コンパイラ１０又はコンパイラ７０として機能するコンピュータ５００のハードウェア構成の一例を示す。コンピュータ５００は、ホストコントローラ１７８２により相互に接続されるＣＰＵ８０、ＲＡＭ１７２０、グラフィックコントローラ１７７５、及び表示装置１７８０を有するＣＰＵ周辺部と、入出力コントローラ１７８４によりホストコントローラ１７８２に接続される通信インターフェイス１７３０、ハードディスクドライブ１７４０、及びＣＤ−ＲＯＭドライブ１７６０を有する入出力部と、入出力コントローラ１７８４に接続されるＲＯＭ１７１０、フレキシブルディスクドライブ１７５０、及び入出力チップ１７７０を有するレガシー入出力部とを備える。
【０１３１】
ホストコントローラ１７８２は、ＲＡＭ１７２０と、高い転送レートでＲＡＭ１７２０をアクセスするＣＰＵ８０及びグラフィックコントローラ１７７５とを接続する。ＣＰＵ８０は、ＲＯＭ１７１０及びＲＡＭ１７２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１７７５は、ＣＰＵ８０等がＲＡＭ１７２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１７８０上に表示させる。これに代えて、グラフィックコントローラ１７７５は、ＣＰＵ８０等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【０１３２】
入出力コントローラ１７８４は、ホストコントローラ１７８２と、比較的高速な入出力装置である通信インターフェイス１７３０、ハードディスクドライブ１７４０、及びＣＤ−ＲＯＭドライブ１７６０を接続する。通信インターフェイス１７３０は、ネットワークを介して外部の装置と通信する。また、通信インターフェイス１７３０は、半導体試験装置１０と通信する。ハードディスクドライブ１７４０は、コンピュータ５００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１７６０は、ＣＤ−ＲＯＭ１７９５からプログラム又はデータを読み取り、ＲＡＭ１７２０を介して入出力チップ１７７０に提供する。
【０１３３】
また、入出力コントローラ１７８４には、ＲＯＭ１７１０と、フレキシブルディスクドライブ１７５０や入出力チップ１７７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１７１０は、コンピュータ５００の起動時にＣＰＵ８０が実行するブートプログラムや、コンピュータ５００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１７５０は、フレキシブルディスク１７９０からプログラム又はデータを読み取り、ＲＡＭ１７２０を介して入出力チップ１７７０に提供する。入出力チップ１７７０は、フレキシブルディスク１７９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【０１３４】
コンピュータ５００に提供されるプログラムは、フレキシブルディスク１７９０、ＣＤ−ＲＯＭ１７９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１７７０及び/又は入出力コントローラ１７８４を介して、記録媒体から読み出されコンピュータ５００にインストールされて実行される。コンピュータ５００にインストールされて実行されるコンパイラプログラムがコンピュータ５００に働きかけて行わせる動作は、図１から図１５において説明したコンパイラ１０又はコンパイラ７０における動作と同一であるから、説明を省略する。
【０１３５】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１７９０、ＣＤ−ＲＯＭ１７９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ５００に提供してもよい。
【０１３６】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【０１３７】
以上の実施例によると、以下の各項目に示すコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置が実現される。
（項目１）最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部とを備えるコンパイラ。
（項目２）  前記変換命令生成部は、ＸＭＬ文書における文字の文字コード体系であるUTF8から、Ｊａｖａプログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する項目１記載のコンパイラ。
【０１３８】
（項目３）  前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納されない場合に、当該実行パスに変換命令を生成し、当該変換命令を除去することにより変換命令の部分冗長性を除去する項目１記載のコンパイラ。
（項目４）  前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字コード体系を設定するコンストラクタにより生成され、前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第２の文字コード体系に設定する場合に、当該実行パスにおいて前記文字変数に前記第２の文字コード体系の文字が格納されると判断する項目１記載のコンパイラ。
【０１３９】
（項目５）  前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第２の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、当該実行パスにおいて前記文字変数に前記第２の文字コード体系の文字が格納されると判断する項目１記載のコンパイラ。
（項目６）  前記第２の文字コード体系の文字を戻り値とするメソッドの識別情報を格納するメソッド情報格納部と、前記コンストラクタにより前記第２の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第２の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記メソッド情報格納部に格納するメソッド再帰判断部とを更に備え、前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、当該実行パスにおいて前記第２の文字コード体系の文字が前記文字変数に格納されると判断する項目５記載のコンパイラ。
【０１４０】
（項目７）  前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第１の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第２の文字コード体系である場合に当該文字を前記第１の文字コード体系に戻して出力する命令列を生成する出力処理命令列生成部を更に備える項目１記載のコンパイラ。
（項目８）  最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第２の文字コード体系である場合に当該処理を実行し、当該文字が前記第１の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ。
【０１４１】
（項目９）  前記文字操作処理生成部は、前記文字変数の文字を読み出して操作する前記複数の処理の各々について、当該処理に入力される文字が前記第２の文字コード体系である確率が、予め定められた基準確率より高い場合に、前記例外付命令列を生成する項目８記載のコンパイラ。
（項目１０）  前記文字変数は、当該文字変数が前記第１の文字コード体系及び前記第２の文字コード体系の何れであるかを示すコード体系情報と、第１の文字コード体系の文字を格納する第１文字格納領域と、第２の文字コード体系の文字を格納する第２文字格納領域とを管理し、前記文字操作処理生成部は、第１の文字コード体系の文字が前記文字変数に格納された場合に、前記第２文字格納領域のアドレスを示すポインタを無効なアドレスに設定することにより前記例外付命令列に例外を発生させる命令列と、前記第２の文字コード体系の文字が前記文字変数に格納された場合に前記第２文字格納領域のアドレスを有効なアドレスに設定する命令列と、前記例外付命令列として前記第２文字格納領域を読み出す命令列とを生成する項目８記載のコンパイラ。
【０１４２】
（項目１１）  最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラであって、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部とを備えるコンパイラ。
（項目１２）  前記文字コードのデータサイズは、前記文字コードの値の範囲に応じて異なり、前記取得処理生成部は、前記文字コードを含む予め定められたサイズの単位データを取得する命令列を生成し、前記変換検出処理生成部は、前記文字コードのデータサイズ毎に、前記単位データに当該データサイズの複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、前記単位データに当該データサイズの複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令列を生成する項目１１記載のコンパイラ。
【０１４３】
（項目１３）  前記変換検出処理生成部は、前記文字コードのデータサイズ毎に実行する前記検出処理として、前記単位データのうち何れの文字コードが当該データサイズであるかを更に検出する命令列を生成し、前記選択処理生成部は、前記変換処理の処理結果のうち、前記検出処理により当該データサイズであると検出された文字コードについての処理結果を選択して出力する命令列を生成する
項目１２記載のコンパイラ。
（項目１４）  前記変換検出処理生成部は、前記複数の変換処理の各々として、当該変換処理の処理結果を当該変換処理に対応して予め定められた記憶領域に格納する命令列を生成し、前記選択処理生成部は、前記検出処理により検出された前記文字コードの値の範囲に基づいて、当該文字コードを変換した処理結果を格納する記憶領域のアドレスを生成し、生成した当該アドレスから処理結果を読み出す命令列を生成する項目１１記載のコンパイラ。
【０１４４】
（項目１５）  文字の種類に応じてデータサイズの異なる第１の文字コード体系の文字を第２の文字コード体系の文字に変換する変換処理を実行する中央処理装置であって、前記文字の文字コードのデータサイズ毎に、当該データサイズの複数の文字コードがレジスタに連続して配列される場合に実行すべき前記変換処理と並行して、当該データサイズの複数の文字コードが前記レジスタに連続して配列されるか否かを検出する検出処理を実行する命令を有する中央処理装置。
（項目１６）  最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部として機能させるコンパイラプログラム。
【０１４５】
（項目１７）  最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第２の文字コード体系である場合に当該処理を実行し、当該文字が前記第１の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部として機能させるコンパイラプログラム。
（項目１８）  最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部として機能させるコンパイラプログラム。
【０１４６】
（項目１９）  項目１６から項目１８の何れかに記載のコンパイラプログラムを記録した記録媒体。
（項目２０）  最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラを、コンピュータにより制御する制御方法であって、前記コンピュータにより、第１の文字コード体系により書き込まれた文字変数の文字を読み出して第２の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第１の文字コード体系から前記第２の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成段階と、前記変換命令生成段階において生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第２の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去段階とを備える制御方法。
（項目２１）  最適化対象の対象プログラムにおいて文字変数に格納される文字を第１の文字コード体系から第２の文字コード体系に変換する変換処理を最適化するコンパイラを、コンピュータにより制御する制御方法であって、前記コンピュータにより、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成段階と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成段階と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成段階とを備える制御方法。
【図面の簡単な説明】
【０１４７】
【図１】図１は、コンパイラ１０のブロック図である（実施例１）。
【図２】図２は、文字変数２０のデータ構造の一例である（実施例１）。
【図３】図３は、コンパイラ１０が変換処理を最適化する処理フローを示す（実施例１）。
【図４】図４は、出力処理命令生成部１５０が出力処理として生成する命令列の動作を示すプログラム例である（実施例１）。
【図５】図５は、本実施例に係るコンパイラ１０をSAX入力ライブラリに適用したプログラム例である（実施例１）。
【図６】図６は、本実施例に係るコンパイラ１０をDOM入力ライブラリに適用したプログラム例である（実施例１）。
【図７】図７は、コンパイラ７０及び中央処理装置８０のブロック図である（実施例２）。
【図８】図８は、コンパイラ１０が変換処理を最適化する処理フローを示す（実施例２）。
【図９】図９は、UTF16及びUTF8の文字コード体系を比較して示す（実施例２）。
【図１０】図１０は、UTF16をUTF8に変換する処理の他の例を示す（実施例２）。
【図１１】図１１は、本実施例におけるコンパイラ７０が生成する変換処理の処理フロー図を示す（実施例２）。
【図１２】図１２は、中央処理装置８０が有する、UTF8をUTF16に変換する命令群の一例を示す（実施例２）。
【図１３】図１３は、中央処理装置８０が有するその他の命令を示す（実施例２）。
【図１４】図１４は、コンパイラ１０が変換処理を最適化して生成した命令列の処理フローを示す（実施例２）。
【図１５】図１５は、コンパイラ１０が変換処理を最適化して生成した命令群５０の一例を示す（実施例２）。
【図１６】図１６は、コンパイラ１０又はコンパイラ７０として機能するコンピュータ５００のハードウェア構成の一例を示す。
【符号の説明】
【０１４８】
１０  コンパイラ
２０  文字変数
５０  命令群
７０  コンパイラ
８０  中央処理装置
１００  文字コード体系判定部
１０５  変換命令生成部
１１０  変換命令除去部
１２０  メソッド情報格納部
１３０  メソッド再帰判断部
１４０  文字操作処理生成部
１４５  例外ハンドラ生成部
１５０  出力処理命令生成部
２１０  コード体系情報
２２０  第１ポインタ
２２５  第１文字格納領域
２３０  第２ポインタ
２３５  第２文字格納領域
２４０  データ長情報
５００  コンピュータ
７００  取得処理生成部
７１０  変換検出処理生成部
７２０  選択処理生成部
【図１】
2005293386.tif 000009
【図２】
2005293386.tif 000010
【図３】
2005293386.tif 000011
【図４】
2005293386.tif 000012
【図５】
2005293386.tif 000013
【図６】
2005293386.tif 000014
【図７】
2005293386.tif 000015
【図８】
2005293386.tif 000016
【図９】
2005293386.tif 000017
【図１０】
2005293386.tif 000018
【図１１】
2005293386.tif 000019
【図１２】
2005293386.tif 000020
【図１３】
2005293386.tif 000021
【図１４】
2005293386.tif 000022
【図１５】
2005293386.tif 000023
【図１６】
2005293386.tif 000024