|
|
素晴らしい後輩に感動
| 2006/10/01(日) 14:23:35
|
ひさしぶりに GCC の Wiki を見に行ってみたら (絶賛放置中ですいません…), やたらページが増えている.どうやら学部時代の超優秀な後輩 (研究室は違う.僕は知識情報学系の G 研究室.当時彼はセマンティックウェブとかネットセキュリティをやってる研究室で,今は OS 系の研究室だったはず) のココサブ君ががんばっているようだ.期待 (笑)
ココサブログ
僕は今 tcc を読んでいるのですが,gcc に比べると死ぬ程読みやすい (あたりまえ).それでも 1 万行以上あるのですが,この程度の関数呼び出しの深さならば,なんとかトップダウンでも読んでいけます.
TCC は素晴らしい
いや,ホント,gcc は化け物ですよ.あれは.main から降りて行こうとすると,たちまち迷路になります w
main -> toplev_main -> do_compile -> compile_file ->lang_hooks.parse_file
この時点でもそうとうな深さです.GCC はコンパイラの集合なので,異常にコードが抽象的になってます.んで,この時点で,まず lang_hooks が何者なのか (関数ポインタが大量にメンバになっていて,C で疑似的なオブジェクト指向が実現されています),具体的に呼び出されるのは何か (フロントエンドによって初期化されて決まる) など,一気に読まなければならないコードが爆発します.また,データ構造もかなり凝った作りになっているので,tree.h tree.c tree.def あたりのからくりも理解しないといけません (ここらへんの知識は tcc を読むのにもすごく役に立った.もしかして gcc は,いろんなコンパイラのお手本になってるのかな ?).
# ここらへんが参考になるかも.僕が shinh さんと wo さんの記事を頼りにだいたいここらへんを見終わった後に,ssato さんの記事が出たので,もっと早く出してよ〜 もうそこらへんは知ってるよ〜 (無茶 w),と思ったものです.
2006-04-04 Mudflap (3): main () から mudflap の初期化まで (その二) 2006-09-07 Mudflap (4): mudflap ランタイムの初期化 (その一)
その点 tcc は,C 言語限定な上,1 パスコンパイラ (一切中間言語を経由せず,アセンブル,リンクまで一気に行う)
main() -> tcc_new() ; parse_args() ; tcc_set_output_type() ; tcc_add_file() -> add_file_internal() -> tcc_compile(); tcc_free() ; tcc_output_file() OR tcc_run() -> tcc_delete();
と,容易に全体像が把握できます.というか,libtcc としてライブラリ化までして API が公開されているぐらいですから,一回使うとすぐに中身が理解できます.
理想的には,gcc クラスの巨大ソフトウェアは,ライブラリ化されていて,各コンポーネントをバラバラに扱うことができれば良いのでしょうが,gcc は効率のため全体が一枚岩になっている (ように,私のような素人には見える) ので,非常に理解しにくい.
# ただ,これは,RMS のポリシーで,企業などが容易にバックエンドを作れないように,意図的に各フェイズの間のインタフェースがわかりにくくされているという面もあるみたい.
そんなこんなで,gcc は私には荷が重すぎました.まずは tcc で腕を磨いてから,再び gcc の方に参加する所存であります.
しっかし,僕が高々 1 万行のコードをグダグダ読んでいるのに対して,世の中には 10 万行のコードを一年間に書いてしまう人もいるのだよなぁ.
My Life Between Silicon Valley and Japan ■[コラム] 10年連続10万行の男
「いや、コード見てわかるんですよ。書いている奴が、食事しているときと寝ているとき以外は、ずーっとプログラム書くか勉強しているかのどっちかだってことが、コード見てわかるんですよ。それも十年以上、そういう生活をしているのが、わかるもん。すげーなぁと思いますよ。そいつ一人だけですよ。」
現代のポール・エルデシュですな.やはり,何かを極めるというのは,こういうことなのだと思います.
シリコンバレーからの手紙 (17) 天才プログラマの身体 梅田望夫
そんな思い上がった気持ちを持ったとき、「Emacs」という名のエディタ(文書編集)ソフトが「ソフトウェア世界の最高峰だ」という噂を聞いた。MIT (マサチューセッツ工科大学)のリチャード・ストールマンという天才プログラマーが書いたものらしい。邦宏はさっそくその「Emacs」のソースコードを手に入れて読み始めた。ソースコードは数十万行に及び、最初は意味がよくわからず、結局、読了するまで三カ月以上かかった。 「リチャードの書いたプログラムにはスタイルがあった。あばら屋でないれっきとした構築物でした。これは作品なんだ、文学と同じような芸術作品なんだ、と心から理解しましたね。それで、俺もこういうことがやりたいなぁ、これなら俺もできるぞ、と思ったんです」 アルバイトの延長線上でソフト会社に就職し、少しでも面白い仕事があれば転職するという根のない生活を続けながらも、プログラミングの才能について自信を深めていた邦宏は、「自分の作品」と自信を持って言えるプログラムを開発する決心をする。一九九五年、二十八歳のとき。それはちょうどインターネット新時代が到来した時期と重なっていた。
3 ヵ月で数十万行読み切るというのも凄まじい話だ.ましてや,偉大すぎる変態 Lisper (褒め言葉) RMS の書いたコードを.まさしく,氏のブログのタイトル通り.
人生で必要なことは全てソースコードから学んだ(わけではないけど)[改]
# umeda 氏のゲストブログ
しっかし,仮に 5 万行のコードを毎年書き続けたとしても,GCC を作るには 10 年かかるのか,と考えると,いろいろゾっとするな.
「デーモン君のソース探検」 の中で,巨大化してしまった後のコードを読むのは至難の技なので,まずは古いバージョンのコードを読んでスタイルを掴もう,みたいな記述があったなぁ.RMS のスタイルを掴むためには,たとえ遠回りに見えても,まずは gcc の 1.0 あたりを読んでみるべきなのかもしれない.
GCC の old version archive を見る限り,gcc-1.21.tar.bz2 というのが,一番古い感じだ.しっかし,lions 本の UNIX 6 が読みにくいのと同じ理由で,古いコードはいろいろ読みにくいかもしれない.ざっと眺めた感じ,tree.def とかのトリックは,このころから既に使われていたようだ.vax とか m68k とかの md (Machine Depend routine ; ターゲット依存) ファイルが歴史を感じさせる.ns32k.md とか spur.md とか,謎のターゲットも.
~/src/gcc-1.21$ ls COPYING cpp.info genoutput.c obstack.c stupid.c ChangeLog cpp.kys genpeep.c obstack.h symout.c INSTALL cpp.pgs genrecog.c optabs.c symseg.h Makefile cpp.texinfo global-alloc.c output-m68k.c texinfo.tex NS32K.README cpp.tps gnulib.c output-ns32k.c tm-3b1.h PROBLEMS cpp.vrs hard-reg-set.h output-spur.c tm-hp9k320.h PROJECTS cse.c integrate.c output-vax.c tm-hp9k320g.h README dbxout.c internals output.h tm-isi68.h TAGS decl.c internals-1 parse.h tm-m68k.h assert.h emit-rtl.c internals-2 parse.output tm-news800.h basic-block.h emit-rtl.c~ internals-3 parse.tab.c tm-ns32k.h c-tree.h explow.c internals-4 parse.y tm-sequent.h cccp.c expmed.c internals-5 print-tree.c tm-spur.h cexp.c expr.c internals-6 recog.c tm-sun2.h cexp.y expr.h internals.aux recog.h tm-sun3.h combine.c final.c internals.dvi regclass.c tm-ultrix.h conditions.h fixincludes internals.texinfo regs.h tm-vax.h conf-hp9k320.h flags.h jump.c reload.c tm-vms.h config-hp9k3.h flow.c limits.h reload.h toplev.c config-m68k.h fold-const.c local-alloc.c reload1.c tree.c config-ns32k.h gcc.1 loop.c rtl.c tree.def config-spur.h gcc.c m68k.md rtl.def tree.h config-vax.h gdbfiles.h machmode.def rtl.h typecheck.c config-vms.h gencodes.c make-cc1.com spur.md varargs-spur.h cpp.aux genconfig.c make-cccp.com stdarg.h varargs.h cpp.cps genemit.c make.com stddef.h varasm.c cpp.dvi genextract.c move-if-change stmt.c vax.md cpp.fns genflags.c ns32k.md stor-layout.c version.c
今ではあれだけ巨大な gcc も当時はいっこのディレクトリに収まるぐらいだったんだなぁ… それでも 10 万行近いけど.*.c と *.h で 76359,全部で 124136 lines らしい.856 K ,今の gcc-core-4.1.1.tar.bz2 は 16688 K ! 約 20 倍である.gcc-4.1.1/*/*/* の深さまでの *.c *.h *.def だけでも 680960 linse (そしてこの他にも,数え切れない程の md ファイルが.それを含めると,だいたい倍 1128786 lines (*/*/*.md */*/*/*.md)).
ものすごくどうでもいいけど,世界トップクラスのプログラマの,一応北大の 21 下の後輩 (僕が 3 歳の時 (1986 年) に,石黒邦宏氏は北大に進学したらしい.学部も何もかも違って何の関係も無いけど w) というのは何かうれしい (^-^)
僕がリアルに知っている凄いプログラマ数名も,北海道の寒い地方出身らしい.そういえば,Linus も寒い地方出身だ.なんか,東北とか北海道とかフィンランドとか,寒い所で育つと,プログラマとしての資質が生まれつき身に付くのかもしれない w 外に出なくても (というか,冬場は物理的に出れない) ,人に会わなくても全然平気とか.
とにかく素晴らしい.勇気をもらいました.
|
C 言語/コンパイラ/BinaryHacks|TB:1|CM:0|
|

▲
| |
|
コメント
| |
|
コメントの投稿
|
|
|
トラックバック
|
『> ちょっと長いコメント』
等価変換な日々にて僕の名前が挙がっていたりして、引用もコメントも長くなりそうなの |
|
ココサブログ|2006/10/02(月) 01:32 |
トラックバックURLはこちら
http://alohakun.blog7.fc2.com/tb.php/479-8ed4e24c
| |
|
|
最近のコメント
| |
| リンク
| |
このブログをリンクに追加する
| 最近のトラックバック
| |
| 人生の残り日数
| |
日本人男性の平均寿命は 28700日.
| RSSフィード
| |
| カテゴリー
| |
|
|