つきいち日記へ戻る  

組み込み用C言語

2006年3月12日

 とある理由によって組み込みマイコンのC言語を必死で調べている。
 C言語と言えば、最近ではパソコンプログラミングの主流であろう。私も多少不本意ながらC言語のベテランと言ってもよい状態なので、この機会に私のC言語との付き合いを記録しておきたいと思う。

● プログラミングことはじめ

 私が初めて知ったプログラミング言語はCOBOL(コボル)なのだが、当時はおよそ歯が立たないものであった。その翌年にFORTRAN(フォートラン)に出会い、運のよいことに、これはすらすら頭に入った。だから、私がプログラミング言語を発想する場合は、FORTRANが基準になっている。

 FORTRANはformula translatorの略で、数式変換機の意味だから、人間が数式を書いたら、何と!、計算機が自動的に解釈・実行してくれるプログラムである。今ではC言語と同様の、手続き型計算機言語と位置づけられている。
 しかし、その当時はコンピュータの異様な姿から「電子頭脳」と呼ばれたり、FORTRANも正体がよく分からないまま「自動プログラミング」などと呼ばれていた…、はずだ。はずだ、というのは、もうよく当時を覚えていないからである。言いたいのは、まだ電子計算機が当たり前とは言えない時代であった、ということだ。

 それからの計算機言語には結構紆余曲折があった。初期のFORTRANでも性能はよいのだが、学術関係者には極めて評判が悪かった。学術系では生真面目なALGOL(アルゴル)があって、良いとこ取りをしようとした巨大言語PL/I(ピーエルワン)、ALGOLの性能重視の改良版PASCAL(パスカル)があって、この系統がC言語につながるのである。

● C言語は使えない

 話を聞いていると、Visual BASICやJAVAで入門した方も多いようであるが、現在プログラミング言語の代表と言えば、何といってもC言語である。良質なC言語の処理系が容易に手に入るし、資料も多い。壁に当たったら、インターネットで質問すれば答えてくれる人が出現する確率が高い。
 私から見ると、プログラミング言語であればFORTRANもPASCALもCも変わらないし、むしろアセンブラのような低水準言語を当てにしたところのあるFORTRANの方が良いと思える。だが、多勢に無勢、いまさらどうしようもない。私とて、最初のプログラミング言語にはC言語をお勧めする。

 BASICやFORTRANでプログラミングしていたころ、他のプログラミング言語の本も一冊ずつ集めることにしていた。C言語に関しては、有名なカーニハン&リッチーの第一版(1981年)を持っている。今書店で売られているのは第二版(1989年)である。
 この第一版のC言語は米国規格になる以前のC言語であり、熱狂的なファンが支えていた状態であった。研究者ならともかく、プロは見向きもしなかったと思う。

 実際、私の所有する第一版はかなり保存状態が良い。とあるマイナーな処理系を手に入れて使ってみたのだが、その時の印象は「面白い言語もあるな」程度だったと思う。正直に言って、この言語に新しい点は何もなかった。それにライブラリが処理系ごとに違うのは不安を増強するに十分だった。
 まあ、それでも一応は全体を見ておいたので、後々役立った、ということにはなる。今も時々はページを繰るから、名著であることは私も認める。

● 最強の対抗馬PASCAL

 当時のミニコンという、今から考えるとささやかな性能の計算機を縦横無尽に活躍させるには、初版のC言語あたりが適当だったのだろう。作者はC言語のコンパイラは軽いと主張するのだが、それは今から見るとかなり言い訳に近い。じゃ思いっ切り軽いPASCALは何なのよ、ということになるからだ。多分、Cと同じ目的のPL/Iと比べて軽いのだろう。私がC言語やUNIX使いになんとなくうさんくささを感じるのは、このあたりの都合のよい言い回しである。

 C言語のマニアは、PASCALは学習用言語であって実用ではない、と言い張る。
 私の見解ではPASCALは最初からALGOLの高速改良版であった。おそらく、この点においてPASCALの右に出る言語はない。PASCALで窮屈なのは文字列処理だが、とある有名処理系では新たに文字列型を新導入し、それで十分であった。
 しかし、確かに情けない仕様の学習用PASCALは存在し、まるで使い物にならなかった。PASCAL陣営の不用意な対応が自らの首を締めていた。

 C言語のマニアは、PASCALでは機械の細かい操作ができない、と言い張る。
 FORTRANやおそらくPASCALでは、そのような場合はアセンブリ言語の支援を期待している。C言語でもアセンブラは使う。FORTRANでもサブルーチンコールで機械はいじれたし、最適化すればC言語並みの効率にはなりそうだ。PASCALが深いレベルの記述までしていたという話は聞くし、某ミニコンのメーカー製OSはほとんどがFORTRANで書かれていたというもっぱらのうわさであった。C言語が特別というのは、はっきり言って幻想だ。

 さすがに素性がよいためか、PASCALは今でも生きていて、名前は違うがファンが結構いるようだ。だが、時代は確実に通信や並列処理など、さらに先を模索している。PASCALがFORTRANやC以上に対応できるのか、興味深いところである。

