1: 2008-12-21 (日) 00:15:12 |
2: 2008-12-21 (日) 01:22:15 |
| -(by [[K]], 2008.12.20) | | -(by [[K]], 2008.12.20) |
| -メモのうち重要な部分をそのうちまとめてまともなページを作る | | -メモのうち重要な部分をそのうちまとめてまともなページを作る |
- | *** (29) 近況 | + | *** (29) 2008.12.20近況 |
| -ここ1週間ほどの開発がここ数年で最高に充実していてかつ面白かったので記念でメモ。 | | -ここ1週間ほどの開発がここ数年で最高に充実していてかつ面白かったので記念でメモ。 |
| -少し前からOSASK-IRCにneriさんが常駐してくれていて、それでCOM64-GREの改良の話をしました。いろいろと改良してアーカイブ風になったあと、もっとコンパクトの役に立つ仕様にしたいということで、二人でどうしたらいいかを話し合いました。長すぎるシグネチャを短くするべきか、みたいなところが出発点だったと思います。こうしてCOM64plusの開発が始まりました。シグネチャを4バイトにするべきか2バイトにするべきか、そこも悩ましいところでした。 | | -少し前からOSASK-IRCにneriさんが常駐してくれていて、それでCOM64-GREの改良の話をしました。いろいろと改良してアーカイブ風になったあと、もっとコンパクトの役に立つ仕様にしたいということで、二人でどうしたらいいかを話し合いました。長すぎるシグネチャを短くするべきか、みたいなところが出発点だったと思います。こうしてCOM64plusの開発が始まりました。シグネチャを4バイトにするべきか2バイトにするべきか、そこも悩ましいところでした。 |
- | -それでneriさんは「ぐいぐい01」に採用されているテクニックを貪欲に吸収し、起動時に小アプリ一般にとって有利になるようなレジスタ初期値を採用して、なんとhello+.comのサイズが「ぐいぐい01」のhello(このときは27バイト)を下回る25バイトで書けるまでになりました。僕は「負けたあ」とその日はあきらめて寝ました。 | + | -それでneriさんは「ぐいぐい01」に採用されているテクニックを貪欲に吸収し、起動時に小アプリ一般にとって有利になるようなレジスタ初期値を採用して、なんとhello+.comのサイズが「ぐいぐい01」のhello(このときは27バイト)を下回る25バイトで書けるまでになりました。僕は「負けたあ」とその日はあきらめて寝ました。たしかcharsも負けました。 |
- | -しかし寝ているうちにアイデアを大量に思いついたので、それを翌朝全部neriさんに聞いてもらって、どう思うか感想をききながら検討しました。それやるくらいならむしろこうしたほうがいいとか、それはいかにもhello専用の仕様過ぎて好ましくないとか、そんな感じの話をしました。そして結局hellok2.g01は22バイトまで行きました。neriさんのhello+.comは21バイトになりました。これは相当に「おかしい」サイズで、DOSの22バイトよりも小さいのです(註:この文脈での「おかしい」は最高の褒め言葉)。 | + | -しかし寝ているうちにアイデアを大量に思いついたので、それを翌日全部neriさんに聞いてもらって、どう思うか感想をききながら検討しました。それやるくらいならむしろこうしたほうがいいとか、それはいかにもhello専用の仕様過ぎて好ましくないとか、そんな感じの話をしました。そしてneriさんもいろいろとアイデアを出して結局hellok2.g01は22バイトまで行きました。neriさんのhello+.comは21バイトになりました。これは相当に「おかしい」サイズで、DOSの22バイトよりも小さいのです(註:この文脈での「おかしい」は最高の褒め言葉)。これに勝てるのはバッチファイルで"@echo hello, world"の18バイトくらいなものでしょう。文句なくx86世界最小だと思います。 |
- | | + | -またchars+.comはついに15バイトにまでなり、でも「ぐいぐい01」もがんばって16バイトまではきました。もとが33バイトだったのに16バイトだなんてもはや半減です。DOS版が17バイトなので、やはりこれもneriさんは世界記録保持者だと思います。 |
- | | + | -その後さらにもう一段僕が改良し(これはneriさんには応用しにくい改良)、helloは何とかneriさんに追いつきました。これで世界記録タイです。charsは追いつけませんでした。またechoも作りました。neriさんは作ってないので比べられません。 |
| + | -以下にここまでの成果(多分これが限界でもあると思う)を書いておきます。 |
| + | | |hello |hello-c |chars |echo |echo-c | |
| + | |abcdw006用 |RIGHT:27 |RIGHT:86 |RIGHT:33 |? |RIGHT:156 | |
| + | |abcdw007用 |RIGHT:''21''|RIGHT:''71''|RIGHT:16 |RIGHT:''19''|RIGHT:''75''| |
| + | |COM64plus用|RIGHT:''21''|検討中? |RIGHT:''15''|? |? | |
| + | |DOS用 |RIGHT:22 |? |RIGHT:17 |RIGHT:''19''|? | |
| + | --註:echoはargv[0]が見えても見えなくてもよい。 |
| + | --echoはもちろんジャンクAPIで実現しているが、ジャンクAPIはジャンクであるというマークがついている分だけ実行ファイルが長くなる傾向がある。もし他の部分は一切変えずに本仕様に昇格させれば、それだけでechoもecho-cも2バイトは縮むだろう。 |
| + | -abcdw006→abcdw007の仕様変更はかなり大きなもので、基本的にバイナリ互換はありません。ソース互換すらほどほどしかありません。大規模改造なので僕も非常に苦労しています(アプリの移植はそれほどでもないけど、efg01の改造が大変)。 |
| + | -これはまさに「乾いた雑巾を絞る」レベルの改良で、その中にあってcharsが半減したり、echo-cが半減したりと、ちょっとありえない劇的な進歩になっています。それもこれもみんなneriさんの協力のおかげです。・・・neriさんなしで一人でやっていたらこの設計に到達するまでに1年間はかかったと思います。あとやぱっぱりabcdw006までで小さいアプリをたくさん作ってきて、ボトルネックというか、「こんな仕様だったらいいのに」を実感していたのもあると思います。 |
| + | -それにhello-cも static char s[18] = "\x35\x01\x24\x8d" "hello, world\n" "\x23"; なんていういかにも「うさんくさい」「こんなの普通書くわけない」といった方法での86バイトだったのが、 g01_putstr0("hello, world"); という普通の書き方で71バイトになるようになっています。汚く書いたらもう少し小さくなるかもしれませんがまああまり変わらないでしょう。 |
| + | -という劇的な大進歩なので、互換性がちょっと不足気味だったりリリースにてこずったりしても、どうか大目にみてください。 |
| * こめんと欄 | | * こめんと欄 |
| #comment | | #comment |