1.組み込み機器とさまざまなプログラミング言語

C言語のメリット/デメリット

● C言語のメリット

 高級言語には,C言語,FORTRAN,Pascal,COBOLなどがありますが,次のような理由により,現時点ではC言語が組み込み用途としてもっとも適した言語といえます.

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

 構造化された構文を使うことで,プログラムをブロック単位に記述できます.これにより,可読性に優れたプログラムを構成できます.また,モジュール単位でプログラミングすることで,複数の開発者による大規模プログラムの開発が容易になります.

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

 C言語には,バイト,ワード,ロングワードなど,CPUのアークテクチャを活かすデータ型が用意されています.また,組み込みシステムでは必須となる,絶対アドレスへのアクセスは,ポインタ型でサポートしています.

移植性

 アセンブリ言語は,CPUの種類により異なった命令体系をもっています.このため,あるCPUを搭載した組み込みシステムの開発を,アセンブリ言語で行っていた開発者が,別の種類のCPUを搭載したシステムに移植しなければならなくなった場合,開発者はアセンブリ言語をはじめから学習する必要があります.

 これに対してC言語では,特別に拡張された機能を使わない限り,プログラムの記述方法は同じです.C言語を使えば,CPUアーキテクチャによる違い(アセンブラ命令やレジスタ)をすべてコンパイラが吸収してくれるため,異なったCPUへの移植も容易にできます.

 具体例を見てみましょう.たとえば,リスト1(a)を見てください.これは変数に0x10を代入するプログラムです.これをARMのアセンブリ言語で記述すると,リスト1(b)のようになります.同様に,SHの場合はリスト1(c)になります.このように,マイコンごとにアセンブリ言語はまったくといってよいほど異なります.

変数の代入処理

〔リスト1(a)〕
Cプログラムソース

short int xyz;

main()
{
   xyz = 0x10;
}

〔リスト1(b)〕
リスト1(a)をARMアセンブリ
言語で置き換えた場合
.text
	.align	0
	.global	_main
_main:
	mov	ip,sp
	stmfd	sp!,{fp,ip,lr,pc}
	sub	fp,ip,#4
	bl	___gccmain
	ldr	r3,.L3
	mov	r1,#16
	mov	r2,r1@movhi
	strh	r2,[r3, #0]	@movhi
	b	.L2
.L4:
	.align	0
.L3:
	.word	_xyz
.L2:
.L1:
	ldmea	fp,{fp,sp,pc}
.comm	_xyz,4@2

〔リスト1(c)〕
リスト1(a)をSHアセンブリ
言語で置き換えた場合

_main:
          ADD         #-4,R15
          MOV         #0,R3
          MOV         R3,R0
          MOV.B       R0,@(3,R15)
          BRA         L207
          NOP
L208:                             
          MOV.B       @(3,R15),R0
          MOV         R0,R2
          ADD         #1,R2
          MOV         R2,R0
          MOV.B       R0,@(3,R15)
L207:                             
          MOV.B       @(3,R15),R0
          MOV         R0,R3
          MOV         #10,R2
          CMP/GE      R2,R3
          BF          L208
          ADD         #4,R15
          RTS
          NO	

プログラミング効率

 ここで,リスト1(a)リスト1(b)を見比べてください.C言語ではほんの4〜5ステップのプログラムが,アセンブリ言語では数倍になります.つまり単純に考えると,C言語を使えばアセンブリ言語と比較して,数十分の一の時間でプログラミングが可能,つまりその時間で製品開発ができる計算になります.

学習,習得のしやすさ

 基本的に,C言語のキーワードや構文は,英語の略語に近い表記になっています.また,関数名や変数名なども英数字で記述できます.このため,プログラムの論理を考えるうえで,わかりやすい言語体系となっています.また,書籍やインターネットなど,世の中にはC言語に関する情報があふれています.初心者でも独学でCプログラミングを容易に習得できます.

ライブラリ

 C言語はFORTRANやPascalと比較して,低級な言語だともいわれます.標準のC言語には,言語仕様にデータの入出力機能がないためです.しかし,C言語には豊富なライブラリが用意されています.ライブラリを活用すれば,効率よくプログラミングができます.

その他

 C言語以外にも優れた言語は存在します.しかし,それが入手困難であったり,特定の開発環境を要求したり,あまりに抽象的な言語体系をもっていると,使いこなすことが不便です.また,ツールが高価な場合には,コストを下げたい組み込み開発には向きません.一般的に,C言語の開発環境は,各コンパイラメーカーから妥当な価格で販売され,さまざまなプラットホーム上で動作します.このように,現実的問題の観点からも,C言語は組み込み開発に有効な言語だといえます.

● C言語のデメリット

 以上,C言語のメリットを述べましたが,デメリットもあります.

コードサイズ

 Cコンパイラから出力されたコードは,優秀なアセンブラプログラマがコーディングしたプログラムと比較してサイズが大きい.

スピード

 Cコンパイラから出力されたコードは,優秀なアセンブラプログラマがコーディングしたプログラムと比較してスピードが遅い.

 しかし,コンパイラには最適化という技術があります.この最適化により,コンパイラはコードサイズが小さく,かつスピードが速いコードを生成します.また,RISC CPUの場合,CPU自体がC言語で開発することを考慮して設計されています.このため,アセンブリ言語であれこれ悩むより,最初からC言語を使ったほうが,効率よくプログラミングできます.

Column1 C言語の使用を前提としたRISC CPU

 リスト1(c)の上から7行目を見てください.ここにはNOP命令があります.SHの場合,ブランチ命令(6行目のBRA)を実行する前に,次の命令を実行する機能(遅延分岐)があります.このためブランチ命令の後にNOP命令を挿入していないと,CPUはブランチ命令の次のアドレスにある命令も実行してしまい,プログラマが予期しない動作をします.

 アセンブリ言語を使う場合,注意深くプログラミングすれば問題ありませんが,あまりSHに詳しくないプログラマや熟練したプログラマでも,ついうっかりNOPの挿入を忘れてしまうことも考えられます.

 これに対して,C言語を使えば,Cコンパイラが自動的に必要なところにNOPを挿入してくれます.


1.組み込み機器とさまざまなプログラミング言語
 機械語/アセンブリ言語/高級言語
 C言語のメリット/デメリット

2.Cコンパイラと組み込み向けC言語の特徴
 開発の流れ
 ネイティブコンパイラ/クロスコンパイラ...


3月号特集トップページへ戻る


Copyright 2002 山本繁寿/有末一寿