レベル-1: 関数は、ただのポインタとして持ち運べるのを見てそのシンプルさと柔軟さに感動する。
レベル-2: リンカの動作を説明できる。externを付ける必要性を理解する。
レベル-3: __attribute__((ctor))や、 __attribute__((dtor))の動きを説明できる。
レベル-4: __attribute__((weak))が利用できる場面を思い付く。
レベル-5: オブジェクトファイルと機械語とCプログラムの区別が無くなってくる。全部バイト列に見える
レベル-6: Cは、カリー化したり、クロージャ作ったりできることに気付く
レベル-7: Cコンパイラの都合によって生成されるコードが毎回変わるので困る。
レベル-8: むしろ関数のほとんどがインラインアセンブラで書いてある
レベル-9: それでもやっぱり-fomit-frame-pointerとかされると生成されるコードが変わるので困る。だんだんプログラムがmainと配列一個だけになってくる。
char prog[] = { 0x68, 0x6f, 0x2e, 0x0a, 0x00, 0x68, 0x48, 0x65, 0x6c, 0x6c, 0x89, 0xe1, 0xb8, 0x04, 0x00, 0x00, 0x00, 0xbb, 0x01, 0x00, 0x00, 0x00, 0xba, 0x07, 0x00, 0x00, 0x00, 0xcd, 0x80, 0x83, 0xc4, 0x08, 0xc3 }; typedef void (*func_t)(); int main() { ((func_t)prog)(); return 0; }
レベル-10: むしろnasmとかみたいなちゃんとしたアセンブラを使ったほうが楽だったことに気付く。
それは無い。