[osask 6989] bim2bin4m.

  こんばんは、川合です。

  先日までせっせとtek4の最終仕上げをしていましたが、どうも満足で
きる圧縮率になりませんでした。どうもUC0やUC1を一度捨てることも視
野に入れて、やり直す必要がありそうです。これはかなり長期戦になり
そうな気がしてきました(半年とか)。半年もメインの開発を中断しつ
づけるわけには行きませんので、tek4の開発は後回しにするべきだとい
う結論に達しました。

  またtek3はtek4に近いアルゴリズムにすることが僕の希望なので、
tek4が決まらなければtek3も決められないということになります。とい
うことで、tek3とtek4は当面白紙です。tek2は結構いいのですが、ちょ
っとだけ引っかかっているところがあるので、まだ保留です。

  一方、tek1は我ながらバランスに優れたいい出来で問題はなさそうな
ので、これはフォーマット確定ということにします。いや、厳密に言う
と、フォーマット確定はtek1ではなくstk1ですが。フルセット仕様であ
るtek1のほうは、まだいろいろテストしたいことが残っているので、確
定しないでおきます。とにかくtek1もstk1の範囲で使う分には全く問題
ないわけです。

  OSASKやKHBIOSでも、とりあえずはstk1をサポートします。たぶんあ
る時点でstk1のサポートからtek1のサポートに繰り上げると思いますが
その場合は上位互換になりますので、問題はないわけです。

  それで、結局新規に確定したフォーマットがstk1だけということにな
ってしまうと、圧縮率でtek0の代用になるものがないということになっ
てしまい、これでは相変わらずtek0が使いつづけられてしまいます。展
開の遅いtek0を使われるくらいなら、速度は同じくらいだけど圧縮率の
高いLZMAのほうがマシです。

  それで、そういえばいつかLZMAライクな圧縮形式をtek5として作ろう
と思っていたことを思い出し(つまり、「スライド辞書法+レンジコー
ダもしくは算術圧縮」)、いっそのこと、それを今作ってしまおうと思
いました。もちろんゼロから作るのは途方もない時間がかかりますが、
幸いLZMAのソースがLGPLで公開されていますので、これをちょっと手直
しすれば良さそうです。

  ASKA版のデコーダを途中まで書いてみて、これはデコードするときの
ことをあまり考えていないなと思いました。よっぽどへんな仕様のCPU
でないかぎり(繰り下がり時にキャリーフラグが0になるなんていう仕
様でない限り・・・というかそんなCPUは存在するのか?)、今のLZMA
の仕様は展開しにくいです。どうしてもビット反転命令を追加しなけれ
ばいけなくなります。

  ということで、デコードしやすい形式に改造しました。これで1%くら
いは展開が速く出来るでしょう(最適化が優秀ではないCコンパイラで
は、むしろ遅くなるかもしれないですが、そんなことはもちろんコンパ
イラのせいであってフォーマット仕様のせいではない)。

  またスライド辞書での一致長が273バイトまでしかエンコードできな
いというさみしい制限があり(ちなみにこの手の制限はよくある制限で
LHAなどもそうです)、そのせいで圧縮率で損をしているようでした。
ということでフォーマットをいじって一致長の制限をなくしました。こ
れで、bim2binc以外のすべてで圧縮率が改善しました。そんなわけで、
今回紹介するstk5はベータ版ながら多くのケースでLZMAと同じかそれを
上回る圧縮率を発揮し、しかも展開速度がLZMAよりも速いという特徴を
もちます。もっとも展開速度についてはチューンした展開ルーチンがで
きているわけではないので、確証はありませんが。

                  LZMA        stk5
    bim2binc      110.2       110.2
    kdun00b       101.7       100.0
    osaskgo       104.8       104.8
    osask.bmp     110.0       100.4

    詳しいデータはこちら:
        http://wiki.osask.jp/?tek1/comp

  もはやstk5に対しては、bzip2はライバルではありません(というか
LZMAがbzip2を既に打ち負かしていた)。ライバルは王者のrkだけです
。

  stk5はその名のとおりtek5のサブセットですが、フルセットのtek5で
は、さらにLZMAの弱点らしきところを改良しようと予定しています。
LZMAでは僕が今までtek1〜tek4の開発を通して発見した有効なテクニッ
クの多くが使われていないのです。それは、このテクニックがレンジコ
ーダに対してはもはや足手まといになるからかもしれませんが、でもた
とえば先の273バイト制限のように、ただ試していないだけというもの
もあるわけです。そんなわけで、tek5になれば、さらに圧縮率が改善し
rkにさらに迫れるようになる可能性があります。その上、tek5になって
も展開速度はほとんど増えません(というか僕は展開速度に影響するよ
うなテクニックは知らないだけですが)。

  さて現状をまとめるとこうです。

    stk1 : フォーマット確定
    stk2 : フォーマット検討中(変更の可能性:3%)
    stk3 : フォーマット開発そのものを当面中断
    stk4 : フォーマット開発そのものを当面中断
    stk5 : フォーマット検討中(変更の可能性:5%)

  結局tek形式は、1個増えて2個減った、という感じですね。

  stk2に関しては、今のところ何も変わっていないので、今回のリリー
スは特にありません。stk5に関するリリースはこれです。

    http://k.hideyosi.com/bim2bi4m.lzh  (161KB)

  この中には3つの実行ファイルと1つのバッチファイルがあります。い
ずれも今の暫定版のstk5を生成したり、展開させたりするためのもので
す。今回は時間がなくてbim2bin内には組み込めませんでした。

  それぞれのファイルについてのライセンスは、memo.txtを読んでくだ
さい。LZMAのライブラリを使っている上に、その中で救えるものはでき
るだけKL-01にしてやろうとしているので、ライセンスがちょっとやや
こしいです。

  まあ結局はこれもベータ版なのですが、まあ次バージョンではOSASK
でstk5がサポートされて、そのときになったら、今のstk5とのフォーマ
ットの互換性はないかもしれませんが、とにかくこのくらいのサイズに
圧縮して使えるようになりそうだ、ということです。その目安を知って
暇つぶしが出来る、というだけのことです。

  圧縮するには、

prompt>enctk5 osask.bmp osask.tk

などとしてください。これで圧縮されます。細かいパラメータはなしで
す。とりあえずパラメータがデフォルトでも十分に圧縮されますから。
圧縮速度は、今までのbim2bin4よりもずっと速いです。これはひとえに
LZMAライブラリのおかげです。

  展開するには、

prompt>tstdstk5 osask.tk osask.bmp

です。

  最後に今後の予定です。まずはstk5のデコードルーチンを完成させま
す。stk5のデコードルーチンを書いているうちに、stk5フォーマットの
どこに手を加えるべきかも自然に分かると思うので、デコードルーチン
が完成すればstk5もフォーマットが確定します。

  そしてstk1とstk5がOSASKに組み込まれて、やっと本来の目的の
KHBIOSの開発がはじまるわけです。

  stk2については、それまでに確定すればOSASKに入れますが、確定し
ないかもしれません。確定しなければ、確定しないままにしておくつも
りです。圧縮形式の開発が主目的ではない以上、こればかりに時間をか
けてもしょうがないでしょうから。バランスの悪いtek0を引退させて、
KHBIOSでバランスのよい形式だけをサポートすることだけが重要なので
す。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! osask.jp
Homepage http://osask.jp/

ML番号でジャンプ
ML単語検索