(57)【要約】【課題】圧縮率を向上させる。【解決手段】実行プログラム４２−１乃至４２−４は、プログラムコードの先頭の方と末尾の方で異なるデータが配置されている。ＣＰＵが直接実行可能な並び順を形式１とし、形式１の並び順を逆順に並び替えたものを形式２とする。圧縮装置は、連結する複数の実行プログラム４２−１乃至４２−４を、１つおきに、形式２に並べ替えて連結し、プログラムデータ群２７１を作成する。このように、形式１と形式２の並び順を交互にくり返すことにより、実行プログラム同士の境界部に、類似するデータが配置されることになる。よって、移動窓をスライドして圧縮する圧縮アルゴリズムを採用した場合、実行プログラム同士の境界における圧縮率の低下を軽減することができる。本発明は、電子機器に適用できる。【選択図】      図７
2004328097.tif 000002
【特許請求の範囲】
【請求項１】
連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替え手段と、
前記並べ替え手段により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮手段と
を備えることを特徴とする情報処理装置。
【請求項２】
前記データのビット数を前記ビット長で割り算した余りを、前記ビット長から差し引いた値に等しい長さの別データを前記データに付加する付加手段をさらに備える
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記圧縮手段により圧縮された複数の前記データ、前記データ毎のデータサイズ、および前記ビット長を記録媒体に記録する記録手段をさらに備える
ことを特徴とする請求項１に記載の情報処理装置。
【請求項４】
前記記録手段は、奇数番目に連結された前記データと偶数番目に連結された前記データのうち、いずれの前記データが逆順に並べ替えられたのかを示す配列データをさらに前記記録媒体に記録する
ことを特徴とする請求項３に記載の情報処理装置。
【請求項５】
前記並べ替え手段は、複数の異なる前記ビット長単位により、前記データを並べ替え、
前記圧縮手段は、複数の異なる前記ビット長単位により逆順に並べ替えられた前記データを、前記ビット長単位毎に連結して圧縮し、
前記記録手段は、前記圧縮手段により前記ビット長単位毎に連結して圧縮された前記データのうち、最も圧縮率の高い前記データを前記記録媒体に記録する
ことを特徴とする請求項３に記載の情報処理装置。
【請求項６】
連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、
前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップと
を含むことを特徴とする情報処理方法。
【請求項７】
連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、
前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップと
を含むことを特徴とするコンピュータが読み取り可能なプログラムが記録されている記録媒体。
【請求項８】
連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、
前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップと
をコンピュータに実行させることを特徴とするプログラム。
【請求項９】
連結して圧縮された複数のデータを伸長する伸長手段と、
前記伸長手段により伸長された複数の前記データを１つおきに所定のビット長単位で逆順に並べ替える並べ替え手段と
を備えることを特徴とする情報処理装置。
【請求項１０】
前記並べ替え手段により１つおきに逆順に並べ替えられた複数の前記データのうち、指定された前記データに基づく処理を実行する実行手段をさらに備える
ことを特徴とする請求項９に記載の情報処理装置。
【請求項１１】
連結して圧縮された複数のデータを伸長する伸長ステップと、
前記伸長ステップの処理により伸長された複数の前記データを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと
を含むことを特徴とする情報処理方法。
【請求項１２】
連結して圧縮された複数のデータを伸長する伸長ステップと、
前記伸長ステップの処理により伸長された複数の前記データを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと
を含むことを特徴とするコンピュータが読み取り可能なプログラムが記録されている記録媒体。
【請求項１３】
連結して圧縮された複数のデータを伸長する伸長ステップと、
前記伸長ステップの処理により伸長された複数の前記データを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと
をコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、情報処理装置および方法、記録媒体、並びにプログラムに関し、特に、データの圧縮率を向上させることができるようにした情報処理装置および方法、記録媒体、並びにプログラムに関する。
【０００２】
【従来の技術】
以前はＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）で実現していた処理を、主にＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）に実行させるソフトウエアソリューション指向のアーキテクチャを採用し、ソフトウエアを入れ替えることで異なるアプリケーションに柔軟に対応できるＬＳＩ（Ｌａｒｇｅ  Ｓｃａｌｅ  Ｉｎｔｅｇｒａｔｉｏｎ）が、近年、増えてきている。また、近年、複数のＣＰＵを混載し、各ＣＰＵに機能を割り当てて分散処理することで、処理能力を高くしたＬＳＩも増えてきている。
【０００３】
このため、そのようなＬＳＩを採用した製品には同じアーキテクチャのインストラクションセットで構成された複数の実行プログラムを用意しておくことが必要である。従って、複数の実行プログラムを保持しておけるように、大容量の不揮発性メモリ（ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ−ｏｎｌｙ  Ｍｅｍｏｒｙ）やフラッシュメモリなど）が必要とされる場合が増えてきている。大容量の不揮発性メモリを必要とすることは、製品コストを高くする要因となる。
【０００４】
そこで、プログラムを圧縮して、不揮発性メモリに保存しておき、プログラムの実行時には、圧縮されたプログラムを伸張して使用することにより、不揮発性メモリに記憶させるべきプログラムのデータ量を削減し、不揮発性メモリの容量を小さくすることが知られている。これにより、コスト削減が期待できる。
【０００５】
従来、複数の実行プログラムを圧縮して不揮発性メモリに格納する場合には、プログラム毎に個別に圧縮したデータを連結して格納するか、複数のプログラムをそのまま連結して１つのデータとしてまとめて圧縮し、格納するかのどちらかであった。複数のプログラムを個別に圧縮する場合、辞書や統計的情報を個別に構築し直す必要があり、プログラムの最初の部分の局所的な圧縮率はあまりよくない。
【０００６】
同じインストラクションセットに基づくプログラムコード同士は、統計的な性質が比較的類似している。また同じハードウエア資源を使用したプログラムコードである場合、統計的な性質がさらに類似している可能性も高いと予想される。そのため、このような複数の類似したプログラムの１つのプログラムを圧縮する場合、他のプログラムを初期辞書として使用し、辞書式圧縮技法（Ｌｅｍｐｅｌ  Ｚｉｖ符号など）で圧縮することや、他のプログラムの統計的情報を初期値として、統計的圧縮技法（ＭＤＬ（Ｍｉｎｉｍｕｍ  Ｄｅｓｃｒｉｐｔｉｏｎ  Ｌｅｎｇｔｈ）符号、ＰＰＭ（Ｐｒｅｄｉｃｔｉｏｎ  ｂｙ  Ｐａｒｔｉａｌ  Ｍａｔｃｈｉｎｇ）符号、ＣＴＷ（Ｃｏｎｔｅｘｔ  Ｗｅｉｇｈｔｉｎｇ  Ｍｅｔｈｏｄ）符号など）で圧縮することにより、圧縮率の向上を期待することができる（例えば、非特許文献１参照）。
【０００７】
実際のデータは、単純な確率モデルではないので、データの全域にわたって同じ統計的性質を仮定するより、徐々に統計的性質が変化していくことを仮定した方が、圧縮率を高くすることがある。例えば、移動窓を仮定して、符号化しようとするデータの直前の一部分だけのデータから辞書や統計情報を構築し、これを利用して圧縮を行う方法などである。Ｌｅｍｐｅｌ  Ｚｉｖ符号のＬＺ７７（Ｌｅｍｐｅｌ  Ｚｉｖ  ７７）符号はその例である。移動窓を用いる場合には、圧縮しようとするデータとその直前のデータはなるべく類似しているほうが圧縮率がよい。
【０００８】
【非特許文献１】
山本博資  著「ユニバーサルデータ圧縮アルゴリズムの変遷―基礎から最新手法まで―」２００１年情報論的学習理論ワークショップ（２００１年７月３０日―８月１日開催）、日本、ｐ．３３９−３４８
【０００９】
【発明が解決しようとする課題】
しかし、プログラムコードでは、一般的に先頭の方にＣＰＵのインストラクションコードが配置され、変数の初期値や定数値、文字列などのデータが末尾のほうに配置された構造が良く用いられるため、プログラムの境界では局所的に圧縮率が低下するという課題があった。
【００１０】
すなわち、プログラムの先頭の方と末尾の方のコードでは、統計的な性質（確率モデルや確率モデルを仮定したときの頻度分布などであり、辞書に対してもこれらを想定することできる）が、かなり異なっている場合が多い。そのため、上記のように移動窓を仮定して、符号化する場合、プログラムの境界では、圧縮しようとするプログラムのデータと、その直前のプログラムのデータの統計的性質が類似していないため、この部分の圧縮率が低下する。
【００１１】
具体的には、データ部は連続する８ビットのすべてが０のような特定のビットパターンの頻度が高く、連続しているものも多いことなどがその例である。インストラクションコードの場合には、例えば３２ビットのＲＩＳＣでは４バイト単位で構成されており、４バイトを１ワードとして考えると、１ワードの特定の位置のビットが命令の機能やレジスタの番号を示しているので、特定のビットフィールドに注目すると頻度の高いビットパターンが存在する。
【００１２】
従って、インストラクションコードの部分の統計的な性質は、明らかに、変数の初期値や定数値、文字列などとは異なっていると推測できる。そのため、プログラムコードをそのまま連結し、１つのデータとしてまとめて圧縮すると、プログラムの境界では、局所的に圧縮率が低下する。特に移動窓の大きさに対してプログラムの大きさが十分に大きくない場合には、全体に占める影響も大きくなり圧縮率に大きな影響がある。
【００１３】
本発明はこのような状況に鑑みてなされたものであり、データの圧縮率をより向上させることができるようにするものである。
【００１４】
【課題を解決するための手段】
本発明の第１の情報処理装置は、連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替え手段と、並べ替え手段により、１つおきに逆順に並べ替えられた複数のデータを連結して圧縮する圧縮手段とを備えることを特徴とする。
【００１５】
前記データのビット数を前記ビット長で割り算した余りを、前記ビット長から差し引いた値に等しい長さの別データを前記データに付加する付加手段をさらに設けるようにしても良い。
【００１６】
前記圧縮手段により圧縮された複数の前記データ、前記データ毎のデータサイズ、および前記ビット長を記録媒体に記録する記録手段をさらに設けるようにしても良い。
【００１７】
前記記録手段には、奇数番目に連結された前記データと偶数番目に連結された前記データのうち、いずれの前記データが逆順に並べ替えられたのかを示す配列データをさらに前記記録媒体に記録するようにさせることができる。
【００１８】
前記並べ替え手段には、複数の異なる前記ビット長単位により、前記データを並べ替えるようにさせ、前記圧縮手段には、複数の異なる前記ビット長単位により逆順に並べ替えられた前記データを、前記ビット長単位毎に連結して圧縮するようにさせ、前記記録手段には、前記圧縮手段により前記ビット長単位毎に連結して圧縮された前記データのうち、最も圧縮率の高い前記データを前記記録媒体に記録するようにさせることができる。
【００１９】
本発明の第１の情報処理方法は、連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数のデータを連結して圧縮する圧縮ステップとを含むことを特徴とする。
【００２０】
本発明の第１の記録媒体のプログラムは、連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数のデータを連結して圧縮する圧縮ステップとを含むことを特徴とする。
【００２１】
本発明の第１のプログラムは、連結する複数のデータを、１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップと、並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数のデータを連結して圧縮する圧縮ステップとをコンピュータに実行させることを特徴とする。
【００２２】
本発明の第２の情報処理装置は、連結して圧縮された複数のデータを伸長する伸長手段と、伸長手段により伸長された複数のデータを１つおきに所定のビット長単位で逆順に並べ替える並べ替え手段とを備えることを特徴とする。
【００２３】
前記並べ替え手段により１つおきに逆順に並べ替えられた複数の前記データのうち、指定された前記データに基づく処理を実行する実行手段をさらに設けるようにすることができる。
【００２４】
本発明の第２の情報処理方法は、連結して圧縮された複数のデータを伸長する伸長ステップと、伸長ステップの処理により伸長された複数のデータを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップとを含むことを特徴とする。
【００２５】
本発明の第２の記録媒体のプログラムは、連結して圧縮された複数のデータを伸長する伸長ステップと、伸長ステップの処理により伸長された複数のデータを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップとを含むことを特徴とする。
【００２６】
本発明の第２のプログラムは、連結して圧縮された複数のデータを伸長する伸長ステップと、伸長ステップの処理により伸長された複数のデータを１つおきに所定のビット長単位で逆順に並べ替える並べ替えステップとをコンピュータに実行させることを特徴とする。
【００２７】
本発明の第１の情報処理装置および方法、記録媒体、並びにプログラムにおいては、連結する複数のデータが、１つおきに所定のビット長単位で逆順に並べ替えられ、１つおきに逆順に並べ替えられた複数のデータが連結され、圧縮される。
【００２８】
本発明の第２の情報処理装置および方法、記録媒体、並びにプログラムにおいては、連結して圧縮された複数のデータが伸長され、伸長された複数のデータが、１つおきに所定のビット長単位で逆順に並べ替えられる。
【００２９】
本発明は、例えば電子機器に適用することができる。
【００３０】
【発明の実施の形態】
以下に本発明の実施の形態を説明するが、請求項に記載の構成要件と、発明の実施の形態における具体例との対応関係を例示すると、次のようになる。この記載は、請求項に記載されている発明をサポートする具体例が、発明の実施の形態に記載されていることを確認するためのものである。従って、発明の実施の形態中には記載されているが、構成要件に対応するものとして、ここには記載されていない具体例があったとしても、そのことは、その具体例が、その構成要件に対応するものではないことを意味するものではない。逆に、具体例が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その具体例が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【００３１】
さらに、この記載は、発明の実施の形態に記載されている具体例に対応する発明が、請求項に全て記載されていることを意味するものではない。換言すれば、この記載は、発明の実施の形態に記載されている具体例に対応する発明であって、この出願の請求項には記載されていない発明の存在、すなわち、将来、分割出願されたり、補正により追加される発明の存在を否定するものではない。
【００３２】
請求項１に記載の情報処理装置（例えば、図１の圧縮装置１）は、連結する複数のデータ（例えば、図１の実行プログラム４２−１乃至４２−４）を、１つおきに所定のビット長単位で逆順に並べ替える並べ替え手段（例えば、図３のステップＳ２乃至ステップＳ８の処理を実行する図１の配列処理プログラム４３Ｃ）と、前記並べ替え手段により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮手段（例えば、図３のステップＳ９の処理を実行する図１の圧縮処理プログラム４３Ａ）とを備えることを特徴とする。
【００３３】
請求項２に記載の情報処理装置は、前記データのビット数を前記ビット長（例えば、図５のビット長Ｘ）で割り算した余りを、前記ビット長から差し引いた値に等しい長さの別データを前記データに付加する付加手段（例えば、図３のステップＳ１の処理を実行する図１のデータ付加プログラム４３Ｂ）をさらに備えることを特徴とする。
【００３４】
請求項３に記載の情報処理装置は、前記圧縮手段により圧縮された複数の前記データ、前記データ毎のデータサイズ（例えば、図９のサイズデータ２７２）、および前記ビット長（例えば、図９のビット長データ３６１）を記録媒体（例えば、図１の不揮発性メモリ２１）に記録する記録手段（例えば、図１の不揮発性メモリ書き込み装置１４）をさらに備えることを特徴とする。
【００３５】
請求項４に記載の情報処理装置において、前記記録手段は、奇数番目に連結された前記データと偶数番目に連結された前記データのうち、いずれの前記データが逆順に並べ替えられたのかを示す配列データ（例えば、図１７のステップＳ２１２の処理により生成された配列データ）をさらに前記記録媒体に記録する（例えば、ステップＳ２１４の処理）ことを特徴とする。
【００３６】
請求項５に記載の情報処理装置において、前記並べ替え手段は、複数の異なる前記ビット長単位により、前記データを並べ替え（例えば、図２１のステップＳ３０４乃至ステップＳ３１０の処理）、前記圧縮手段は、複数の異なる前記ビット長単位により逆順に並べ替えられた前記データを、前記ビット長単位毎に連結して圧縮し（例えば、図２１のステップＳ３１１の処理）、前記記録手段は、前記圧縮手段により前記ビット長単位毎に連結して圧縮された前記データのうち、最も圧縮率の高い前記データを前記記録媒体に記録する（例えば、図２１のステップＳ３１３およびステップＳ３１４の処理）ことを特徴とする。
【００３７】
請求項６に記載の情報処理方法は、連結する複数のデータ（例えば、図１の実行プログラム４２−１乃至４２−４）を、１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図３のステップＳ２乃至ステップＳ８）と、前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップ（例えば、図３のステップＳ９）とを含むことを特徴とする。
【００３８】
請求項７に記載の記録媒体のプログラムは、連結する複数のデータ（例えば、図１の実行プログラム４２−１乃至４２−４）を、１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図３のステップＳ２乃至ステップＳ８）と、前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップ（例えば、図３のステップＳ９）とを含むことを特徴とする。
【００３９】
請求項８に記載のプログラムは、連結する複数のデータ（例えば、図１の実行プログラム４２−１乃至４２−４）を、１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図３のステップＳ２乃至ステップＳ８）と、前記並べ替えステップの処理により、１つおきに逆順に並べ替えられた複数の前記データを連結して圧縮する圧縮ステップ（例えば、図３のステップＳ９）とをコンピュータに実行させることを特徴とする。
【００４０】
請求項９に記載の情報処理装置（例えば、図２の撮像装置２０１）は、連結して圧縮された複数のデータ（例えば、図９の圧縮済みプログラムデータ３５１）を伸長する伸長手段（例えば、図１１の伸長プログラム４４Ａを実行することにより、図１０のステップＳ１０２の処理を実行する図２のＣＰＵ２４４−１）と、前記伸長手段により伸長された複数の前記データ（例えば、図７のプログラムデータ群２７１に含まれる実行プログラム４２−１乃至４２−４）を１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替え手段（例えば、図１１の配列処理プログラム４４Ｃを実行することにより、図１０のステップＳ１０５乃至ステップＳ１０９の処理を実行する図２のＣＰＵ２４４−１）とを備えることを特徴とする。
【００４１】
請求項１０に記載の情報処理装置は、前記並べ替え手段により１つおきに逆順に並べ替えられた複数の前記データのうち、指定された前記データに基づく処理を実行する実行手段（例えば、図１２のステップＳ１５３の処理を実行する図２のＣＰＵ２４４−３）をさらに備えることを特徴とする。
【００４２】
請求項１１に記載の情報処理方法は、連結して圧縮された複数のデータ（例えば、図９の圧縮済みプログラムデータ３５１）を伸長する伸長ステップ（例えば、図１０のステップＳ１０２）と、前記伸長ステップの処理により伸長された複数の前記データ（例えば、図７のプログラムデータ群２７１に含まれる実行プログラム４２−１乃至４２−４）を１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図１０のステップＳ１０５乃至ステップＳ１０９）とを含むことを特徴とする。
【００４３】
請求項１２に記載の記録媒体のプログラムは、連結して圧縮された複数のデータ（例えば、図９の圧縮済みプログラムデータ３５１）を伸長する伸長ステップ（例えば、図１０のステップＳ１０２）と、前記伸長ステップの処理により伸長された複数の前記データ（例えば、図７のプログラムデータ群２７１に含まれる実行プログラム４２−１乃至４２−４）を１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図１０のステップＳ１０５乃至ステップＳ１０９）とを含むことを特徴とする。
【００４４】
請求項１３に記載のプログラムは、連結して圧縮された複数のデータ（例えば、図９の圧縮済みプログラムデータ３５１）を伸長する伸長ステップ（例えば、図１０のステップＳ１０２）と、前記伸長ステップの処理により伸長された複数の前記データ（例えば、図７のプログラムデータ群２７１に含まれる実行プログラム４２−１乃至４２−４）を１つおきに所定のビット長（例えば、図５のビット長Ｘ）単位で逆順に並べ替える並べ替えステップ（例えば、図１０のステップＳ１０５乃至ステップＳ１０９）とをコンピュータに実行させることを特徴とする。
【００４５】
図１は、本発明を適用した圧縮装置１の構成例を表している。圧縮装置１は、複数個のプログラムを連結して１つのデータとしてまとめて圧縮し、不揮発性メモリ２１に格納する装置である。なお、圧縮装置１は、例えば、汎用のパーソナルコンピュータ、ワークステーション、または、その他の情報処理装置とすることができる。
【００４６】
図１において、ＣＰＵ１１は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１２に記憶されているプログラム、またはストレージデバイス１８からＲＡＭ１３にロードされたプログラムに従って、各種の処理を実行する。ＲＡＭ１３にはまた、ＣＰＵ１１が各種の処理を実行する上において必要なデータなども適宜記憶される。
【００４７】
ＣＰＵ１１、ＲＯＭ１２、およびＲＡＭ１３は、バス１７を介して、相互に接続されている。このバス１７にはまた、不揮発性メモリ書き込み装置１４、入力部１５、出力部１６、ストレージデバイス１８、通信部１９、およびドライブ２０も接続されている。
【００４８】
不揮発性メモリ書き込み装置１４は、ＣＰＵ１１の指示に従って、ストレージデバイス１８に記憶された圧縮コードデータ４１を読み出し、不揮発性メモリ２１に書き込む。不揮発性メモリ２１は、圧縮コードデータ４１が書き込まれた状態で、例えばカメラ一体型ビデオテープレーコーダ（ＶＴＲ）などの電子機器に内蔵される。
【００４９】
入力部１５は、例えばキーボード、マウスなどにより構成され、操作の入力を受け付ける。出力部１６は、ＣＲＴ（ＣａｔｈｏｄｅＲａｙ  Ｔｕｂｅ）、ＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）などよりなるディスプレイ、並びにスピーカなどにより構成される。
【００５０】
ストレージデバイス１８は、例えばハードディスクドライブ等により構成され、種々のデータやプログラムを記憶する。ストレージデバイス１８は、例えば、圧縮コードデータ４１、実行プログラム４２−１乃至４２−４、記録プログラム４３、並びにブートプログラム４４を記憶する。
【００５１】
圧縮コードデータ４１は、不揮発性メモリ２１に格納するために生成されたデータであり、圧縮された実行プログラムを含んでいる。圧縮コードデータ４１は、後述するデータ記録処理により生成される。
【００５２】
実行プログラム４２−１乃至４２−４は、不揮発性メモリ２１に格納するために用意されたプログラムである。実行プログラム４２−１乃至４２−４は、例えば、圧縮装置１を操作するオペレータからの指示により、通信部１９を介して、外部の装置から取得されたり、ドライブ２０に装着された磁気ディスク３１、光ディスク３２、光磁気ディスク３３、または半導体メモリ３４から読み出すことにより、取得されたものである。また、実行プログラム４２−１乃至４２−４は、例えば、入力部１５を介して、オペレータにより入力されたものであっても良い。勿論、実行プログラム４２−１乃至４２−４は、上記以外の方法で、取得しても良い。
【００５３】
なお、本実施の形態においては、実行プログラム４２−１乃至４２−４の４つの実行プログラムが用意されているが、用意する実行プログラムの個数は、４個に限定されるものではない。また、以下の説明において、実行プログラム４２−１乃至４２−４のそれぞれを個々に区別する必要がない場合、まとめて実行プログラム４２と称する。以下、他の構成も同様とする。
【００５４】
記録プログラム４３は、実行プログラム４２−１乃至４２−４を圧縮して圧縮コードデータ４１を生成し、圧縮コードデータ４１を不揮発性メモリ２１に記録する処理を実行するプログラムであり、適宜ＲＡＭ１３にロードされ、ＣＰＵ１１により実行される。記録プログラム４３は、圧縮処理プログラム４３Ａ、データ付加処理プログラム４３Ｂ、および配列処理プログラム４３Ｃを含んでいる。圧縮処理プログラム４３Ａは、実行プログラム４２−１乃至４２−４を圧縮するプログラムであり、本実施の形態においては、ＬＺ７７符号により実行プログラム４２−１乃至４２−４を圧縮する。なお、本実施の形態においては、ＬＺ７７符号を利用した場合を例にして説明するが、本発明は、移動窓を設定してデータを符号化するＬＺ７７以外の方式にも適用可能である。
【００５５】
データ付加処理プログラム４３Ｂは、圧縮処理プログラム４３Ａにより実行プログラム４２−１乃至４２−４が圧縮される前に、実行プログラム４２−１乃至４２−４に、所定のデータを付加するデータ付加処理を実行する。データ付加処理の詳細な説明は後述する。
【００５６】
配列処理プログラム４３Ｃは、実行プログラム４２−１乃至４２−４を連結する際に、各実行プログラムを所定の配列に並べる処理を実行する。
【００５７】
ブートプログラム４４は、不揮発性メモリ２１に記録するために用意されたプログラムである。
【００５８】
通信部１９は、例えばモデム、ターミナルアダプタなどより構成され、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）やインターネット等を含むネットワークを介しての通信処理を行う。
【００５９】
ドライブ２０は、必要に応じて、図示せぬ入出力インタフェースを介して、バス１７に接続され、磁気ディスク３１（フレキシブルディスクを含む）、光ディスク３２（ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ），ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）を含む）、光磁気ディスク３３（ＭＤ（Ｍｉｎｉ−Ｄｉｓｋ）を含む）、または半導体メモリ３４が装着され、それらから読み出されたコンピュータプログラムやデータが、必要に応じて、ストレージデバイス１８に記憶される。
【００６０】
次に、図２は、本発明を適用した撮像装置２０１の構成例を表している。撮像装置２０１は、例えば、カメラ一体型ビデオテープレコーダ、またはデジタルスチルカメラとすることができる。撮像装置２０１は不揮発性メモリ２１を内蔵しており、この不揮発性メモリ２１には、圧縮装置１により圧縮された複数のプログラムが格納されている。撮像装置２０１は、不揮発性メモリ２１に格納されたプログラムを適宜実行する。
【００６１】
なお、本実施の形態においては、本発明を撮像装置２０１に適用した場合を例として説明するが、このことは、本発明が撮像装置にしか適用できないことを意味するものではない。本発明は、その他、あらゆる電子機器に適用することができる。
【００６２】
図２において、ＬＳＩ２１１は、バス２４１に接続された複数のＣＰＵ２４４−１乃至２４４−３、並びにインタフェース（Ｉ／Ｆ）２４２，２４３，２４５を含んでいる。
【００６３】
バス２４１には、ホストＣＰＵ２１３が接続されており、ＣＰＵ２４４−１乃至２４４−３は、ホストＣＰＵ２１３からの指示に従って、各種の処理を実行する。
【００６４】
ホストＣＰＵ２１３は、操作部２１２からの操作信号に従って、ＣＰＵ２４４−１乃至２４４−３を含む、撮像装置２０１の全体の動作を制御する。操作部２１２は、種々のボタンやダイヤル等により構成され、ユーザからの操作の入力を受け付け、入力された操作に基づく操作信号を発生し、ホストＣＰＵ２１３に通知する。
【００６５】
バス２４１には、インタフェース２４２を介して、不揮発性メモリ２１が接続されている。図１の圧縮装置１により、不揮発性メモリ２１には、圧縮コードデータ４１およびブートプログラム４４が格納されている。撮像装置２０１が起動された場合、ＣＰＵ２４４−１により、不揮発性メモリ２１からブートプログラム４４および圧縮コードデータ４１が読み出される。
【００６６】
バス２４１には、インタフェース２４３を介して、ＳＤＲＡＭ（Ｓｙｎｃｈｒｏｎｏｕｓ  Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２１４が接続されている。ＳＤＲＡＭ２１４は、インタフェース２４３を介して供給されるデータを、所定のメモリアドレスに記憶する。ＳＤＲＡＭ２１４に記憶されたデータは、インタフェース２４３を介して、適宜読み出されたり、書き込まれる。ＳＤＲＡＭ２１４は、例えば、伸長された実行プログラム４２のコード等を記憶する。
【００６７】
ＣＰＵ２４４−１は、ホストＣＰＵ２１３からの指示に従って、不揮発性メモリ２１からブートプログラム４４を読み出し、実行する。ブートプログラム４４には、圧縮された実行プログラム４２−１乃至４２−４を伸長する伸長プログラムが含まれている。そこで、ＣＰＵ２４４−１は、ブートプログラム４４を実行した場合、圧縮コードデータ４１を読み出し、圧縮コードデータ４１に含まれている圧縮された実行プログラム４２−１乃至４２−４を伸長する。ＣＰＵ２４４−１は、伸長した実行プログラム４２−１乃至４２−４や、それに付随する情報データ等をＳＤＲＡＭ２１４に記憶させる。また、ＣＰＵ２４４−１は、ホストＣＰＵ２１３からの指示に従って、ＳＤＲＡＭ２１４に記憶された複数の実行プログラム４２−１乃至４２−４の中から、所定の実行プログラムを選択し、選択した実行プログラムを実行する。
【００６８】
ＣＰＵ２４４−２および２４４−３は、ホストＣＰＵ２１３からの指示に従って、ＳＤＲＡＭ２１４に記憶された複数の実行プログラム４２−１乃至４２−４の中から、所定の実行プログラムを選択し、選択した実行プログラムを実行する。なお、本実施の形態においては、例としてＣＰＵ２４４−２は、画像のエンコードおよびデコードに関する実行プログラムを実行し、ＣＰＵ２４４−３は、音声のエンコードおよびデコードに関する実行プログラムを実行するものとする。
【００６９】
バス２４１には、インタフェース２４５を介して、音声出力部２１５、音声入力部２１６、表示部２１７、撮像部２１８、および記録再生部２１９も接続されている。
【００７０】
音声出力部２１５は、スピーカを含み、インタフェース２４５を介してＣＰＵ２４４−３から供給された音声信号に基づく音声を出力する。音声入力部２１６は、マイクロフォンを含み、撮像装置２０１の周囲の音声を集音し、集音された音声に基づく音声信号をインタフェース２４５を介して、ＣＰＵ２４４−３に供給する。
【００７１】
表示部２１７は、例えばＬＣＤにより構成され、インタフェース２４５を介してＣＰＵ２４４−２から供給された映像信号に基づく映像を表示する。撮像部２１８は、例えば、ＣＣＤ（Ｃｈａｒｇｅｄ  Ｃｏｕｐｌｅｄ  Ｄｅｖｉｃｅ）、またはＣＭＯＳ（Ｃｏｍｐｌｅｍｅｎｔａｒｙ  Ｍｅｔａｌ  Ｏｘｉｄｅ  Ｓｅｍｉｃｏｎｄｕｃｔｏｒ）などの撮像素子を有し、被写体を撮像して生成された映像信号をインタフェース２４５を介してＣＰＵ２４４−２に供給する。
【００７２】
記録再生部２１９は、インタフェース２４５を介して供給されたオーディオビジュアル（ＡＶ）データを、装着された記録媒体（例えばテープメディア）に記録する。また、記録再生部２１９は、記録媒体に記録されたＡＶデータを読み出し、インタフェース２４５を介して、ＣＰＵ２４４−２および２４４−３に出力する。
【００７３】
次に、図３のフローチャートを参照して、圧縮装置１のデータ記録処理、すなわち、圧縮コードデータ４１を生成し、不揮発性メモリ２１に格納するまでの処理について説明する。なお、以下の説明において、記録プログラム４３により実行される処理は、実際には、ＣＰＵ１１が記録プログラム４３をＲＡＭ１３にロードして実行することにより実行される。
【００７４】
ステップＳ１において、データ付加処理プログラム４３Ｂは、データ付加処理を実行し、実行プログラム４２−１乃至４２−４に、所定のデータを付加する。
【００７５】
ここで、データ付加処理について説明する。
【００７６】
圧縮装置１は、後述するステップＳ５およびステップＳ６の処理により、実行プログラム４２を所定のビット長毎に区切り、複数に区切られた実行プログラムを、所定の順番で整列させる。図４は、所定のビット長単位で区切られた実行プログラム４２のプログラムコードの例を表し、図５は、図４のプログラムコードを、所定のビット長Ｘ単位で区切り整列させた例を表している。
【００７７】
図４において、プログラムコードの先頭が左側に位置し、プログラムコードの末尾が右側に位置している。配列処理プログラム４３Ｃは、図４に示されるように、プログラムコードを、先頭から順番に、所定のビット長単位で区切る。図４においては、１乃至ＮのＮ個のコードに区切られている。なお、Ｎは２以上の整数である。また、以下の説明において、プログラムコードを区切る単位である所定のビット長をビット長Ｘと称し、ビット長Ｘ単位で区切られた個々のコードを部分コードと称する。また、以下の説明においては、図４に示されるように、先頭の部分コードを１番目の部分コードとし、以下、順次、１番目の部分コードの次の部分コードを２番目の部分コードと称し、２番目の部分コードの次の部分コードを３番目の部分コードと称してゆき、末尾の部分コードをＮ番目の部分コードと称する。
【００７８】
図５は、図４のように区切られたＮ個の部分コードを先頭のデータから末尾のデータまで整列させたものである。
【００７９】
図５の左側には、ビット長Ｘ毎に区切られた部分コードが、上から順番に整列した実行プログラム４２が示されている。すなわち、左側に示された実行プログラム４２は、１番目の部分コードを先頭のデータとして、１番目の部分コードの次に２番目の部分コードを配置し、２番目の部分コードの次に３番目の部分コードを配置している。以下、順次、４番目以降の部分コードが配置されてゆき、Ｎ番目の部分コードが末尾のデータとして配置されている。
【００８０】
ここで、実行プログラム４２全体のビット数が、ビット長Ｘで割り切れた場合、Ｎ番目の部分コードのビット数は、ビット長Ｘと同一の値になるが、実行プログラム４２全体のビット数が、ビット長Ｘで割り切れず、余りがある場合、Ｎ番目部分コードのビット数が、ビット長Ｘより小さい値になってしまう。
【００８１】
これを簡単な例で説明すると、仮に、実行プログラム４２全体のビット数が２１ビットで、ビット長Ｘが３ビットであったとする。この場合、実行プログラム４２全体のビット数（＝２１ビット）を、ビット長Ｘ（＝３ビット）で割り算すると、
２１÷３＝７…０
となり、割り切れるので、Ｎ（＝７）番目の部分コードも、３ビットとなる。これに対して、仮に、実行プログラム４２全体のビット数が２１ビットで、ビット長Ｘが４ビットであるとした場合、実行プログラム４２全体のビット数（＝２１ビット）を、ビット長Ｘ（＝４ビット）で割り算すると、
２１÷４＝５…１
となり、余り（＝１）が出てしまう。よって、Ｎ番目の部分コードは、１ビットとなり、ビット長Ｘ（＝４ビット）未満の値になってしまう。
【００８２】
このように、Ｎ番目の部分コードが、ビット長Ｘ未満の値になってしまった場合、図５のＮ番目の部分コードのビット数が不足してしまう。
【００８３】
そこで、ステップＳ１において、データ付加処理プログラム４３Ｂは、実行プログラム４２全体のビット数がビット長Ｘで割り切れない場合、不足分のデータ（上記の例の場合、３ビットのデータ）をＮ番目の部分コードに足して、Ｎ番目の部分コードのビット数をビット長Ｘになるようにする。
【００８４】
なお、上記の説明においては、実行プログラム４２のビット数を２１ビットとし、ビット長Ｘを３ビットまたは４ビットとして説明したが、この値は、説明を簡単にするために仮定した値であり、実際の実行プログラム４２のビット数、およびビット長Ｘが、上記の値になることを意味するものではない。
【００８５】
なお、図５の右側に記された実行プログラム４２についての説明は後述する。
【００８６】
次に、図６のフローチャートを参照して、ステップＳ１のデータ付加処理、すなわち不足分のデータをＮ番目の部分コードに付加する処理について詳細に説明する。
【００８７】
ステップＳ３１において、データ付加処理プログラム４３Ｂは、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化する。
【００８８】
ステップＳ３２において、データ付加処理プログラム４３Ｂは、プログラム番号ｉが、プログラム総数以下であるか否かを判定する。ここで、プログラム総数とは、不揮発性メモリ２１に格納すべき実行プログラム４２の個数のことを示している。すなわち、図１の例の場合、不揮発性メモリ２１に格納すべき実行プログラムは、実行プログラム４２−１乃至４２−４の４個なので、プログラム総数は４となる。そこで、ステップＳ３２において、データ付加処理プログラム４３Ｂは、プログラム番号ｉが、このプログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ３３に進む。
【００８９】
ステップＳ３３において、データ付加処理プログラム４３Ｂは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、ＲＡＭ１３のバッファに記憶させる。
【００９０】
ステップＳ３４において、データ付加処理プログラム４３Ｂは、ステップＳ３３でＲＡＭ１３に記憶させた実行プログラム４２全体のビット数（以下、プログラム長とも称する）を取得する。
【００９１】
ステップＳ３５において、データ付加処理プログラム４３Ｂは、ステップＳ３４で取得された、実行プログラム４２のプログラム長を、ビット長Ｘで割り算する。なお、データ付加処理プログラム４３Ｂは、小数点以下の割り算は行わない。よって、商および余りは整数の値となる。
【００９２】
ステップＳ３６において、データ付加処理プログラム４３Ｂは、ステップＳ３５の処理により、プログラム長がビット長Ｘで割り切れたか否かを判定し、プログラム長がビット長Ｘで割り切れなかった場合、処理はステップＳ３７に進む。
【００９３】
ステップＳ３７において、データ付加処理プログラム４３Ｂは、実行プログラム４２に、不足分のデータを付加する。すなわち、ステップＳ３５で、プログラム長をビット長Ｘで割り算することにより、商と余り（余りをＹとする）が算出されるので、データ付加処理プログラム４３Ｂは、ビット長Ｘから余りＹを差し引いた分のビット数（Ｘ−Ｙ）のデータを実行プログラム４２に付加する。その後、処理はステップＳ３８に進む。
【００９４】
ステップＳ３６において、データ付加処理プログラム４３Ｂが、プログラム長がビット長Ｘで割り切れたと判定した場合、ステップＳ３７の処理はスキップされ、処理はステップＳ３８に進む。
【００９５】
ステップＳ３８において、データ付加処理プログラム４３Ｂは、ＲＡＭ１３に記憶された実行プログラム４２をストレージデバイス１８に記憶させる。なお、ステップＳ３７の処理によりデータが付加された場合、データ付加処理プログラム４３Ｂは、付加されたデータも含めて、実行プログラム４２をストレージデバイス１８に記憶させる。
【００９６】
ステップＳ３９において、データ付加処理プログラム４３Ｂは、プログラム番号ｉを１増やす。
【００９７】
その後、処理はステップＳ３２に戻り、上述したステップＳ３２以降の処理がくり返される。
【００９８】
そして、ステップＳ３２において、データ付加処理プログラム４３Ｂが、プログラム番号ｉはプログラム総数以下ではない（プログラム番号ｉはプログラム総数より大きい）と判定した場合、データ付加処理は終了する。
【００９９】
その後、処理は図３のステップＳ２に進む。
【０１００】
ここで、上記のデータ付加処理を、図１の実行プログラム４２−１乃至４２−４に当てはめた場合の例について説明する。なお、図１の実行プログラム４２−１を１番目の実行プログラムとし、実行プログラム４２−２を２番目の実行プログラムとし、実行プログラム４２−３を３番目の実行プログラムとし、実行プログラム４２−４を４番目の実行プログラムとする。
【０１０１】
データ付加処理プログラム４３Ｂは、まず、ステップＳ３１で、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化する。次に、ステップＳ３２において、プログラム番号ｉ＝１が、プログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉは、プログラム総数以下なので、処理はステップＳ３３に進む。
【０１０２】
ステップＳ３３において、データ付加処理プログラム４３Ｂは、１番目の実行プログラム、すなわち実行プログラム４２−１をストレージデバイス１８から読み込み、ＲＡＭ１３のバッファに記憶させる。データ付加処理プログラム４３Ｂは、ステップＳ３４において、実行プログラム４２−１のプログラム長を取得し、ステップＳ３５において、実行プログラム４２−１のプログラム長をビット長Ｘで割り算し、ステップＳ３６において、実行プログラム４２−１のプログラム長がビット長Ｘで割り切れたか否かを判定する。そして、実行プログラム４２−１のプログラム長がビット長Ｘで割り切れなかった場合、処理はステップＳ３７に進み、データ付加処理プログラム４３Ｂは、実行プログラム４２−１に、不足分のデータを付加し、ステップＳ３８において、ステップＳ３７でデータが付加された実行プログラム４２−１をストレージデバイス１８に保存する。また、ステップＳ３６において、データ付加処理プログラム４３Ｂが、実行プログラム４２−１のプログラム長がビット長Ｘで割り切れたと判定した場合、ステップＳ３７はスキップされ、ステップＳ３８において、実行プログラム４２−１が、ストレージデバイス１８に保存される。ステップＳ３８の後、処理はステップＳ３９に進み、データ付加処理プログラム４３Ｂは、ｉを１だけ増やして、ｉ＝２とする。
【０１０３】
その後、処理はステップＳ３２に戻り、データ付加処理プログラム４３Ｂは、プログラム番号ｉ＝２が、プログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ＝２は、プログラム総数（＝４）以下であるので、処理はステップＳ３３に進む。データ付加処理プログラム４３Ｂは、ステップＳ３３において、２番目の実行プログラムである実行プログラム４２−２をストレージデバイス１８から読み込み、ＲＡＭ１３のバッファに記憶させる。その後、データ付加処理プログラム４３Ｂは、２番目の実行プログラム４２−２に対して、ステップＳ３４乃至ステップＳ３８の処理を実行する。なお、２番目の実行プログラム４２−２に対するステップＳ３４乃至ステップＳ３８の処理は、１番目の実行プログラム４２−１に対するステップＳ３４乃至ステップＳ３８の処理と同様であるので、説明を省略する。ステップＳ３８の後、ステップＳ３９において、データ付加処理プログラム４３Ｂは、ｉを１だけ増やして、ｉ＝３とする。
【０１０４】
その後、処理はステップＳ３２に戻り、データ付加処理プログラム４３Ｂは、プログラム番号ｉ＝３が、プログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ＝３は、プログラム総数（＝４）以下であるので、処理はステップＳ３３に進む。データ付加処理プログラム４３Ｂは、ステップＳ３３において、３番目の実行プログラムである実行プログラム４２−３をストレージデバイス１８から読み込み、ＲＡＭ１３のバッファに記憶させる。その後、データ付加処理プログラム４３Ｂは、３番目の実行プログラム４２−３に対して、ステップＳ３４乃至ステップＳ３８の処理を実行する。なお、３番目の実行プログラム４２−３に対するステップＳ３４乃至ステップＳ３８の処理は、１番目の実行プログラム４２−１に対するステップＳ３４乃至ステップＳ３８の処理と同様であるので、説明を省略する。ステップＳ３８の後、ステップＳ３９において、データ付加処理プログラム４３Ｂは、ｉを１だけ増やして、ｉ＝４とする。
【０１０５】
その後、処理はステップＳ３２に戻り、データ付加処理プログラム４３Ｂは、プログラム番号ｉ＝４が、プログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ＝４は、プログラム総数（＝４）以下であるので、処理はステップＳ３３に進む。データ付加処理プログラム４３Ｂは、ステップＳ３３において、４番目の実行プログラムである実行プログラム４２−４をストレージデバイス１８から読み込み、ＲＡＭ１３のバッファに記憶させる。その後、データ付加処理プログラム４３Ｂは、４番目の実行プログラム４２−４に対して、ステップＳ３４乃至ステップＳ３８の処理を実行する。なお、４番目の実行プログラム４２−４に対するステップＳ３４乃至ステップＳ３８の処理は、１番目の実行プログラム４２−１に対するステップＳ３４乃至ステップＳ３８の処理と同様であるので、説明を省略する。ステップＳ３８の後、ステップＳ３９において、データ付加処理プログラム４３Ｂは、ｉを１だけ増やして、ｉ＝５とする。
【０１０６】
その後、処理はステップＳ３２に戻り、データ付加処理プログラム４３Ｂは、プログラム番号ｉ＝５が、プログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ＝５は、プログラム総数（＝４）以下ではない（プログラム番号ｉ＝５は、プログラム総数（＝４）より大きい）ので、データ付加処理プログラム４３Ｂは、一連のデータ付加処理を終了する。その後、処理は図３のステップＳ２に進む。
【０１０７】
以上のようにして、不揮発性メモリ２１に格納すべき全ての実行プログラム４２−１乃至４２−４に対して、必要に応じて、データが付加される。
【０１０８】
説明は図３に戻り、ステップＳ１のデータ付加処理の後、ステップＳ２において、配列処理プログラム４３Ｃは、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化する。
【０１０９】
ステップＳ３において、配列処理プログラム４３Ｃは、プログラム番号ｉが、プログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ４に進む。図１の例の場合、不揮発性メモリ２１に格納すべき実行プログラムは、実行プログラム４２−１乃至４２−４の４個なので、プログラム総数は４となる。
【０１１０】
ステップＳ４において、配列処理プログラム４３Ｃは、プログラム番号ｉが偶数であるか否かを判定し、プログラム番号ｉが偶数ではなかった場合（奇数だった場合）、処理はステップＳ５に進む。
【０１１１】
ステップＳ５において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、読み込まれた実行プログラム４２を、図５の左側に示されるように、そのままの並び順でＲＡＭ１３の一時的なバッファに記憶させる。その後、処理はステップＳ７に進む。なお、以下の説明において、図５の左側に示された、実行プログラム４２の並び方の形式を形式１とする。なお、形式１は、撮像装置２０１のＣＰＵ２４４が直接実行可能な並び順の形式である。また、ビット長Ｘの例としては、１バイトや、撮像装置２０１のＣＰＵ２４４の命令長（３２ビットＲＩＳＣ（Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒ）では４バイト）、ＬＺ７７の移動窓のサイズやその半分などが考えられる。
【０１１２】
ステップＳ４において、配列処理プログラム４３Ｃが、プログラム番号ｉは偶数であると判定した場合、処理はステップＳ６に進む。
【０１１３】
ステップＳ６において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、ＲＡＭ１３上で、ビット長Ｘ毎に、逆順に並び替えた後、並び替えられた実行プログラム４２をＲＡＭ１３のバッファに追加する（記憶させる）。図５の右側には、ステップＳ６において、逆順に並べ替えられた実行プログラム４２の例が示されている。
【０１１４】
図５の右側に示された実行プログラム４２は、１番目乃至Ｎ番目のＮ個の部分コードが、Ｎ番目の部分コードを先頭にし、１番目の部分コードを末尾にして並べられている。すなわち、図５の右側の実行プログラム４２においては、図４に示されたＮ番目の部分コードが、先頭に並べられ、Ｎ−１番目の部分コードが、Ｎ番目の部分コードの次に並べられ、Ｎ−２番目の部分コードが、Ｎ−１番目の部分コードの次に並べられ、Ｎ−３番目の部分コードが、Ｎ−２番目の部分コードの次に並べられている。以下も同様にして並べられてゆき、末尾には、１番目の部分コードが並べられている。なお、図５の右側に示された実行プログラム４２の並び方の形式を形式２とする。なお、形式２は、撮像装置２０１のＣＰＵ２４４が直接実行することができない並び順の形式である。
【０１１５】
形式２の実行プログラム４２を、図５の左側に示された形式１の実行プログラム４２と比較すると、形式１の並び方においては、上方に示された先頭のデータは、１番目の部分コードとされ、１番目の部分コードの次は２番目の部分コードとされ、２番目の部分コードの次は３番目の部分コードとされる。以降、順番に並べられ、末尾のデータは、Ｎ番目の部分コードとされる。それに対して、形式２の並び方においては、先頭のデータは、Ｎ番目の部分コードとされ、Ｎ番目の部分コードの次はＮ−１番目の部分コードとされ、Ｎ−１番目の部分コードの次は、Ｎ−２番目の部分コードとされ、Ｎ−２番目の部分コードの次は、Ｎ−３番目の部分コードとされる。以降、順番に並べられ、末尾のデータは、１番目の部分コードとされる。
【０１１６】
すなわち、形式１の並び方においては、ビット長Ｘ毎に区切られた実行プログラム４２の各部分コードは、実行プログラム４２の記述順（１番目→Ｎ番目）に従って、先頭から末尾タに向けて並べられている。それに対して、形式２の並び方においては、ビット長Ｘ毎に区切られた実行プログラム４２の各部分コードは、実行プログラム４２の記述順とは、逆の順番（Ｎ番目→１番目）に従って、先頭から末尾に向けて並べられている。すなわち、形式２の並び順は、形式１の並び順をビット長Ｘ単位で倒置した並び順となっている。
【０１１７】
実行プログラム４２は、図４のプログラムコードの先頭の方にＣＰＵのインストラクションコードが配置され、末尾の方に変数の初期値や定数値、文字列などのデータが配置されている。すなわち、図４のプログラムコードの１番目の部分コードの方には、ＣＰＵのインストラクションコードが配置され、Ｎ番目の部分コードの方には、変数の初期値や定数値、文字列などのデータが配置されている。
【０１１８】
従って、図５に示された形式１の並び順においては、先頭のデータの方に、ＣＰＵのインストラクションコードが配置され、末尾のデータの方に、変数の初期値や定数値、文字列などが配置される。また、図５に示された形式２の並び順においては、先頭のデータの方に、変数の初期値や定数値、文字列などが配置され、末尾のデータの方に、ＣＰＵのインストラクションコードが配置される。
【０１１９】
なお、図５の左側の実行プログラム４２内に示されている、上から下に向かう矢印は、この実行プログラム４２が形式１であることを示し、図５の右側の実行プログラム４２内に示されている、下から上に向かう矢印は、この実行プログラム４２が形式２であることを示している。後述する図７、図９、および図１６も同様である。
【０１２０】
上記したように、実行プログラム４２は、ステップＳ５においては、形式１の並び順でＲＡＭ１３のバッファに記憶され、ステップＳ６においては、形式２の並び順でＲＡＭ１３のバッファに記憶される。
【０１２１】
図３に戻り、ステップＳ６の処理により、実行プログラム４２が、図４の形式２のように並び替えられた後、処理はステップＳ７に進む。
【０１２２】
ステップＳ７において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２のプログラム長（ビット数）を示すサイズデータを取得し、これをＲＡＭ１３の情報データを記憶する領域に記憶させる。なお、ＲＡＭ１３には、実行プログラム４２を記憶させる領域と情報データを記憶させる領域が、それぞれ異なる領域として確保されている。
【０１２３】
ステップＳ８において、配列処理プログラム４３Ｃは、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ３に戻り、上述したステップＳ３以降の処理をくり返す。
【０１２４】
そして、ステップＳ３において、配列処理プログラム４３Ｃが、プログラム番号ｉは、プログラム総数以下ではない（プログラム番号ｉは、プログラム総数より大きい）と判定した場合、処理はステップＳ９に進む。
【０１２５】
なお、以上のステップＳ３乃至ステップＳ８のループ処理は、複数の実行プログラム４２を、１つおきに逆順に並べ替えて連結する処理であり、ステップＳ３乃至ステップＳ８の処理をくり返すことにより、ＲＡＭ１３のバッファには、形式１の並び順の実行プログラム４２と形式２の並び順の実行プログラム４２が交互に並べられ、記憶される。このことをより具体的に示すために、実行プログラム４２−１乃至４２−４をＲＡＭ１３に記憶させる場合を例にして、ステップＳ３乃至ステップＳ８の処理について、以下に説明する。
【０１２６】
配列処理プログラム４３Ｃは、上述したステップＳ２において、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化した後、ステップＳ３において、プログラム番号ｉ（＝１）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝１）は、プログラム総数（＝４）以下であるので、処理はステップＳ４に進む。
【０１２７】
ステップＳ４において、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝１）は偶数であるか否かを判定し、プログラム番号ｉ（＝１）は偶数ではない（奇数である）ので、処理はステップＳ５に進む。ステップＳ５において、配列処理プログラム４３Ｃは、１番目の実行プログラム４２−１をストレージデバイス１８から読み込み、形式１の並び順で、ＲＡＭ１３のバッファに追加する。その後、ステップＳ７において、配列処理プログラム４３Ｃは、１番目の実行プログラム４２−１のプログラム長を示すサイズデータを情報データとしてＲＡＭ１３に記憶させる。なお、情報データは、ＲＡＭ１３のうち、実行プログラム４２とは別の領域に記憶される。ステップＳ８において、配列処理プログラム４３Ｃは、ｉを１だけ増やし、ｉ＝２とする。
【０１２８】
その後、処理はステップＳ３に戻り、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝２）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝２）は、プログラム総数（＝４）以下であるので、処理はステップＳ４に進む。ステップＳ４において、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝２）は、偶数であるか否かを判定し、プログラム番号ｉ（＝２）は偶数なので、処理はステップＳ６に進む。ステップＳ６において、配列処理プログラム４３Ｃは、２番目のプログラム４２−２をストレージデバイス１８から読み込み、形式２の並び順に並び替えてＲＡＭ１３のバッファに記憶させる。なお、配列処理プログラム４３Ｃは、２番目の実行プログラム４２−２を、１番目の実行プログラム４２−１が記憶されたメモリアドレスの直後のメモリアドレスに続けて記憶させる。その後、ステップＳ７において、配列処理プログラム４３Ｃは、２番目の実行プログラム４２−２のプログラム長を示すサイズデータをＲＡＭ１３に記憶された情報データに追加して記憶させる。ステップＳ８において、配列処理プログラム４３Ｃは、ｉを１だけ増やし、ｉ＝３とする。
【０１２９】
その後、処理はステップＳ３に戻り、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝３）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝３）は、プログラム総数（＝４）以下であるので、処理はステップＳ４に進む。ステップＳ４において、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝３）は、偶数であるか否かを判定し、プログラム番号ｉ（＝３）は偶数ではない（奇数である）ので、処理はステップＳ５に進む。ステップＳ５において、配列処理プログラム４３Ｃは、３番目のプログラム４２−３をストレージデバイス１８から読み込み、形式１の並び順でＲＡＭ１３のバッファに記憶させる。なお、配列処理プログラム４３Ｃは、３番目の実行プログラム４２−３を、２番目の実行プログラム４２−２が記憶されたメモリアドレスの直後のメモリアドレスに続けて記憶させる。その後、ステップＳ７において、配列処理プログラム４３Ｃは、３番目の実行プログラム４２−３のプログラム長を示すサイズデータをＲＡＭ１３に記憶された情報データに追加して記憶させる。ステップＳ８において、配列処理プログラム４３Ｃは、ｉを１だけ増やし、ｉ＝４とする。
【０１３０】
その後、処理はステップＳ３に戻り、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝４）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝４）は、プログラム総数（＝４）以下であるので、処理はステップＳ４に進む。ステップＳ４において、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝４）は、偶数であるか否かを判定し、プログラム番号ｉ（＝４）は偶数であるので、処理はステップＳ６に進む。ステップＳ６において配列処理プログラム４３Ｃは、４番目のプログラム４２−４をストレージデバイス１８から読み込み、形式２の並び順に並び替えてＲＡＭ１３のバッファに記憶させる。なお、配列処理プログラム４３Ｃは、４番目の実行プログラム４２−４を、３番目の実行プログラム４２−３が記憶されたメモリアドレスの直後のメモリアドレスに続けて記憶させる。その後、ステップＳ７において、配列処理プログラム４３Ｃは、４番目の実行プログラム４２−４のプログラム長を示すサイズデータをＲＡＭ１３に記憶された情報データに追加して記憶させる。ステップＳ８において、配列処理プログラム４３Ｃは、ｉを１だけ増やし、ｉ＝５とする。
【０１３１】
その後、処理はステップＳ３に戻り、配列処理プログラム４３Ｃは、プログラム番号ｉ（＝５）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝５）は、プログラム総数（＝４）以下ではないので、処理はステップＳ９に進む。
【０１３２】
以上のような処理の結果、ＲＡＭ１３のバッファには、図７に示されるようプログラムデータ群２７１が記憶される。すなわち、プログラムデータ群２７１は、連続的に並べられた実行プログラム４２−１乃至４２−４により構成されている。実行プログラム４２−１は、形式１の並び順で記憶されている。実行プログラム４２−２は、形式２の並び順で、実行プログラム４２−１が記憶されたメモリアドレスの直後に記憶されている。実行プログラム４２−３は、形式１の並び順で、実行プログラム４２−２が記憶されたメモリアドレスの直後に記憶されている。実行プログラム４２−４は、形式２の並び順で、実行プログラム４２−３が記憶されたメモリアドレスの直後に記憶されている。このように、形式１と形式２の並び順を交互にくり返して、実行プログラム４２−１乃至４２−４を並べることにより、実行プログラム同士の境界部に、類似するデータが配置されることになる。
【０１３３】
すなわち、図５を参照して説明したように、形式１の並び順においては、先頭のデータの方に、ＣＰＵのインストラクションコードが配置され、末尾のデータの方に、変数の初期値や定数値、文字列などが配置される。それに対して、形式２の並び順においては、先頭のデータの方に、変数の初期値や定数値、文字列などが配置され、末尾のデータの方に、ＣＰＵのインストラクションコードが配置される。
【０１３４】
そこで、図７のプログラムデータ群２７１の実行プログラム４２−１と実行プログラム４２−２の境界に注目すると、実行プログラム４２−１の末尾の方、および実行プログラム４２−２の先頭の方には、変数の初期値や定数値、文字列などのデータが配置されている。また、実行プログラム４２−２と実行プログラム４２−３の境界に注目すると、実行プログラム４２−２の末尾の方、および実行プログラム４２−３の先頭の方には、ＣＰＵのインストラクションコードが配置されている。また、実行プログラム４２−３と実行プログラム４２−４の境界に注目すると、実行プログラム４２−３の末尾の方、および実行プログラム４２−４の先頭の方には、変数の初期値や定数値、文字列などのデータが配置されている。
【０１３５】
このように、実行プログラム４２同士の境界に、類似するデータを配置することにより、後に、プログラムデータ群２７１を圧縮する際に、境界部分の圧縮率の低下を防ぐことができる。
【０１３６】
ところで、図７において、下方に、サイズデータ２７２が示されている。このサイズデータ２７２は、情報データに含まれるデータであり、２７２Ａは、実行プログラム４２−１のプログラム長（ビット数）を示すサイズデータであり、２７２Ｂは、実行プログラム４２−２のプログラム長（ビット数）を示すサイズデータであり、２７２Ｃは、実行プログラム４２−３のプログラム長（ビット数）を示すサイズデータであり、２７２Ｄは、実行プログラム４２−４のプログラム長（ビット数）を示すサイズデータである。
【０１３７】
図３に戻り、ステップＳ９において、圧縮処理プログラム４３Ａは、ＲＡＭ１３のバッファに記憶されたプログラムデータ群２７１を圧縮する。図８は、圧縮処理プログラム４３Ａによる圧縮の概念を表している。すなわち、圧縮処理プログラム４３Ａは、移動窓３０４を設定し、この移動窓３０４を、プログラムデータ群２７１に沿って、矢印Ａ方向に移動させてゆき、プログラムデータ群２７１を順次圧縮してゆく。図８において、符号化済みデータ３０１は、移動窓３０４が移動し、符号化が済んだデータを示している。また、３０２は、現在の移動窓３０４を基にして符号化しようとする１符号化単位のデータを示している。また、３０３は、まだ符号化されていない未符号化データを示している。
【０１３８】
ここで、図８の符号化方式である、ＬＺ７７符号について説明する。辞書式データ圧縮アルゴリズムの代表的なものとしてＬｅｍｐｅｌ−Ｚｉｖ符号がある。Ｌｅｍｐｅｌ−Ｚｉｖ符号は、大きく分けてＬＺ７７符号とＬＺ７８符号の２種類がある。このうち、図８のような移動窓３０４を仮定して、移動窓３０４中のデータを辞書として符号化／復号するのがＬＺ７７符号である。
【０１３９】
ＬＺ７７符号によりデータを圧縮（符号化）する圧縮処理プログラム４３Ａは、まず、辞書中に存在する文字列の中で、符号化しようとする１符号化単位のデータ３０２と最長一致する文字列を検索する。そして、一致するものがあった場合、圧縮処理プログラム４３Ａは、一致するものがあること示すフラグ、一致した文字列の辞書中における開始位置、および一致長を符号として、１符号化単位のデータ３０２中のデータを符号化する。また、一致するものがなかった場合、圧縮処理プログラム４３Ａは、一致するものがないことを示すフラグ、および一致するものがなかった文字列をそのまま符号として、１符号化単位のデータ３０２中のデータを符号化する。そして、圧縮処理プログラム４３Ａは、今符号化された１符号化単位のデータ３０２を含むように移動窓３０４をスライドさせて新たな辞書とし、その辞書からまた一致するものを検索して符号化する。圧縮処理プログラム４３Ａは、以上の処理を繰り返すことでデータ全体を符号化する。
【０１４０】
Ｌｅｍｐｅｌ−Ｚｉｖ符号は、確率構造が未知なデータを漸近的にエントロピーレートまで圧縮するユニバーサルデータ圧縮であり、効率のよい圧縮ができることが知られている。また、非常に高速な伸張が可能であり、ソフトウエア処理にも向いている。
【０１４１】
図３に戻って、ステップＳ１０において、記録プログラム４３は、圧縮済みのプログラムデータ、および情報データを、圧縮コードデータ４１としてストレージデバイス１８に記憶させる。なお、情報データは、ステップＳ７で追加されたサイズデータ２７２、プログラム総数を示すプログラム総数データ、およびビット長Ｘを示すビット長データにより構成される。図９は、圧縮コードデータ４１の例を表している。
【０１４２】
図９において、圧縮コードデータ４１は、ステップＳ９で、圧縮処理プログラム４３Ａにより圧縮された圧縮済みプログラムデータ３５１、および情報データ３５２により構成される。情報データ３５２は、ビット長データ３６１、プログラム総数データ３６２、およびサイズデータ２７２により構成される。ビット長データ３６１は、予め配列処理プログラム４３Ｃに設定されたビット長Ｘに基づいて生成されたデータであり、プログラム総数データ３６２は、不揮発性メモリ２１に格納される実行プログラム４２のプログラム総数（４個）に基づいて生成される。なお、ビット長データ３６１およびプログラム総数データ３６２は、記録プログラム４３により生成される。
【０１４３】
ステップＳ１１において、記録プログラム４３は、ステップＳ１０の処理によりストレージデバイス１８に記憶された圧縮コードデータ４１およびブートプログラム４４を読み出し、不揮発性メモリ書き込み装置１４に供給する。不揮発性メモリ書き込み装置１４は、供給された圧縮コードデータ４１およびブートプログラム４４を不揮発性メモリ２１に格納する（記憶させる）。
【０１４４】
以上のようにして、不揮発性メモリ２１に、圧縮された実行プログラム４２が格納される。
【０１４５】
以上のように、連結するプログラムを１つおきに逆順に並べ替えることで、類似するコードをより近づけてから圧縮することにより、プログラム同士の境界付近における局所的な圧縮率低下を軽減でき、全体としての圧縮率を向上させることができる。結果的に、不揮発性メモリ２１に保存させるデータのデータ量を削減することができるため、メモリコストを削減することができる。また不揮発性メモリ２１に書き込むデータ量が減少するので、不揮発性メモリへのデータの書き込み時間を短縮することが可能となる。
【０１４６】
さらに、以上の処理は、既存の圧縮アルゴリズムへの変更を加える必要がないため、既存のシステムへの適用を容易に実現することができる。
【０１４７】
以上のようにして不揮発性メモリ２１に格納された実行プログラム４２は、撮像装置２０１のＣＰＵ２４４により伸長され実行される。
【０１４８】
次に、図１０のフローチャートを参照して、撮像装置２０１の伸長処理、すなわち、撮像装置２０１が、不揮発性メモリ２１に格納された実行プログラムを伸長し、実行可能な並び順に並び替える処理について説明する。
【０１４９】
操作部２１２が操作され、撮像装置２０１の起動が指示された場合、ホストＣＰＵ２１３は、ＣＰＵ２４４−１に、ブートプログラム４４の実行を指示する。そこで、ステップＳ１０１において、ＣＰＵ２４４−１は、不揮発性メモリ２１に記憶されたブートプログラム４４を読み出し、実行する。なお、ブートプログラム４４は、圧縮済みプログラムデータ３５１を伸長する伸長プログラム等を含んでいる。図１１に、ブートプログラム４４に含まれるプログラムの例が示されている。すなわち、図１１において、ブートプログラム４４には、伸長プログラム４４Ａ、管理プログラム４４Ｂ、および配列処理プログラム４４Ｃが含まれている。以下のステップＳ１０２乃至ステップＳ１０９の処理は、ＣＰＵ２４４−１がブートプログラム４４を実行することにより、実行される。
【０１５０】
ステップＳ１０２において、ＣＰＵ２４４−１は、伸長プログラム４４Ａを実行することにより、図１１に示されるように、不揮発性メモリ２１から、圧縮コードデータ４１を読み出し、圧縮済みプログラムデータ３５１を伸長する。そして、ＣＰＵ２４４−１は、情報データ３５２および伸長されたプログラムデータ群２７１をＳＤＲＡＭ２１４に記憶させる。なお、ＣＰＵ２４４−１は、伸長されたプログラムデータ群２７１をＳＤＲＡＭ２１４に記憶させる際、ＳＤＲＡＭ２１４の予め設定された先頭アドレスから順番に、対応するメモリアドレスに記憶させる。
【０１５１】
ステップＳ１０３において、ＣＰＵ２４４−１は、管理プログラム４４Ｂを実行することにより、ＳＤＲＡＭ２１４に記憶された情報データ（サイズデータ２７２、ビット長データ３６１、およびプログラム総数データ３６２）に基づいて、各実行プログラムの先頭が記憶されたメモリアドレス（先頭アドレス）を算出する。
【０１５２】
すなわち、プログラムデータ群２７１は、ステップＳ１０２の処理により、予め設定された先頭アドレスから順番に記憶されているので、１番目の実行プログラム４２−１のプログラム長に基づいて、２番目の実行プログラム４２−２の記録開始位置のメモリアドレスを特定する。そして、２番目の実行プログラム４２−２の記録開始位置のメモリアドレスと実行プログラム４２−２のプログラム長に基づいて、３番目の実行プログラム４２−３の記録開始位置のメモリアドレスを特定する。同様に、３番目の実行プログラム４２−３の記録開始位置のメモリアドレスと実行プログラム４２−３のプログラム長に基づいて、４番目の実行プログラム４２−４の記録開始位置のメモリアドレスを特定する。このようにして、ＣＰＵ２４４−１は、各実行プログラムの先頭が記憶されたメモリアドレス（先頭アドレス）を算出する。
【０１５３】
ステップＳ１０４において、ＣＰＵ２４４−１（管理プログラム４４Ｂ）は、ステップＳ１０３で算出された各実行プログラムの先頭アドレスとプログラム長を対応付けたプログラム管理テーブルを作成し、ＳＤＲＡＭ２１４に記憶させる。図１１に示されるように、ＳＤＲＡＭ２１４には、ステップＳ１０４で作成されたプログラム管理テーブル４０１が記憶されている。
【０１５４】
以下、ステップＳ１０５乃至ステップＳ１０９の処理は、ＣＰＵ２４４−１が、配列処理プログラム４４Ｃを実行することにより実行される。まず、ステップＳ１０５において、ＣＰＵ２４４−１は、プログラム番号ｉを１に初期化する。
【０１５５】
ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉがプログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ１０７に進む。
【０１５６】
ステップＳ１０７において、ＣＰＵ２４４−１は、プログラム番号ｉが偶数であるか否かを判定し、ｉが偶数である場合、処理はステップＳ１０８に進む。
【０１５７】
ステップＳ１０８において、ＣＰＵ２４４−１は、ＳＤＲＡＭ２１４に記憶されたｉ番目の実行プログラムを、所定のビット長Ｘ毎に逆順に並び替え、ＳＤＲＡＭ２１４に記憶させる。これにより、形式２の並び順に倒置されていた実行プログラムは、図１１に示されるように、本来の並び順（形式１の並び順）に並び替えられる。その後、処理はステップＳ１０９に進む。
【０１５８】
ステップＳ１０７において、ＣＰＵ２４４−１が、プログラム番号ｉは偶数ではない（奇数である）と判定した場合、ステップＳ１０８の処理はスキップされ、処理はステップＳ１０９に進む。
【０１５９】
ステップＳ１０９において、ＣＰＵ２４４−１は、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ１０６に戻り、上述したステップＳ１０６以降の処理がくり返される。なお、ステップＳ１０６乃至ステップＳ１０９のループの処理は、形式２の並び順に変換されていた実行プログラム４２を形式１の並び順に変換する処理である。
【０１６０】
そして、ステップＳ１０６において、ＣＰＵ２４４−１が、プログラム番号ｉはプログラム総数以下ではない（プログラム番号ｉはプログラム総数より大きい）と判定した場合、ＣＰＵ２４４−１は、伸長処理を終了する。
【０１６１】
以上のステップＳ１０５乃至ステップＳ１０９の処理をより具体的に示すために、図９のプログラムデータ群２７１のように並べられた実行プログラム４２−１乃至４２−４に対して、ステップＳ１０６乃至ステップＳ１０９の処理を実行した場合の例を以下に説明する。
【０１６２】
ステップＳ１０５でプログラム番号ｉが１に初期化された後、ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝１）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝１）はプログラム総数（＝４）以下なので、処理はステップＳ１０７に進む。ステップＳ１０７において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝１）は偶数であるか否かを判定し、プログラム番号ｉ（＝１）は偶数ではない（奇数である）ので、ステップＳ１０８の処理はスキップされ、処理はステップＳ１０９に進む。ステップＳ１０９において、ＣＰＵ２４４−１は、プログラム番号ｉを１だけ増やし、プログラム番号ｉ＝２とする。その後、処理はステップＳ１０６に戻る。
【０１６３】
ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝２）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝２）はプログラム総数（＝４）以下なので、処理はステップＳ１０７に進む。ステップＳ１０７において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝２）は偶数であるか否かを判定し、プログラム番号ｉ（＝２）は偶数なので、処理はステップＳ１０８に進む。ステップＳ１０８において、ＣＰＵ２４４−１は、ＳＤＲＡＭ２１４に記憶された２番目の実行プログラム４２−２の記録位置を、プログラム管理テーブル４０１より取得し、取得された記録位置に基づいて、実行プログラム４２−２のプログラムコードを特定する。そして、ＣＰＵ２４４−１は、実行プログラム４２−２の並び順を、形式２から形式１に変換して、ＳＤＲＡＭ２１４の記憶を更新する。その後、処理はステップＳ１０９に進む。ステップＳ１０９において、ＣＰＵ２４４−１は、プログラム番号ｉを１だけ増やし、プログラム番号ｉ＝３とする。その後、処理はステップＳ１０６に戻る。
【０１６４】
ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝３）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝３）はプログラム総数（＝４）以下なので、処理はステップＳ１０７に進む。ステップＳ１０７において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝３）は偶数であるか否かを判定し、プログラム番号ｉ（＝３）は偶数ではない（奇数である）ので、ステップＳ１０８の処理はスキップされ、処理はステップＳ１０９に進む。ステップＳ１０９において、ＣＰＵ２４４−１は、プログラム番号ｉを１だけ増やし、プログラム番号ｉ＝４とする。その後、処理はステップＳ１０６に戻る。
【０１６５】
ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝４）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝４）はプログラム総数（＝４）以下なので、処理はステップＳ１０７に進む。ステップＳ１０７において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝４）が偶数であるか否かを判定し、プログラム番号ｉ（＝４）は偶数なので、処理はステップＳ１０８に進む。ステップＳ１０８において、ＣＰＵ２４４−１は、ＳＤＲＡＭ２１４に記憶された４番目の実行プログラム４２−４の記録位置を、プログラム管理テーブル４０１より取得し、取得された記録位置に基づいて、実行プログラム４２−４のプログラムコードを特定する。そして、ＣＰＵ２４４−１は、実行プログラム４２−４の並び順を、形式２から形式１に変換して、ＳＤＲＡＭ２１４の記憶を更新する。その後、処理はステップＳ１０９に進む。ステップＳ１０９において、ＣＰＵ２４４−１は、プログラム番号ｉを１だけ増やし、プログラム番号ｉ＝５とする。その後、処理はステップＳ１０６に戻る。
【０１６６】
ステップＳ１０６において、ＣＰＵ２４４−１は、プログラム番号ｉ（＝５）がプログラム総数（＝４）以下であるか否かを判定し、プログラム番号ｉ（＝５）はプログラム総数（＝４）以下ではない（プログラム番号ｉ（＝５）はプログラム総数（＝４）より大きい）ので、ＣＰＵ２４４−１は、伸長処理を終了する。
【０１６７】
以上の処理の結果、並び順が倒置されていた（形式２の）実行プログラム４２−２および４２−４が、形式１の並び順に変換される。図１１の実行プログラム４２−１乃至４２−４は、図１０の伸長処理により、並び順が変換された後の状態を表している。
【０１６８】
形式２の並び順だった実行プログラム４２−２および４２−４を形式１の並び順に変換することにより、実行プログラム４２−２および４２−４は、ＣＰＵ２４４が直接実行可能な並び順となる。
【０１６９】
ユーザは、操作部２１２を操作して、例えば、映像および音声の記録や再生等、種々の動作を指示することができ、ホストＣＰＵ２１３は、ユーザからの指示に対応した実行プログラム４２を、ＣＰＵ２４４に実行させる。なお、ＣＰＵ２４４−１乃至２４４−３は、それぞれ実行する実行プログラム４２が割り当てられている。図１１の例においては、ＣＰＵ２４４−１は、実行プログラム４２−１を実行するように設定され、ＣＰＵ２４４−２は、実行プログラム４２−２を実行するように設定され、ＣＰＵ２４４−３は、実行プログラム４２−３および４２−４を実行するように設定されている。
【０１７０】
次に、図１２のフローチャートを参照して、撮像装置２０１のプログラム実行処理、すなわち、撮像装置２０１が、実行プログラム４２を実行する処理について説明する。
【０１７１】
ステップＳ１５１において、ホストＣＰＵ２１３は、操作部２１２からの操作信号に基づいて、所定の実行プログラム４２の実行が指示されたか否かを判定し、所定の実行プログラム４２の実行が指示されるまでステップＳ１５１の処理をくり返して待機する。そして、所定の実行プログラム４２の実行が指示された場合、処理はステップＳ１５２に進む。
【０１７２】
ＣＰＵ２４４−１乃至２４４−３のそれぞれが実行する実行プログラム４２は、予め設定されている。例えば、図１１の例においては、ＣＰＵ２４４−１は、実行プログラム４２−１を実行し、ＣＰＵ２４４−２は、実行プログラム４２−２を実行し、ＣＰＵ２４４−３は、実行プログラム４２−３および４２−４を実行するように、予め設定されている。そこで、ステップＳ１５２において、ホストＣＰＵ２１３は、ステップＳ１５１で実行するように指示された実行プログラム４２が、ＣＰＵ２４４−１乃至２４４−３のうち、どのＣＰＵ２４４により実行されるべき実行プログラムなのかを特定し、特定したＣＰＵ２４４に対して、ステップＳ１５１で指示された実行プログラム４３を実行するように指令する。以下の説明においては、実行プログラム４２−３の実行を指示された場合を例にして説明する。ステップＳ１５１において、実行プログラム４２−３を実行するように指示された場合、ホストＣＰＵ２１３は、ＣＰＵ２４４−３に対して、実行プログラム４２−３を実行するように指令する。
【０１７３】
ＣＰＵ２４４−３は、ホストＣＰＵ２１３からの指令に従って、まず、プログラム管理テーブル４０１を参照して、実行する実行プログラム４２−３が記憶された開始アドレスを算出する。
【０１７４】
ステップＳ１５３において、ＣＰＵ２４４−３は、ステップＳ１５２で算出された開始アドレスにジャンプし、実行プログラム４２−３の実行を開始する。
【０１７５】
ステップＳ１５４において、ＣＰＵ２４４−３は、実行プログラム４２−３の処理が全て実行されたか否かを判定し、実行プログラム４２−３の処理が全て実行されていない場合（まだ完了していない処理がある場合）、処理はステップＳ１５５に進む。
【０１７６】
ユーザは、実行プログラム４２−３の実行中に、操作部２１２を操作して、その実行プログラム４２−３の実行を強制終了させる指示を入力することができる。ホストＣＰＵ２１３は、実行中の実行プログラム４２−３を強制終了させる指示が入力された場合、その実行プログラム４２−３を実行中のＣＰＵ２４４−３に、実行プログラム４２−３を強制終了するように通知する。そこで、ステップＳ１５５において、ＣＰＵ２４４−３は、ホストＣＰＵ２１３から、強制終了の指示が通知されたか否かを判定し、ホストＣＰＵ２１３から、強制終了の指示が通知されていない場合、処理はステップＳ１５４に戻り、上述したステップＳ１５４以降の処理がくり返される。
【０１７７】
以上のようにして、実行プログラム４２−３が終了せず、強制終了の指示も通知されていない場合、ステップＳ１５４およびステップＳ１５５の処理をくり返し、その間、実行プログラム４２−３の実行が継続されるが、ステップＳ１５４において、実行プログラム４２−３の処理が全て実行されたと判定された場合、ＣＰＵ２４４−３は、実行プログラム４２−３の実行を終了し、プログラム実行処理を終了する。また、ステップＳ１５５において、ホストＣＰＵ２１３から強制終了の指示が通知された場合、ＣＰＵ２４４−３は、実行プログラム４２−３の実行を終了し、プログラム実行処理を終了する。
【０１７８】
以上のようにして、プログラム実行処理が実行される。
【０１７９】
なお、以上の説明においては、ＣＰＵ２４４−３が実行プログラム４２−３を実行する場合を例にして説明したが、これは１例であり、上記の説明は、ＣＰＵ２４４−１が実行プログラム４２−１を実行する場合、ＣＰＵ２４４−２が実行プログラム４２−２を実行する場合、およびＣＰＵ２４４−３が実行プログラム４２−４を実行する場合にも適用可能である。
【０１８０】
以上説明したように、本発明によれば、圧縮装置１で実行プログラム４２を圧縮する際に、実行プログラム４２を１つおきに倒置させてから、まとめて圧縮することにより、実行プログラム４２同士の境界に、類似するコードを配置することができる。従って、圧縮率をより高くすることが可能となる。結果的に、不揮発性メモリ２１の記憶容量をより小さいものとすることができ、コストダウンをはかることが可能となる。
【０１８１】
実験結果を、図１３乃至図１５を参照して説明する。
【０１８２】
実験に利用したのは、プログラムのコードサイズが共に１３１０７２バイトのプログラムａおよびプログラムｂである。なお、プログラムａとプログラムｂは、異なるコードである。実験では、プログラムａとプログラムｂを図１３のように連結した。図１３に示される「ａ」は形式１の並び順のプログラムａを表し、「ａ逆」は、形式２の並び順のプログラムａを表し、「ｂ」は、形式１の並び順のプログラムｂを表し、「ｂ逆」は、形式２の並び順のプログラムｂを表している。すなわち、図１３に示されるように、形式１のプログラムａ、形式２のプログラムａ、形式１のプログラムｂ、形式２のプログラムｂ、形式１のプログラムｂの順番で、プログラムを連結した。この連結されたプログラム全体で、６５５３６０バイトである。
【０１８３】
図１３に示されるようにして連結されたプログラムを、４０９６バイトの移動窓で、ＬＺＳＳにより圧縮した結果が、図１４および図１５である。図１５は、図１４の表をグラフ化したものである。なお、ＬＺＳＳ（Ｌｅｍｐｅｌ−Ｚｉｖ−Ｓｔｏｒｅｒ−Ｓｙｚｍａｎｓｋｉ）は、ＬＺ７７のバリエーションの１つである。
【０１８４】
図１４において、左側の列の「逆順に並べ替える単位（バイト）」は、ビット長Ｘを表している。なお、単位はバイトである。また、右側の列には、「本発明」と「従来」の圧縮率（％）の結果が示されている。図１４に示されるように、ビット長Ｘを１バイト乃至１６３８４バイトの複数の長さに設定して、実験を行った。
【０１８５】
図１５において、縦軸は圧縮率（％）を示し、横軸はビット長Ｘ（「逆順に並べ替える単位（バイト）」）を表している。図１５に明らかなように、本実験の結果、ビット長Ｘがａ乃至ｂの間、およびｃ以上である場合、本発明を適用したほうが、従来より圧縮率を高くすることができる。それに対して、ビット長Ｘが１乃至ａの間、およびｂ乃至ｃの間である場合、本発明を適用すると、従来より圧縮率が低くなってしまう。ビット長Ｘを適切な値に設定すれば、本発明を適用することにより、従来より圧縮率を高くすることができることが、この実験結果より確かめられた。
【０１８６】
なお、図１３乃至図１５に示されたものは、実験の１例であり、本発明が、従来と比較して、図１４および図１５に示される程度しか、圧縮率の向上を望めないことを意味するものではない。例えば、プログラムデータ群２７１全体のデータ量は同じでも、プログラムデータ群２７１を構成する実行プログラムの個数が多ければ、実行プログラム同士の境界も多くなるので、従来の圧縮率と比較して、より高い圧縮率を期待することができる。
【０１８７】
ところで、以上の説明においては、図７のプログラムデータ群２７１に示されるように、連結する１番目の実行プログラム４２−１を形式１の並び順とし、２番目の実行プログラム４２−２を形式２の並び順とし、３番目の実行プログラム４２−３を形式１の並び順とし、４番目の実行プログラム４２−４を形式２の並び順としている。これに対して、連結する実行プログラム４２−１乃至４２−４を、図１６に示されるようにしても良い。
【０１８８】
すなわち、図１６のプログラムデータ群４５１においては、連結する１番目の実行プログラム４２−１を形式２の並び順とし、２番目の実行プログラム４２−２を形式１の並び順とし、３番目の実行プログラム４２−３を形式２の並び順とし、４番目の実行プログラム４２−４を形式１の並び順としている。図７のプログラムデータ群２７１と比較すると、図７のプログラムデータ群２７１においては、奇数番目の実行プログラムが形式１の並び順とされ、偶数番目の実行プログラムが形式２の並び順とされているのに対し、図１６のプログラムデータ群４５１おいては、奇数番目の実行プログラムが形式２の並び順とされ、偶数番目の実行プログラムが形式１の並び順とされている。
【０１８９】
図１６に示されるプログラムデータ群４５１を作成する場合、図３のデータ記録処理のステップＳ４の処理を変更する必要がある。すなわち、上述したステップＳ４においては、プログラム番号ｉが奇数である場合、処理はステップＳ５に進み、プログラム番号ｉが偶数である場合、処理はステップＳ６に進んでいたが、これを、プログラム番号ｉが奇数である場合、ステップＳ６に進み、プログラム番号ｉが偶数である場合、ステップＳ５に進むように変更する。これにより、図１６に示されるプログラムデータ群４５１を作成することが可能となる。
【０１９０】
また、図１６に示されるプログラムデータ群４５１が圧縮された圧縮コードデータ４１を伸長する場合、図１０のステップＳ１０７の処理を変更する必要がある。すなわち、上述したステップＳ１０７においては、プログラム番号ｉが偶数である場合、処理はステップＳ１０８に進み、プログラム番号ｉが奇数である場合、ステップＳ１０８の処理はスキップされ、処理はステップＳ１０９に進んでいたが、これを、プログラム番号ｉが偶数である場合、ステップＳ１０８の処理をスキップしてステップＳ１０９に進み、プログラム番号ｉが奇数である場合、ステップＳ１０８に進むように変更する。これにより、図１６に示されるプログラムデータ群４５１が圧縮された圧縮コードデータ４１を伸長して、倒置されていた実行プログラムを本来の並び順に直すことができる。
【０１９１】
ところで、本発明においては、図７のプログラムデータ群２７１と図１６のプログラムデータ群４５１を、選択可能なようにすることもできる。この場合の圧縮処理について図１７および図１８のフローチャートを参照して説明する。
【０１９２】
ステップＳ２０１において、記録プログラム４３のデータ付加処理プログラム４３Ｂは、データ付加処理を実行する。なお、ステップＳ２０１の処理は、図３のステップＳ１の処理と同様であるため、詳細な説明は省略する。
【０１９３】
ステップＳ２０２において、記録プログラム４３の配列処理プログラム４３Ｃは、実行プログラム４２の配列を、図７のプログラムデータ群２７１のようにするのか、図１６のプログラムデータ群４５１のようにするのか、いずれかに設定する。なお、ステップＳ２０２の処理は、例えば、入力部１５を介して、オペレータから、いずれかの選択を受け付けることにより、設定することができる。
【０１９４】
ステップＳ２０３において、配列処理プログラム４３Ｃは、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化する。
【０１９５】
ステップＳ２０４において、配列処理プログラム４３Ｃは、ステップＳ２０２で設定された配列は、奇数番目の実行プログラム４２を形式２の並び順にする配列であるか否かを判定し、ステップＳ２０２で設定された配列が、奇数番目の実行プログラム４２を形式２の並び順にする配列ではない（偶数番目の実行プログラム４２を形式２の並び順にする配列である）場合、処理はステップＳ２０５に進む。
【０１９６】
ステップＳ２０５乃至ステップＳ２１０の処理はそれぞれ、図３のステップＳ３乃至ステップＳ８の処理と同様であるため、説明を省略する。なお、ステップＳ２０５において、配列処理プログラム４３Ｃが、プログラム番号ｉはプログラム総数以下ではない（プログラム番号ｉはプログラム総数より大きい）と判定した場合、処理はステップＳ２１１に進む。
【０１９７】
ステップＳ２０４において、配列処理プログラム４３Ｃが、ステップＳ２０２で設定された配列は、奇数番目の実行プログラム４２を形式２の並び順にする配列であると判定した場合、処理は図１８のステップＳ２１５に進む。
【０１９８】
ステップＳ２１５において、配列処理プログラム４３Ｃは、プログラム番号ｉが、プログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ２１６に進む。
【０１９９】
ステップＳ２１６において、配列処理プログラム４３Ｃは、プログラム番号ｉが奇数であるか否かを判定し、プログラム番号ｉが奇数ではなかった場合（偶数だった場合）、処理はステップＳ２１７に進む。
【０２００】
ステップＳ２１７において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、図５の左側に示されるように、形式１の並び順で、実行プログラム４２をＲＡＭ１３のバッファに追加する（記憶させる）。その後、処理はステップＳ２１９に進む。
【０２０１】
ステップＳ２１６において、配列処理プログラム４３Ｃが、プログラム番号ｉは奇数であると判定した場合、処理はステップＳ２１８に進む。
【０２０２】
ステップＳ２１８において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、ＲＡＭ１３上で、形式２の並び順に並び替えた後、並び替えられた形式２の実行プログラム４２をＲＡＭ１３のバッファに追加する（記憶させる）。
【０２０３】
ステップＳ２１９において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２のプログラム長（ビット数）を示すサイズデータを取得し、これをＲＡＭ１３の情報データを記憶する領域に記憶させる。
【０２０４】
ステップＳ２２０において、配列処理プログラム４３Ｃは、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ２１５に戻り、上述したステップＳ２１５以降の処理をくり返す。
【０２０５】
そして、ステップＳ２１５において、配列処理プログラム４３Ｃが、プログラム番号ｉは、プログラム総数以下ではない（プログラム番号ｉは、プログラム総数より大きい）と判定した場合、処理は図１７のステップＳ２１１に進む。
【０２０６】
ステップＳ２１１において、圧縮処理プログラム４３Ａは、ＲＡＭ１３のバッファに記憶されたプログラムデータ群２７１（または４５１）を圧縮する。なお、ステップＳ２１１の処理は、図３のステップＳ９の処理と同様である。
【０２０７】
ステップＳ２１２において、配列処理プログラム４３Ｃは、ステップＳ２０２での設定に基づいて、ステップＳ２１１で圧縮されたプログラムデータ群が、図７のプログラムデータ群２７１であるのか、図１６のプログラムデータ群４５１であるのかを示す配列データを作成する。
【０２０８】
ステップＳ２１３において、記録プログラム４３は、圧縮済みのプログラムデータ、および情報データを、圧縮コードデータ４１としてストレージデバイス１８に記憶させる。なお、情報データは、サイズデータ２７２、プログラム総数データ３６２、およびビット長データ３６１、並びにステップＳ２１２で生成された配列データにより構成される。
【０２０９】
ステップＳ２１４において、記録プログラム４３は、ステップＳ２１３の処理によりストレージデバイス１８に記憶された圧縮コードデータ４１を読み出し、不揮発性メモリ書き込み装置１４に供給する。不揮発性メモリ書き込み装置１４は、供給された圧縮コードデータ４１を不揮発性メモリ２１に格納する（記憶させる）。なお、この際、記録プログラム４３は、圧縮コードデータ４１とともに、ブートプログラム４４を読み出し、不揮発性メモリ書き込み装置１４に供給する。不揮発性メモリ書き込み装置１４は、圧縮コードデータ４１とともにブートプログラム４４を不揮発性メモリ２１に格納する。
【０２１０】
以上のように、配列を、図７のプログラムデータ群２７１、または図１６のプログラムデータ群４５１のいずれかに選択するようにしても良い。この場合、いずれを選択したのかを示す配列データを、情報データに含めることにより、後に、撮像装置２０１が伸長処理を行う際に、倒置された実行プログラム４２を正確に、ＣＰＵ２４４が実行可能な並び順に戻すことが可能となる。
【０２１１】
次に、図１９および図２０のフローチャートを参照して、図１７および図１８のデータ記録処理により不揮発性メモリ２１に記憶された圧縮コードデータ４１を伸長する伸長処理について説明する。
【０２１２】
ステップＳ２５１乃至ステップＳ２５４の処理は、それぞれ図１０のステップＳ１０１乃至ステップＳ１０４の処理と同様であるので、説明を省略する。
【０２１３】
ステップＳ２５４の後、ステップＳ２５５において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ＳＤＲＡＭ２１４に記憶された情報データの中から、配列データを読み出し、配列データに基づいて、奇数番目の実行プログラム４２が形式２の並び順になっているか否かを判定し、奇数番目の実行プログラム４２は形式２の並び順になっていない（偶数番目の実行プログラム４２が形式２の並び順になっている）場合、処理はステップＳ２５６に進む。
【０２１４】
ステップＳ２５６乃至ステップＳ２６０の処理は、それぞれ図１０のステップＳ１０５乃至ステップＳ１０９と同様である。すなわち、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ステップＳ２５６において、プログラム番号ｉを１に初期化し、ステップＳ２５７において、プログラム番号ｉがプログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ２５８に進む。
【０２１５】
ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ステップＳ２５８において、プログラム番号ｉが偶数であるか否かを判定し、ｉが偶数である場合、処理はステップＳ２５９に進む。ステップＳ２５９において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ＳＤＲＡＭ２１４に記憶されたｉ番目の実行プログラムを、所定のビット長Ｘ毎に逆順に並び替え、ＳＤＲＡＭ２１４に記憶させる。これにより、倒置されていた実行プログラムは、本来の並び順（形式１の並び順）に並び替えられる。その後、処理はステップＳ２６０に進む。
【０２１６】
ステップＳ２５８において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）が、プログラム番号ｉは偶数ではない（奇数である）と判定した場合、ステップＳ２５９の処理はスキップされ、処理はステップＳ２６０に進む。
【０２１７】
ステップＳ２６０において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ２５７に戻り、上述したステップＳ２５７以降の処理がくり返される。
【０２１８】
そして、ステップＳ２５７において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）が、プログラム番号ｉはプログラム総数以下ではない（プログラム番号ｉはプログラム総数より大きい）と判定した場合、ＣＰＵ２４４−１は、伸長処理を終了する。
【０２１９】
ステップＳ２５５において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）が、奇数番目の実行プログラム４２が形式２の並び順になっていると判定した場合、処理は図２０のステップＳ２６１に進む。
【０２２０】
ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ステップＳ２６１において、プログラム番号ｉを１に初期化し、ステップＳ２６２において、プログラム番号ｉがプログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ２６３に進む。
【０２２１】
ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ステップＳ２６３において、プログラム番号ｉが奇数であるか否かを判定し、ｉが奇数である場合、処理はステップＳ２６４に進む。ステップＳ２６４において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、ＳＤＲＡＭ２１４に記憶されたｉ番目の実行プログラムを、所定のビット長Ｘ毎に逆順に並び替え、ＳＤＲＡＭ２４１に記憶させる。これにより、倒置されていた実行プログラムは、本来の並び順（形式１の並び順）に並び替えられる。その後、処理はステップＳ２６５に進む。
【０２２２】
ステップＳ２６３において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）が、プログラム番号ｉは奇数ではない（偶数である）と判定した場合、ステップＳ２６４の処理はスキップされ、処理はステップＳ２６５に進む。
【０２２３】
ステップＳ２６５において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）は、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ２６２に戻り、上述したステップＳ２６２以降の処理がくり返される。
【０２２４】
そして、ステップＳ２６２において、ＣＰＵ２４４−１（配列処理プログラム４４Ｃ）が、プログラム番号ｉはプログラム総数以下ではない（プログラム番号ｉはプログラム総数より大きい）と判定した場合、ＣＰＵ２４４−１は、伸長処理を終了する。
【０２２５】
以上のようにしても良い。
【０２２６】
なお、以上の説明においては、図７のプログラムデータ群２７１、または図１６のプログラムデータ群４５１のいずれを選択したかを示す配列データを情報データに含むようにしているが、このようにする代わりに、ブートプログラムに、予め設定するようにしても良い。すなわち、偶数番目の実行プログラム４２を形式１の並び順に並び替えるブートプログラム、および奇数番目の実行プログラム４２を形式１の並び順に並び替えるブートプログラムを圧縮装置１に予め保持しておく。そして、不揮発性メモリ２１に圧縮コードデータ４１を記憶させる場合、圧縮コードデータ４１が、図７のプログラムデータ群２７１を圧縮した圧縮済みプログラムデータを含んでいたら、偶数番目の実行プログラム４２を形式１の並び順に並び替えるブートプログラムを、圧縮コードデータ４１とともに不揮発性メモリ２１に記憶させ、圧縮コードデータ４１が、図１６のプログラムデータ群４５１を圧縮した圧縮済みプログラムデータを含んでいたら、奇数番目の実行プログラム４２を形式１の並び順に並び替えるブートプログラムを、圧縮コードデータ４１とともに不揮発性メモリ２１に記憶させる。
【０２２７】
以上のようにしてもよい。
【０２２８】
ところで、先述した図１５のグラフを参照すると分かるように、設定するビット長Ｘの値が違えば、プログラムデータ群の圧縮率も異なるものとなる。そこで、圧縮率が最も高いビット長Ｘのときの圧縮コードデータ４１を不揮発性メモリ２１に格納することにより、不揮発性メモリ２１に記憶させる圧縮コードデータ４１の容量を最小にすることができる。
【０２２９】
そこで、例えば、圧縮装置１に、複数の異なるビット長Ｘで、それぞれ圧縮コードデータ４１を生成させ、生成された複数の圧縮コードデータ４１の中から、データサイズが最小の圧縮コードデータ４１を特定し、特定された圧縮コードデータ４１を不揮発性メモリ２１に格納するようにしても良い。
【０２３０】
この場合の、データ記録処理について、図２１のフローチャートを参照して説明する。
【０２３１】
圧縮装置１は、予め複数のビット長Ｘの候補を保持している。圧縮装置１は、例えば、図１４に示されるように、ビット長Ｘの候補として、１バイト、２バイト、４バイト、８バイト、１６バイト、３２バイト、６４バイト、１２８バイト、２５６バイト、５１２バイト、１０２４バイト、２０４８バイト、４０９６バイト、８１９２バイト、および１６３８４バイトの合計１５個の候補を保持している。そして、ステップＳ３０１において、記録プログラム４３は、全てのビット長Ｘの候補により圧縮コードデータ４１が作成されたか否かを判定し、全てのビット長Ｘの候補により圧縮コードデータ４１が作成されていない（まだ圧縮コードデータ４１を作成していないビット長Ｘの候補が存在する）場合、処理はステップＳ３０２に進む。
【０２３２】
ステップＳ３０２において、記録プログラム４３は、複数のビット長Ｘの候補の中から１つの候補を選択し、実行プログラム４２を整列させる際のビット長Ｘとして設定する。
【０２３３】
ステップＳ３０３において、データ付加処理プログラム４３Ｂは、ステップＳ３０２で設定されたビット長Ｘを利用して、データ付加処理を実行する。なお、ステップＳ３０３の処理は、図３のステップＳ１の処理と同様である。
【０２３４】
ステップＳ３０４乃至ステップＳ３１２の処理は、それぞれ図３のステップＳ２乃至ステップＳ１０の処理と同様である。すなわち、配列処理プログラム４３Ｃは、ステップＳ３０４において、プログラム番号ｉを１に初期化し、ＲＡＭ１３のバッファを初期化し、ステップＳ３０５において、プログラム番号ｉが、プログラム総数以下であるか否かを判定し、プログラム番号ｉがプログラム総数以下である場合、処理はステップＳ３０６に進む。
【０２３５】
ステップＳ３０６において、配列処理プログラム４３Ｃは、プログラム番号ｉが偶数であるか否かを判定し、プログラム番号ｉが偶数ではなかった場合（奇数だった場合）、処理はステップＳ３０７に進む。ステップＳ３０７において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、形式１の並び順で、実行プログラム４２をＲＡＭ１３のバッファに追加する（記憶させる）。その後、処理はステップＳ３０９に進む。
【０２３６】
ステップＳ３０６において、配列処理プログラム４３Ｃが、プログラム番号ｉは偶数であると判定した場合、処理はステップＳ３０８に進む。ステップＳ３０８において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２をストレージデバイス１８から読み込み、ステップＳ３０２で設定されたビット長Ｘ毎に、形式２の並び順に並び替えた後、並び替えられた実行プログラム４２をＲＡＭ１３のバッファに追加する（記憶させる）。その後、処理はステップＳ３０９に進む。
【０２３７】
ステップＳ３０９において、配列処理プログラム４３Ｃは、ｉ番目の実行プログラム４２のプログラム長（ビット数）を示すサイズデータを取得し、これをＲＡＭ１３の情報データを記憶する領域に記憶させる。なお、ＲＡＭ１３には、実行プログラム４２を記憶させる領域と情報データを記憶させる領域が、それぞれ異なる領域として確保されている。
【０２３８】
ステップＳ３１０において、配列処理プログラム４３Ｃは、プログラム番号ｉを１だけ増やす。その後、処理はステップＳ３０５に戻り、上述したステップＳ３０５以降の処理をくり返す。
【０２３９】
そして、ステップＳ３０５において、配列処理プログラム４３Ｃが、プログラム番号ｉは、プログラム総数以下ではない（プログラム番号ｉは、プログラム総数より大きい）と判定した場合、処理はステップＳ３１１に進む。
【０２４０】
なお、以上のステップＳ３０５乃至ステップＳ３１０の処理の結果、ＲＡＭ１３のバッファには、図７に示されるようプログラムデータ群２７１およびサイズデータ２７２が記憶される。なお、プログラムデータ群２７１は、ステップＳ３０２で設定されたビット長Ｘを単位として並べられている。
【０２４１】
ステップＳ３１１において、圧縮処理プログラム４３Ａは、ＲＡＭ１３のバッファに記憶されたプログラムデータ群２７１を圧縮する。ステップＳ３１２において、記録プログラム４３は、圧縮済みのプログラムデータ、および情報データを、圧縮コードデータ４１としてストレージデバイス１８に記憶させる。なお、情報データは、ステップＳ３０９で追加されたサイズデータ２７２、プログラム総数を示すプログラム総数データ、およびステップＳ３０２で設定されたビット長Ｘを示すビット長データにより構成される。
【０２４２】
その後、処理はステップＳ３０１に戻り、上述したステップＳ３０１以降の処理がくり返される。以上のステップＳ３０１乃至ステップＳ３１２の処理をくり返すことにより、複数の異なるビット長Ｘに基づいて生成された複数の圧縮コードデータ４１が、ストレージデバイス１８に記憶される。なお、ステップＳ３０２の処理において、複数のビット長Ｘの候補から１つを選択する際、記録プログラム４３は、すでに選択済みのビット長Ｘの候補は選択せず、まだ選択されていないビット長Ｘの候補を選択する。
【０２４３】
そして、ステップＳ３０１において、記録プログラム４３が、全てのビット長Ｘの候補での圧縮コードデータ４１の生成が終了したと判定した場合、処理はステップＳ３１３に進む。
【０２４４】
ステップＳ３１３において、記録プログラム４３は、ストレージデバイス１８に記憶された複数の圧縮コードデータ４１の中から、最もデータ量の小さい圧縮コードデータ４１を選択する。
【０２４５】
ステップＳ３１４において、記録プログラム４３は、ステップＳ３１３の処理により選択された圧縮コードデータ４１を読み出し、不揮発性メモリ書き込み装置１４に供給する。不揮発性メモリ書き込み装置１４は、供給された圧縮コードデータ４１を不揮発性メモリ２１に格納する（記憶させる）。なお、この際、記録プログラム４３は、圧縮コードデータ４１とともにブートプログラム４４を読み出し、不揮発性メモリ書き込み装置１４に供給する。不揮発性メモリ書き込み装置１４は、圧縮コードデータ４１とともにブートプログラム４４を不揮発性メモリ２１に格納する。
【０２４６】
以上のようにして、不揮発性メモリ２１に、最もデータ量が小さい圧縮コードデータ４１が格納される。以上のようにすることにより、不揮発性メモリ２１の記憶容量をさらに削減することが可能となる。
【０２４７】
以上に説明したように、本発明によれば、複数の実行プログラムを、より高い圧縮率で圧縮することが可能となる。
【０２４８】
すなわち、上述したように、実行プログラム４２のコードは、インストラクションとデータ（変数の初期値や定数、文字列など）から構成される。実行プログラム４２を作成するときのリンク方法によってコードの配置は異なるが、最初にインストラクションを配置し、その直後にデータが配置することが多い。また、そうでない配置の場合も、このような配置となるようにリンク方法を変更しても問題となることはほとんどない。
【０２４９】
実行プログラム４２のコードが、このような配置であるとすると、プログラムコードの先頭と末尾の方では統計的な性質が非常に異なっている場合が多く、ＬＺ７７符号で圧縮しようとした場合、先頭の方の符号化時と末尾の方の符号化時では辞書の内容が大きく異なっている。圧縮率を高くするためには、辞書に長い一致長のデータがなるべく多く存在することが望ましい。そのため、なるべく似たデータが近くに配置されているほうが良い。
【０２５０】
本発明は、実行プログラムのコードを似たデータが近くに配置されるようなデータ形式に簡単に変換し、その形式においてデータを圧縮することで、変換せずに圧縮するよりも圧縮率を向上させたものである。
【０２５１】
なお、以上の説明においては、圧縮アルゴリズムとしてＬＺ７７符号を用い、統計情報を移動窓に対応した辞書とした場合を例として説明したが、本発明は、過去のデータの統計情報（辞書を含む）を用いて圧縮を行うタイプのものであればＬＺ７７符号以外の圧縮アルゴリズムにも適用可能である。
【０２５２】
また、以上の説明においては、圧縮装置１と撮像装置２０１の２つの装置に分けて説明したが、装置を分けず、１つの装置で圧縮装置１と撮像装置２０１の処理を実現するようにしても良い。すなわち、上述のデータ記録処理、伸長処理、およびプログラム実行処理を、１つの装置で実行するようにしても良い。
【０２５３】
また、以上の説明においては、実行プログラム４２−１乃至４２−４を圧縮する場合を例にして説明したが、このことは、本発明が、実行プログラムを圧縮する場合にしか適用できないことを意味するものではない。連結して圧縮するものは、プログラム以外のデータでも良い。すなわち、コードの先頭側と末尾側に異なる種類のコードが配置されている複数のデータを連結して圧縮する場合に、本発明を適用することができる。
【０２５４】
上述した一連の処理は、ハードウエアにより実行させることもできるし、上述したようにソフトウエアにより実行させることもできる。一連の処理をソフトウエアにより実行させる場合には、そのソフトウエアを構成するプログラムが、専用のハードウエアに組み込まれているコンピュータ、または、各種のプログラムをインストールすることで、各種の機能を実行することが可能な、例えば汎用のパーソナルコンピュータなどに、ネットワークや記録媒体からインストールされる。
【０２５５】
この記録媒体は、図１および図２に示されるように、装置本体とは別に、ユーザにプログラムを提供するために配布される、プログラムが記録されている磁気ディスク３１（フレキシブルディスクを含む）、光ディスク３２（ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ），ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）を含む）、光磁気ディスク３３（ＭＤ（Ｍｉｎｉ−Ｄｉｓｋ）を含む）、もしくは半導体メモリ３４などよりなるパッケージメディアにより構成されるだけでなく、装置本体に予め組み込まれた状態でユーザに提供される、プログラムが記録されている不揮発性メモリ２１、ＲＯＭ１２、およびストレージデバイス１８に含まれるハードディスクなどで構成される。
【０２５６】
なお、本明細書において、記録媒体に記録されるプログラムを記述するステップは、記載された順序に沿って時系列的に行われる処理はもちろん、必ずしも時系列的に処理されなくとも、並列的あるいは個別に実行される処理をも含むものである。
【０２５７】
また、本明細書において、システムとは、複数の装置により構成される装置全体を表すものである。
【０２５８】
【発明の効果】
このように、第１の本発明によれば、データを圧縮することが可能である。特に、複数のデータ（プログラムを含む）を連結して圧縮する場合、データ同士の境界付近における局所的な圧縮率低下を軽減でき、全体としての圧縮率を向上させることができる。結果的に、不揮発性メモリに保存されるデータが削減されるため、メモリコストを削減することができる。
【０２５９】
また、第１の本発明によれば、不揮発性メモリに対するデータ転送量が減少するので、不揮発性メモリへのデータの書き込み時間を短縮することが可能となる。
【０２６０】
さらに、第１の本発明によれば、既存の圧縮アルゴリズムに変更を加えずに、圧縮率を向上させることが可能であり、既存のシステムに対して容易に適用することができる。
【０２６１】
第２の本発明によれば、圧縮されたデータを伸長することが可能である。特に、複数のデータを、１つおきに逆順に並べ替えることにより、高い圧縮率で圧縮されている場合でも、圧縮されたデータを伸長し、利用可能な並び順に復元することができる。従って、不揮発性メモリに保存されるデータが削減されるため、メモリコストを削減することができる。
【０２６２】
また、第２の本発明によれば、不揮発性メモリからのデータ転送量が減少するので、不揮発性メモリからのデータの読み込み時間を短縮するとともに、不揮発性メモリから読み出されたデータの伸張処理を高速化することが可能となる。
【０２６３】
さらに、第２の本発明によれば、既存の圧縮アルゴリズムに変更を加えずに、圧縮率を向上させることが可能であり、既存のシステムに対して容易に適用することができる。
【図面の簡単な説明】
【図１】本発明を適用した圧縮装置の構成例を示すブロック図である。
【図２】本発明を適用した撮像装置の構成例を示すブロック図である。
【図３】圧縮装置のデータ記録処理を説明するフローチャートである。
【図４】実行プログラムのプログラムコードをビット長単位で区切ることを説明する図である。
【図５】実行プログラムの並び順を説明する図である。
【図６】圧縮装置のデータ付加処理を説明するフローチャートである。
【図７】連結される実行プログラムの配列の例を説明する図である。
【図８】圧縮処理の概念を説明する図である。
【図９】圧縮コードデータに含まれるデータについて説明する図である。
【図１０】撮像装置の伸長処理を説明するフローチャートである。
【図１１】撮像装置の動作を説明する図である。
【図１２】撮像装置のプログラム実行処理を説明するフローチャートである。
【図１３】実験に利用したプログラムの連結の順番を説明する図である。
【図１４】本発明を適用した場合の圧縮率と従来の圧縮率を比較した実験結果を示す図である。
【図１５】本発明を適用した場合の圧縮率と従来の圧縮率を比較した実験結果を示す図である。
【図１６】連結される実行プログラムの配列の他の例を説明する図である。
【図１７】圧縮装置のデータ記録処理を説明する他のフローチャートである。
【図１８】圧縮装置のデータ記録処理を説明する、図１７に続くフローチャートである。
【図１９】撮像装置の伸長処理を説明する他のフローチャートである。
【図２０】撮像装置の伸長処理を説明する、図１９に続くフローチャートである。
【図２１】圧縮装置のデータ記録処理を説明する、さらに他のフローチャートである。
【符号の説明】
１  圧縮装置，  １１  ＣＰＵ，  １２  ＲＯＭ，  １３  ＲＡＭ，  １４  不揮発性メモリ書き込み装置，  １５  入力部，  １６  出力部，  １７  バス，  １８ストレージデバイス，  １９  通信部，  ２０  ドライブ，  ２１  不揮発性メモリ，  ３１  磁気ディスク，  ３２  光ディスク，  ３３  光磁気ディスク，  ３４  半導体メモリ，  ４１  圧縮コードデータ，  ４２−１乃至４２−４実行プログラム，  ４３  記録プログラム，  ２０１  撮像装置，  ２１１  ＬＳＩ，  ２１２  操作部，  ２１３  ホストＣＰＵ，  ２１４  ＳＤＲＡＭ，  ２１５  音声出力部，  ２１６  音声入力部，  ２１７  表示部，  ２１８  撮像部，  ２１９  記録再生部，  ２４１  バス，  ２４２，２４３  インタフェース，  ２４４−１乃至２４４−３  ＣＰＵ，  ２４５  インタフェース
【図１】
2004328097.tif 000003
【図２】
2004328097.tif 000004
【図３】
2004328097.tif 000005
【図４】
2004328097.tif 000006
【図５】
2004328097.tif 000007
【図６】
2004328097.tif 000008
【図７】
2004328097.tif 000009
【図８】
2004328097.tif 000010
【図９】
2004328097.tif 000011
【図１０】
2004328097.tif 000012
【図１１】
2004328097.tif 000013
【図１２】
2004328097.tif 000014
【図１３】
2004328097.tif 000015
【図１４】
2004328097.tif 000016
【図１５】
2004328097.tif 000017
【図１６】
2004328097.tif 000018
【図１７】
2004328097.tif 000019
【図１８】
2004328097.tif 000020
【図１９】
2004328097.tif 000021
【図２０】
2004328097.tif 000022
【図２１】
2004328097.tif 000023