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

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

C言語が組み込み開発の主流となったのはなぜか。機械語、アセンブリ言語などとの比較から、C言語が支持される理由を解説しよう

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

 パソコンは、ソフトウェアがなければ粗大ゴミといわれますが、組み込み機器も同様です。携帯電話や自動販売機などの組み込み機器は、ソフトウェアがなければ、シリコンを主成分とする化学合成物からなる無機質な固まりです。大げさなようですが、この無機物に命を吹き込んでいるのが、組み込みソフトウェアです。そこで今回は、組み込み機器の開発に必要な、ソフトウェアの基礎知識について解説します。

初期のプログラミング言語

 組み込みシステムのソフトウェア開発には、C言語が主に使われています。ここで筆者の独断を述べますが、組み込みソフトウェアを開発するために、C言語を使う必然性はありません。日本ではなじみがないかもしれませんが、ヨーロッパではPL/Iと呼ばれる言語が組み込み機器の開発に利用されています。また日本でも10年くらい前にはPL/Mと呼ばれる言語が使われていて、現在でも一部の機器にはPL/Mで開発されたプログラムが搭載されています。とはいえ現状では、Cが開発言語の主流を占めています。これはなぜでしょうか。理由を探る前に、開発言語の種類を見てみましょう。

機械語

 機械語は、その名のとおり、機械(マイコン)の言葉です。機械語は、0と1のバイナリまたは16進数で構成されています。マイコンは、機械語の命令を受け入れることにより(マイコン自身を含めたハードウェアが)動作します(逆のいい方をすれば、マイコンは機械語しか理解できません)。

 機械語の概念を分かりやく説明するために、人間の言葉に置き換えてみます。地球上には190以上の国と地域があり、それぞれに公用語があります。各国あるいは地域には、公用語以外に、特定の土地でのみ使われる言葉があります。

 日本語を例に取ると、いわゆる共通語のほかに方言として東北弁や関西弁、九州弁などがあり、例えば九州弁も博多弁、熊本弁、鹿児島弁などに細分化されます。さらに分類上、鹿児島弁のカテゴリに属していても、お年寄りが使う鹿児島弁は、同じ鹿児島に住む若い人には理解できないなど、言語は多様性に富んでいます。

 機械語は、方言の中でも特定の土地で、ある世代のみに使われている言葉に相当します。つまり機械語は、特定のマイコンの特別な機能を実現するレベルまで落とし込まれた記述方法を取るため、たとえ同じファミリのマイコンでも周辺機能が異なれば、機械語の記述方法が異なってきます。従って、普通の人間にとって、マイコン固有の機能を数値(バイナリまたは16進数の羅列)で記述することは難しいため、特別な理由がない限り、機械語でプログラミングすることはありません。

コラム:お茶の水博士
いまから三十数年前、鉄腕アトムというアニメがありました。子供の形をしたロボットが活躍する物語ですが、それに出てくる「お茶の水博士」が、コンピュータからはき出される紙テープにパンチされた穴の位置から情報を読み取っていた場面をいまでも鮮明に覚えています。穴が開いていれば「0」、穴がない個所は「1」に相当するため、お茶の水博士は機械語と直接対話していたのだと考えられます。
筆者はパンチから情報を読み取る能力はありませんが、コンピュータ関係の仕事を始めた新人のころ、ハンドアセンブラを経験しました(させられました)。ハンドアセンブラとは、ニーモニック表を傍らに置いて、アセンブリ言語の命令を「0、1」の数値に変換していく作業です。現在では、あまり意味のある作業とは思えませんが、マイコンの基礎を勉強するための1つの手法だと思います。


アセンブリ言語

 機械語は、あまりにもマシン寄りの表記をしているため、できるだけ人間に理解しやすい表現はないかと考えられてできたのが、アセンブリ言語です。アセンブリ言語は、数値データではなく、英語ベースのテキスト形式で記述できます。これにより、アセンブリ言語は機械語と比較して、人間にとって分かりやすい言語体系となっています。

 しかしアセンブリ言語は先ほどの例でいくと、博多弁や熊本弁、鹿児島弁などの方言レベルに相当します。何故かというと、アセンブリ言語の命令セットは、基本的に機械語、つまりマイコンと1対1で対応しているからです。このためアセンブリ言語はマイコンの種類によって、細かい個所で異なった記述方法を取らざるを得ません。

 例えば、東京の倉庫にある荷物Aを福岡の倉庫Bに送りたい場合、アセンブリ言語では転送命令MOVを使います(注1)。データ転送はMOV命令で行えますが、マイコンの種類により、記述方法が微妙に異なります。あるマイコンではAからBにデータを転送する場合、以下のように記述します。

MOV  A, B

 ところが別のマイコンでは、同じ結果を得るために、以下のように記述します。

MOV  B, A

 このように、マイコンのアーキテクチャ(あるいは設計思想)が異なれば、単純なデータ転送1つを取ってみても、アセンブリ言語ではプログラムの書き方が異なってきます。これは同じ固有名詞を指すのに、方言により表現方法が異なっているのと似ています。

 過去現在未来と同じマイコンを使い続けることができる幸せなプログラマは少ないと思います。大部分のプログラマにとって、マイコンが置き換わるたびにリファレンス・マニュアルを読み、マイコン固有の命令セットを理解して、アセンブリ言語でプログラムを書き直していたのでは、日進月歩(秒進日歩?)の組み込み市場において生き残ることは困難になります(注2、注3)。そこで登場するのが、C言語に代表される高級言語です。

※注1:
実世界で荷物を送る場合、倉庫Aから倉庫Bに荷物を送ると、倉庫Aの荷物はなくなり、荷物は倉庫Bに移動する。アセンブリ言語のMOV命令はモノを移動するのではなく、データ(状態)をAからBにコピーする。つまり、AからBにMOVしても、Aに格納されていたデータ自体はなくならない。


※注2:
しかし逆の考え方をすれば、マイコンのアーキテクチャに精通した優秀なプログラマならば、アセンブリ言語でプログラミングすることで、マイコンが持つ性能を最大限に発揮するプログラムを書くことができる。


※注3:
アセンブリ言語の欠点ばかり書き連ねた感があるが、組み込みシステムではアセンブリ言語でないと実現できない機能がある。例えばレジスタを直接読み書きする場合は、アセンブリ言語による記述が必要になる。また、微妙なタイミングを調整する場合も、アセンブリ言語の命令を利用する。これに関しては、別項で解説する。


       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.