※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
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;

}


(C)copyright ffortune.net 1995-2007 produced by ffortune and Lumi.
お問い合わせはこちらから