MSXでC言語というと、マイナーなイメージがありますが、実際はいくつもの処理系があり、それぞれに特徴があります。
今回は、広く知られているSMALL-C、MSX-C、SOLID C、HI-TECH Cについて比較を行いました。
SMALL-Cに関しては、日本語のマニュアルが充実していることなどから、FUTURE FORUMによって発表されているバージョンを使いました。
MSX-Cは筆者が持っているということとMSX-DOS1で使えるということで、Version 1.1を利用しています。
MSX-C Magazineに戻る
Tatsu's MSX 情報局に戻る
今回は、誰でも使える環境ということで、ノーマルのFS-A1STで、フロッピーディスク、Z80CPU、MSX-DOS1という条件で比較を行いました。
今回は、どの処理系でもコンパイルでき、ライブラリの作りや生成される実行ファイルの速度を測るために、次のプログラムを用意しました。
#include <stdio.h>
int main(argc,argv)
int argc;
char *argv[];
{
int i,r;
puts("Hello,world(^^)!!\n");
for (i = 0;i < 32767;i++){
r = i / 17;
}
puts("Hello,world(^^)!!\n");
return(0);
}
ライブラリの設計による違いを明らかにするため、高水準入出力のputs関数を利用してメッセージを表示し、コンパイラが生成した実行ファイルの性能を比較するため、基本的なループと、CPUの命令がなく、ランタイムライブラリの性能や呼び出し法に差がつく除算を行うようにしました。
また、コンパイラ自体とは関係ない動作の影響を除くため、中間ファイルの削除や、MSX-CのFPCのような外部のパラメータチェッカ、最適化オプションや外部のオプティマイザ(HI-TECH CのOPTIMなど)は実行せず、各コンパイラのデフォルトの動作でコンパイルを行いました。
コンパイル時間 | 実行ファイルサイズ | 実行時間 | 規格 | 配布条件 | |
SMALL-C | 1分21秒41 | 2432 | 42秒29 | サブセット | 非商用 |
MSX-C | 1分41秒18 | 6016 | 25秒61 | K&R | 非商用 |
SOLiD C(CLIB) | 1分15秒60 | 2513 | 22秒78 | K&R | 制限無し |
SOLiD C(SLIB) | 0分54秒67 | 426 | 22秒78 | K&R | 制限無し |
HI-TECH C | 3分4秒63 | 3072 | 30秒46 | ANSI | 制限なし |
コンパイル時間はコンパイル用のバッチファイルを実行してから、DOSのプロンプトが出るまでの時間を計測しました。
実行時間に関しては、最初のHello,world(^^)!!が表示されてから次のHello,world(^^)!が表示されるまでの時間を計測しました。
コンパイル時間と実行時間はストップウォッチを利用して計測したので、必ずしも正確ではありませんが、だいたいの傾向はつかめると思います。
SOLiD Cでは、コンパイラに付属の最小限のライブラリ(SLIB.IRL)と、フルバージョンのライブラリ(CLIB.IRL)でコンパイル時間や実行ファイルサイズに明らかな違いが見られたので、あえて、別に分けました。
コンパイル時間では、SOLiD Cの速さがひときわ目に付きました。Cコンパイラ2行程、アセンブル、リンクという4パスの行程にも関わらず、Cコンパイラ1行程、アセンブル、リンクの3パスでコンパイルが行われるSMALL-Cをも上回る結果となりました。
HI-TECH Cは、プリプロセッサ、Cコンパイラ2行程、アセンブル、リンクと5パスにもわたる上、今回利用したC言語の中で唯一ANSI規格をサポートするという複雑な構成のせいか、もっとも時間がかかりました。
中間に位置するMSX-Cは4パス構成と、SOLID Cと同様の構成をとっていることから、SOLID Cの構文解釈ルーチンの優秀さが伺えます。
実行ファイルサイズの面では、コンパイラ付属の最小限のライブラリをリンクしたSOLiD Cと比較的シンプルなライブラリを持つSMALL-Cが小さな実行ファイルを生成しました。
また、フルバージョンのライブラリをリンクしたSOLiD Cもライブラリをすべてアセンブリ言語で記述していることもあって、SMALL-Cに匹敵するサイズを実現しました。
HI-TECH Cはこれらと比べると、ややファイルサイズが大きい気もしますが、極端に問題が起こる値ではないと思われます。
MSX-Cはリダイレクト機能のないMSX-DOS1でもリダイレクト機能をソフト的に実現するライブラリが標準でリンクされることもあり、HI-TECH Cの倍と、極端な大きさになりました。生成されるプログラムのソースを見る限りはそう肥大しているわけでもないので、ライブラリの設計上の問題といえるでしょう。
実行時間でも、SOLiD Cの優秀さが伺えます。ホームページに書いてあるHighly
optimizing C compiler. の文字は伊達ではないといえるでしょう。
MSX-Cがこれに続く25秒68を叩き出しています。
3番手のHI-TECH Cはインデックスレジスタを多用するというコード生成の癖が足を引っ張り、30秒46という結果に甘んじています。
意外にも最下位はSMALL-Cで、コード生成の基本的能力で劣っているといえるでしょう。
今回取り上げたMSX用のC言語の中では、ANSI C対応という面で、HI-TECH Cが一歩進んでいるといえます。また、long型や浮動小数点演算を唯一サポートしているということもあり、他機種からのプログラムの移植や、ツールプログラムの作成に大きな力となってくれると思います。
MSX-CとSOLID CはK&R準拠で、long型や浮動小数点演算はサポートされてませんが、ANSI規格のプリプロセッサ宣言や構造体の直接代入といった点を除くとそう大きな違いはないので、プログラムをする上では、大きな問題にはならないと思います。
SMALL-Cはlong型や浮動小数点演算の非サポートに加え、符号なしの型(unsigned int,unsigned char)が使えないなど、一般的なC言語から見るとさらに、サブセット的なものといえます。
FUTURE FORUM版では、FUTURE FORUMによるANSIスタイルの関数宣言のサポートや充実した日本語マニュアルの存在が特徴といえます。
また、CP/M用のコンパイラなので、CP/Mでも動作するソフトの開発や、エミュレータを利用したクロス開発には有利であるといえるでしょう。
まず、何といっても、MSXで最も一般的に使われてきたという実績が特徴と言えます。そのため、MSX-C Libraryやその他ネットワークで流通している外部ライブラリや雑誌記事など、周辺が充実しており、学習用にもってこいと言えます。
また、アセンブラへ引数を渡す際、パラメータ数を固定にすると、レジスタ経由で引数が渡されるので、関数へのポインタを使ったシステムルーチンの呼び出し(BASIC環境で動くプログラムを書く時に良く使われる)やアセンブラで関数を書く事が楽になります。
また、MSX-DOS1用とMSX-DOS2用が別になっており、各バージョンのDOSの性能を生かしたプログラムを記述することができるということもファイル関係のユーティリティーの作成では利点になるでしょう。
各言語の比較で好成績をあげた高いコンパイラの性能と、MSX-Cでも採用されている引数のレジスタ渡しにより、すべての面に置いて、高いパフォーマンスを実現していることが一番の特徴としてあげられます。
また、フルアセンブリ言語で記述されたライブラリは、一つの実行ファイルで、MSX-DOS1,MSX-DOS2,MISIXに対応した方式でファイルアクセスができる上にコンパクトなサイズを実現しています。
加えて、MSX-Cを強烈に意識しており、Cコンパイラのオプションの中には、MSX-Cとの互換性をとるためのオプションまで存在しています。
ただ、マニュアルがないので、MSX-Cを知っている人であれば、高性能を生かしたプログラムが作れるとは思いますが、そうでない人が1からC言語によるプログラムを学ぶにはやや厳しい面があるかもしれません。
The HI-TECH Z80 CP/M C compiler V3.09 is provided free of charge for any use,private or commercial strictly as-is.
とあるように同人ソフトなど、売る為のソフトを作る事が出来ることと、ます。ANSI対応という2つの面が大きな特徴的といえます。
更に、CP/M用のC言語という事で、他の機種で、CP/Mエミュレータを使ったりしてクロス開発を考える人にとっては有利と言えます。
CC -A -P %1.C >%1.MAC M80 %1=%1/M/Z L80 %1,CLIB/S,%1/N/E
cf TBENCH cg TBENCH m80 =TBENCH/z l80 ck,TBENCH,clib/s,crun/s,cend,TBENCH/n/e:xmain
cc1 TBENCH cc2 TBENCH as TBENCH.asm ld TBENCH,clib/s/gXMAIN
CPP -DCPM -DHI_TECH_C -Dz80 -I TBENCH.C $C1.T P1 $C1.T $C2.T $C3.T CGEN $C2.T $C1.T ZAS -N -oTBENCH.O $C1.T LINK -Z -Ptext=0,data,bss -C100H -OTBENCH.COM CRT.O TBENCH.O LIBC.LIB