● 国産ワークステーション

 私がC言語を必要としたのは、某国産UNIXワークステーションでウィンドウプログラミングをするためであった。それまでは、FORTRANとアセンブリ言語で十分だったのである。
 その某国産UNIXワークステーションにもFORTRANは内蔵されていたのだが、UNIXシステムコールに最低限必要なリンクしかできないようになっていた。つまり、初版C言語並みであった。ウィンドウプログラミングが不可能なのである。

 専門用語が続出して申し訳ない。ワークステーションというのは、今で言うパソコンと同じものであるが、多少多機能なのでかっこよく言った言葉である(今から考えると、である)。UNIXは今でも大活躍のOSで、Windowsみたいなものである。ライブラリは共同利用のための便利プログラム集で、リンクという操作をして使えるようになる。システムコールはライブラリの中でもOSの機能を使うためのものである。

 あまりのFORTRANの扱いにショックを受けたが、問題は差し迫っているので仕方がない。FORTRANは熟知しているというのに、C言語の猛勉強を開始するという、まことに情けない事態になった。しかし、目標があるというのは良いことで、なぜかその時はC言語がスラスラ頭に入っていったのである。
 後でIBMのAIXワークステーションを使うことになり、そこではFORTRANで十分にウィンドウを使うことができた。しかし、完全に後の祭りであった。すでに私はC言語を十分に使えるようになっていた。

● 安心C

 そうはいっても、パソコンでは相変わらずBASICとFORTRANとアセンブラであった。
 C言語が安心して使えるなと思ったのは、ANSI Cと呼ばれる米国規格(1989年)が確立し、それに対応する処理系が普及してからである。
 結局、私がパソコンでC言語を使うようになったのは、パソコンのOSがウィンドウに対応してからである。というのも、まともにウィンドウを扱うにはC言語以外の選択肢は無かったからである。

 ANSI Cにも小さな問題はあったが、困るというほどではない。むしろしっかりした規格化がありがたかった。
 そして、本当に瞬く間に良質のC言語処理系が次々と登場する事態になった。しかも経済的。当事者はたまったものではなかろうが、すさまじい競争のおかげで極めて品質の良いC言語を我々は手軽に使えるようになったのである。もはや相対的に高価なFORTRANを使う理由が無くなってしまった。
 Windows NT系のOSが使えるようになってからは、パソコンも十分に信頼が置けるようになった。UNIX系も充実しているようで、プログラミングする者にとっては幸せな時代である。

 結局、今の私の主力言語は、職業上のデータベースのスクリプト言語を除けば、C言語、ということになる。

● C言語が楽しくなるには

 C言語を知っていれば、当面プログラミング環境に困ることはない。
 だが分かってはいても、C言語にはポインタなどの学習者に対する壁があるので、躊躇してしまう入門者もおられるようだ。なにしろ、ポインタだけで数冊の参考書が売られているのだ。あとは独特の記法であるが、これはやっているうちに慣れる。

 実質的なポインタが無い計算機言語は皆無であるはずである。ただし、できる限り隠そうとする。配列は高度な柔軟性はないが数値計算には十分であることが多く、昔のBASICなどはこれしかない。文字列は基本型の一つにしてしまう言語が多いだろう。C言語でもこのあたりは大切なので、ていねいに解説されているはずである。

 配列と文字列さえ突破できれば中級者としてC言語を使いこなしていることになるし、プログラムを書くのが楽しくなっているはずである。

 その先は、引数の参照渡し(相当)、リスト(自己参照的構造体)、関数へのポインタ、と続く。このあたりは慣れろと言っても不可能で、C言語のあからさまな弱点である。不思議にも、無知か高慢か、C言語マニアはこのあたりを自慢するので、何をか言わんやである。

● C99

 最初のANSI Cは良くできていたと思うが、言語規格というのは止まってはいけないのである。5年程度の間隔で見直しされないと、過去の言語になってしまう。C言語も例外ではない。
 C言語はあまりにも普及したために、大変な努力が必要だったようだが、ついに1999年に現国際規格(C99)が成立したようである。ようである、というのは、いまでもC99に準拠しないC言語が広く使われているからである。実際の処理系が新規格に対応しないという事態は珍しくはなく、有名無実の規格というのも意外に多い。

 ということで、最近になってC99の規格を見てみたのだが、非常にうれしいというか、なにをいまさら、もっと早く対応して欲しかった部分も多く、普及が待ち遠しい。
 今私が使っているC言語処理系はC99に完全には対応していない。しかし、先行して取り入れられた部分が素敵で、とても気に入っている。具体的に言えば、配列の活躍の場を広げたことと、コンパイラの最適化を促す仕様である。言い換えれば、C言語は普通の計算機言語に戻ったのである。
 C99に関してはインターネットでJIS規格が閲覧できるし、分かりやすい要約もある。

