JP4129981B2 - コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置 - Google Patents

コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置 Download PDF

Info

Publication number
JP4129981B2
JP4129981B2 JP2004109650A JP2004109650A JP4129981B2 JP 4129981 B2 JP4129981 B2 JP 4129981B2 JP 2004109650 A JP2004109650 A JP 2004109650A JP 2004109650 A JP2004109650 A JP 2004109650A JP 4129981 B2 JP4129981 B2 JP 4129981B2
Authority
JP
Japan
Prior art keywords
character
variable
conversion instruction
stored
code system
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2004109650A
Other languages
English (en)
Other versions
JP2005293386A (ja
Inventor
聰 古関
道昭 立堀
一明 石崎
秀昭 小松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2004109650A priority Critical patent/JP4129981B2/ja
Priority to US11/096,548 priority patent/US7577936B2/en
Publication of JP2005293386A publication Critical patent/JP2005293386A/ja
Application granted granted Critical
Publication of JP4129981B2 publication Critical patent/JP4129981B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/151Transformation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/126Character encoding

Description

本発明は、コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置に関する。特に、本発明は、文字変数の文字コード体系を変換するコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置に関する。
近年、各種のデータを構造化して統一的に取扱う技術として、XML(eXtensible Markup Language)が注目さている。XMLでは、世界各国で使われる文字を統一的に扱う文字コード体系であるUTF8(8-bit UCS Transformation Format)を用いることが推奨されている。UTF8は、頻繁に使われることが予想されるアルファベットを1バイトで表現できる一方、日本語の文字を3バイト程度で表現する。このように、UTF8は、文字の種類等に応じてデータサイズが異なっている。
また、近年、Java(登録商標)言語において、XMLの文書を効率的に解析・編集する多くのAPIが用意されている。しかしながら、Java言語は、通常、文字をUTF16(16-bit UCS Transformation Format)のデータとして取扱う。このため、Java(登録商標)言語で記述されたプログラムがXML文書を操作するには、UTF8をUTF16に変換する処理が必要である。更に、Java(登録商標)言語で記述されたプログラムにより処理された文字をXML文書として出力するためには、UTF16をUTF8に変換する処理が必要である。
従来、連続して配列されたUTF8の文字列をUTF16の文字列に変換する技術が用いられている(非特許文献1参照。)。この技術は、UTF8の文字を文字列から1つずつ読み出し、読み出した当該文字のデータ長や文字の種類を判断し、判断結果により異なる変換処理を行う。また、従来、Java(登録商標)言語において、UTF8の文字をUTF16に変換することなく操作するためのライブラリプログラムが提案されている(非特許文献2参照。)。
非特許文献3及び4については後述する。
インターネットURL「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.
非特許文献2の技術によれば、UTF8の文字をUTF16に変換する処理を省略できる。しかしながら、UTF16の文字を操作する多数のAPIは、既に広く開発されており、これらの既存のAPIを使って効率的にプログラムを開発することができない。また、UTF8を対象とする処理は、UTF16を対象とする処理と比較して効率が悪い場合も多い。従って、従来既に開発されているAPIを有効活用しつつ、UTF8からUTF16への変換処理を効率化することが第1の課題となる。
また、非特許文献1の技術を用いれば、UTF8の文字列をUTF16の文字列に適切に変換できる。しかしながら、操作する対象の文字を全てUTF16に変換するのは効率的でない。例えば、UTF8で入力された文字をそのまま出力する場合には、UTF8からUTF16に変換し、再度UTF8に戻すという冗長な処理となってしまう場合がある。従って、変換すべき文字を適切に選択することが第2の課題となる。
また、非特許文献1のプログラム例によれば、UTF8の各文字をUTF16の各文字に変換するために、UTF8のデータサイズ等の条件に応じて異なる処理が必要となる。このため、UTF8のデータサイズ等の条件を判断する条件分岐命令が生成される。近年の中央処理装置においては、条件分岐命令により命令パイプラインがフラッシュされ処理効率が悪化する場合があり、好ましくない。従って、変換処理において条件分岐をできるだけ減らすことが第3の課題となる。
そこで本発明は、上記の課題を解決することのできるコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
上記課題を解決するために、本発明の第1の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラ装置であって、前記対象プログラム中における、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って実行される位置に、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令をCPUの動作により生成する変換命令生成部と、前記変換命令生成部により生成された各変換命令について、前記対象プログラム中における当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、前記CPUの動作により、前記対象プログラムから当該変換命令を除去する変換命令除去部とを備えるコンパイラ装置、当該コンパイラ装置をコンピュータにより実現する方法、当該コンパイラ装置としてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
また、本発明の第2の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々として、文字変数に格納される文字が第2の文字コード体系である場合に当該処理を実行し、当該文字が第1の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、例外が発生した場合に実行され、文字変数に格納される文字を第1の文字コード体系から第2の文字コード体系に変換して当該文字変数に格納し、例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ、当該コンパイラの制御方法、当該コンパイラとしてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
また、本発明の第3の形態においては、最適化対象の対象プログラムにおいて文字変数に格納される文字を第1の文字コード体系から第2の文字コード体系に変換する変換処理を最適化するコンパイラであって、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、複数の変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部とを備えるコンパイラ、当該コンパイラの制御方法、当該コンパイラとしてコンピュータを機能させるプログラム、当該プログラムを記録した記録媒体を提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
本発明によれば、文字コード体系の変換を最適化することができる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、コンパイラ10のブロック図である(実施例1)。コンパイラ10は、文字変数に格納される文字の文字コード体系の変換を最適化することを目的とする。特に、コンパイラ10は、XML文書における文字の文字コード体系であるUTF8から、Java(登録商標)プログラムとして記述された処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する変換命令を最適化することを目的とする。
コンパイラ10は、文字コード体系判定部100と、変換命令生成部105と、変換命令除去部110と、メソッド情報格納部120と、メソッド再帰判断部130と、文字操作処理生成部140と、例外ハンドラ生成部145と、出力処理命令生成部150とを備える。文字コード体系判定部100は、Java(登録商標)言語で記述された最適化対象の対象プログラムを、例えば最適化対象のメソッド毎に受け取る。そして、文字コード体系判定部100は、そのメソッドに対して入力される文字がUTF16である確率が、予め定められた基準確率より高いか否か判断する。UTF16である確率が基準確率より高い場合に、文字コード体系判定部100は、そのメソッドを文字操作処理生成部140に送る。一方、基準確率より低い場合に、文字コード体系判定部100は、そのメソッドを変換命令生成部105に送る。
変換命令生成部105は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々に先立って、その文字をUTF8からUTF16に変換してその文字変数に格納する変換命令を生成する。変換命令除去部110は、変換命令生成部105により生成された各変換命令について、その変換命令に先立って実行される全ての実行パスにおいて、その文字変数にUTF16の文字が格納される場合に、その変換命令を除去する。
具体的には、変換命令除去部110は、各実行パスについて、以下の何れかの条件が満たされる場合に、その実行パスにおいて文字変数にUTF16の文字が格納されると判断する。
1.その実行パスにおいて変換命令が実行される場合
2.その実行パスにおいて、その文字変数に対してUTF16の文字の記憶領域を確保すると共に文字コード体系をUTF16に設定するコンストラクタが実行される場合
3.その実行パスにおいて、UTF16の文字を戻り値として文字変数に格納するメソッドが実行される場合
例えば、メソッド情報格納部120は、UTF16の文字を戻り値とするメソッドの識別情報を格納し、変換命令除去部110は、各実行パスにおいて、メソッド情報格納部120に格納された識別情報に対応するメソッドの戻り値が文字変数に格納されるか否かを判断してもよい。
更に、変換命令除去部110は、変換命令生成部105により生成された各変換命令について、その変換命令に先立って実行される何れかの実行パスにおいて、その文字変数にUTF16の文字が格納されない場合には、その実行パスに新たに変換命令を生成し、その変換命令を除去することにより、変換命令の部分冗長性を除去する。
メソッド再帰判断部130は、最適化対象のメソッドが、UTF16を戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部120に格納する。具体的には、メソッド再帰判断部130は、最適化対象のメソッドが、コンストラクタによりUTF16に設定された文字変数に格納された文字と、変換命令により既にUTF16に変換された文字と、メソッド情報格納部120に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部120に格納する。
文字操作処理生成部140は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々として、その文字変数に格納される文字がUTF16である場合にその処理を実行し、その文字がUTF8である場合に例外を発生させる例外付命令列を生成する。そして、例外ハンドラ生成部145は、例外が発生した場合に実行され、その文字変数に格納される文字をUTF8からUTF16に変換してその文字変数に格納し、その例外を発生させた処理に復帰させる例外ハンドラを生成する。
出力処理命令生成部150は、文字変数に格納される文字を出力する処理として、その文字変数に格納された文字がUTF8である場合にその文字を出力し、その文字変数に格納された文字がUTF16である場合にその文字をUTF8に戻して出力する命令列を生成する。そして、出力処理命令生成部150は、生成した命令列を、上記処理により最適化された他の各メソッドと共に、最適化されたプログラムである結果プログラムとして出力する。
図2は、文字変数20のデータ構造の一例である(実施例1)。文字変数20は、文字変数20の格納する文字がUTF8及びUTF16の何れであるかを示すコード体系情報210と、UTF8の文字を格納する第1文字格納領域225と、UTF16の文字を格納する第2文字格納領域235とを管理する。具体的には、文字変数20は、コード体系情報210と、第1文字格納領域225のアドレスを示す第1ポインタ220と、第2文字格納領域235のアドレスを示す第2ポインタ230と、第1文字格納領域225又は第2文字格納領域235に格納された文字のデータの長さを示すデータ長情報240とを有する。
対象プログラムにおいて、文字変数20を生成するコンストラクタは、文字を格納する記憶領域である第1文字格納領域225及び/又は第2文字格納領域235を確保すると共に、その文字変数における文字コード体系を設定する。例えば、コンストラクタは、その文字変数の文字がUTF8又はUTF16である旨を示すコード体系情報210を生成する。これにより、コンパイラ10の変換命令除去部110は、文字変数のコンストラクタがその文字変数をUTF8及びUTF16の何れに設定したか判断できる。
本図に係る文字変数20の具体的な実現方法としては、Java(登録商標)プログラムの実行環境であるJVM(Java仮想マシン)において、Java(登録商標)言語標準のStringオブジェクトの定義を、本図に係るStringオブジェクトの定義に置き換える。そして、UTF8の文字を操作するクラスであるUTF8Stringを定義する。UTF8Stringのクラスは、例えば、以下のメソッドを含む。
Boolean isUTF8(String str); コード体系情報210を読み出すAPI。
Byte [] getRawBytes(String str); 第1文字格納領域225又は第2文字格納領域235を読み出すAPI。
Int getRawLength(String str); データ長情報240を読み出すAPI。
また、JVMにおいて、UTF8のStringオブジェクトを生成するメソッドであるcreateを以下のように定義する。
String create(byte []date, int start, int length)
このメソッドは、第1引数として取得した文字データのうち、第2引数及び第3引数で指定される部分を取り出して、UTF8の文字を有するオブジェクトとして生成する。
図3は、コンパイラ10が変換処理を最適化する処理フローを示す(実施例1)。文字コード体系判定部100は、各メソッドに対して入力される文字がUTF8である確率が、基準確率より高いか否か判断する(S300)。例えば、文字コード体系判定部100は、UTF8の文字を入力することが予め定められているメソッドについて、そのメソッドに入力される文字がUTF16である確率が、基準確率より低いと判断する。より具体的には、以下の各メソッド群は、XML文書を入力とすることが予め定められているので、文字コード体系判定部100は、これらのメソッド群にUTF8が入力されると判断する。
SAXアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。(サブクラスを含む)
org.xml.sax.Parser.parse(..)
org.xml.sax.XMLReader.parse(..)
javax.xml.parsers.SAXParser.parse(..)
DOMアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。(サブクラスを含む)
Javax.xml.parsers.DocumentBuilder.parse(..)
Org.apache.xml.serialize.XMLserializer.serialize(..)
Javax.xml.parsers.DocumentBuilderFactory.newInstance(..)
Pull Parserアプリケーションプログラム中における以下のメソッド、又はこれらのメソッドから更に呼び出されるメソッド。(サブクラスを含む)
Org.xmlpull.v1.XmlPullParser.next()
Org.xmlpull.v1.XmlPullParser.nextToken()
Org.xmlpull.v1.XmlPullParser.nextTag()
Org.xmlpull.v1.XmlPullParser.nextText()
UTF16である確率が基準確率より低い場合に、変換命令生成部105は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々に先立って、その文字をUTF8からUTF16に変換してその文字変数に格納する変換命令を生成する(S310)。ここで、上記複数の処理とは、例えば、UTF16の文字変数をインスタンスに持つ予め定められたクラスにおけるメソッド群である。一例として、Java(登録商標)言語において、上記複数の処理とは、java/lang/Stringクラスにおける、文字出力用メソッド等、UTF16形式の文字内容を操作する必要のないメソッドを除いた全てのメソッドをいう。即ち、変換命令生成部105は、これらのメソッドの呼び出し処理の各々に先立って実行される位置、例えば呼び出し処理の直前に実行される位置に、変換命令を生成する。
変換命令除去部110は、変換命令生成部105により生成された各変換命令について、その変換命令に先立って実行される全ての実行パスにおいて、その文字変数にUTF16の文字が格納される場合に(条件Aとする)、その変換命令を除去する(S320)。更に、変換命令除去部110は、変換命令生成部105により生成された各変換命令について、その変換命令に先立って実行される何れかの実行パスにおいて、その文字変数にUTF16に文字が格納されない場合には(条件Aが不成立)、その実行パスに新たな変換命令を生成し、その変換命令を除去することにより、変換命令の部分冗長性を除去する。この場合、その実行パスの何れかの実行位置において、その実行位置を起点とする全ての実行パスにおいて文字変数にUTF16の文字が格納されることが条件となる(条件Bとする)。
この処理の実現方法として、例えば、変換命令除去部110は、非特許文献3及び4に例示された方法により部分冗長性を除去してもよい。ここでは、非特許文献3に記載された方法を応用して変換命令の部分冗長性を除去する処理の一例を説明する。まず、変換命令除去部110は、最適化対象のメソッドにおける各々の基本ブロックについて、以下の述語を計算する。但し、変換命令のうち、変換対象の文字変数にUTF8の文字が格納されているか否かチェックする処理部分を、フォーマットチェック処理と呼ぶ。
TRANSP(bb):基本ブロックbbにおいて、フォーマットチェック処理の処理対象の文字変数の内容が破壊されていないか否か
N-COMP(bb):基本ブロックbbにフォーマットチェック処理が存在し、そのフォーマットチェック処理をその基本ブロックbbの入口に配置しても安全か否か(即ち、対象プログラムの意味が変わらないか否か)
X-COMP(bb):基本ブロックbbにフォーマットチェック処理が存在し、そのフォーマットチェック処理をその基本ブロックの出口に配置しても安全か否か(即ち、対象プログラムの意味が変わらないか否か)
次に、変換命令除去部110は、Busy Code Motionにより、同一の文字変数に2度以上実行されるフォーマットチェック処理のうち最初に実行されるフォーマットチェック処理が配置される部分を求める。具体的には、まず、変換命令除去部110は、フォーマットチェック処理の上方配置安全性と、下方配置安全性とを求める。
各基本ブロックの入口における上方配置安全性:
Figure 0004129981
各基本ブロックの出口における上方配置安全性:
Figure 0004129981
各基本ブロックの入口における下方配置安全性:
Figure 0004129981
各基本ブロックに出口における下方配置安全性:
Figure 0004129981
次に、変換命令除去部110は、以上の方程式を解くことにより、N-D-SAFE(), X-D-SAFE(), N-U-SAFE(), X-U-SAFE()の不動点解を求める。次に、変換命令除去部110は、浮動点解を用いて、フォーマットチェック処理を配置するべき位置を以下のように決定する。そして、この際、元々配置されていたフォーマットチェック処理は、原理上全て冗長となるので、変換命令除去部110は、これらのフォーマットチェック処理を削除する。
入口にフォーマットチェック処理を配置するべき基本ブロック=以下の式(5)をtrueとする基本ブロック。
Figure 0004129981
出口にフォーマットチェック処理を配置するべき基本ブロック=以下の式(6)をtrueとする基本ブロック。
Figure 0004129981
更に、変換命令除去部110は、Lazy Code Motionにより、不必要に上方に配置されたフォーマットチェック処理を冗長性除去の効果が失われない限り下方に移動してもよい。この方法については、非特許文献3に記載の方法を上記のBusy Code Motionの場合と同様に応用したものであるから、説明を省略する。
更に他の例として、変換命令除去部110は、変換命令をより多く除去するべく、制御フローが変更されるように対象プログラムを変形してもよい。例えば、変換命令除去部110は、各変換命令について、その変換命令に至る一部の実行パスにおいて文字変数にUTF16の文字が格納されず(条件Aが不成立)、かつその実行パスの何れの実行位置においても、その実行位置を起点とする全ての実行パスにおいて文字変数にUTF16の文字が格納されない場合に(条件Bが不成立)、次の処理を行う。
まず、変換命令除去部110は、UTF16の文字が格納される実行パスと格納されない実行パスとの合流地点を求める。次に、変換命令除去部110は、その合流地点から変換命令に至るパスにおいて、UTF16の文字が格納される実行パスと格納されない実行パスとの分岐地点を求める。次に、変換命令除去部110は、その合流地点からその分岐地点の間のパスをコピーする。次に、変換命令除去部110は、コピー元のパスとコピー先のパスとの各々に、合流地点に合流していたパスの各々を接続する。この結果、条件Bが満たされるので、変換命令除去部110は、例えばbusy code motionを応用した上記の方法により、変換命令の部分冗長性を除去できる。
続いて、メソッド再帰判断部130は、最適化対象のメソッドがUTF16を戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部120に格納する(S330)。具体的には、メソッド再帰判断部130は、最適化対象のメソッドが、コンストラクタによりUTF16に設定された文字変数に格納された文字と、変換命令により既にUTF16に変換された文字と、メソッド情報格納部120に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とする場合に、そのメソッドの識別情報をメソッド情報格納部120に格納する。
一方、UTF16である確率が基準確率より高い場合に、文字操作処理生成部140は、UTF8により書き込まれた文字変数の文字を読み出してUTF16においてその文字を使用する複数の処理の各々として、その文字変数に格納される文字がUTF16である場合にその処理を実行し、その文字がUTF8である場合に例外を発生させる例外付命令列を生成する(S340)。
具体的には、文字操作処理生成部140は、例外付命令列として、UTF16の文字が格納される第2文字格納領域235を読み出す命令列を生成する。そしてこの場合、文字操作処理生成部140は、UTF8の文字が文字変数に格納された場合に実行される命令列であって、第2文字格納領域235のアドレスを示す第2ポインタ230を無効なアドレスに設定することにより、例外付命令列に例外を発生させる命令列を生成する。また、文字操作処理生成部140は、UTF16の文字が文字変数に格納された場合に実行される命令列であって、第2ポインタ230を有効なアドレスに設定する命令列を生成する。なお、Java(登録商標)言語においては、例えば、文字変数を操作するjava/lang/Stringクラス内のメソッドを予め書き換えておき、コンパイラ10は、書き換えられたこれらのメソッドをコンパイルすることにより上記の命令列を生成してもよい。
そして、例外ハンドラ生成部145は、例外が発生した場合に実行され、その文字変数に格納される文字をUTF8からUTF16に変換してその文字変数に格納し、その例外を発生させた処理に復帰させる例外ハンドラを生成する(S350)。なお、他のメソッドについて既に生成した例外ハンドラを利用できる場合には、例外ハンドラ生成部145は、S350において再度例外ハンドラを生成しなくともよい。
続いて、出力処理命令生成部150は、最適化対象が文字変数に格納される文字を出力する出力処理を行うメソッドである場合には、その文字変数に格納された文字がUTF8である場合にその文字を出力し、その文字変数に格納された文字がUTF16である場合にその文字をUTF8に戻して出力する命令列を生成する(S360)。
図4は、出力処理命令生成部150が出力処理として生成する命令列の動作を示すプログラム例である(実施例1)。このプログラムは、図2で説明したAPIを用いて記述されている。具体的には、出力処理は、出力するべき文字コード体系がUTF8であってかつ出力する文字がUTF8である場合には、UTF8の文字をそのまま出力する。一方、出力するべき文字コード体系がUTF8であってかつ出力する文字がUTF16である場合には、UTF16をUTF8に戻して出力する。
出力処理命令生成部150が本図に係る命令列を生成する方法としては、具体的には、コンパイラ10が対象プログラムと共にコンパイルするライブラリプログラムのうち、出力処理を行うメソッド(例えば、OutputStreamWriter.write)を予め変更する。この結果、出力処理命令生成部150は、変更されたこのライブラリプログラムをコンパイルすることにより、本図に係る出力処理を実現する適切な命令列を生成できる。
図5は、本実施例に係るコンパイラ10をSAX入力ライブラリに適用したプログラム例である(実施例1)。(a)は、SAX(The Simple API for XML)ハンドラのインターフェイスを示し、(b)は、本実施例におけるSAXパーサの一例を示す。
SAXパーサは、入力したXML文書の各要素に対して、ContentHandlerインターフェイスで定義されたメソッドを実装するオブジェクトのstartElementを読み出す。そして、本実施例におけるSAXパーサは、入力されたXML文書の文字コード体系がUTF8である場合に、UTF8の文字のデータを有するStringオブジェクトを生成し、生成したこのオブジェクトを引数としてメソッドstartElementを呼び出す。
(c)は、本実施例におけるSAXパーサを用いたアプリケーションプログラムの断片を示す。StartElementの引数であるqNameは、UTF8のまま変換されることなくPrintWriter.printを介してOutputStreamWriter.writer()に渡されている。この結果、UTF8の文字は、UTF16に変換されることなくUTF8のまま出力される。このように、SAXパーサを用いるアプリケーションプログラムを何ら変更することなく、UTF16及びUTF8間の変換処理を最適化することができる。
図6は、本実施例に係るコンパイラ10をDOM入力ライブラリに適用したプログラム例である(実施例1)。DOM(Document Object Model)において、アプリケーションプログラムは、Nodeインターフェイスで定義されるメソッドを呼び出すことにより、要素名などの文字列を取得する。本実施例に係るDOM入力ライブラリは、Documentオブジェクトを生成する場合に、Nodeインターフェイスを実装するオブジェクトの構成要素として、UTF8のStringオブジェクトを生成する。本図は、Nodeインターフェイスを継承するElementインターフェイスを実装するクラスのオブジェクトを生成するライブラリの実装例である。
以上、図1から図6に示す実施例1によれば、コンパイラプログラムとライブラリプログラムの協働により、UTF8からUTF16への文字コード体系の変換処理を、必要最小限に減らすことができる。この結果、例えば入力されたUTF8をそのまま出力する場合に、不要な変換処理を省略することができる。また、UTF16において文字を操作するメソッドは、入力された文字が既にUTF16に変換されたか確認するフォーマットチェック処理を省略できる。
更に、UTF16の文字が入力される確率がより高いメソッドにおいては、変換処理を通常の実行パスに生成せず、例外ハンドラのみに生成することができるので、更に効率が高い。更に、上記の処理は、アプリケーションプログラムを変更することなく、ライブラリプログラム及び/又はコンパイラプログラムにより実現される。従って、既存のアプリケーションプログラムを有効に利用することができる。
図7は、コンパイラ70及び中央処理装置80のブロック図である(実施例2)。コンパイラ70は、最適化対象の対象プログラムにおいて文字変数に格納される文字をUTF8からUTF16に変換する変換処理、又は、UTF16からUTF8に変換する変換処理を最適化することを目的とする。コンパイラ70は、取得処理生成部700と、変換検出処理生成部710と、選択処理生成部720とを備える。
取得処理生成部700は、対象プログラムを入力すると、まず、変換対象の文字の文字コードを取得する処理の命令列を生成する。以降、この命令列による処理を取得処理と呼ぶ。次に、変換検出処理生成部710は、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、その文字コードに値の範囲を検出する検出処理とを並行して実行する命令列を生成する。以降、この命令列による処理を変換検出処理と呼ぶ。
選択処理生成部720は、複数の上記変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する選択処理の命令列を生成する。そして、中央処理装置80は、出力された命令列を実行して、UTF8に変換された文字コードを生成し、出力する。
図8は、コンパイラ10が変換処理を最適化する処理フローを示す(実施例2)。コンパイラ10は、UTF8の文字をUTF16の文字に変換する変換処理の各々に対して、以下の処理を繰り返す。まず、取得処理生成部700は、取得処理の命令列を生成する(S800)。例えば、取得処理生成部700は、文字コードを含む予め定められたサイズの単位データを取得する命令列を生成してもよい。より具体的には、文字コードが8から32ビットの可変長である場合には、その文字コードを含む32ビット又は64ビットの単位データを取得してもよい。次に、変換検出処理生成部710は、変換検出処理の命令列を生成する(S810)。そして、選択処理生成部720は、選択処理の命令列を生成する(S820)。
図9は、UTF16及びUTF8の文字コード体系を比較して示す(実施例2)。本発明に係る第1の文字コード体系の一例であるUTF8は、16進数で0から7Fまでの文字コードを、1バイトのデータサイズの文字コードにおける下位の7ビットとして表す。これに対して、本発明に係る第2の文字コード体系の一例であるUTF16は、16進数で0から7Fまでの文字コードを、2バイトのデータサイズの文字コードにおける下位の7ビットとして表す。このように、16進数で0から7Fまでの文字コードについては、UTF8の方がUTF16よりメモリの使用効率が良い。
UTF8は、16進数で80から7FFまでの文字コードを、2バイトのデータサイズの文字コードにおける、1バイト目の下位5ビットと、2バイト目の下位6ビットとに分割して表す。その他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、2バイトのデータサイズの文字コードにおける下位の11ビットとして表す。
UTF8は、16進数で800から0FFFまでの文字コードを、3バイトのデータサイズの文字コードにおける、2バイト目の下位5ビットと、3バイト目の下位6ビットとに分割して表す。1バイト目のデータと、2バイト目及び3バイト目のその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、2バイトのデータサイズの文字コードにおける下位の12ビットとして表す。
UTF8は、16進数で1000からDF77まで、又は、E000からFFFFまでの文字コードを、3バイトのデータサイズの文字コードにおける、1バイト目の下位4ビットと、2バイト目の下位6ビットと、3バイト目の下位6ビットとに分割して表す。一方、UTF16は、この文字コードを、2バイトのデータサイズの文字コードにおける16ビットとして表す。
UTF8は、16進数で10000から3FFFFまでの文字コードを、4バイトのデータサイズの文字コードにおける、2バイト目の下位6ビットと、3バイト目の下位6ビットと、4バイト目の下位6ビットとに分割して表す。1バイト目と、2から4バイト目のその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、20ビットの文字コードにおける下位18ビットとして表す。
UTF8は、16進数で40000からFFFFFまでの文字コードを、4バイトのデータサイズの文字コードにおける、1バイト目の下位2ビットと、2バイト目の下位4ビットと、3バイト目の下位6ビットと、4バイト目の下位6ビットとに分割して表す。その他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、20ビットの文字コードにおける20ビットとして表す。
UTF8は、16進数で100000から10FFFFまでの文字コードを、4バイトのデータサイズの文字コードにおける、2バイト目の下位4ビットと、3バイト目の下位6ビットと、4バイト目の下位6ビットとに分割して表す。1バイト目のデータ、及びその他のビットは、文字コードのデータサイズ又は文字の種類等を示す予め定められた制御用データである。一方、UTF16は、この文字コードを、24ビットの文字コードにおける16ビットとして表す。
このように、UTF8においては、格納する文字コードの値又は文字の種類に応じて、文字コードのデータサイズが異なる。一方、UTF16においては、16進数で10000を超える文字を除いて、データサイズが2バイトで一定である。この結果、データサイズの小さい文字が連続した場合には、UTF8の方がメモリの使用効率が高い。一方、UTF16は、UTF8と比較して、文字の種類に応じてデータサイズが変化しにくい。このため、UTF16を対象とする処理の方が、UTF8を対象とする処理より高速である場合が多い。
そして、UTF8をUTF16に変換するには、UTF8の文字コードにおける制御用データを読み出して、その制御用データに応じて適切な変換処理を選択する必要がある。続いて、図10を用いて、UTF16をUTF8に変換するこの処理の一例を示す。なお、本図の以降の説明において、特に断らない限り、演算に用いる定数を16進数で示す。
コンピュータの中央処理装置は、メモリその他のハードウェアと協働して、まず、文字コードの最初の8ビットを、変数b0に読み出す(S1000)。以降の説明において、「コンピュータの中央処理装置は、メモリその他のハードウェアと協働して、」を単に「コンピュータは、」と略記する。そして、コンピュータは、読み出した文字コードを80でマスクした結果が0である場合に(S1005:YES)、変数b0と2進数の00000000との論理和、即ちb0自体を算出し(S1010)、S1140に処理を移す。
一方、変数b0を80でマスクした結果が0以外の値の場合において(S1005:NO)、コンピュータは、変数b0をe0でマスクした結果がc0になる場合に(S1015:YES)、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す(S1020)。そして、変数b1をc0でマスクした結果が80にならなければ(S1025:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1030)。例えば、入力となる文字がUTF8に準拠していない場合がこれに該当する。
一方、変数b1をc0でマスクした結果が80であれば(S1025:YES)、コンピュータは、変数b0を6ビット左シフトして7c0でマスクした値と、変数b1を3fでマスクした値との論理和を変数cに格納して、S1140において出力させる(S1035)。コンピュータは、変数b0をe0でマスクした結果がc0でない場合に(S1015:NO)、変数b0をf0でマスクした結果がe0であるか否か判断する(S1040)。e0である場合に(S1040:YES)、コンピュータは、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す(S1045)。
そして、変数b1をc0でマスクした結果が80にならなければ(S1050:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1055)。一方、変数b1をc0でマスクした結果が80である場合に(S1050:YES)、コンピュータは、b1として読み出した文字コードに連続する次の8ビットを、変数b2に読み出す(S1060)。
変数b2をc0でマスクした結果が80にならなければ(S1065:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1070)。変数b2をc0でマスクした結果が80である場合に(S1065:YES)、コンピュータは、変数b0を12ビット左シフトしてf000でマスクした値と、変数b1を6ビット左シフトしてfc0でマスクした値と、変数b2を3fでマスクした値との論理和を、変数cに格納する(S1075)。
コンピュータは、変数b0をf0でマスクした結果がe0でない場合に(S1040:NO)、変数b0をf8でマスクした結果がf0であるか判断する(S1080)。f0でない場合に(S1080:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1085)。変数b0をf8でマスクした結果がf0である場合に(S1080:YES)、コンピュータは、b0として読み出した文字コードに連続する次の8ビットを、変数b1に読み出す(S1090)。
変数b1をc0でマスクした結果が80でない場合に(S1095:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1100)。一方、変数b1をc0でマスクした結果が80である場合に(S1095:YES)、コンピュータは、b1として読み出した文字コードに連続する次の8ビットを、変数b2に読み出す(S1105)。
続いて、変数b2をc0でマスクした結果が80でない場合に(S1110:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者等に通知する(S1115)。変数b2をc0でマスクした結果が80である場合に(S1110:YES)、コンピュータは、b2として読み出した文字コードに連続する次の8ビットを、変数b3に読み出す(S1120)。
続いて、変数b3をc0でマスクした結果が80でない場合に(S1125:NO)、コンピュータは、変換処理においてエラーが生じた旨を利用者に通知する(S1130)。変数b3をc0でマスクした結果が80である場合に(S1125:YES)、コンピュータは、次の計算をする(S1135)。まず、変数b0を2ビット左シフトして1cでマスクした値と、変数b1を4ビット右シフトして3でマスクした値との論理和を求め、1減じた値を、変数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の文字コードとして出力する(S1140)。
このように、UTF8をUTF16に変換するには、UTF8の文字コードにおける制御用データを読み出して、その制御用データに応じて適切な変換処理を選択する必要がある。即ち例えば、コンピュータは、制御用データがどのような値であるか判断して条件分岐する必要がある。本図のように条件分岐が頻繁に行なわれる場合には、次に実行される命令群を的確に予測できないので、コンピュータは、実行中の命令より後に実行される命令を先読みして実行しにくい。このため、コンピュータの中央処理装置が処理可能な命令の並列度を有効に利用できず、対象プログラムの実行効率が悪くなってしまう。更に、近年の中央処理装置は、レジスタに64ビットのデータを格納できる一方、本例の処理においてはレジスタに8ビットのデータしか格納されない場合も多く、効率的でない。
これに対して、本実施例におけるコンパイラ10は、条件分岐の数を減らして変換命令の実行効率を高めることができる。以降、本実施例におけるコンパイラ10が生成する変換命令の一例を説明する。
図11は、本実施例におけるコンパイラ70が生成する変換処理の処理フロー図を示す(実施例2)。本図においても、特に断らない限り、演算対象の定数を16進数で示す。コンピュータは、まず、取得処理として、32ビットのデータを読み出して、変数wに格納する(S1145)。そして、コンピュータは、変換検出処理として、S1150からS1190に示す8つの処理を並行に行う。
具体的には、コンピュータは、第1の変換処理として、変数wを24ビット右シフトして7fでマスクした値を変数c0に格納する(S1150)。また、コンピュータは、第2の変換処理として、変数wを18ビット右シフトして7c0でマスクした値と、変数wを16ビット右シフトして3fでマスクした値との論理和を、変数c1に格納する(S1155)。また、コンピュータは、第3の変換処理として、変数wを12ビット右シフトしてf000でマスクした値と、変数wを10ビット右シフトしてfc0でマスクした値と、変数wを8ビット右シフトして3fでマスクした値との論理和を、変数c2に格納する(S1160)。
更に、コンピュータは、第4の変換処理として、まず、変数wを22ビット右シフトして1cでマスクした値と、変数wを20ビット右シフトして3でマスクした値との論理和を求め、1減じた値を、変数xに格納する(S1165)。次に、第4の変換処理として、コンピュータは、定数d800と、変数xを6ビット左シフトして3c0でマスクした値と、変数wを14ビット右シフトして3cでマスクした値と、変数wを12ビット右シフトして3でマスクした値との論理和を、変数c_highに格納する。次に、コンピュータは、定数dc00と、変数wを2ビット右シフトして3c0でマスクした値と、変数wを3fでマスクした値との論理和を、変数c_lowに格納する。
また、コンピュータは、検出処理として、変数wを80000000でマスクした値が0である場合に、変数f0に真を格納する(S1170)。また、コンピュータは、変数wをe0c00000でマスクした値がc0800000である場合に、変数f1に真を格納する(S1180)。また、コンピュータは、変数wをf0c0c000でマスクした値がe0808000である場合に、変数f2に真を格納する(S1185)。また、コンピュータは、変数wをf8c0c0c0でマスクした値がf0808080である場合に、変数f3に真を格納する(S1190)。
コンピュータは、上記第1から第4の変換処理と、検出処理と互いに並行に実行してもよいし、これらのうち少なくとも2つの処理を並行に実行してもよい。続いて、コンピュータは、選択処理として、S1195からS1220の処理を実行する。
具体的には、コンピュータは、まず、変数f0が真である場合に、変数cに変数c0を格納する(S1195)。また、変数f1が真である場合に、変数cに変数c1を格納する(S1200)。また、変数f2が真である場合に、変数cに変数c2を格納する(S1205)。これらの場合には、コンピュータは、変数cの内容を変換結果として出力する(S1220)。また、変数f3が真である場合に、c_highを上位ビットとし、c_lowを下位ビットとする値をUTF16の文字コードとして出力する(S1220)。なお、f0からf3の何れも真でない場合には、変換処理においてエラーが発生した旨を通知する(S1215)。
このように、本実施例によけるコンパイラ70が生成した命令列によれば、何れかを選択して実行すべき複数の変換処理を、条件判断に先立って投機的に実行できる。そして、変換処理及び検出処理を条件分岐を処理することなく互いに並列に実行できる。これにより、複数の命令を並行して実行可能な中央処理装置の性能を有効に活用して、文字コード体系を効率的に変換させることができる。
以降、この変換処理を更に効率良く実行させる方法として、連続して配列されたデータサイズの等しい複数の文字コードを一括して変換する処理について説明する。まず、この処理を更に効率的に実行するためには、中央処理装置80が、変換処理に適した命令群を有していることが好ましい。以降、図12及び図13を用いて、中央処理装置80が有する命令群を説明する。そして、図14において、コンパイラ70がこれらの命令群を含む命令列を生成する例を説明する。
図12は、中央処理装置80が有する、UTF8をUTF16に変換する命令群の一例を示す(実施例2)。(a)は、命令UTF81toUTF16の詳細を示す。変換検出処理生成部710は、命令UTF81toUTF16として、64ビットのレジスタrsに、データサイズが8ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが8ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、命令UTF81toUTF16により、中央処理装置80は、レジスタrsの第1ビットから第7ビットと、第9ビットから第15ビットと、第17ビットから第23ビットと、第25ビットから第31ビットとを、それぞれ、レジスタrtの第9ビットから第15ビットと、第25ビットから第31ビットと、第41ビットから第47ビットと、第57ビットから第63ビットとにコピーする。
更に、命令UTF81toUTF16により、中央処理装置80は、レジスタrsの第0ビットが0であり、第8ビットが0であり、第16ビットが0であり、かつ第24ビットが0である場合に、データサイズが8ビットである複数の文字コードが連続され配列されている旨の検出結果を示すべく、レジスタcrに1を格納する。
(b)は、命令UTF82toUTF16の詳細を示す。変換検出処理生成部710は、命令UTF82toUTF16として、64ビットのレジスタrsに、データサイズが16ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが16ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、命令UTF82toUTF16により、中央処理装置80は、レジスタrsの第3ビットから第7ビット、及び、第10ビットから第15ビットを結合してレジスタrtの第5ビットから第15ビットにコピーする。また、中央処理装置80は、レジスタrsの第19ビットから第23ビット、及び、第26ビットから第31ビットを結合してレジスタrtの第21ビットから第31ビットにコピーする。
また、中央処理装置80は、レジスタrsの第35ビットから第39ビット、及び、第42ビットから第47ビットを結合してレジスタrtの第37ビットから第47ビットにコピーする。また、中央処理装置80は、レジスタrsの第51ビットから第55ビット、及び、第58ビットから第63ビットを結合してレジスタrtの第53ビットから第63ビットにコピーする。
更に、命令UTF82toUTF16により、中央処理装置80は、レジスタrsの第0から第2ビット、第16ビットから第18ビット、第32ビットから第34ビット、及び第48から第50ビットの各々が、2進数の110である条件を満たすか否か判断する。更に、中央処理装置80は、第8及び第9ビット、第24及び第25ビット、第40及び第41ビット、並びに第56及び第57ビットが、2進数の10である条件を満たすか判断する。
更に、中央処理装置80は、レジスタrsの第3ビットが0でないか、又は、第4から第7ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置80は、レジスタrsの第19ビットが0でないか、又は、第20から第23ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置80は、レジスタrsの第35ビットが0でないか、又は、第36から第39ビットが000でも001でもないという条件を満たすか否か判断する。更に、中央処理装置80は、レジスタrsの第51ビットが0でないか、又は、第52から第55ビットが000でも001でもないという条件を満たすか否か判断する。以上の条件が全て満たされる場合に、中央処理装置80は、レジスタcrに1を格納する。
(c)は、命令UTF83toUTF16の詳細を示す。変換検出処理生成部710は、命令UTF83toUTF16として、64ビットのレジスタrsに、データサイズが24ビットである複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが24ビットである複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、命令UTF83toUTF16により、中央処理装置80は、レジスタrsの第4ビットから第7ビット、第10ビットから第15ビット、及び第18から第23ビットを結合してレジスタrtの第32ビットから第47ビットにコピーする。また、中央処理装置80は、レジスタrsの第28ビットから第31ビット、第34ビットから第39ビット、及び第42から第47ビットを結合してレジスタrtの第48ビットから第63ビットにコピーする。
更に、命令UTF83toUTF16により、中央処理装置80は、レジスタrsの第0から第3ビット、及び、第24ビットから第27ビットの各々が、2進数の1110である条件を満たすか否か判断する。更に、命令UTF83toUTF16により、中央処理装置80は、レジスタrsの第8及び第9ビット、第16及び第17ビット、第32及び第33ビット、並びに、第40及び第41ビットの各々が、2進数の10である条件を満たすか否か判断する。
更に、中央処理装置80は、レジスタrsの第4ビットから第7ビットが2進数の1101でないか、又は、第10ビットが1でないという条件を満たすか判断する。更に、中央処理装置80は、レジスタrsの第28ビットから第31ビットが2進数の1101でないか、又は、第34ビットが1でないという条件を満たすか判断する。以上の条件が全て満たされる場合に、中央処理装置80は、レジスタcrに1を格納する。
以上、本図に示すように、変換検出処理生成部710は、文字コードのデータサイズである8ビット、16ビット、及び24ビット毎に、単位データにそのデータサイズの複数の文字コードが連続して配列される場合に実行するべき変換処理と並行して、その単位データにそのデータサイズの複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成することができる。
更に、これらの命令の処理を論理回路で実現した場合、2〜3段のNANDゲートを要する。従って、NANDゲートを実装した場合の信号遅延を考慮しても、これらの命令は、それぞれ、単純な加算命令等と同様、1サイクルのレイテンシ及び1サイクルのスループットで実行される。即ち、本図の命令によれば、コンピュータは、1サイクルで最大4文字程度のUTF8の文字列を、UTF16の文字列に変換できる。
図13は、中央処理装置80が有するその他の命令を示し、(a)は、UTF16をUTF8に変換する命令群の1つである命令UTF16toUTF81の詳細を示す(実施例2)。変換検出処理生成部710は、命令UTF16toUTF81として、64ビットのレジスタrsに、データサイズが8ビットのUTF8に変換すべき文字コードが連続して配列される場合に実行すべき変換処理と並行して、データサイズが8ビットのUTF8に変換すべき文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、命令UTF16toUTF81により、中央処理装置80は、レジスタrtの第9ビットから第15ビットと、第25ビットから第31ビットと、第41ビットから第47ビットと、第57ビットから第63ビットとを、それぞれ、レジスタrtの第33ビットから第39ビットと、第41ビットから第47ビットと、第49ビットから第55ビットと、第57ビットから第63ビットとにコピーする。
更に、命令UTF16toUTF81により、中央処理装置80は、レジスタrsの第0から第8ビット、第16から第24ビット、第32から第40ビット、及び、第48から第56ビットの全てが0である条件を満たす場合に、レジスタcrに1を格納する。
(b)は、中央処理装置80が有する、UTF16をUTF8に変換する命令群の1つである命令UTF16toUTF82の詳細を示す。変換検出処理生成部710は、命令UTF16toUTF82として、64ビットのレジスタrsに、16ビットのUTF8に変換するべきUTF16の文字コードが連続して配列される場合に実行すべき変換処理と並行して、16ビットのUTF8に変換するべきUTF16の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、命令UTF16toUTF82により、中央処理装置80は、レジスタrsの第5ビットから第15ビットを分割して、レジスタrtの第3ビットから第7ビット、及び、第10ビットから第15ビットにコピーする。また、中央処理装置80は、レジスタrsの第21ビットから第31ビットを分割して、レジスタrtの第19ビットから第23ビット、及び、第26ビットから第31ビットにコピーする。
更に、命令UTF16toUTF82により、中央処理装置80は、レジスタrsの第37ビットから第47ビットを分割して、レジスタrtの第35ビットから第39ビット、及び、第42ビットから第47ビットにコピーする。また、中央処理装置80は、レジスタrsの第53ビットから第63ビットを分割して、レジスタrtの第51ビットから第55ビット、及び、第58ビットから第63ビットにコピーする。
更に、命令UTF16toUTF82により、中央処理装置80は、レジスタrsの第0から第4ビット、第16ビットから第20ビット、第32ビットから第36ビット、及び第48から第52ビットの各々が、全て0である条件を満たすか否か判断する。更に、中央処理装置80は、第5から第7ビット、第21から第23ビット、第37から第39ビット、及び第53から第55ビットの何れもが、2進数の000でないという条件を満たすか否か判断する。以上の条件を全て満たす場合に、中央処理装置80は、レジスタcrに1を格納する。
(c)は、中央処理装置80が有する、UTF16をUTF8に変換する命令群の1つである命令UTF16toUTF82の詳細を示す。変換検出処理生成部710は、命令UTF16toUTF83として、64ビットのレジスタrsに、24ビットのUTF8に変換すべきUTF16の文字コードが連続して配列される場合に実行すべき変換処理と並行して、24ビットのUTF8に変換すべきUTF16の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令を生成する。
より詳細には、UTF16toUTF83により、中央処理装置80は、レジスタrsの第32ビットから第47ビットを分割して、レジスタrtの第4ビットから第7ビット、第10ビットから第15ビット、及び第18から第23ビットにコピーする。また、中央処理装置80は、レジスタrsの第48ビットから第63ビットを分割して、レジスタrtの第28ビットから第31ビット、第34ビットから第39ビット、及び第42から第47ビットにコピーする。
更に、命令UTF16toUTF83により、中央処理装置80は、レジスタrsの第32から第36ビットが2進数の00001であるか、又は、第32から第35ビットが、2進数の0000でないという条件を満たすか判断する。また、中央処理装置80は、レジスタrsの第48から第52ビットが2進数の00001であるか、又は、第48から第51ビットが、2進数の0000でないという条件を満たすか判断する。以上の条件を全て満たす場合に、中央処理装置80は、レジスタcrに1を格納する。
(d)は、中央処理装置80が有する条件付き加算命令の一例を示す。この命令により、コンピュータは、レジスタcrが1の場合に、レジスタrsに定数immを加えた結果をレジスタrtに格納する。
図14は、コンパイラ10が変換処理を最適化して生成した命令列の処理フローを示す(実施例2)。取得処理生成部700により生成された取得処理の命令列により、コンピュータは、予め定められたサイズの単位データ、例えば64ビットのデータをレジスタに読み込む(S1500)。読み込み先のレジスタをレジスタr6とする。次に、コンピュータは、取得処理生成部700により生成された変換検出処理により、以下の処理を並行に行う。
まず、コンピュータは、レジスタr6に1バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に1バイトのUTF8が連続して配列されているか否かを検出する検出処理を実行する(S1510)。また、コンピュータは、レジスタr6に2バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に2バイトのUTF8が連続して配列されているか否かを検出する検出処理を実行する(S1550)。
更に、コンピュータは、レジスタr6に3バイトのUTF8が連続して配列されている場合に実行すべき変換処理と並行して、レジスタr6に3バイトのUTF8が連続して配列されているか否かを検出検出処理を実行する(S1570)。S1500、S1510、S1550、及びS1570の処理については、図15において詳述する。
レジスタr6に1バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を1文字づつ4文字出力する(S1520)。この場合、コンピュータは、レジスタr6のうち未変換の32ビットのデータを、UTF16に変換し(S1530)、変換後の文字を1文字づつ更に4文字出力する(S1540)。
レジスタr6に2バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を1文字づつ4文字出力する(S1560)。一方、レジスタr6に3バイトの文字が連続して配列されていると検出した場合には、コンピュータは、例えば他のメソッドから呼び出しを受ける毎に、変換後の文字を1文字づつ2文字出力する(S1580)。
一方、コンピュータは、何れのデータサイズの文字コードもレジスタr6に連続して配列されていない場合には、UTF81toUTF16等の命令を用いずに文字コード体系を変換する予め準備された命令列を処理し(S1590)、変換結果を1文字づつ出力する(S1595)。
以上、本図の処理によれば、64ビットの単位データにおいて、データサイズが等しいUTF8の文字コードが連続して配列されている場合に、これらの文字コードをまとめてUTF16に変換する。この結果、データサイズが等しい文字コードが連続する場合に、変換処理の効率を向上させることができる。例えば、1バイトのUTF8の文字が連続して配列される場合には、本図の太線で示す経路で処理が進むので、データを一度読み出すことにより8文字の文字コードを変換でき、効率が良い。これにより、例えばXML文書のような、タグ部分には1バイトのUTF8の文字が連続して配列し、テキスト部分には日本語の文字を示す特定のコードが連続して配列される文書を、特に効率良く変換できる。
更に、本図の処理によれば、複数の文字を一度に変換した場合であっても、他のメソッドから呼び出しを受ける毎に変換後の文字を1文字づつ出力する。これにより、本図の処理を呼び出し他のメソッドを変更する必要がないので、従来のプログラムとの親和性が高い。
図15は、コンパイラ10が変換処理を最適化して生成した命令群50の一例を示す(実施例2)。取得処理生成部700は、変換対象の文字の文字コードを取得する処理の命令を2行目に生成する。この命令は、レジスタr3により指されるアドレスから64ビットのデータをレジスタr6に読み込む。そして、変換検出処理生成部710は、文字コードの値の範囲に応じて何れかを選択して実行すべき複数の変換処理の各々と、その文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を、第4、第5、及び第7行目に生成する。
これらの命令は、UTF8が採り得るデータサイズ毎に、レジスタr6にそのデータサイズの文字コードが連続して配列されている場合に実行するべき複数の変換処理を実行し、変換結果をレジスタr7、レジスタr8、及びレジスタr9にそれぞれ格納する。更にこれらの命令は、レジスタr6にそのデータサイズの文字コードが連続して配列されているか否かを検出した検出結果を、レジスタcr0.lt、レジスタcr1.lt、及びレジスタcr2.ltにそれぞれ格納する。
続いて、選択処理生成部720は、何れのデータサイズの文字コードもレジスタr6に連続して配列されていないか検出する命令列を、第11行、第13行、及び第22行目に生成する。即ち例えば、この命令列は、レジスタr6中にデータサイズの異なる複数の文字コードが配列されているか判断し、そのように判断した場合には、UTF81toUTF16等の命令を用いずに文字コード体系を変換する予め準備された命令列に処理を移す。
また、選択処理生成部720は、複数の変換処理のうち何れかの変換処理の処理結果を、検出処理の検出結果に基づいて選択して出力する命令列を、第9、第15、及び第20行目に生成する。これらの命令列は、レジスタcr0、cr1、及びcr2の値に応じて、レジスタr7、r8、及びr8の何れかを選択してレジスタr4に格納する。即ちレジスタr4に変換結果が出力される。
更に、好ましくは、選択処理生成部720は、文字コードを取得する後続する命令に備えて、文字コードの読み出し先を指すレジスタr3をインクリメントする命令を、第14、第18、第25行目に生成する。また、好ましくは、選択処理生成部720は、変換後の文字コードを使用する処理に備えて、変換した文字の文字数を計算して出力する命令を、第10、第17、及び第21行目に生成する。これらの命令は、変換した文字の文字数をレジスタr5に出力する。
上記の命令をIBMコーポレーション(登録商標)のPOWER4(登録商標)アーキティクチャにより実行する場合について、実行に要するサイクル数を説明する。このアーキティクチャにおいて、固定小数点命令2命令、分岐命令2命令、及びコンディショナルレジスタ命令1命令が、1サイクルで並行に実行される。また、このアーキティクチャにおいて、ロード命令のレイテンシは3サイクルである。
また、このアーキティクチャにおいて、通常の加算命令のレイテンシは2サイクルであり、スループットは1サイクルである。従って、UTF81to16、UTF82to16、及びUTF83to16の各命令も、同様のスループット及びレイテンシを有しているものとして取扱う。このような前提の下、本図の命令列は、11サイクルで実行される。即ち、本図の命令列によれば、2から4文字のUTF8の文字列を、11サイクルで、UTF16の文字列に変換することができる。
これに対して、例えば図10の例によれば、1文字の変換に最短10サイクルを要する。具体的には、1バイトのUTF8をUTF16に変換する場合において、ロード命令(3サイクル)、比較命令(2サイクル)、分岐命令(1サイクル)、シフト命令(2サイクル)、及びAND命令(2サイクル)が実行される。この様に、本図の命令列は、図10の例と比較して文字数あたりの変換効率を高めることができる。
なお、上記処理に代えて、変換検出処理生成部710は、文字コードのデータサイズ毎に実行する検出処理として、単位データのうち何れの文字コードがそのデータサイズであるかを更に検出する命令列を生成してもよい。そしてこの場合、選択処理生成部720は、その検出処理に対応する変換処理の処理結果のうち、その検出処理によりそのデータサイズであると検出された文字コードについての処理結果のみを選択して出力する命令列を生成する。この場合、単位データに同一サイズの文字コードが配列されている場合のみならず、異なるサイズの文字コードが配列されている場合であっても、処理を高速化できる。
また、本図において、各変換処理の変換結果は、レジスタcr0.lt、レジスタcr1.lt、及びレジスタcr2.ltの値に応じて選択され、レジスタr4に出力される。これに代えて、各変換処理の処理結果を記憶領域の連続したアドレスに格納し、検出処理の処理結果に応じて定まるアドレスから取得した処理結果をレジスタr4に出力してもよい。即ちこの場合、変換検出処理生成部710は、複数の変換処理の各々として、その変換処理の処理結果をその変換処理に対応して予め定められた記憶領域に格納する命令列を生成する。そして、選択処理生成部720は、検出処理により検出された文字コードの値の範囲に基づいて、読み出すべき処理結果を格納する記憶領域のアドレスを生成し、生成したそのアドレスから処理結果を読み出す命令列を生成する。この場合、処理結果をレジスタr4に読み込む処理を1命令に集約することができる。
図16は、コンパイラ10又はコンパイラ70として機能するコンピュータ500のハードウェア構成の一例を示す。コンピュータ500は、ホストコントローラ1782により相互に接続されるCPU80、RAM1720、グラフィックコントローラ1775、及び表示装置1780を有するCPU周辺部と、入出力コントローラ1784によりホストコントローラ1782に接続される通信インターフェイス1730、ハードディスクドライブ1740、及びCD−ROMドライブ1760を有する入出力部と、入出力コントローラ1784に接続されるROM1710、フレキシブルディスクドライブ1750、及び入出力チップ1770を有するレガシー入出力部とを備える。
ホストコントローラ1782は、RAM1720と、高い転送レートでRAM1720をアクセスするCPU80及びグラフィックコントローラ1775とを接続する。CPU80は、ROM1710及びRAM1720に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ1775は、CPU80等がRAM1720内に設けたフレームバッファ上に生成する画像データを取得し、表示装置1780上に表示させる。これに代えて、グラフィックコントローラ1775は、CPU80等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
入出力コントローラ1784は、ホストコントローラ1782と、比較的高速な入出力装置である通信インターフェイス1730、ハードディスクドライブ1740、及びCD−ROMドライブ1760を接続する。通信インターフェイス1730は、ネットワークを介して外部の装置と通信する。また、通信インターフェイス1730は、半導体試験装置10と通信する。ハードディスクドライブ1740は、コンピュータ500が使用するプログラム及びデータを格納する。CD−ROMドライブ1760は、CD−ROM1795からプログラム又はデータを読み取り、RAM1720を介して入出力チップ1770に提供する。
また、入出力コントローラ1784には、ROM1710と、フレキシブルディスクドライブ1750や入出力チップ1770等の比較的低速な入出力装置とが接続される。ROM1710は、コンピュータ500の起動時にCPU80が実行するブートプログラムや、コンピュータ500のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ1750は、フレキシブルディスク1790からプログラム又はデータを読み取り、RAM1720を介して入出力チップ1770に提供する。入出力チップ1770は、フレキシブルディスク1790や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
コンピュータ500に提供されるプログラムは、フレキシブルディスク1790、CD−ROM1795、又はICカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ1770及び/又は入出力コントローラ1784を介して、記録媒体から読み出されコンピュータ500にインストールされて実行される。コンピュータ500にインストールされて実行されるコンパイラプログラムがコンピュータ500に働きかけて行わせる動作は、図1から図15において説明したコンパイラ10又はコンパイラ70における動作と同一であるから、説明を省略する。
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク1790、CD−ROM1795の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムをコンピュータ500に提供してもよい。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
以上の実施例によると、以下の各項目に示すコンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置が実現される。
(項目1)最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部とを備えるコンパイラ。
(項目2) 前記変換命令生成部は、XML文書における文字の文字コード体系であるUTF8から、Javaプログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する項目1記載のコンパイラ。
(項目3) 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納されない場合に、当該実行パスに変換命令を生成し、当該変換命令を除去することにより変換命令の部分冗長性を除去する項目1記載のコンパイラ。
(項目4) 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字コード体系を設定するコンストラクタにより生成され、前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第2の文字コード体系に設定する場合に、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する項目1記載のコンパイラ。
(項目5) 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第2の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する項目1記載のコンパイラ。
(項目6) 前記第2の文字コード体系の文字を戻り値とするメソッドの識別情報を格納するメソッド情報格納部と、前記コンストラクタにより前記第2の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第2の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記メソッド情報格納部に格納するメソッド再帰判断部とを更に備え、前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、当該実行パスにおいて前記第2の文字コード体系の文字が前記文字変数に格納されると判断する項目5記載のコンパイラ。
(項目7) 前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第1の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第2の文字コード体系である場合に当該文字を前記第1の文字コード体系に戻して出力する命令列を生成する出力処理命令列生成部を更に備える項目1記載のコンパイラ。
(項目8) 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラであって、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第2の文字コード体系である場合に当該処理を実行し、当該文字が前記第1の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部とを備えるコンパイラ。
(項目9) 前記文字操作処理生成部は、前記文字変数の文字を読み出して操作する前記複数の処理の各々について、当該処理に入力される文字が前記第2の文字コード体系である確率が、予め定められた基準確率より高い場合に、前記例外付命令列を生成する項目8記載のコンパイラ。
(項目10) 前記文字変数は、当該文字変数が前記第1の文字コード体系及び前記第2の文字コード体系の何れであるかを示すコード体系情報と、第1の文字コード体系の文字を格納する第1文字格納領域と、第2の文字コード体系の文字を格納する第2文字格納領域とを管理し、前記文字操作処理生成部は、第1の文字コード体系の文字が前記文字変数に格納された場合に、前記第2文字格納領域のアドレスを示すポインタを無効なアドレスに設定することにより前記例外付命令列に例外を発生させる命令列と、前記第2の文字コード体系の文字が前記文字変数に格納された場合に前記第2文字格納領域のアドレスを有効なアドレスに設定する命令列と、前記例外付命令列として前記第2文字格納領域を読み出す命令列とを生成する項目8記載のコンパイラ。
(項目11) 最適化対象の対象プログラムにおいて文字変数に格納される文字を第1の文字コード体系から第2の文字コード体系に変換する変換処理を最適化するコンパイラであって、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部とを備えるコンパイラ。
(項目12) 前記文字コードのデータサイズは、前記文字コードの値の範囲に応じて異なり、前記取得処理生成部は、前記文字コードを含む予め定められたサイズの単位データを取得する命令列を生成し、前記変換検出処理生成部は、前記文字コードのデータサイズ毎に、前記単位データに当該データサイズの複数の文字コードが連続して配列される場合に実行すべき変換処理と並行して、前記単位データに当該データサイズの複数の文字コードが連続して配列されているか否かを検出する検出処理を実行する命令列を生成する項目11記載のコンパイラ。
(項目13) 前記変換検出処理生成部は、前記文字コードのデータサイズ毎に実行する前記検出処理として、前記単位データのうち何れの文字コードが当該データサイズであるかを更に検出する命令列を生成し、前記選択処理生成部は、前記変換処理の処理結果のうち、前記検出処理により当該データサイズであると検出された文字コードについての処理結果を選択して出力する命令列を生成する
項目12記載のコンパイラ。
(項目14) 前記変換検出処理生成部は、前記複数の変換処理の各々として、当該変換処理の処理結果を当該変換処理に対応して予め定められた記憶領域に格納する命令列を生成し、前記選択処理生成部は、前記検出処理により検出された前記文字コードの値の範囲に基づいて、当該文字コードを変換した処理結果を格納する記憶領域のアドレスを生成し、生成した当該アドレスから処理結果を読み出す命令列を生成する項目11記載のコンパイラ。
(項目15) 文字の種類に応じてデータサイズの異なる第1の文字コード体系の文字を第2の文字コード体系の文字に変換する変換処理を実行する中央処理装置であって、前記文字の文字コードのデータサイズ毎に、当該データサイズの複数の文字コードがレジスタに連続して配列される場合に実行すべき前記変換処理と並行して、当該データサイズの複数の文字コードが前記レジスタに連続して配列されるか否かを検出する検出処理を実行する命令を有する中央処理装置。
(項目16) 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとしてコンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成部と、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去部として機能させるコンパイラプログラム。
(項目17) 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々として、前記文字変数に格納される文字が前記第2の文字コード体系である場合に当該処理を実行し、当該文字が前記第1の文字コード体系である場合に例外を発生させる例外付命令列を生成する文字操作処理生成部と、前記例外が発生した場合に実行され、前記文字変数に格納される文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納し、前記例外を発生させた当該処理に復帰させる例外ハンドラを生成する例外ハンドラ生成部として機能させるコンパイラプログラム。
(項目18) 最適化対象の対象プログラムにおいて文字変数に格納される文字を第1の文字コード体系から第2の文字コード体系に変換する変換処理を最適化するコンパイラとして、コンピュータを機能させるコンパイラプログラムであって、前記コンピュータを、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成部と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成部と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成部として機能させるコンパイラプログラム。
(項目19) 項目16から項目18の何れかに記載のコンパイラプログラムを記録した記録媒体。
(項目20) 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラを、コンピュータにより制御する制御方法であって、前記コンピュータにより、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令を生成する変換命令生成段階と、前記変換命令生成段階において生成された各変換命令について、当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、当該変換命令を除去する変換命令除去段階とを備える制御方法。
(項目21) 最適化対象の対象プログラムにおいて文字変数に格納される文字を第1の文字コード体系から第2の文字コード体系に変換する変換処理を最適化するコンパイラを、コンピュータにより制御する制御方法であって、前記コンピュータにより、変換対象の文字の文字コードを取得する処理の命令列を生成する取得処理生成段階と、前記文字コードの値の範囲に応じて何れかを選択して実行すべき複数の前記変換処理の各々と、前記文字コードの値の範囲を検出する検出処理とを並行して実行する命令列を生成する変換検出処理生成段階と、前記複数の変換処理のうち何れかの変換処理の処理結果を、前記検出処理の検出結果に基づいて選択して出力する命令列を生成する選択処理生成段階とを備える制御方法。
図1は、コンパイラ10のブロック図である(実施例1)。 図2は、文字変数20のデータ構造の一例である(実施例1)。 図3は、コンパイラ10が変換処理を最適化する処理フローを示す(実施例1)。 図4は、出力処理命令生成部150が出力処理として生成する命令列の動作を示すプログラム例である(実施例1)。 図5は、本実施例に係るコンパイラ10をSAX入力ライブラリに適用したプログラム例である(実施例1)。 図6は、本実施例に係るコンパイラ10をDOM入力ライブラリに適用したプログラム例である(実施例1)。 図7は、コンパイラ70及び中央処理装置80のブロック図である(実施例2)。 図8は、コンパイラ10が変換処理を最適化する処理フローを示す(実施例2)。 図9は、UTF16及びUTF8の文字コード体系を比較して示す(実施例2)。 図10は、UTF16をUTF8に変換する処理の他の例を示す(実施例2)。 図11は、本実施例におけるコンパイラ70が生成する変換処理の処理フロー図を示す(実施例2)。 図12は、中央処理装置80が有する、UTF8をUTF16に変換する命令群の一例を示す(実施例2)。 図13は、中央処理装置80が有するその他の命令を示す(実施例2)。 図14は、コンパイラ10が変換処理を最適化して生成した命令列の処理フローを示す(実施例2)。 図15は、コンパイラ10が変換処理を最適化して生成した命令群50の一例を示す(実施例2)。 図16は、コンパイラ10又はコンパイラ70として機能するコンピュータ500のハードウェア構成の一例を示す。
符号の説明
10 コンパイラ
20 文字変数
50 命令群
70 コンパイラ
80 中央処理装置
100 文字コード体系判定部
105 変換命令生成部
110 変換命令除去部
120 メソッド情報格納部
130 メソッド再帰判断部
140 文字操作処理生成部
145 例外ハンドラ生成部
150 出力処理命令生成部
210 コード体系情報
220 第1ポインタ
225 第1文字格納領域
230 第2ポインタ
235 第2文字格納領域
240 データ長情報
500 コンピュータ
700 取得処理生成部
710 変換検出処理生成部
720 選択処理生成部

Claims (21)

  1. 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラ装置であって、
    前記対象プログラム中における、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って実行される位置に、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令をCPUの動作により生成する変換命令生成部と、
    前記変換命令生成部により生成された各変換命令について、前記対象プログラム中における当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、前記CPUの動作により、前記対象プログラムから当該変換命令を除去する変換命令除去部と
    を備えるコンパイラ装置
  2. 前記変換命令生成部は、CPUの動作により、XML文書における文字の文字コード体系であるUTF8から、Java(登録商標)プログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する
    請求項1記載のコンパイラ装置
  3. 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、前記対象プログラム中における、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納されない場合に、前記CPUの動作により、当該実行パスに新たな変換命令を生成し、元の変換命令を除去する
    請求項1記載のコンパイラ装置
  4. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第2の文字コード体系に設定する場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項1記載のコンパイラ装置
  5. 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第2の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項1記載のコンパイラ装置
  6. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記第2の文字コード体系の文字を戻り値とするメソッドの識別情報を格納するメソッド情報格納部と、
    前記コンストラクタにより前記第2の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第2の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記CPUの動作により、前記メソッド情報格納部に格納するメソッド再帰判断部と
    を更に備え、
    前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、前記CPUの動作により、当該実行パスにおいて前記第2の文字コード体系の文字が前記文字変数に格納されると判断する
    請求項5記載のコンパイラ装置
  7. 前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第1の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第2の文字コード体系である場合に当該文字を前記第1の文字コード体系に戻して出力する命令列を、前記CPUの動作により生成する出力処理命令列生成部
    を更に備える請求項1記載のコンパイラ装置
  8. 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラ装置としてコンピュータを機能させるコンパイラプログラムであって、
    前記コンピュータを、
    前記対象プログラム中における、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って実行される位置に、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令をCPUの動作により生成する変換命令生成部と、
    前記変換命令生成部により生成された各変換命令について、前記対象プログラム中における当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、前記CPUの動作により、前記対象プログラムから当該変換命令を除去する変換命令除去部と
    して機能させるコンパイラプログラム。
  9. 前記変換命令生成部は、前記CPUの動作により、XML文書における文字の文字コード体系であるUTF8から、Java(登録商標)プログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する
    請求項8に記載のコンパイラプログラム。
  10. 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、前記対象プログラム中における、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納されない場合に、前記CPUの動作により、当該実行パスに新たな変換命令を生成し、元の変換命令を除去する 請求項8に記載のコンパイラプログラム。
  11. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第2の文字コード体系に設定する場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項8に記載のコンパイラプログラム。
  12. 前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第2の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項8に記載のコンパイラプログラム。
  13. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記コンピュータは、前記第2の文字コード体系の文字を戻り値とするメソッドの識別情報を格納するメソッド情報格納部を備え、
    当該コンパイラプログラムは、前記コンピュータを、
    前記コンストラクタにより前記第2の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第2の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記CPUの動作により、前記メソッド情報格納部に格納するメソッド再帰判断部と
    して更に機能させ、
    前記変換命令除去部は、前記変換命令生成部により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、前記CPUの動作により、当該実行パスにおいて前記第2の文字コード体系の文字が前記文字変数に格納されると判断する
    請求項12に記載のコンパイラプログラム。
  14. 当該コンパイラプログラムは、前記コンピュータを、
    前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第1の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第2の文字コード体系である場合に当該文字を前記第1の文字コード体系に戻して出力する命令列を、前記CPUの動作により生成する出力処理命令列生成部
    として更に機能させる請求項8に記載のコンパイラプログラム。
  15. 最適化対象の対象プログラムにおいて文字変数に格納される文字の文字コード体系の変換を最適化するコンパイラ装置を、コンピュータにより実現する方法であって、
    前記対象プログラム中における、第1の文字コード体系により書き込まれた文字変数の文字を読み出して第2の文字コード体系において当該文字を使用する複数の処理の各々に先立って実行される位置に、当該文字を前記第1の文字コード体系から前記第2の文字コード体系に変換して当該文字変数に格納する変換命令を、前記コンピュータのCPUの動作により生成する変換命令生成段階と、
    前記変換命令生成段階において生成された各変換命令について、前記対象プログラム中における当該変換命令に先立って実行される全ての実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納される場合に、前記コンピュータのCPUの動作により、前記対象プログラムから当該変換命令を除去する変換命令除去段階と
    を備える方法
  16. 前記変換命令生成段階は、CPUの動作により、XML文書における文字の文字コード体系であるUTF8から、Java(登録商標)プログラムとして記述された前記複数の処理が文字列を操作する場合に使用する文字コード体系であるUTF16に変換する命令を前記変換命令として生成する
    請求項15に記載の方法。
  17. 前記変換命令除去段階は、前記変換命令生成段階により生成された各変換命令について、前記対象プログラム中における、当該変換命令に先立って実行される何れかの実行パスにおいて、前記文字変数に前記第2の文字コード体系の文字が格納されない場合に、前記CPUの動作により、当該実行パスに新たな変換命令を生成し、元の変換命令を除去する
    請求項15に記載の方法。
  18. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記変換命令除去段階は、前記変換命令生成段階により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記文字変数のコンストラクタが当該文字変数を前記第2の文字コード体系に設定する場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項15に記載の方法。
  19. 前記変換命令除去段階は、前記変換命令生成段階により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記第2の文字コード体系の文字を戻り値として前記文字変数に格納するメソッドが実行される場合に、前記CPUの動作により、当該実行パスにおいて前記文字変数に前記第2の文字コード体系の文字が格納されると判断する
    請求項15に記載の方法。
  20. 前記文字変数は、文字を格納する記憶領域を確保すると共に、当該文字変数における文字コード体系を設定するコンストラクタにより生成され、
    前記第2の文字コード体系の文字を戻り値とするメソッドの識別情報を前記コンピュータのメソッド情報格納部に格納するメソッド情報格納段階と、
    前記コンストラクタにより前記第2の文字コード体系に設定された文字変数に格納された文字と、前記変換命令により既に前記第2の文字コード体系に変換された文字と、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値との何れかを、更に戻り値とするメソッドの識別情報を、前記CPUの動作により、前記メソッド情報格納部に格納するメソッド再帰判断段階と
    を更に備え、
    前記変換命令除去段階は、前記変換命令生成段階により生成された各変換命令について、当該変換命令に先立って実行される各実行パスにおいて、前記メソッド情報格納部に格納された識別情報に対応するメソッドの戻り値が前記文字変数に格納される場合に、前記CPUの動作により、当該実行パスにおいて前記第2の文字コード体系の文字が前記文字変数に格納されると判断する
    請求項19に記載の方法。
  21. 前記文字変数に格納される文字を出力する処理として、前記文字変数に格納された文字が前記第1の文字コード体系である場合に当該文字を出力し、前記文字変数に格納された文字が前記第2の文字コード体系である場合に当該文字を前記第1の文字コード体系に戻して出力する命令列を、前記CPUの動作により生成する出力処理命令列生成段階
    を更に備える請求項15に記載の方法。
JP2004109650A 2004-04-02 2004-04-02 コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置 Expired - Fee Related JP4129981B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2004109650A JP4129981B2 (ja) 2004-04-02 2004-04-02 コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置
US11/096,548 US7577936B2 (en) 2004-04-02 2005-04-01 Optimization of conversion of a character coding system

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004109650A JP4129981B2 (ja) 2004-04-02 2004-04-02 コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置

Publications (2)

Publication Number Publication Date
JP2005293386A JP2005293386A (ja) 2005-10-20
JP4129981B2 true JP4129981B2 (ja) 2008-08-06

Family

ID=35095761

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004109650A Expired - Fee Related JP4129981B2 (ja) 2004-04-02 2004-04-02 コンパイラ、コンパイラプログラム、記録媒体、制御方法、及び中央処理装置

Country Status (2)

Country Link
US (1) US7577936B2 (ja)
JP (1) JP4129981B2 (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9069547B2 (en) 2006-09-22 2015-06-30 Intel Corporation Instruction and logic for processing text strings
US7394411B1 (en) 2007-01-09 2008-07-01 International Business Machines Corporation Fast implementation of decoding function for variable length encoding
US8633936B2 (en) * 2008-04-21 2014-01-21 Qualcomm Incorporated Programmable streaming processor with mixed precision instruction execution
JP5164112B2 (ja) * 2008-10-28 2013-03-13 インターナショナル・ビジネス・マシーンズ・コーポレーション ソースコード変換方法、サーバシステム、およびサーバプログラム
WO2010125960A1 (ja) * 2009-04-28 2010-11-04 インターナショナル・ビジネス・マシーンズ・コーポレーション マルチスレッド上で動作するプログラムのプログラム・コードをロック衝突が少ないプログラム・コードに変換するための方法、並びにそのコンピュータ・プログラム及びコンピュータ・システム
JP2010277440A (ja) * 2009-05-29 2010-12-09 Internatl Business Mach Corp <Ibm> プログラム実行時における文字列の処理を最適化する方法、並びにそのコンピュータ・システム及びコンピュータ・プログラム
JP5059174B2 (ja) * 2010-08-10 2012-10-24 株式会社東芝 プログラム変換装置、およびそのプログラム
JP6245028B2 (ja) 2014-03-27 2017-12-13 富士通株式会社 実行制御方法、実行制御プログラムおよび実行制御装置
US10733199B2 (en) 2014-11-05 2020-08-04 International Business Machines Corporation Optimizing data conversion using pattern frequency
JP6397343B2 (ja) * 2015-01-28 2018-09-26 株式会社日立社会情報サービス 情報処理装置、および、情報処理方法
US10620956B2 (en) 2017-03-03 2020-04-14 International Business Machines Corporation Search string processing via inline decode-based micro-operations expansion
US10564965B2 (en) 2017-03-03 2020-02-18 International Business Machines Corporation Compare string processing via inline decode-based micro-operations expansion
US10255068B2 (en) 2017-03-03 2019-04-09 International Business Machines Corporation Dynamically selecting a memory boundary to be used in performing operations
US10564967B2 (en) 2017-03-03 2020-02-18 International Business Machines Corporation Move string processing via inline decode-based micro-operations expansion
US10613862B2 (en) 2017-03-03 2020-04-07 International Business Machines Corporation String sequence operations with arbitrary terminators
US10789069B2 (en) 2017-03-03 2020-09-29 International Business Machines Corporation Dynamically selecting version of instruction to be executed
US10324716B2 (en) 2017-03-03 2019-06-18 International Business Machines Corporation Selecting processing based on expected value of selected character

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050086584A1 (en) * 2001-07-09 2005-04-21 Microsoft Corporation XSL transform

Also Published As

Publication number Publication date
US7577936B2 (en) 2009-08-18
US20050231397A1 (en) 2005-10-20
JP2005293386A (ja) 2005-10-20

Similar Documents

Publication Publication Date Title
US7577936B2 (en) Optimization of conversion of a character coding system
US5303356A (en) System for issuing instructions for parallel execution subsequent to branch into a group of member instructions with compoundability in dictation tag
US5504932A (en) System for executing scalar instructions in parallel based on control bits appended by compounding decoder
US7508985B2 (en) Pattern-matching system
JP2002149416A (ja) プログラムの最適化方法及びこれを用いたコンパイラ
KR100947137B1 (ko) 양 엔디안 가능 컴파일러를 구현하기 위한 방법 및 장치
JP3900485B2 (ja) 最適化装置、コンパイラプログラム、最適化方法、及び記録媒体
US7958133B2 (en) Application conversion of source data
JPS6288033A (ja) ソフトウエアプログラムを生成するための装置及びその方法
JP2008059279A (ja) 文字列出力処理を最適化する技術
JPH08314728A (ja) ソースプログラムをオブジェクトプログラムに変換する方法および装置
US8839218B2 (en) Diagnosing alias violations in memory access commands in source code
US8332833B2 (en) Procedure control descriptor-based code specialization for context sensitive memory disambiguation
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
US6460067B1 (en) Using time stamps to improve efficiency in marking fields within objects
US7979853B2 (en) Compiler device, method, program and recording medium
JP5536593B2 (ja) 最適化装置、最適化方法およびコンパイラ・プログラム
KR100308512B1 (ko) 편집 기능을 위한 전문 밀리코드 지시
KR100317769B1 (ko) 압축 기억된 십진수 나눗셈에 대한 전문 밀리코드 명령
JP2004259007A (ja) コンパイラ装置、コンパイラプログラム、及び記録媒体
KR19990082748A (ko) 번역및테스트를위한전문밀리코드명령
JP2000122875A (ja) 例外処理方法およびシステム
EP0545927B1 (en) System for preparing instructions for instruction parallel processor and system with mechanism for branching in the middle of a compound instruction
Fülöp et al. Code comprehension for read-copy-update synchronization contexts in C code
KR19990082750A (ko) 전문업데이트및브랜치명령을이용하는밀리코드플래그

Legal Events

Date Code Title Description
A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20071210

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20080108

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20080122

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080201

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20080513

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

RD14 Notification of resignation of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7434

Effective date: 20080515

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20080519

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20110530

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees