こんにちは、川合です。
go_0020は僕としてはある意味「完成」と言えるものです。まあgcc.e
xeを作るという仕事はまだ残っていますが、とりあえずそれはおいてお
くことにして。
もうドライバ部分(gccに由来しない部分)の改良の余地はほとんど
ないでしょう。あ、そうか、naskのパワーアップをするという道もある
な。まあとりあえず今はこれも考えないことにします。
それで、あらためて全体像を眺めてみました。
go_0020sのソースは解凍すると合計18.5MB、610ファイルあります(
本当は611ファイルあるのですが、一個は僕が消し忘れたゴミです)。
内訳は、
・gcc由来部分 :17.9MB(388ファイル)
・ドライバやツール:437KB(116ファイル)
・そのほか(w32clibcなどのおまけライブラリ):ちょっと
gcc由来部分ファイル数はちょっと適当です。Makefileや僕が書いた
ヘッダファイルも含めて数えたので、ファイル数は10個前後の誤差があ
るかもしれません。しかしサイズに関しては、これらの合計でも0.1MB
未満しかないと思うので、正確だと思います。
17.9MBからすると437KBなどというのは2.4%ほどでしかなく、つまり
2.4%に改良の余地がないというのは、つまり残りの97.6%には改良の余
地があるということです。・・・なんて思ったので、軽い気持ちで、
gcc由来部分のソースを久しぶりに眺めてみました。
僕が見たのは、gcc/insn-attrtab.cというソースで、964KBもありま
す。・・・僕はすぐに絶句しました。これはひどいプログラムです。こ
んなものをgccユーザは使っていたのか、なんということだ、信じられ
ない、という感じです。
一方的にけなして嘆いていてもしょうがないので、とりあえず最初の
2つの関数だけを書き直してみました。どのくらい改善するのか判明す
れば、この問題をより深く考えられるだろうと思うからです。もちろん
書き直した関数も全く同じ動作をします(バグがなければ、ですが。一
応、go_0020sをコンパイルさせてみて同じオブジェクトファイルを生成
しているという確認はとりました)。
僕は結局、insn-attrtab.cというソースを次のようにいじりました。
・改変前:全部で40219行。このうちの2493行(6.2%)を改変。
・改変後:2493行は1525行にまとまった。これにより圧縮前のサイズで
cc1、cc1plus、osaskgoのいずれにおいても、14KB弱のサイズ縮小が
みられた。アルゴリズムは前よりもいいので、多分コンパイル速度も
0.1%くらいは改善しているかもしれない。
圧縮後のサイズで比較すると差は小さく、
cc1.exe : 2.0KB
cc1plus.exe : 2.0KB
osaskgo.bin : 3.1KB
となった。
これだけの改造に5日もかかってしまいました(このうちの3日はどう
すれば一番効率よくなるかを考えたりテストしたりするためのものでし
た)。5日頑張ってosaskgoが3KBだけ小さくなったと言っても、これは
喜ぶべきかどうかは微妙ではあります。ただ、gcc由来部分にはまだか
なりの改良の余地があることを実証できたと思います。それについては
以下をご覧ください。
今回はinsn-attrtab.cの6.2%の部分だけを改良しています。もし、こ
のソースの残りも全部書き直せば、cc1で32KB、osaskgoなら48KBの減量
になるでしょう(このサイズは圧縮後のサイズです)。
しかしこのinsn-attrtab.cも964KBでしかなく、これはgcc由来部分の
5.3%でしかありません。もし17.9MBのソースを全てチェックして書き直
せば、機能的な妥協を全くしなくても、cc1で608KB、osaskgoで912KBの
減量になります。・・・まあこれはちょっと虫がよすぎる気がするので
(理由は後述)、半分の304KBと456KBということにしましょう。そうだ
とすると、
cc1 : 851KB -> 547KB
cc1plus : 1025KB -> 721KB
osaskgo : 1123KB -> 667KB
という見積もりができます。おそらく、コンパイル速度もサイズに比例
する感じで、高速化されるでしょう。これを言い直すと、つまり今の
osaskgoのサイズの4割は、ただのゴミである可能性が高いということで
す。
ええとgcc作者の方々の名誉のために言いたいのですが、今回いじっ
たinsn-attrtab.cは、人間が書いたコードではなく、スクリプトが生成
したコードです。だからこれほど情けないプログラムだったのだろうと
思っています。人間が書いた部分は多分これよりはマシです(しかしス
クリプトが生成したソースは他にもまだたくさんあるのも事実です)。
また、17.9MBというサイズの中にはcpp0やcc1plusのみで使うコードも
含まれているので、osaskgoに影響しない部分もあります(しかし大半
はcc1とcc1plusの共通コードです)。その辺の差違を考慮して、減量
見積もりを半分にしました。
さてこの2KB/3KBほど小さくなったcc1、cc1plus、osaskgoですが、こ
こでリリースするか、たまにちょっとずつの改良を繰り返して10KBくら
いの差が付いてからにするか、それがちょっと悩みどころです。
それでは。
--
川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/