はじめに

●アセンブリ言語とC言語

 まず、Cを開設するにあたり、予備知識として多少のアセンブリ言語も解説します。これはわかりにくいといわれるポインタを理解するために重要であるからです。また、C言語自体の開設もポインタを後回しにせず、積極的に出してます。  一般の書籍などで、ポインタから攻めるというのは、私自身、あまり見たことはありませんし、ほとんどないと思います。

 ポインタからなどから説明する理由として、C言語の特徴、開発経緯からみても、やはりポインタはキーになってきます。そのポインタを後にして学ぶこと自体、ポインタなどでつまずく理由であると思いますし、それで関数を理解しろこと自体、無理がある思います。
 私自身の経験からいって、はっきり言ってポインタより関数呼び出しのメカニズムの方が把握に時間を要しました。

 今、現在、OSの主流がWindows系となり、みなさんのなかにはこのOS上のソフトウェアを開発したいと思う方もいるでしょう。この場合でも、ポインタの知識は重要です。  書籍によっては、C言語を高級言語として扱っていますし、一見そんな風に思えますが、高級言語らしい部分が非常に少ないので、私にはそうは思えません。

たとえば、
 ・コンパイル時の文法チェックが甘い
 ・実行時チェックはほとんど無い
 ・言語構造自体、アセンブリ言語に対応した単機能なものが多い
のようなところは高級言語らしくないとおもいます。

 C言語は別名ポータブルアセンブラとか、構造化アセンブリ言語などと呼ばれています。
このように呼ばれるのは、アセンブリプログラマがアセンブリ言語を記述する手段にC言語が有効であり、しかもアセンブリと同じような威力を発揮できるというところにあるでしょう。

 アセンブリ言語を扱っていた人にとっては、ものすごく便利な言語であり、逆に高級言語しか経験のない人にとっては、アセンブリレベルの構造を理解していないため歯が立たなくなってしまうのも当然だと思います。

●C言語の開発経緯

 C言語はそもそも、「UNIXのOSを作成するための記述言語として開発された」という経緯はどんな本を見ても書いてありますから、言うまでもないことでしょう。しかし、そのことがどんな意味を持つのかまで書かれたものはほとんどないと思います。

 OSってのは、ハードウェアを一括して管理し、そして、処理環境を提供するものです。 たとえばWindowsってOSであれば、そのOS上で動作するソフトは、基本的にハードを限定しません。ハードが違ってもWindowsというOSであれば、その違いをOS側で吸収し提供してくれる。

 しかし、C言語がOSを記述するものであるいうことは、ハードウェアに直結するプログラムを記述するのがそもそも目的であるわけで、当然ハードウェアを制御できるものであるわけです。
 OSを記述するにはアセンブリ言語で記述できるものをすべてカバーしなければならないため当然、C言語自体、アセンブリの知識は無視できないと思います。
 このように、C言語の開発経緯から見て、OSを作成するための記述言語だということは重要な意味を持ち、アセンブリの知識を無視できないということがここからも見えてきます。

 そしてC言語にはもう一つ特徴があります。それは「移植性」です。ハードウェアに密接していながら、移植が行いやすい。その理由は追々見ていくと、理解できると思います。