2015/04/14

4/14/2015
 ネットを放浪していて見つけた「お前なんかハッカーじゃない」という言葉。
 他人を罵倒しているのかと思って観てみたのですが、これ、本人の頑張りが凝縮された濃厚な記事だった。

 筆者はシステム業界に20年以上勤務しており、顧客との折衝が増える中、未だに実装もやっているので、技術者と言って良い部類の人種だと思います。
 ただハッカーというと一線を飛び越えたところにいる人たちという感覚があり、憧れがある中で自分はなれないんだろうなぁとそんな感覚があります。
 しかし、筆者は技術者ということに一定のプライドがあり、考え続けること、理想に向けて進んでいくことにはこだわりがあります。
 広い意味ではハッカーに入ってるのかもしれません(探求者という意味で)。

 そんな筆者が先ほどの記事を読んで思った感想は、そうだ、僕も駆け出しの頃に思っていた。いつもの打ちのめされていた(今もかも)というもの。
 その都度僕の心情は、「この業界が好きだろ、理解するしか無いんだ、それしか無いんだ」というもの。

 記事の中に、C言語のポインタ洗礼を受けたという記事がある。実は僕も洗礼を受けた。これは手痛く打ちのめされた。
 C言語は広島コンピュータ専門学校で習ったのだが、当時19歳でZ80アッセンブラや6809アッセンブラで遊ぶ少年にもポインタは難しかった。
 当時のパソコンは性能が限られていたので、性能を引き出そうとするとCPUが直接わかる低レベルな命令を直接生成する方法が必要だったので、アッセンブラ(マシン語です)を使う人、結構多かったです。
 筆者は一番機械に使い制御方法を知っていたにも関わらず、C言語のポインタが難しかった理由は、C言語では論理の抽象化に挑戦している点でした。
 アッセンブラではメモリの場所をアドレスと言います。機械の中ではメモリ装置には1バイト毎に番号が付与されており、それをアドレス(住所)といい、このアドレスで識別できるようになっています。
 100バイト目に格納せよ指示すれば、そのように格納するし、100バイト目を読み出せよ言えば読み出す。非常に直接的でわかりやすい。(マクロアッセンブラなどではアドレスに変数名をつけることが出来、多少抽象化可能です)
 ですが、C言語では以下の様に書き、直接的に何をしているのかわからなくなります。
main(){
   char buf[100];            /* 100バイトのエリアを確保せよ */
   char *b = "helloworld";    /* helloworld+NULL がセットされた領域を準備し、それの先頭アドレスを char型のbにセットせよ */
   memcpy (buf,b,strlen(b));  /* bufの領域に、bの文字列をコピーせよ。長さは bの文字列のNULLドメまで。 */
}

 さあ、大変です。上記は、bufの100バイトエリアに、helloworldと言う文字列をセットせよというプログラムです。
 たったこれだけでも、バグが入っています。例えば、C言語における文字列の扱いは、文字がじまってから、NULLがあるまでとなるのですが、前述のサンプルbufは初期化していないので、helloworldの次のエリア(11バイト目)は何がセットされているかわからないのです。
 そのため、printf(buf);とのコードで、bufの内容を標準出力に出力すると、helloworldと出力される場合もあるし、helloworldxxx@@xooxなどと化け文字が表示されることもあるということになってしまいます。
 このあたりは、動作系の状況にもよるので、なかなか完結に説明はつきません。
 簡単なことをしたくても、入り口はそれほど大きく開いていません。C言語はデニス・リッチーとブライアンカーニハンいう数学者が作ったものです。
 コンピュータを使い尽くそうとするなら、コンピュータ自信の言葉、アッセンブラで使い倒すのが最も効率的です。
 ただ、洗練されたプログラムを、コンピュータ専用にいちいち用意していたのではいくら時間があっても足りません。
 そこで考え尽くして、機械語に近く、しかし抽象化を実現しうるもの、抽象化してあるもは具体的でないがゆえに動作系を限定しない。優れた動作系がアレばすぐにそこに引っ越せる。それをむちゃくちゃ考えぬいて作られたのがC言語
 彼らはそれを使ってUNIXシステムを作り上げた。というより、UNIXシステムを作るためにC言語を設計した。
 メモリ管理は自由にできるが、言語仕様において管理(マネージ)しない。
 それがベストなバランスだった。
 でもそれがニューカマーを選別する。
 仕方ないものかもしれない。ただ、考えてもらいたい。作る側も必死にやったんだ本当に。C言語では、言葉と数式の一体化まで挑戦していると思っている。
 だから、腐らずやってみようでははないか。挑戦してみようではないか。世の中は広い。本当に広い。C言語に限らずいろんな技術が満ち溢れている。
 挑戦しようとしているものを勇気づけてやろうではないか。

0 コメント:

コメントを投稿