見出し画像

C++ - それはC言語でありC言語ではない

C++が登場したのは1983年でした。もっとも登場したと言っても、最初の頃に使えたのはC言語へのトランスレータであり、言語仕様も試行錯誤の繰り返しでした。C++で書かれたコードはC言語になるだけなので、もしC++処理系に怪しいところがあっても、それは人間であったりCコンパイラが問題を見つけるので、言語仕様の解釈がよく分からなくても、結果を見て対応することは出来たわけです。

C言語を本格的に使うようになると、ライブラリとして使うような関数や構造体が増えてきて、その管理に困るようになります。一般的には名前の一部を使ってグループ化したりしていましたが、長い名前を使うと打ち込むのが面倒なだけではなく(統合環境の支援なんてありません)、リンカが扱える名前の長さ制限や名前領域が不足したりしはじめるので、数文字程度の追加で済まそうとするのですが、そうすると今度は何かの拍子にかち合うことも出てきました。

また XWINDOW のような GUI が登場すると、構造体の中に関数を入れるようなコードの書き方が一般的になり、オブジェクト指向をサポートするような言語でないと、なかなか書くのも難しくメンテも大変だよとなりつつありました。

C++の歴史

C++で追加されたものとしてはクラスだけではなく、関数の多重定義、演算子のオーバーロード、名前空間、例外処理、そしてテンプレートなどがありますが、ポイントとしてはあくまでC言語の拡張であり、既存のC言語のコードを再利用することはもちろん、別に殆どをC言語の書き方で書いても構わないことでした(多少チェックが厳しくなっていたり、互換性のないところもあるのですが)。このためC++は順調に普及していくものの、潜在的なバグがあるようなコードが淘汰されることもなく、せっかく言語が提供している検査機能も書き方ひとつですり抜けられてしまうので、将来に禍根を残し続けては居ます。もっとも無理にでも何とかできるというのは、システムを記述するのにどうしても必要なんですけどね。

C++ - 

時代が進むに連れネイティブなコンパイラも登場し、多重継承や仮想関数の扱いも安定し、1990年代になると言語仕様も落ち着いてきました。その間にGUIをサポートしたOSも普及し、WindowsはCとSDKと呼ばれるライブラリで、ClassicMacは主にPASCAL系の言語で頑張っていました。この時代のパソコンOSは、今のようなプロセスといったものをサポートしているわけでもなく、リソースの保護や分離も曖昧でOSというよりもライブラリではないの?というもので、いろいろな複雑なお約束を守らないとパソコン全体がフリーズしてしまうものでした。

そんな訳でGUI OSで動くプログラムがなかなか増えてこないし、安定して動かないという悪循環にもなり、開発言語としてC++のようなオブジェクトをサポートした処理系が待ち望まれ、1993年に遂にMFCというWindowsなオブジェクトを含んだVC++が登場しました(この頃Macは諸々な不幸な時代)。

Microsoft Visual C++ (厳密には92年のコンパイラからC++/MFCに対応しています)

面白いのは基本となるオブジェクトがクラスで実装されており、C++らしいテンプレートはサポートされているものの限定的にしか使っていなかったことです(動的な配列も当時はクラスとして実装されていました)。こうしてC++を知らないとウィンドウズのプログラムが書けない(書けるけど制限がある)という事態になり、C++はわが道を謳歌するようになりました。もっとも初期のMFCは、いろいろと無理があって、仕様通りに使っているつもりなのにうまく動かないことも多く、それはMSもわかっていたのか開発環境にはソースコードも含まれていて、MFCも含めてデバッグモードでコンパイルしてデバッガで追うことで、問題点を見つけていました。その結果MFC側をパッチしてしまうこともたびたびあり、せっかくのクラスなんだけどなぁという状態ではありました。この経験でプログラミングは法則がきちんと隅々まで適用できる「物理」な世界から、原理は正しくてもすでにある手順通りにしないと思った反応は起きない「化学」な世界になったのかもしれないと思いました(今はどんなに素晴らしくてもダメでも数が増えて生き残らないとならない「生物」な時代だと思っています)。

その後、最初からオブジェクトをサポートした Java なども登場し普及していますが、ネイティブなコードに、それも強力に最適化できるC++は、そのパフォーマンスにおいて一日の長があります。まだまだ広く使われていますが、なかなか文法の厳格さが大変で、コンパイラが許してくれるコードを書く難易度はかなり高めです。きちんと設計して正しいコードを書いていく必要があるのは当たり前といえば当たり前なのですが、const ひとつ違うだけでバイナリが生成されず、テンプレート絡みの間違いはエラーメッセージをみても、それだけでどこが悪いかが分かる人は殆ど居ないでしょう。取り敢えず書いてみたり部分的に設計して機能を追加していくにはかなりコツが必要です。その代わりと言ってはなんですが、きちんと書いてエラーを潰せばC言語のように実行時にトラブルを起こすことは滅多に無くなり、テストに関してはかなり端折っても大丈夫です。

もちろんC++はC言語の拡張版であることは今でも変わりませんし、C++のすべての機能を使う必要はなく、その一部の機能だけを有り難く使って、残りはC言語で書いてしまうこともできるのは変わりません。例えばマイコンボードであるArduinoの開発環境であるIDEはC++が使えますが、基本的にはライブラリで提供されるクラスを上手にオーバーライドして使っているだけで、C++に深入りせずC言語のように書いていけば使えるようになっています。

Arduino

Arduino言語 = C/C++言語? Arduinoコードの仕組み

Arduinoで遊ぶページ

C++はとても便利で強力なのですが、C言語に比べると覚える概念が多く、使いこなすにはそれなりに大変です。そのうちC++も教室を開いて見ようかと少し思っています。

C++ 言語リファレンス

C++入門

ヘッダ画像は私がずっと使っているC++の愛読書。かなり分厚い。

#Cプラスプラス #C言語 #プログラミング言語 #Arduino #VisualC #MFC #テンプレート #クラス #オブジェクト指向 #GUI  

この記事が気に入ったらサポートをしてみませんか?