Get Things Right

My English blog is here http://getthingsright.blogspot.com/

 プログラミングの基礎

その昔、カレー屋であった日本で働くインド人に職業を聞くJava言語で携帯電話のソフトを作っていると答えた。海外で働きたかった自分はどうしたらJava言語を学べるかと聞くとC言語を学べと彼はいう。C言語を知らないとJavaがどう動いているか分からないぞと。

その後、IT業界に入り会社で使うプログラム言語を一通り学び終えた後、彼の忠告通りC言語を学び始めた。C言語は変数のスコープ、参照渡し、関数、構造体など他のプログラム言語に共通する特性分かりやすい形で示してくれた。またポインタを深く学び関数の宣言もスタックに詰まれたプログラムを指し示すポインタであり、配列もまた(演算が定義された)ポインタ。ポインタを使いADT(Abstract Data Type)を構築し巧みにデータを保存し、自在に取り出す術を学び、構造体は16ビット、32ビットでPaddingのされ方が異なることを学んだところでリニアに並んだメモリを順に読み出していくチューリングマシンモデルが見えた。

C言語チューリングマシンモデルを映しているから基礎なのだと理解した。

先日、アセンブリやCPUの機能を通じてOSを学ぶ本を読んだ。ソフトウエア、ハードウエア割り込み。レジスタ上の値を保存、改定することで実現するタスクの切り替え。ページング、セグメントを通じて実現する仮想メモリ空間。自分がC言語を学んだときに見えた一直線上のメモリ空間は実はOSが作り出す仮想メモリであることが明白になる。また実装が闇の中だったmalloc関数はプロテクトモード上ならばセグメントディスクリプタ部を変更すること関係しているのではないかと考えが及ぶようになった。

時代はCPUはマルチコアが主流だ。どう動いているのか今のところ検討がつかない。どうタスクを切り分け、メモリ空間を共有しているのか。(「はじめて読むマルチコア」みたいな本はでないのかな)

Java達人な同僚が書くプログラムは、プログラムが動作する環境に暗黙知的に存在する前提条件をとことんエラーチェックで回避している。なぜそんなところまでエラーチェックをするのかと思うときもあるが、彼の意識の高さ(それとも単なる性格か)に学ぶところは多い。

実際にコードを書く機会が職場では少ないのはきついが、まずはコンピュータの知識のレベルで彼と同等、もしくはそれ以上になれば自然と見えてくるもが見えはじめ、より意識の高いコーディングができるのではと期待する。
Reference:

Pointers on C
C Primer Plus
エキスパートCプログラミング―知られざるCの深層 (Ascii books)
C言語ポインタ完全制覇 (標準プログラマーズライブラリ)
はじめて読む486―32ビットコンピュータをやさしく語る
はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)
CPUのきもち―IA‐32アーキテクチャーとWindowsXPの不思議な関係