Kの開発メモ #0010
- (by K, 2014.09.16)
- ここは川合の開発の進捗などをレポートするところです。
2014.09.16 Tue
- ひさしぶりの近況を。
- フロントエンドコードをもっと小さくしたくて、ついにレンジコーダに手を出しました。これをやると、もうバイナリエディタで内容を「読む」のは非常に難しくなってしまうのですが、しかし究極のサイズというものがどういうものなのか見たいということもあって、せっせと頑張っています。
2014.10.01 Wed
- このサイトのトップページのアクセス数がすごいです。たぶん定期的にチェックしてくれている人が結構いるのだと思います。その期待に応えたいです。今年度はキャンプ後も細々と継続的にやっていきますので、少しずつ前進できると思います!
2015.11.13 Fri
- rev3の構想があるのですが、まだ着手できていません。
- で、rev3にとりかかると大変なので、まずはrev2のままで、簡単にできそうなことはやってしまうことにします。
- このプログラムを書いて思ったのは、まず数値の出力にかなりサイズを食ってしまっているということです。なんと8.5バイトも使っています。全体が30.5バイトなので、28%も使っていることになります。複雑な書式とかは使えなくていいから、とにかく単純なやつがあればいいのにと思いました。仮に2バイト命令を新設すれば、それだけで24バイトまで小さくできます。
- また、定数400000000の扱いも不満です。10のベキ数をうまく表現できないかなと考えています。仮にこれが2.5バイトで書ければ3バイト減らせます。これで21バイトまでいけます。
2015.11.14 Sat
- フロントエンドコードのプレフィクス4について考える。
- プレフィクス4がもしなかったらこうなる。
- opeが4ビット:7個(0~6)
- opeが8ビット:57個(87~bf)
- opeが12ビット:448個(cc0~dff)
- プレフィクス4があるとこうなる(rev1, rev2)。
- opeが4ビット:6個(0~3, 5~6)
- opeが8ビット:63個(57+6)
- opeが12ビット:505個(448+57)
- なるほど、4ビット命令をひとつ犠牲にした代わりに、8ビット命令を6個増やして、12ビット命令を57個増やしたわけか。
- これを逆に考えれば、8ビット命令を6つ12ビット側に追い出すことにすれば、4ビット命令をもうひとつ増やすことができる。
2015.11.16 Mon
- for構文のcontinue周りを改良していたんだな。それに気づけなくて悩んでしまった。
- 今まで、命令コード長さは、Kの勘だけで調整されてきました。これはまあ正しいこともあるのですが、間違うことだってあると思うのです。そこで、どんな命令がどのくらいの頻度で使われているのかの統計を取って、それで命令コードの長さを再検討したらいいのではないかと思いました。今はそれをやっています。
2015.11.19 Thu
- OSECPU-VMはアプリが非常に小さくなる傾向があります。まあ何をいまさらという感じですが。これをどのように役立てたらいいのかと考えてみました。
- 可逆圧縮の研究の世界では、主にデータの圧縮に主眼を置いて研究していると思います。これは多くのユーザが持っているファイルのうち、容量の大きなものは実行ファイルではなくデータファイルなので、データファイルが小さくできないと、総容量は少ししか改善しないからです。
- ということで、コードが小さくなることそのものは、あまり大きなインパクトはありません。
- しかし一方で、コードも結局は作業手順を記した「データ」であり、これが半減するなどというのは尋常なことではありません。
- たとえばwindows用に書かれた2560バイトのインベーダゲームを、現在知られているもっとも強力な圧縮プログラムで圧縮したとしても、430バイトにはなりません。まあたとえば1000バイトになったとしましょう。これと430バイトとの差は570バイトもあります。なぜ570バイトもの無駄が残ったのか、それを解明する必要があります。
- そしてその過程で、きっとコードの圧縮に限定されないような、つまりデータの圧縮にも応用可能な、有意義な圧縮テクニックを見いだせるはずです。
- それは今の私の仕事ではないですが、でも誰もやらないなら私がいつかやりたいと思っています。
- 今はとにかくコードを限界まで究極に小さくすることに集中します。
2015.11.26 Thu
- OSECPU-VMには api_malloc_initInt() という命令があって、これを使うとmallocした上に指定した初期値で領域を初期化してくれるのですが、なんとこれにバグがあることが判明しました。原因は内部コードで==と!=を間違えていたという非常に情けないもので、そのせいで最初の1要素のみ初期化されて、ループがうまく回っていませんでした。これも次のバージョンまでには直します。
こめんと欄
|