/ «2006-08-19 (Sat) ^ 2006-08-23 (Wed)» ?
   西田 亙の本:GNU 開発ツール -- hello.c から a.out が誕生するまで --

Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール


2006-08-20 (Sun)

[Publish] GNU 開発ツール・内容紹介 (その1)

手順から理解へ

Computer Architecture Series をはじめるにあたり、最初のテーマとして何を選択するかについては、長期間にわたり検討を続けました。悩み抜いた結果、現代 UNIX プログラマーの右腕とも言える、GNU 開発ツールがふさわしいだろうと判断しました。

どのような職業でもそうだと思いますが、基本となる仕事道具の使いこなしは、簡単なようでいて大変難しいものです。しかも、明文化された操作説明書やノウハウ集は、まず世の中には存在しません。

さらには世の趨勢として、道具は "バカチョン式" が主流となっており、基本を習得せずともそれなりの仕事がこなせるようになってしまいました。こうして "基本離れ" に益々拍車がかかり、年配の方々の口からは「今の若いもんは・・」と古代エジプトでパピルスに記されて以来の決まり文句が流れます。しかし、本当に悪いのは "今の若いもん" なのでしょうか?

本屋に行けば一目瞭然ですが、専門書コーナーには "手順書" が所狭しと並ぶばかりで、基本の理解を説く本は皆無に近い状況です。手順は書かれていても、"なぜそうする必要があるのか” 説明がありません。

初心者に与えられるハードウェアやソフトウェアは高度に複雑化したものばかりで、一個人が理解できるレベルを遙かに超えています。基本を理解したくとも、あまりに複雑かつ冗長な構造が視界と行く手を遮り、先に進めません。結果、彼らの心に残るのは、敗北感ばかり・・。

かく言う私自身も、20年以上にわたりこの "敗北感と疎外感" に悩まされてきた一人です。救われたい一心で、これまで膨大なお布施を投じてきましたが、御利益を実感できた本は、数えるほどしかありません。それも多くは断片的な知識に過ぎず、体系だった理解へと導いてくれた書籍には、不幸にしてまだ出会えていません。

私が最初にコンピュータに出会ったのは1980年のことですが、Computer Architecture Series は、当時の私自身を読者に想定しています。

理解する喜び the Joy of Understanding

仮想読者としての当時の私に、単なる手順の習得ではなく、"理解する喜び" を送り届けることが、本シリーズのテーマです。

gcc hello.c に隠された謎

さて、GNU 開発ツールにも "バカチョン式" コマンドとして gcc が用意されています。

$ gcc hello.c

世の中の教科書は「はい、a.out が出来ました。実行すると Hello, world! が現れましたね。それでは次に進みましょう」という具合ですが、Computer Architecture Series 第一弾となる "GNU 開発ツール" はこの一行の意味を解説するために、全220ページを費やしています。

ここで、コマンドラインに -v オプションを付加してみてください。

$ gcc -v hello.c
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.5/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --enable-__cxa_atexit --with-system-zlib --enable-nls --without-included-gettext --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.5 (Debian 1:3.3.5-13)
 /usr/lib/gcc-lib/i486-linux/3.3.5/cc1 -quiet -v -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=5 hello.c -quiet -dumpbase hello.c -auxbase hello -version -o /tmp/ccVz4JNp.s
GNU C version 3.3.5 (Debian 1:3.3.5-13) (i486-linux)
        compiled by GNU C version 3.3.5 (Debian 1:3.3.5-13).
GGC heuristics: --param ggc-min-expand=38 --param ggc-min-heapsize=15929
ignoring nonexistent directory "/usr/i486-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc-lib/i486-linux/3.3.5/include
 /usr/include
End of search list.
 as -V -Qy -o /tmp/ccM81NuJ.o /tmp/ccVz4JNp.s
GNU assembler version 2.15 (i386-linux) using BFD version 2.15
 /usr/lib/gcc-lib/i486-linux/3.3.5/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc-lib/i486-linux/3.3.5/../../../crt1.o /usr/lib/gcc-lib/i486-linux/3.3.5/../../../crti.o /usr/lib/gcc-lib/i486-linux/3.3.5/crtbegin.o -L/usr/lib/gcc-lib/i486-linux/3.3.5 -L/usr/lib/gcc-lib/i486-linux/3.3.5/../../.. /tmp/ccM81NuJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc-lib/i486-linux/3.3.5/crtend.o /usr/lib/gcc-lib/i486-linux/3.3.5/../../../crtn.o

呪文のようなメッセージ群は、gcc コマンドが "陰に隠れてこっそり" 行っているビルド作業の真の姿をあらわしています。"GNU 開発ツール" が220ページを必要とした理由は、この呪文を解読し、作業の内容を理解するためです。

gcc hello.c はあくまでも手順に過ぎず、この知識だけでは応用には結びつきませんし、make の途中でエラーが発生しても適切な対処は難しいでしょう。しかし、ビルドの基本工程と、プログラムの基本構造を理解しておけば、ほとんどのエラーに対して自信を持って対処できるようになるはずです。

私は、

すべての応用は、基本の延長線上にある

と考えていますが、"GNU 開発ツール" もこの精神に基づいて執筆しました。

感謝

実は、昨晩予約開始のメッセージを tDiary に登録する際、しばらくの間 "追記" ボタンが押せませんでした。ボタンを押す前に再度目次をチェックし、「読者の方々に、この内容で納得してもらえるだろうか」と自問自答、自問自答・・。

意を決して追記すると、ほどなくして予約完了のメールが転送され始めました。休日中にもかかわらず、1日を経ずして100名を超える方々から予約を頂いています。

さらには、有り難いことに多くの応援コメントまで頂きました。自費出版に挑戦したもうひとつの理由は、商業誌上での執筆では、読者の方々からの声がほとんど私まで届かなかったことにありますが、今回こうしてたくさんのメッセージを頂けただけでも、敢行した意味があったと思います。

読者の皆様に、この場を借りてお礼を申し上げます。