(57)【要約】【課題】プログラムの圧縮方法に関し、プログラムの命令コード領域とデータ領域とを判別しそれぞれの領域に適した圧縮方法で圧縮を行う方法を提供することを目的とする。【解決手段】本発明のプログラム圧縮方法は、プログラムを所定のブロックサイズに分割するプログラム分割手順と、分割したブロックに含まれる条件コードの出現率を求める出現率算出手順と、その出現率が予め設定した閾値を超えるとき命令ブロックとして命令コード圧縮に適したアルゴリズムで圧縮し、そうでないときはデータ圧縮に適したアルゴリズムで圧縮する選択圧縮手順とで構成する。【選択図】    図１
2005025637.tif 000002
【特許請求の範囲】
【請求項１】
所定の条件コードを含む命令語セットで記述されるプログラムコードのプログラム圧縮方法であって、
プログラムコードを所定のサイズのブロックに分割するプログラム分割手順と、
前記ブロックに含まれる前記条件コードの出現率を求める出現率算出手順と、
前記出現率が予め設定した閾値を超えるときは前記ブロックを命令ブロックとして命令コード圧縮に適したアルゴリズムで圧縮し、前記出現率が前記閾値を超えないときはデータブロックとしてデータ圧縮に適したアルゴリズムで圧縮する選択圧縮手順と
を有することを特徴とするプログラム圧縮方法。
【請求項２】
プログラムコード中における配列構造を成すデータ領域を圧縮するプログラム圧縮方法であって、
前記データ領域に配置しているデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置変換する配置変換手順と、
前記配置変換されたデータに対して、個々のデータを該データの１つ前のデータとの差分を求め、該差分のデータに置き換える差分データ置換手順と、
該差分のデータに置き換えたデータに対してランレングス圧縮を行うランレングス圧縮手順と
を有することを特徴とするプログラム圧縮方法。
【請求項３】
プログラムコード中におけるランレングス圧縮された配列構造をなすデータ領域のプログラム解凍方法であって、
圧縮された前記データ領域のデータに対してランレングス解凍を行うランレングス解凍手順と、
前記ランレングス解凍されたデータに対して、個々のデータを該データの１つ前のデータを加えたデータに置き換える差分データ復元手順と、
前記差分データ復元手順により置き換えられたデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置し直す配置復元手順と
を有することを特徴とするプログラム解凍方法。
【請求項４】
所定の条件コードを含む命令語セットで記述されるプログラムコードの圧縮プログラムであって、
プログラムコードを所定のサイズのブロックに分割するプログラム分割手順と、
前記ブロックに含まれる前記条件コードの出現率を求める出現率算出手順と、
前記出現率が予め設定した閾値を超えるときは前記ブロックを命令ブロックとして命令コード圧縮に適したアルゴリズムで圧縮し、前記出現率が前記閾値を超えないときはデータブロックとしてデータ圧縮に適したアルゴリズムで圧縮する選択圧縮手順と
をコンピュータに実行させるための圧縮プログラム。
【請求項５】
プログラムコード中における配列構造を成すデータ領域を圧縮する圧縮プログラムであって、
前記データ領域に配置しているデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置変換する配置変換手順と、
前記配置変換されたデータに対して、個々のデータを該データの１つ前のデータとの差分を求め、該差分のデータに置き換える差分データ置換手順と、
該差分のデータに置き換えたデータに対してランレングス圧縮を行うランレングス圧縮手順と
をコンピュータに実行させるための圧縮プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、携帯電話等の携帯情報端末において、ファームウェアとして格納されるプログラムコードの圧縮方法およびその解凍方法に関する。
【０００２】
【従来の技術】
携帯電話の機能アップは著しいものがあり、２〜３年もすると陳腐化するまでになってきている。この機能アップに伴い、プログラムサイズも拡大の一途をたどっておりファームウェアとして格納されるメモリコストを押し上げる要因になっている。このため、プログラムを圧縮することでプログラム格納メモリを小さくでき、容量が小さなメモリを使用することによりメモリコストの引き下げを図ることが行われている。
【０００３】
プログラムは一般に命令を実行する命令コード領域と数値データ等を格納するデータ領域から構成されるが、プログラム圧縮はこれら領域に関係なく高い圧縮率で圧縮できることが望まれる。しかし圧縮を行うアルゴリズムは何らかの規則性に基づいて圧縮を行うため、命令コード領域とデータ領域とに共通する規則性がないか、あるいは少ないため一つのアルゴリズムで高い圧縮率で圧縮を行うことは現実には困難である。本願発明の出願人は、携帯電話やＰＤＡ（Ｐｅｒｓｏｎａｌ  Ｄｉｇｉｔａｌ  Ａｓｓｉｓｔａｎｔ）などの携帯情報端末に多く使用されているＡＲＭ系のＲＩＳＣプロセッサ（例えば、非特許文献１参照）におけるプログラムの命令コード領域の圧縮／解凍方法を先に提案している（特許文献１参照）。
【０００４】
一般的にデータ圧縮法としてランレングス圧縮（例えば、非特許文献２参照）が知られている。これは圧縮対象のデータ中において「同じデータパターンｐが繰り返しｎ回発生する部分」を「ｐ×ｎ」と置き換える圧縮である。解凍の処理もｐをｎ回出力するという簡単な処理であり、ＣＰＵの処理能力の低い装置でも容易かつ高速に実行できる、と言う特徴を持っている。
【０００５】
【特許文献１】
特許２００３−５２３０６
【０００６】
【非特許文献１】
ＡＲＭプロダクトインフォメーション、［ｏｎｌｉｎｅ］、アーム株式会社、［平成１５年６月６日検索］、インターネット＜  ｈｔｔｐ：／／ｗｗｗ．ｊｐ．ａｒｍ．ｃｏｍ／ｋｋ／ｋｋ  ＿ｐｒｏｄｕｃｔ．ｈｔｍｌ＞
【０００７】
【非特許文献２】
データ圧縮について、［ｏｎｌｉｎｅ］、だうぴ、［平成１５年６月６日検索］、インターネット＜  ｈｔｔｐ：／／ｗｗｗ．ａｎｎ．ｈｉ−ｈｏ．ｎｅ．ｊｐ／ｊｉｒｏ／ａｓｓｙｕｋｕ２．ｈｔｍ＞
【０００８】
【発明が解決しようとする課題】
上記で述べたように、本願発明の出願人はプログラムの命令コード領域に対する圧縮方法を先に提案したが、この圧縮方法はデータ領域に対して適用できるものではなかった。
また、データの圧縮方法として知られているランレングス圧縮で圧縮可能なのは「同じパターンが連続して発生する」部分であり、プログラムのデータ領域においてランレングス圧縮が利用できる部分は限られていた。即ち、データ中に見られる等差数列のパターンや、同じパターンの等差数列パターンのようなデータでは、単純な繰り返しパターンとはならずランレングス圧縮が出来ないからである。このような構造はデータテーブルや配列要素をメモリ上に展開すると発生するものであり、一般的なデータ領域では良く見られるものである。そして、このような構造のデータ領域はプログラム中に散在し、その配置や領域サイズはプログラムによって異なるのが一般的である。
【０００９】
例えば、構造体Ｓのメンバが
2005025637.tif 000003
である場合、この構造体Ｓの要素番号Ａやインデックス文字Ｂは一定間隔で単調増加することが期待できるし、ポインタＣは隣接する配列要素での文字列格納領域が比較的近い（＝ポインタアドレスを示すデータがほぼ等しい）ことが予想される。しかし、構造体Ｓはメモリ中には図４に示すような形で記録されるため、従来のランレングス圧縮では圧縮対象にできない、と言う問題があった。
【００１０】
本発明の目的は、ＡＲＭ系のプロセッサのプログラムにおいて、命令コード領域とデータ領域とが混在する場合のプログラム圧縮方法を提案するとともに、ランレングス圧縮上での問題を解決してプログラムのデータ領域の圧縮にランレングス圧縮を適用する方法を提案することにある。
【００１１】
【課題を解決するための手段】
上記課題を解決するため、本発明のプログラム圧縮方法およびプログラム解凍方法は以下のように構成される。
（１）第１の発明
第１の発明は、ＡＲＭ系のプロセッサのプログラムコード中に混在する命令コード領域とデータ領域とをそれぞれに適した圧縮方法で圧縮するものである。
【００１２】
その原理を図１を用いて説明する。第１の発明は、図１に示すようにプログラム分割手順１、出現率算出手順２および選択圧縮手順３から成る。
プログラム分割手順１は、圧縮対象とするプログラムを所定のサイズのブロックに分割する。所定のサイズとは、例えば数ＫＢ（キロバイト）から数十ＫＢである。
【００１３】
出現率算出手順２は、所定の条件コードの出現率を分割した各ブロックに対して求めることを行う。例えば、ＡＲＭ３２ビット命令語セットにおける命令実行条件指定部の「Ａｌｗａｙｓ（常に実行）」と言う条件コードの出現率を算出する。
選択圧縮手順３は、各ブロックで求めた条件コードの出現率が予め設定した閾値を超えるようであればそのブロックが命令コードが多数を占めると判断して命令コードの圧縮に向いた圧縮方法で圧縮を行う。もし、出現率が閾値より低ければデータ領域と見なして、データ領域の圧縮に向いた方法で圧縮を行う。
【００１４】
第１の発明によれば、圧縮対象のプログラムを構成する部分に対して適した圧縮方法で圧縮が可能となり、高い圧縮率を得ることができる。
（２）第２の発明
第２の発明は、プログラムのデータ領域をランレングス圧縮により圧縮するものである。
【００１５】
その原理を図２を用いて説明する。第２の発明は、図２に示すように配置変換手順４、差分データ置換手順５およびランレングス圧縮手順６から成る。
配置変換手順４は、圧縮対象のデータ領域のデータを配列構造の配列要素バイト数単位に１バイトづつを取り出し、並び替えることを行う。ここで配列要素バイト数とは、例えば構造体のメンバがＡ、Ｂ、＊Ｃでそれぞれ整数（２バイト）、文字（１バイト）、ポインタ（４バイト）であるとき、それぞれのバイト数を合わせた７バイトが配列要素バイト数である。従ってこの場合、データ領域のデータを７バイト置きに１バイトづつ取り出し順次配置することを行う。
【００１６】
差分データ置換手順５は、配置変換手順４で配置変換されたデータに対して、個々のデータをそれ自身のデータの値と１つ前に隣接するデータの値との差分を算出してその値（差分データ）に置き換えることを行う。即ち、ｎ番目のデータＤ（ｎ）はＤ（ｎ）−Ｄ（ｎ−１）のデータに置き換えられる。
ランレングス圧縮手順６は、置き換えたデータに対してランレングス圧縮を行う。圧縮後のデータは、差分データの値とその繰り返し個数をセットとしたデータの羅列となる。
【００１７】
第２の発明によれば、プログラムのデータ領域に格納されるデータの特異性（配列要素を繰り返しの単位として等差数列的に格納される場合が多い）を利用してランレングス圧縮により圧縮することが可能となる。
（３）第３の発明
第３の発明は、第２の発明で圧縮したプログラムのデータ領域を解凍する方法である。
【００１８】
第３の発明は、図３に示すようにランレングス解凍手順７、差分データ復元手順８および配置復元手順９から成る。
ランレングス解凍手順７は、圧縮されたデータのランレングス解凍を行う。即ち、ランレングス圧縮されたデータはデータ値と繰り返し個数をセットとして持っているので、全てデータ値となるように展開する。
【００１９】
差分データ復元手順８は、ランレングス解凍手順７で展開されたデータに対して、個々のデータをそのデータの１つ前に隣接したデータの値を加え、このデータを自身のデータと置き換えることを行う。ランレングス解凍したデータは前述した差分値のデータとなっているので、１つ前のデータを加算することにより差分値のデータを復元したことになる。即ち、ｎ番目のデータＤ（ｎ）は、Ｄ（ｎ）＋Ｄ（ｎ−１）と置き換えられる。
【００２０】
配置復元手順９は、差分データ復元手順８で得られたデータを配列構造の配列要素バイト数に等しい単位で１バイトづつを取り出して配置することを順次行う。配列要素バイト数は前述した第２の発明と同様であり、このバイト数が７バイトであった場合、差分データ復元手順８で得られたデータを７バイト置きに１バイトづつを取り出し配置する。これにより圧縮前のデータが復元されたことになる。
【００２１】
第３の発明によれば、ランレングス圧縮されたプログラムのデータ領域の解凍が可能となる。
第４の発明は、第１の発明のプログラムである。第４の発明によれば、圧縮対象のプログラムを構成する部分に対して適した圧縮方法で圧縮が可能となり、高い圧縮率が計れる圧縮プログラムの提供ができる。
【００２２】
第５の発明は、第２の発明のプログラムである。第５の発明によれば、圧縮対象のプログラムのデータ領域をランレングス圧縮できる圧縮プログラムの提供が可能となる。
【００２３】
【発明の実施の形態】
次に、本発明について図５から図１８を参照して実施形態を説明する。
（実施形態その１）
実施形態その１は、第１の発明を具現化する例である。即ち、プログラム全体を命令コード領域とデータ領域とに分け、それぞれに適した圧縮方法にて圧縮を行うものである。
【００２４】
図５はこの処理のフローを示すもので、圧縮対象のプログラムは複数のブロックに分割されており、このブロックを読み込みブロックと称する。また、圧縮したデータを書き込むための書き込みブロックを別途用意しておくものとする。これらのブロックは、コンピュータのメモリ上に展開または領域として確保されるものである。
【００２５】
まず、読み込みブロックおよび書き込みブロックのポインタを初期化しておく。即ち、読み込みブロックのポインタＰｒｂを圧縮対象のプログラムの先頭ブロックのアドレスＲｂにセットする。また、メモリ上に確保した書き込みブロックの先頭アドレスＷｂを書き込みブロックのポインタＰｗｂにセットする。続いて、命令コード領域とデータ領域との分別を行う閾値Ｃｐを設定する。この閾値は人手により入力された値を設定するものであるが、例えば携帯情報端末のＡＲＭ系のプロセッサを用いた実機プログラムを測定して条件コード”Ａｌｗａｙｓ”の出現分布を見ると図６のようであった場合、出現率７０％を閾値として用いることで、命令コード領域とデータ領域とを分別することが可能である。即ち、ブロック内の条件コードの出現率が７０％を超えている場合は、そのブロック内は大半が命令コードで満たされており、７０％以下の場合はデータ領域とみることができる。（Ｓ１０１〜Ｓ１０３）。
【００２６】
圧縮対象プログラムを分割した読み込みブロック内の条件コード”Ａｌｗａｙｓ”の出現率Ｃａを算出する（条件コード出現率はＣａ＝ｆＣａ（Ｐｒｂ）と表すことができる）。求めた出現率Ｃａと先に設定した閾値Ｃｐ（即ち、７０％）とを比較し、Ｃａが大きければそのブロックは命令コードの領域と見なし、命令コードの圧縮ヘッダを書き込みブロックに出力する。続いて、命令コードに適した圧縮方法（例えば、本願出願人が先に特許文献１で提案した方法）で読み込みブロックのプログラムを圧縮し、その結果を書き込みブロックに出力する。
【００２７】
条件コードの出現率Ｃａが閾値Ｃｐより小さいときは読み込みブロックのプログラムをデータ領域と見なし、データの圧縮ヘッダ書き込みブロックに出力する。続いて、データの圧縮に適した圧縮方法（例えば、後述する実施形態その２の方法）で読み込みブロックのプログラムを圧縮し、その結果を書き込みブロックに出力する。
【００２８】
読み込みポインタおよび書き込みポインタを更新し、圧縮対象プログラムの全ブロックに対して圧縮完了しているかどうかをチェックする。完了していなければ、更新された読み込みポインタの示すブロックの条件コードの出現率を算出する処理に戻る。全ブロックの圧縮完了が確認されれば終了となる。（Ｓ１０４〜Ｓ１１１）。
【００２９】
（実施形態その２）
実施形態その２は、第２の発明を具現化する例である。即ち、プログラムのデータ領域の圧縮を行うものである。
本実施形態で用いる配列構造のデータは例えば図４に示すような配置でメモリ中に展開されているものとする。即ち、構造体Ｓの一つの配列要素がｑバイトとするとデータのサイズＭはｑ×ｎバイトであり、メモリ中ではｑバイト置きに配列要素が並べられた配置となっている。データ領域の圧縮はこのデータを圧縮することである。
【００３０】
次に、データ領域の圧縮アルゴリズムの処理フローを図７を用いて説明する。図７において、データの配列Ｍ［１，２，…，ｎｑ］をＭ’［１，ｑ＋１，２ｑ＋１，…，ｎｑ−１，ｎｑ］と配置変換する。即ち、データの配列をｑバイト置きに１バイトづつを取り上げ並べ替えることを行う。このことは図４に並べられたデータを図８（ａ）に示すようにｑバイト置きに１バイトのデータを取り出し、同図（ｂ）に示すように取り出したデータを順に並べることを行っている。次に並び替えたデータに対して、１つ前のデータとの差分を求め置き換えることを行う。但し、先頭のデータはそのままとし、先頭から２番目のデータ以降のデータについてこの処理を行う。即ち、Ｍ”［１］＝Ｍ’［１］として、ｉ＝２〜ｎｑに対してＭ”［ｉ］＝Ｍ’［ｉ］−Ｍ’［ｉ−１］を行う。このＭ”をランレングス圧縮して圧縮データＲを得る。（Ｓ２０１〜Ｓ２０４）。
【００３１】
次にランレングス圧縮の処理フロー例を図９を用いて説明する。ここでは、指定エリア内のデータにおいて同一データが連続する部分を検出して、繰り返しデータと繰り返し回数を示すデータに置換するものである。
まず、圧縮対象エリアＭ（先頭アドレスＭａ、サイズＭｓ）に対する読み込みポインタＰｍａの初期化（Ｐｍａ＝Ｍａ）、および圧縮データ格納エリアＲ（先頭アドレＲａ）に対する書き込みポインタＰｒａの初期化（Ｐｒａ＝Ｒａ）を行う。続いて、圧縮データ格納エリアＲに「ランレングス圧縮開始マークデータＲｍｓ」、「エリアサイズＭｓ」および「配列要素バイト数ｑ」を書き込み、書き込みポインタＰｒａを更新する。（Ｓ３０１〜Ｓ３０３）。
【００３２】
読み込みポインタ位置のデータＭ［Ｐｍａ］が、Ｐｍａ以降Ｍ［Ｐｍａ］，Ｍ［Ｐｍａ＋１］，Ｍ［Ｐｍａ＋２］，…Ｍ［Ｐｍａ＋ｎｑ］において連続する回数Ｐｍａｎを求める。Ｐｍａｎ＞２なら圧縮可能の部位と判断して圧縮データ格納エリアＲに「圧縮マークデータＲｍ」「繰り返し回数Ｐｍａｎ」「繰り返しデータＭ［Ｐｍａ］」を書き込み、書き込みポインタＰｒａの更新および読み込みポインタＰｍａの更新を行う。Ｐｍａｎ＞２でなければ圧縮不可能の部位と判断して圧縮データ格納エリアＲにＭ［Ｐｍａ］を書き込み、書き込みポインタＰｒａの更新、および読み込みポインタＰｍａの更新（Ｐｍａ＝Ｐｍａ＋１）を行う。
【００３３】
更新を行った読み込みポインタＰｍａの値が「圧縮対象エリアの先頭アドレスＭａ＋サイズＭｓ」より小さければこの処理（Ｓ３０４〜Ｓ３０９）を繰り返し、そうでなければ圧縮終了となる。（Ｓ３０４〜Ｓ３１０）。
以上の圧縮動作を具体的なデータに対して行った例を図１０と図１１で説明する。図１０（ａ）のように３つのメンバからなる構造体Ｓを定義し、図１０（ｂ）のように構造体配列Ｓ［］に数値を代入したとき、Ｓ［］のそれぞれの値は１６進表記で図１０（ｃ）のようになり、メモリ中では図１０（ｄ）のようになる（Ｍ）。図１０（ｄ）の数列は普通のランレングス圧縮では圧縮効果が現れにくい形である。
【００３４】
これを構造体Ｓの配列要素のサイズ（７バイト）で折り返し表示すると図１１（ｅ）のようになり、図７の圧縮アルゴリズムのＳ２０１の操作（配置変換）により図１１（ｆ）の形になる（Ｍ’）。さらに図７の圧縮アルゴリズムのＳ２０３の操作（差分作成）を行うと図１１（ｇ）の形になり、同じ数値が連続する状態になる（Ｍ”）。最後に図７の圧縮アルゴリズムのＳ２０４の操作（ランレングス圧縮）により図１１（ｈ）の形になる（Ｒ）。
【００３５】
繰り返し回数表記を１バイトで記述できたとすると、このデータの場合は圧縮前に４２バイトあったものを２０バイトに圧縮できた（実際にはヘッダや圧縮マークが入るのでその分が増える）。
（実施形態その３）
実施形態その２の圧縮アルゴリズムではＭを一旦Ｍ’に配置変換しているが、図７のＳ２０２〜Ｓ２０４において、メモリアクセスポインタをＳ２０１と同様のアドレス変換を施すことにより、Ｓ２０１の工程とＭ’作成に要するワークメモリを省略することができる。この圧縮のアルゴリズムの１例を図１２に示す。
【００３６】
まず、Ｍ”［１］＝Ｍ［１］とし、続いてｉ＝１〜ｑ、ｊ＝１〜ｎに対して、Ｍ”［（ｉ−１）＊ｎ＋ｊ］＝Ｍ［ｉ＋（ｊ−２）＊ｑ］−Ｍ［ｉ＋（ｊ−１）＊ｑ］の演算を行う。即ち、Ｍから配置変換と差分算出とを同時に行って直接Ｍ”を求めることを行う。そして、求めたＭ”をランレングス圧縮して圧縮データＲを得るものである。ランレングス圧縮は図９に示すフローで行える。（Ｓ４０１〜Ｓ４０３）。
【００３７】
（実施形態その４）
実施形態その４は、第３の発明を具現化する例である。即ち、ランレングス圧縮されたプログラムのデータ領域の解凍を行うものである。
図１３は解凍のアルゴリズムを示す処理フローを示すもので、まず圧縮されたプログラムのランレングス解凍（ここでは後述する差分型ランレングス解凍と区別するため、通常型ランレングス解凍と称す）を行って差分データ（Ｍ”）を得る。次に差分の復元を行うが、先頭のデータはそのままとして（即ち，差分復元データをＭ’とすると、Ｍ’［１］＝Ｍ”［１］）、先頭から２番目のデータを先頭のデータの値に加えてその値に置き換える。この処理を順次データ個数分行う（即ち、Ｍ’［ｉ］＝Ｍ”［ｉ］＋Ｍ”［ｉ−１］。但し、ｉ＝２〜ｎｐ）。次に、配置要素のバイト数（ｑ）置きに１バイトづつデータを取り出して並び変えることを行う（即ち、Ｍ’［１，２，…，ｎｑ］をＭ［１，ｑ＋１，２ｑ＋１，…，ｎｑ−１，ｎｑ］と配置変換する）。（Ｓ５０１〜Ｓ５０４）。
【００３８】
次に、前述した通常型ランレングス解凍の処理フローを図１４を用いて説明する。図１４において、圧縮データ格納エリアＲ（先頭アドレスＲａ）に対する読み込みポインタＰｒａの初期化（即ち、Ｐｒａ＝Ｒａ）、および展開データ格納エリアＭ（先頭アドレスＭａ）に対する書き込みポインタＰｍａの初期化（即ち、Ｐｍａ＝Ｍａ）を行う。続いて、圧縮データ格納エリアＲから「ランレングス圧縮開始マークデータＲｍｓ」「エリアサイズＭｓ」「配列要素バイト数ｑ」を読み込み、読み込みポインタＰｒａを更新する。（Ｓ６０１〜Ｓ６０３）。
【００３９】
読み込みポインタＰｒａの示す位置データＲ［Ｐｒａ］が圧縮マークデータＲｍであった場合、繰り返し回数Ｐｍａｎと繰り返しデータＤを読み込んで読み込みポインタＰｒａを更新する。得られたＰｍａｎとＤにより、ＭにデータＤをＰｍａｎ回書き込んで書き込みポインタＰｍａを更新する。
読み込みポインタＰｒａの示す一のデータが圧縮マークデータＲｍでなかった場合、非圧縮データと判断してＭにＲ［Ｐｒａ］を書き込み、書き込みポインタＰｒａを更新（Ｐｒａ＝Ｐｒａ＋１）する。
【００４０】
読み込みポインタＰｒａが解凍対象とするデータの最終データを示す位置（Ｒａ＋Ｒｓ）でなければこの処理を繰り返す。（Ｓ６０４〜Ｓ６０９）。
（実施形態その５）
実施形態その４では、差分データＭ”および配置変換のデータＭ’の作成を行っているが、図１３のＳ５０１ステップのランレングス解凍データ１  バイト毎にＳ５０３ステップの差分復元処理を行い、Ｓ５０４ステップ相当の配置換を施してＭに格納することにより、Ｍ”およびＭ’の作成に要する処理とワークメモリを省略できる。この解凍アルゴリズム（ここでは、差分型ランレングス解凍と称す）の例を図１５および図１６に示す。
【００４１】
図１５に示すように、差分型ランレングス解凍により中間のワークエリアを持つことなく直接解凍するものである。そのフローは図１６に示すもので、Ｓ７０１〜Ｓ７０４は通常ランレングス解凍の処理フローである図１４のＳ６０１〜Ｓ６０４と同一である。
Ｓ７０４で、読み込みポインタが示す位置のデータＲ［Ｐｒａ］が圧縮マークデータＲｍであった場合に、繰り返し回数Ｐｍａｎと繰り返しデータＤを読み込み、繰り返しデータＤをＭ［Ｐｍａ］に書き込み（即ち、Ｍ［Ｐｍａ］＝Ｒ［Ｐｒａ＋＋］）読み込みポインタＰｒａを更新する。続いて、繰り返しデータＤをｑ個置きに直前のデータを差分として加算しながら書き込む（即ち、Ｍ［Ｐｍａ＋ｉ＊ｑ］＝Ｍ［Ｐｍａ＋ｉ＊ｑ］＋Ｍ［Ｐｍａ＋（ｉ−１）＊ｑ］。但し、ｉ＝１〜Ｐｍａｎ−１）。書き込みポインタＰｍａをＰｍａｎ×ｑの分加えて更新する。
【００４２】
Ｓ７０４で、読み込みポインタが示す位置のデータＲ［Ｐｒａ］が圧縮マークデータＲｍでなかった場合は、非圧縮データと判断してＭ［Ｐｍａ］にＲ［Ｐｒａ］を書き込み、書き込みポインタＰｍａおよび読み込みポインタＰｒａを更新（即ち、Ｐｍａ＝Ｐｍａ＋ｑ。Ｐｒａ＝Ｐｒａ＋１）する。
以降読み込みポインタＰｒａがＲａ＋Ｒｓになるまで繰り返し、解凍する対象のデータなくなれば終了する。（Ｓ７０４〜Ｓ７１０）。
【００４３】
（実施形態その６）
実施形態その２およびその３の圧縮工程においては、あらかじめ配列構造の位置とサイズが指定されていたが、実際にはメモリ中のどこにどのようなデータが配置されているかが不明なことが多い。これに対応するため、メモリ中から圧縮可能な領域を検出する手段が必要である。実施形態その６では、領域検出方法として、メモリＭ全体をサイズｄＭｓの小ブロックに分割し、各ブロック毎に配列要素のバイトサイズｑ対圧縮率Ｃの関係を評価する。これにより圧縮率最良となるｑを選択することができる。領域検出アルゴリズムを加えた圧縮の一例を図１７に示す。
【００４４】
図１７において、領域検出開始アドレスＳａを読み込みポインタＰｓおよび検出済ポインタＳｐに設定し、検出済サイズＳｓおよび検出済幅Ｑｐｐを０に初期化する。続いて、読み込みポインタＰｓから領域ｄＭｓに対し、配列要素サイズｘ（ｘ：１〜ｑｍａｘ）と設定したときの圧縮サイズｄＭｓｓ（ｘ）を求める。また、このときの配列要素サイズをｘｍｉｎとする。
【００４５】
圧縮サイズが最小となるｄＭｓｓ［ｘｍｉｎ］が元のサイズｄＭｓより小さいとき、圧縮効果があると判断する。そして、更に検出したｘｍｉｎが検出済幅Ｑｐｐと等しい場合、今回検出したブロックは前回までに検出したブロックの続きであると判断して検出サイズＳｓに領域ｄＭｓを追加する（Ｓｓ＝Ｓｓ＋ｄＭｓ）。
【００４６】
検出したｘｍｉｎが検出済幅Ｑｐｐと異なる場合、新たなブロックと判断して、検出済幅Ｑｐｐ＜＞０ならば前回検出のブロックを圧縮対象とし（Ｓｐ、Ｓｓ、Ｑｐｐを圧縮ルーチンに通知）、検知済パラメータを更新（Ｓｐ＝Ｐｓ、Ｓｓ＝ｄＭｓ、Ｑｐｐ＝ｘｍｉｎ）する。
いずれのｘに対しても圧縮サイズｄＭｓｓ［ｘｍｉｎ］＞＝ｄＭｓである場合は圧縮効果無しと判断し、検出済幅Ｑｐｐ＜＞０ならば前回検出のブロックを圧縮対象とし（Ｓｐ、Ｓｓ、Ｑｐｐを圧縮ルーチンに通知）、検知済パラメータを初期化（Ｑｐｐ＝０）する。そして、読み込みポインタＰｓを更新（Ｐｓ＝Ｐｓ＋ｄＭｓ）し、全領域終了までＳ８０２以降を繰り返す。（Ｓ８０１〜Ｓ８１３）。
【００４７】
上記のアルゴリズムによれば、連続する小ブロックで検出した要素サイズｘｍｉｎが等しい場合、これら連続するブロックを連結して１つのブロックとして扱えるようにしている（図１８参照）。これにより全体のブロック分割数を減少させることができ、ブロック記述ヘッダ部の数を減らすことで圧縮効率を向上させ、かつ解凍処理時にヘッダ部処理回数を減らすことで解凍処理を高速化できる。
【００４８】
（付記１）  所定の条件コードを含む命令語セットで記述されるプログラムコードのプログラム圧縮方法であって、
プログラムコードを所定のサイズのブロックに分割するプログラム分割手順と、
前記ブロックに含まれる前記条件コードの出現率を求める出現率算出手順と、
前記出現率が予め設定した閾値を超えるときは前記ブロックを命令ブロックとして命令コード圧縮に適したアルゴリズムで圧縮し、前記出現率が前記閾値を超えないときはデータブロックとしてデータ圧縮に適したアルゴリズムで圧縮する選択圧縮手順と
を有することを特徴とするプログラム圧縮方法。
【００４９】
（付記２）    プログラムコード中における配列構造を成すデータ領域を圧縮するプログラム圧縮方法であって、
前記データ領域に配置しているデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置変換する配置変換手順と、
前記配置変換されたデータに対して、個々のデータを該データの１つ前のデータとの差分を求め、該差分のデータに置き換える差分データ置換手順と、
該差分のデータに置き換えたデータに対してランレングス圧縮を行うランレングス圧縮手順と
を有することを特徴とするプログラム圧縮方法。
【００５０】
（付記３）    プログラムコード中におけるランレングス圧縮された配列構造をなすデータ領域のプログラム解凍方法であって、
圧縮された前記データ領域のデータに対してランレングス解凍を行うランレングス解凍手順と、
前記ランレングス解凍されたデータに対して、個々のデータを該データの１つ前のデータを加えたデータに置き換える差分データ復元手順と、
前記差分データ復元手順により置き換えられたデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置し直す配置復元手順と
を有することを特徴とするプログラム解凍方法。
【００５１】
（付記４）    所定の条件コードを含む命令語セットで記述されるプログラムコードの圧縮プログラムであって、
プログラムコードを所定のサイズのブロックに分割するプログラム分割手順と、
前記ブロックに含まれる前記条件コードの出現率を求める出現率算出手順と、
前記出現率が予め設定した閾値を超えるときは前記ブロックを命令ブロックとして命令コード圧縮に適したアルゴリズムで圧縮し、前記出現率が前記閾値を超えないときはデータブロックとしてデータ圧縮に適したアルゴリズムで圧縮する選択圧縮手順と
をコンピュータに実行させるための圧縮プログラム。
【００５２】
（付記５）    プログラムコード中における配列構造を成すデータ領域を圧縮する圧縮プログラムであって、
前記データ領域に配置しているデータを、前記配列構造の配列要素バイト数単位に１バイトづつを取り出して配置変換する配置変換手順と、
前記配置変換されたデータに対して、個々のデータを該データの１つ前のデータとの差分を求め、該差分のデータに置き換える差分データ置換手順と、
該差分のデータに置き換えたデータに対してランレングス圧縮を行うランレングス圧縮手順と
をコンピュータに実行させるための圧縮プログラム。
【００５３】
（付記６）  付記２のプログラム圧縮方法であって、
圧縮対象のプログラムを所定サイズのブロックに分割し、該ブロックに対して複数個指定された前記配列要素バイト数毎にランレングス圧縮を行い、最も高い圧縮率を示した該配列要素バイト数の圧縮を採用する
ことを特徴とするプログラム圧縮方法。
【００５４】
【発明の効果】
本発明によれば、携帯情報端末等のプログラムを高い圧縮率で圧縮でき、メモリコストを下げることができる。また、本解凍アルゴリズムは低いＣＰＵ負荷で解凍で高速解凍が可能であり、バッテリィ寿命を損なうものではない。
【図面の簡単な説明】
【図１】第１の発明の原理図である。
【図２】第２の発明の原理図である。
【図３】第３の発明の原理図である。
【図４】配列構造のデータ配置例である。
【図５】実施形態その１の圧縮の処理フロー例である。
【図６】「Ａｌｗａｙｓ」条件コードの含有率分布例である。
【図７】実施形態その２の圧縮の処理フロー例である。
【図８】データ配列の配置変換説明図である。
【図９】ランレングス圧縮の処理フロー例である。
【図１０】実施形態その２  における具体的データ例（その１）である。
【図１１】実施形態その２  における具体的データ例（その２）である
【図１２】実施形態その３の圧縮の処理フロー例である。
【図１３】実施形態その４の解凍の処理フロー例である。
【図１４】実施形態その４の通常型ランレングス解凍の処理フロー例である。
【図１５】実施形態その５の差分型ランレングス解凍の処理フロー例（その１）である。
【図１６】実施形態その５の差分型ランレングス解凍の処理フロー例（その２）である。
【図１７】実施形態その６の圧縮対象領域検出処理付き圧縮フロー例である。
【図１８】実施形態その６における配列要素サイズが等しい小ブロックを一体化した例である。
【符号の説明】
１：プログラム分割手順
２：出現率算出手順
３：選択圧縮手順
４：配置変換手順
５：差分データ置換手順
６：ランレングス圧縮手順
７：ランレングス解凍手順
８：差分データ復元手順
９：配置復元手順
【図１】
2005025637.tif 000004
【図２】
2005025637.tif 000005
【図３】
2005025637.tif 000006
【図４】
2005025637.tif 000007
【図５】
2005025637.tif 000008
【図６】
2005025637.tif 000009
【図７】
2005025637.tif 000010
【図８】
2005025637.tif 000011
【図９】
2005025637.tif 000012
【図１０】
2005025637.tif 000013
【図１１】
2005025637.tif 000014
【図１２】
2005025637.tif 000015
【図１３】
2005025637.tif 000016
【図１４】
2005025637.tif 000017
【図１５】
2005025637.tif 000018
【図１６】
2005025637.tif 000019
【図１７】
2005025637.tif 000020
【図１８】
2005025637.tif 000021