連載
» 2006年10月12日 00時00分 UPDATE

H8で学ぶマイコン開発入門(2):組み込みソフトウェア開発はC言語が主流だ (2/3)

[山本 繁寿 ソフィアシステムズ,@IT MONOist]

高級言語の登場

 アセンブリ言語はテキスト形式で記述できますが、あくまでも機械寄りの言語です。このためMOV命令の例にもあるように、アセンブリ言語でプログラムを記述しても、ソフトウェアの生産性はあまり向上するとは思えません。そこで、人間が理解しやすい自然言語でプログラミングできるようにと考案されたのが、高級言語です。

 大部分の高級言語は、英語表現をベースとしたテキスト形式でプログラミングします。これにより高級言語では、より人間の思考に近い形でプログラムが記述できます。また、高級言語を用いれば、マイコンやハードウェアなどのプラットフォームに依存する部分の動作が共通の表現でプログラミングできます。

 これを現実世界と対比させるために、国際会議を例に取ります。例えば国際会議の席上で、各国の代表が母国語でしゃべっていては、議論が成り立ちません。そこであらかじめ共通で使う言語を決め、その言語を用いて議論を行います。会議で採択された内容は、共通語で記録され、各代表は合意事項を母国あるいは自分が所属する地域に持ち帰り、それを実施します。

 組み込みの世界では、国際会議の席上で共通語により決定・記録された内容=高級言語で記述したプログラムを、各国代表が母国=アセンブリ言語が通用するプラットフォームに持ち帰り、さらに特定の地域の特殊事情に合うように方言=機械語で最終的に実現します。共通語で決めた内容=高級言語で記述したプログラムは、世界190以上の国と地域のどこに持ち込んでも=マイコンやプラットフォームが異なっても、実現可能=動作可能のため、ソフトウェアの生産性はアセンブリ言語や機械語に比べて飛躍的に向上します。

 コンピュータの世界には、数多くの高級言語が存在しています。表1は、代表的な高級言語の種類と用途です。

言語 用途
C/C++ システム記述用:構造化、移植性に優れる
Embedded C/C++ 組み込みシステム記述用:構造化、移植性に優れる
Java システム記述用:ホストに依存しない、構造化、移植性に優れる
Embedded Java 組み込み用Java:ホストに依存しない、構造化、移植性に優れる
Fotran 科学技術計算用:構造化には不向き
Pascal 初心者用:可読性に優れている。組み込み用には不向き
表1 代表的な高級言語


組み込みC言語の特徴

 本稿の冒頭で、「組み込みソフトウェアを開発するために、C言語を使う必然性はありません」と書きました。しかし現実では、ソフトウェアの開発にはC言語が最も多く使われています。そこで本節では、C言語がソフトウェア開発に使われている理由について述べます。

コラム:C言語と組み込みOS
厳密な意味で、完全に構造化されたプログラムをC言語だけで書くことは困難です。C言語でモジュール化を行っても、しょせんは一筆書きのプログラミングスタイルからは脱却できません。完全に構造化あるいは仕様書に沿ったプログラミングを行うためには、組み込みOSの助けが必要です。機会があれば、組み込みOSを用いたプログラミングについても言及したいと思います。


構造化プログラミングに適している

 構造化プログラミングとは、プログラムを処理単位ごとに分割(ブロック化あるいはモジュール化)することで、プログラムの可読性や保守性を向上させようとする手法です。もし言語仕様として構造化をサポートしていない言語でプログラミングすると、プログラムは1本の線になってしまいます。例えば、自動販売機のプログラムを簡略化すると、以下の処理となります。

  • 投入金額の判別:紙幣や硬貨の種類の判別、正規か偽造かの判別など
  • 利用者の希望に応じた商品の選択:例えば利用者がコーヒーを選んだ場合、どの種類のコーヒーを選んだか、ミルク増量ボタンを押したか、砂糖なしボタンを押したかなどの判別
  • 釣り銭の返却

 これらの処理を1本の線で記述すると、どうなるでしょうか。プログラムが期待どおりに動作しない、つまり不具合があることが分かって、その原因を追究することを考えます。1本の線で記述されたプログラムの場合、もしプログラムの最後近辺に不具合の原因があったとしても、そこに行き着くためには線の最初からプログラムを追いかけていかないと、不具合個所には到達できません。これは非効率です。

 プログラム規模が小さい場合なら、何とか力ずくで解決できるかもしれませんが、数十万行以上になる大規模プログラムでは、不具合の発見は不可能に近いと思われます。それ以前の問題で、数十万行以上のプログラムを1本の線で書けるプログラマは、この世にはいないと思います。そこでスマートにプログラミングするためには、構造化に適した言語が必要となります。C言語は言語仕様として構造化をサポートしています。

豊富なデータ型をサポートしている

 極端な例ですが、A4サイズの書類を送る場合、それを縦横1メートルの木箱に入れる人はいないと思います。特別に重要な書類でない限り、A4書類では緩衝材を入れたとしても、せいぜい210mm×297mmプラスαのサイズの袋があれば用を足します。

 大は小を兼ねるといいますが、組み込みの世界にこれは当てはまりません。書類を送る場合でも、必要以上に大きな袋に入れるとそれだけ運賃が増えます。これと同様に、組み込みシステムでは、可能な限り無駄のないようにプログラミングするため、データを格納する容器(変数)の容量(サイズ)にも気を使います。

 例えば、何かの真偽を判定するために変数を使う場合、その変数の値が0か1か分かれば、真偽の判定には必要かつ十分です。この場合、1ビットのデータ型があれば便利です。逆に銀河系の星の動きをシミュレーションするプログラムの場合では、最低でも1000億けたを扱えるデータ型が必要です。また、絶対アドレスの参照やテーブルへ高速にアクセスするためには、ポインタの概念が必要です。これらのデータ型をC言語はサポートしています。ちなみにPL/Mもポインタをサポートしています。

I/O処理が可能

 組み込みシステムの構成要素の1つに、I/Oがあります。高級言語でI/Oへ簡単にアクセスできれば、プログラミングが楽になります。C言語を使うと、メモリマップドI/Oの場合はポインタ、また最近では少なくなりましたが、I/OマップドI/Oの場合は専用命令でアクセスできます(注4)。

※注4:
メモリマップドI/Oは、ROMやRAMといったメモリ空間にI/Oポートを割り当てる。これに対してI/OマップドI/Oは、ROMやRAMとは別にI/O専用の空間を用意し、そこにI/Oポートを割り当てる。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.