組込みエンジニアと参考図書とC言語とポインター
私はそろそろ情報処理業界やソフトウェア開発業界から引退を考えている年寄エンジニアです。エンジニアはどうあるべきか、など日頃考えている事、感じた事をとめどなく書いてみようと思います。このコラムを読まれた方の中には、違う意見や考えをお持ちの方もおられると思います。その時は無視して頂ければ幸いです。
組込み開発学習のバイブル「K&R本」
私は、大学を卒業後に汎用コンピューターメーカーで組込みソフトウェアエンジニアとして仕事を始めました。組込み開発プログラミングでは、メーカー固有のアセンブラ言語や業務用言語のCOBOLを使用していました。そして、8年を過ぎた頃にLSI設計CADの研究や組込み開発を行っていた研究所に転職したのです。C言語に最初に接したのは、その時が初めてです。
同僚にC言語を勉強する際の参考図書を聞くと、皆、カーニハン&リッチーの『プログラミング言語C』(いわゆるK&R本)を薦めてくれました。
K&R本に挫折。。。
早速購入し勉強を始めたのですが、いきなり『hello, world』が出てきたのには面喰いました。最も戸惑ったのは、文法の説明がほとんどなく、ひたすら例題を説明する、という進め方です。C言語の文法の理解が無い状態ですので、例題で説明している以上のことができないのです。結局、K&R本によるC言語の勉強は挫折しました。
その後、文法を説明した別の解説本を自分で探して、C言語およびC++言語を勉強し直しました。
K&R本は今でもC言語や組込み開発プログラミングのバイブルとして君臨しているようですが、やはりバイブルはバイブルなのです。素人にとってバイブルは難しいのです。今からC言語を勉強しようと思っている方に私はK&R本はお勧めしません。たぶんC言語を一通りマスターしたエンジニアが、C言語の本質や思想を勉強するのには良いかもしれません。(と言いつつ私は読み直す気力がなく、本棚の片隅に有難く鎮座しています)
組込みシステムでは未だに主流のC/C++言語
だからと言って、私はC言語自体を忌み嫌っている訳ではありません。組込みシステムでは、ポインタやメモリ管理などの機能を使って、ハードウェアに直接アクセスすることができます。それらの機能から、OSや低レベルドライバのコーディングなどの組込み開発にはC/C++言語は未だ主流ではないでしょうか。
C言語は多くのプログラム言語の基本
ただ、C/C++言語は、最近の高級言語やスクリプト言語に押されて、アプリケーション開発では使用される場面が少なくなってきているかもしれません。しかし、それらの多くの言語は、多かれ少なかれC/C++言語に影響を受けていますので、C/C++言語をマスターしていると、その他の高級言語、スクリプト言語を楽にマスターできます。
組込み開発やOSレベルからアプリケーションまで様々なシーンで適用できるC/C++言語を習得することは、とりもなおさず皆さんが活躍できる場面が広がることに直接つながるのです。組込みソフトウェアエンジニアの皆さんは、是非C/C++言語をマスターしてください。
多くのC言語初学者がつまずく「ポインター」
C言語をK&R本(カーニハン&リッチーの『プログラミング言語C』)で勉強し始め挫折した私が、別の解説本でC/C++言語の文法から勉強し直しした頃の話です。
組込み開発エンジニアとして、C言語を文法から勉強し直ししたことにより、若干プログラミングができるようになったのですが、次につまづいたのはご多分に漏れずポインターです。
C言語の解説書には、ポインターにはアドレスが入っている、と必ず説明しています。ChatGPTに試しに質問してみると
「C言語のポインターとは、メモリ上の番地(アドレス)を格納するための特殊な変数です」
と答えました。ChatGPTもやはりアドレスを絡めて説明するようです。
組込み開発でのC言語とポインターとアドレス操作
私は、アセンブリ言語を普段使いしていましたので、アドレス操作ならお手の物です。それで、例えば32ビットのint型ポインターでポイントしている変数の次のint型変数にアクセスしたくて、ポインターに +4 すると、意に反して4つ先の変数をポイントするではありませんか。
これは期待した動作と違います。ポインターに +1 すると、次のアドレスを指すだけだろうと思いきや、char型ポインターなら期待したアドレスに変化しますが、その他の型のポインターでは型によりアドレスの増分が異なるのです。
C言語を理解しているエンジニアなら「そんなこと当たり前だろう」と思われるでしょう。しかし、アセンブリ言語上がりの私は「ポインター変数が持つアドレスに +1 するんだから次のアドレスになるだけだろう」と頭が勝手に条件反射してしまうのです。
その後、ポインターを解説した書籍を幾つか見ましたが、私の勉強不足からか、ポインターに +1 するとどうしてアドレスが飛び飛びに更新されるのかを分かりやすく説明した本を見たことがありません。
ベテラン組込み開発エンジニアがポインターを再定義
暫くポインターと格闘して得られた結論は、「ポインターはポインターであって、アドレスを格納していると考えるべきではない」ということです。つまり、
「ポインターはアドレスを保持しており、ポインターでポイントしているアドレスにポインターの型を有する変数が存在する」
とは考えてはいけないのです。
もっと単純に
「ポインターは宣言で指定した型の値をポイントするための変数」
と考えるべきなのです。 C言語のポインターで悩んでいる組込み開発エンジニア方は、一度アドレスという概念を捨てて、素直な気持ちでポインターと接することをお勧めします。
ちなみに、当社では組込み開発を始め、様々なシステム開発の相談、設計、実装を全国対応で行なっています。無料相談も実施していますので、お気軽にご相談ください。