12: 2008-12-23 (火) 14:22:47 |
13: 2008-12-24 (水) 07:57:41 |
| -(12.21追記)neriさんは起動時のECX初期値をコンパクトに設定できる形式を導入して1バイトの削減に成功。これでほぼ全てのアプリが1バイト以上小さくなることに。僕も負けじと考えて出現頻度の非常に高いパラメータを省略できるように改良。これで多くのアプリが1バイト以上小さくなることに。 | | -(12.21追記)neriさんは起動時のECX初期値をコンパクトに設定できる形式を導入して1バイトの削減に成功。これでほぼ全てのアプリが1バイト以上小さくなることに。僕も負けじと考えて出現頻度の非常に高いパラメータを省略できるように改良。これで多くのアプリが1バイト以上小さくなることに。 |
| -(12.22追記)昨日neriさんがオプションでCALL(EBP);をコードに追加する機能を付けるべきなんじゃないかと提案しました。この機能を付けるべきかいろいろ試行錯誤した結果、確かに付けたほうがいいと僕は判断しました(.g01の場合は先頭に付ける、COM64plusの場合は末尾に付ける)。またコマンドライン取得APIの仕様が勘違いで間違っていたことに気付いて修正したところ、このAPIが更に使いやすくなりました。これでまたサイズがかなり減っています。なおneriさん自身はまだCALL(EBP);の自動付加オプションをやるという決断にはいたっていないようです(でもきっとあとでやるとは思う)。helloが18バイトで書けるということは、ついにバッチファイルともタイだということです。ちなみにechoの13バイトはバッチファイルで"@echo %1 %2 %3"って書くだけで14バイトなので、すでにバッチファイルにも十分に勝っていると思います。 | | -(12.22追記)昨日neriさんがオプションでCALL(EBP);をコードに追加する機能を付けるべきなんじゃないかと提案しました。この機能を付けるべきかいろいろ試行錯誤した結果、確かに付けたほうがいいと僕は判断しました(.g01の場合は先頭に付ける、COM64plusの場合は末尾に付ける)。またコマンドライン取得APIの仕様が勘違いで間違っていたことに気付いて修正したところ、このAPIが更に使いやすくなりました。これでまたサイズがかなり減っています。なおneriさん自身はまだCALL(EBP);の自動付加オプションをやるという決断にはいたっていないようです(でもきっとあとでやるとは思う)。helloが18バイトで書けるということは、ついにバッチファイルともタイだということです。ちなみにechoの13バイトはバッチファイルで"@echo %1 %2 %3"って書くだけで14バイトなので、すでにバッチファイルにも十分に勝っていると思います。 |
| + | -(12.24追記)CALL(EBP);をやめてCALL([ESI]);にすることにしました。これだとEBPがあくので好きなことができます。バイト数は変わりません。 |
| -以下にここまでの成果(多分これが限界でもあると思う)を書いておきます。[2008.12.22更新] | | -以下にここまでの成果(多分これが限界でもあると思う)を書いておきます。[2008.12.22更新] |
| | |hello |hello-c |chars |echo |echo-c | | | | |hello |hello-c |chars |echo |echo-c | |
| -「こんな互換性に問題の出るバージョンアップが繰り返されたら安心してアプリを作れないじゃないか!」というのはもっともです。「いったいいつになったら落ち着くんだ?」といいたくなるでしょう。しかしこれは永遠に続くわけではないのです。というのはたとえばhelloは文字列だけで13バイトあって、しかも.g01のシグネチャだけで2バイトあるのですから、これだけでも最低15バイトは必要です。これより小さくなることはありえません(一般的なAPIとして不適切な設計にしない限り)。もちろんテキストファイルじゃないので他にも書かなければいけない何らかの情報やプログラムがあるわけですから、本当の限界はもっと大きい値でしょう。どのアプリもAPIを改良すればどこまでも小さくなるわけではないのです。限界があるのです。その限界に達してしまえば、それ以上どんなにいじってもより小さくなることはないので、仕様のバージョンアップが起きることはないはずです。 | | -「こんな互換性に問題の出るバージョンアップが繰り返されたら安心してアプリを作れないじゃないか!」というのはもっともです。「いったいいつになったら落ち着くんだ?」といいたくなるでしょう。しかしこれは永遠に続くわけではないのです。というのはたとえばhelloは文字列だけで13バイトあって、しかも.g01のシグネチャだけで2バイトあるのですから、これだけでも最低15バイトは必要です。これより小さくなることはありえません(一般的なAPIとして不適切な設計にしない限り)。もちろんテキストファイルじゃないので他にも書かなければいけない何らかの情報やプログラムがあるわけですから、本当の限界はもっと大きい値でしょう。どのアプリもAPIを改良すればどこまでも小さくなるわけではないのです。限界があるのです。その限界に達してしまえば、それ以上どんなにいじってもより小さくなることはないので、仕様のバージョンアップが起きることはないはずです。 |
| -現状を見てください。なんかもうひどく限界に近い気がしませんか?まあ僕だってabcdw006の段階で既に限界だと思っていました。だからそういう「感じ」が必ずしもあてになるわけではないのですが、しかし大いに参考になる目安だとは思います。・・・早く限界に近づかせる方法は、サイズを追求する人がさらに増えて、この分野の研究が進むことしかないでしょう。 | | -現状を見てください。なんかもうひどく限界に近い気がしませんか?まあ僕だってabcdw006の段階で既に限界だと思っていました。だからそういう「感じ」が必ずしもあてになるわけではないのですが、しかし大いに参考になる目安だとは思います。・・・早く限界に近づかせる方法は、サイズを追求する人がさらに増えて、この分野の研究が進むことしかないでしょう。 |
- | -以下にabcdw006との比較を書いておきます(全部C言語のみ)。[2008.12.23更新] | + | -以下にabcdw006との比較を書いておきます(全部C言語のみ)。[2008.12.24更新] |
- | | |pi |calc |cpy |makefont |bim2hrb |sjisconv |gas2nask |nask |obj2bim |bim2g01 | | + | | |pi |calc |cpy |makefont |bim2hrb |sjisconv |gas2nask |nask |obj2bim |bim2g01 |bin2obj | |
- | |abcdw006用|RIGHT:241|RIGHT:1583|RIGHT:612|RIGHT:691|RIGHT:987|RIGHT:912|RIGHT:(5114) |RIGHT:23314|RIGHT:7211|RIGHT:1956| | + | |abcdw006用|RIGHT:241|RIGHT:1583|RIGHT:612|RIGHT:691|RIGHT:987|RIGHT:912|RIGHT:(5114) |RIGHT:23314|RIGHT:7211|RIGHT:1956|RIGHT:983| |
- | |abcdw007用|RIGHT:206|RIGHT:1520|RIGHT:387|RIGHT:440|RIGHT:768|RIGHT:644|RIGHT:5007|RIGHT:23040|RIGHT:6902|RIGHT:1790| | + | |abcdw007用|RIGHT:205|RIGHT:1521|RIGHT:386|RIGHT:439|RIGHT:766|RIGHT:644|RIGHT:5001|RIGHT:23040|RIGHT:6903|RIGHT:1792|RIGHT:732| |
- | --(註)piは.hrb版の229バイトに対して逆転に成功。 | + | --(註)piは.hrb版の229バイトに対して逆転に成功。参考までに書いておくとcalc.hrbは1668バイト。 |
| --calcはこのサイズより小さくCで書く方法がないということではない。オリジナルのhrb版のソースにできるだけ近いソースを使わなければいけないという制約を自ら科しているためにこのサイズに留まっている(コマンドラインバッファをより長くすることだけは許される)。 | | --calcはこのサイズより小さくCで書く方法がないということではない。オリジナルのhrb版のソースにできるだけ近いソースを使わなければいけないという制約を自ら科しているためにこのサイズに留まっている(コマンドラインバッファをより長くすることだけは許される)。 |
| * こめんと欄 | | * こめんと欄 |