いものやま。

雑多な知識の寄せ集め

私のコード履歴書。(その2)

前回の続き。

大学(後半)〜大学院

そんなわけでPerlでいろいろ遊んでたんだけど、世間はオブジェクト指向だってことでJavaも勉強したりした。 時期的にはジェネリクスや拡張for文が導入されたり、AWT&AppletからSwing&Java Web Startへ移行したりという時期のはず。 もっとも、そんなのは使えずにCに毛の生えたようなコード書いてたけど・・・

Javaの印象は「やたら大袈裟だなぁ」という感じだった。 Perlだったら文字の入出力なんて何も考えずにできたし、Cでもそこまで大袈裟ではなかったけど、Javaだとラップしてラップしてと、なんでこんなになってるのかと。 main()を書くにしてもクラスを用意してクラスメソッドとして実装しないといけなかったりで、とにかく無駄に書く量が多い。 標準ライブラリも山のようにあって、もちろんそれがいいところでもあったんだけど、当時は圧倒されて「これ全部理解しなきゃいけないの?」という感じがプレッシャーがすごかった。

根本的にはオブジェクト指向をよく理解してなかったというのが大きい。 そもそもヒープにメモリを確保するとかを理解してなかったので。 (CとかJavaとかはコンピュータの具体的な動き、メモリの様子などを理解してないと、理解が難しいところあるよねぇ・・・)

そんなんだったけど、まずC言語のいい本に出会ってみっちり鍛えたのが大きかった。

それとPerlオブジェクト指向を学んだ。 読んだのはたしか『続・初めてのPerl』だったはず・・・

Perlオブジェクト指向は本当に薄皮一枚被せただけの素朴なものなんだけど、その分仕組みがよく分かってとてもよかった。 今あえてそこからオブジェクト指向を学ぶ必要性はないと思うけど、Javaとかで「オブジェクト指向よく分からん・・・」とかなるくらいなら、こっちから学んだ方がいいと思う。

もう一つオブジェクト指向を理解する上で大きかったのは、C言語でリスト構造の実装をやったこと。 これで「データ構造があればそれに伴って操作も定まってしまうんだから、セットで扱うようにすればコードが局所化される」とか「ユーザが興味あるのは操作だけなんだから、関数というインタフェースで操作だけ見せればいいんだ」とか「ポインタ(とその先にあるメモリ)がオブジェクトなんだ」と理解できたので、それでやっとJavaが実際にどう動いているのかとか参照型ってなんなのかとかが腑に落ちた。

あとRubyに初めて触れたのもこの頃。 当時の衝撃は以下の記事に書いてる。

まぁ、すごいと思いつつ当時はPerlにハマってたので、結局は使わなかったんだけど。

あとはちょっと変わったところとして、授業でVerilogを少しやったり、GLPK使って線形計画問題を解いてみたり、OctaveというMATLAB互換のソフトを使って半正定値計画問題を単体法っぽく解くプログラムを修論として書いたりした。(自分の専攻は数学・・・)

社会人(組込み)

卒業(修了)してから就職したのは組込みソフトの受託を行なってる会社。 ここが面白いのは自社で組込みOSも作って売っていたところ。 コンピュータのもっと深いところを理解したり、なんならOSを作ってみたいと思っていたので、とても興味があった。

実際、ここで学んだことはかなり多い。 I/Oがどうなってるのかとかカーネルがどう動いてるのかとかデバッガがどういう仕組みになってるのかとか。 あるいは開発プロセスとか品質の話とか。 趣味で一人でプログラムを書くのと、仕事でチームでプログラムを書くのは、かなり違うところがある。

ちなみに配属されたのはIDEを開発する部隊で、ここはターゲット側の知識も必要でありつつ、ホスト側でUIを作ったりする知識も必要とされたりする。 これはかなり珍しい経験だったと思う。 (と同時に、それが転職で足を引っ張ることになるんだけど・・・そんなことやってるところ、他にほとんどないわけで)

ここのコードは何年もの積み重ねの結果、ザ・カオスという感じだった。 かなり鍛えられた・・・

当時はホスト側の足回りのコードをCからC++に置き換えてる途中だったけど、Cで仮想関数テーブルとかも全部自前でやってて、Cでオブジェクト指向をちゃんとやるならこうだよねというものになってたんだけど、いやー、難しかった。

さらにはプロセス間通信でメッセージキューを自前で実装してたりと、このあたりは組込みOSでメッセージボックスを実装してたから同じような感覚で実装してたんだろうけど、いやー、ハチャメチャだったなぁ。 DLLがロードされると仮想関数テーブルに関数ポインタが設定されて、インタフェースとなる関数を呼び出すと渡したオブジェクトのポインタから仮想関数テーブル経由で関数の実体が呼び出され、それは自前のメッセージキューにメッセージをpushして、それがプロセス間通信で別のプロセスに送られて、そのプロセスではメッセージをディスパッチして対象となる関数を呼び出して、処理をして、みたいな。。。

数千行ある関数とか、do { ... } while (0);とかいう謎のコードでズッコケたりとか(Cだとtry-catchがないのでgotoでエラー処理するのがいいんだけど、コーディング規約でgotoが禁止されてたので大域的ジャンプをするためにこんなコードが書かれてた)、いろいろあったなぁ・・・(遠い目

まぁ、そんな感じで主にIDEのためのコードをCとかJavaで書いてた。

あとはETロボコンというのに参加したときにUMLの勉強をしたりライントレーサーのコードを書いたり。

他にもターゲット側で動くものだと、ELFファイルのローダを書いたりGDBスタブを書いたりとか。 ELFフォーマットについて詳しくなれたのはよかったし、GDBスタブを書くのも面白かったなぁ・・・(デバッグの難しさからは目を逸らしつつ・・・デバッガを実現させるためのコードなので、デバッグにデバッガが使えないし、printfデバッグなんて贅沢なものも使えない)


今日はここまで!