● C言語はどこへ行く

 C99は明らかにC++というC言語のオブジェクト指向へ発展した言語の影響を受けている。C言語がC++との分裂を覚悟でC99に発展した背景を知る由もないが、想像するに、過去の膨大なC言語プログラムを生かそうとしたのだろう。
 C99の仕様は巨大と言ってよく、広範に使われるのはまだ数年先かもしれない。

 C言語の利用上の利点は前述した。計算機言語として見ると、

 (1) 整数の型がやたらと多い。C99ではさらに増えている。文字もビットパターンも「整数」にしてしまったからだ。弁護するなら、C言語のせいというよりも、計算機自体の設計がそうなっているのだ。C言語には機械に追従する方針がある。
 (2) 歴史的理由から、整数型intのbit数が一定していない。マシンを固定すれば良いわけだが、逆にそのために、教科書は実機を前提に書くしかない。だから、私などは32bitのパソコンが主流になって、大いに喜んでいる。
 しかし、今取り組んでいるマイコンは16bitである。ポインタにnear/farの区別がある(懐かしい!)ので、かえって学習に有利な点があるのだが、なんとなく根性が窮屈になりそうだ。
 (3) 構造化プログラミングに関しては満点である。偶然だと思うが、単なるloop構文(for(;;)のこと)があって、これをbreak / continueと組み合わせるととても気持ち良い。しかも、私の知識ではへたくそなwhileより最適化に有利。PASCALを参考にしているのだから、ここが強いのは当然といえば当然。かえってPASCALは妙な思想(?)に拘泥しているように見える。
 (4) C言語付属の文字列はあまりに素朴で、不自由だし効率が悪そうだし、なにより危険。自分で新文字列型を組んでしまえば良いのだが、C++みたいに標準ライブラリ(STL)が提供されているとなお良かった。
 (5) 関数の引数における参照の採用は見送られたようだ。値渡しと参照渡し(相当)で呼び出し側の書き方が変わるのは言語仕様としては最悪と思えるので、何とかして欲しかった。もっとも、Cプログラマはさほど不自由を感じていないだろう。

 FORTRANもCOBOLも、何となくC言語に似てきて、C言語もFORTRANやPASCALに近づいている印象だ。究極の計算機言語など願い下げである。PL/Iの悪夢を思い出すからだ。むしろ、計算機科学の発達により、核部分が似るのは当然、ということなのだろう。

● 組み込みマイコン用の言語としてのC

 さて、今回のC言語の勉強の目的は、組み込み用マイコンのプログラミングである。組み込み用マイコンと一口に言っても、本当に小規模なものからパソコン級の豪華なものまでたくさんある。いま取り組んでいるのは、ピン数わずか20、16bit機でRAMが1KB、ROMが16KBの、ささやかとは言い難いが、さりとて、往年の8bitパソコンよりはRAMがずっと狭い機種である。ただし、その往年の8bitパソコンよりはCPUはずっと強力だし、周辺装置もしっかりしている。
 だから、華やかな実数の数値計算や文字列処理などは無理である。反面、なぜか乗算器などがあって、整数計算に関してはプログラミングのしがいがある。外部との接続が20ピンなのはどうしようもないが、多ければよい、というものでもなかろう。

 C言語は組み込み用にも使われているようだ。というか、もともとミニコンは現在の組み込みマイコンみたいにも使われていたのである。だから、ミニコンで生まれたC言語が組み込み用途に強いのは、当然なのである。
 ただ、その目で見ると、C99はかなり贅沢な仕様になっている。組み込み用マイコンも想定しているのかもしれないが、浮動小数点機構が整備されたような、ずっと上位機種用であろう。

 今回、少しは調べたつもりなのだが、企業のノウハウで秘密なのか、組み込み用C言語の書き方の教科書はあまりない。何かハード作っている本のCプログラムはおまけ扱いだし、一般のC言語の本は組み込みの都合などほとんど考慮されていない。
 まあだから、私のような者にお鉢が回ってきたのだろう。たしかに私も昔はハードもがんがん作ったが、今はデータベースを生業としている、と言ってよい状態なのだ。上述のように、この規模のマイコンに対して第六感が働くことは確かなのだが、勘だけではどうしようもない、はっきり言ってまたもや必死で勉強中である。お恥ずかしい結果にならぬよう、突っ走るまでである。