※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
■C/C++■
CおよびC++は1990年代のミニコン・パソコンの主力言語です。
歴史的なことをいえば、最初にCPL(Combined Program Language)という
言語がありました。そのうち、この簡易版が作られBCPL(Basic CPL)と
呼ばれました。これを改変して作られたのがBで、BCPLの頭の一文字を
取ったものです。この拡張版がCです。これはアルファベットでBの次がC
だからです。このCでは1加えるという動作を x++ のように書きます。そ
こで、このCを更に進化させた言語が生まれた時、それにC++という名前
が付けられました。
Cは1980年代に後半に UNIX マシンとともに広まりました。UNIXは1969年に
ケン・トンプソン(この人の名前はしばしばトム・ケンプソンと誤記されて
いる)により開発されましたが、1973年にデニス・リッチーがこのシステム
を全て C で記述しなおしました。これは UNIX がほとんどのマシンで動作
可能になったことを意味します。リッチーは Cの開発者であるブライアン・
カーニハンとともに、このシステムを学校や研究機関などにはほとんどタダ
のような値段で販売。このため UNIX と C は1980年代後半、あっという間
に世界中に普及しました。パソコン界での MSDOSの普及と合わせ、ここに
二大OSの時代がやってきたのです。
私がWindowsのソフトの開発を始めたのは1988年です。当時NTTと共同である
大規模なネットワーク・システムの開発が進められていました。当時同様の
システムを先行して運用していたグループがN5200を端末に採用していたため
開発チームの大方の意見はN5200+PTOS+COBOLを押していましたが、私は先行
するシステムを越えるためには、PC9801+Windows+Cで行くしかないと強硬に
主張。この意見が通って、この組み合わせで開発が進められました。
しかしこの時点で実は私はWindowsもCも実はあまりよくは知りませんでした。
それから約半年間、私は地獄を見ることになります。もうほんとうに頭がお
かしくなりそうでした。当時Windowsの開発を経験した人のほとんどが同様の
体験を報告しています。この時に私は一度死んで生まれ変わったように思い
ます。しかし自分が必死で勉強しながら指導した、プログラム未体験の新入
社員は、この開発システムを何の苦もなく身につけて行きました。私はこれ
が新世代の開発システムであることを確信しました。
Cの良さというのは、その厳密に構造的な記述方法から来る保守性の良さと
アセンブラ以上のオブジェクト効率の良さです。本来はアセンブラで書くの
が最も効率のいいオブジェクトを作れるはずですが、いかんせん人間の頭の
思考能力の限界があります。Cの場合はコンパイラが同時にいろいろな面か
らプログラムのロジックを分析して効率化を図るため、たいていの人間が考
えながらアセンブラで書くよりは、よほど品質のよいオブジェクトを生成し
てくれるのです。
C++はいつの間にかCに取って代わっていたような気がしますが、1990年
ころにATTから出た仕様書を読んだ記憶があります。私は最初Macintosh
の開発システムで初体験しました。
C++はCにオブジェクト思考の考え方を加えたものです。初期のC++の
コンパイラはいったんC++のプログラムをCに翻訳して、そこから機械語
に翻訳するなどということをしていましたが、現在のコンパイラはもちろん
一気に生成します。
オブジェクト思考というのは1968年にアラン・ケイが公表したダイナブック
思想の中核概念のひとつですが、実際に使えるだけCPUが発達したのは
1990年前後のことでした。Cはプログラム記述は構造化されていましたが
プログラムのモジュール構成は古い世代のものでした。このモジュール構成
自体をオブジェクト志向という概念で構造化したのがC++だということが
いえるでしょう。
【Cの記述例】
void ChangeExt(char* fname, const char* ext)
{
int len;
len = strlen(fname)-1;
while(len>0 && fname[len]!='.' && fname[len]!='\\')
len--;
fname[len]=0;
strcat(fname, ext);
}
【C++の記述例】
void CKcomView::OnDoWrite()
{
CWriteDlg dlg;
if (dlg.DoModal()!=IDOK)
return;
long len = dlg.m_msg.GetLength();
char* buf = new char[len+4];
strcpy(buf, dlg.m_msg);
CKcomDoc* doc = (CKcomDoc*)GetDocument();
doc->Multi2(buf);
delete [] buf;
}