今日におけるC/C++言語
「C言語」は、メモリを直接操作する言語であり、
「機械語」 (アセンブラ含む) に次いで、コンピューターに近い処理を書くため、
メモリ効率がよく、実行速度も極めて高速です。
しかし、「Java」などの簡略化された言語と比べると、
やはり「書きにくい言語」といえます。
C言語が開発された当初からすれば、
パソコンの性能は飛躍的に向上しました。
これにともなって、プログラミング言語も、
「実行速度」や「メモリ効率」を突き詰めて書くよりも、
「書きやすさ」、つまり、「開発効率」が優先されるようになり、
最近では、「Java」や「C#」などで開発されることが多くなりました。
プログラマーがC言語で書く箇所は、格段に少なくなりました。
しかし、工業用ロボットなどの組み込みは
たいていC言語やアセンブラで書かれていますし、
「ゲームプログラミング」などでも、実行速度が重視されるため、
ネイティブなC/C++言語による開発は、いまなお主流となっています。
また、「C」は、オープン系のシステム開発で主流となっている「Java」や
「C#」、「JavaScript」など、ほとんどの言語の先祖にあたり、
共通する点も多いため、その仕組みを知っておくことは、
将来的にも、たいへん意義のあることであると思います。
「iPhoneアプリ」の開発で使う「Objective-C」という言語も、
C言語にマクロ関数をつけたもので、ほとんどC言語です。
本書では、従来の入門書や入門サイトの内容に加えて、
より実践的なプログラミングを行うにあたって欠けている点を補うと共に、
気の短い方にもムリなく読んでいただけるように
単語の種類ごとに色付けを行うなど、読みやすさを追求しています。
サンプルコードは、テストするようにしていますが、
絶対ということは言い切れませんので、
使用するにあっては、自己責任でお願いします。
本書の読み方
・画像が表示されない時は、
「再読み込み」をしてみて下さい。
・ビューアの上の方に、もくじがあります。 ( PDFにはありません )
・まだ執筆中ですので、
修正や、抜けている点があります。
・まずは、一通り、読んでいただいて、
最初は、わからない点もあると思いますが、
実際に、書いていれば、そのうち理解できます。
・また本書では、読者さんの読解力や計算力などを試したり、
きたえたりするといったことは目的としておらず、
そのような設問も、行っておりません。
・あくまでも、「C/C++」というコンピュータ言語の書き方について、
基礎的な知識の理解を充実させるために、
その助けとなるような解説を行うことに主眼をおいています。
・したがって、その他の学習については、他書にゆずります。
・たまに更新を行っていますので、ダウンロードされた方は、
以降も、定期的にダウンロードし直すようにしてください。
・WindowsAPIなどのライブラリの使い方は、
続巻で取り扱う予定です。
・「STL」 ... おもによく使うコンテナクラスをラッピング。
・標準コントロール、コモンコントロール。 ( ★執筆中。一部公開中 )
・「GDI」 ... 描画系の関数いろいろ。( 印刷くらいしか使い道ない? )
・「Direct2D」 ... グラフィックデバイスに直接書き込む2D描画ライブラリ。
・「WIC」 ... 「PNG」「jpeg」など、画像ファイルを簡単に読み書きするライブラリ。
・「Direct3D 10.1&11」 ... 3D描画ライブラリ。
・「DirectInput」「XInput」 ... コントローラーのライブラリ。
・「MME」 ... 「MIDI」「WAV」「MP3」など、音声を扱うライブラリ。
・「XAudio2」 ... 「DirectSound」の後継ライブラリ。
・「WASAPI」 ... 「カーネルミキサー」を使わないので速い。
・「MSXML」 ... 「XML」の読み書きでつかうライブラリ。
・「SSE」「AVX2」 ... 並列処理用の組み込みライブラリ。
・待ちきれないという方は、
ネットを利用するなどして、各自で勉強して下さい。
・新しい本がアップされたら、ブログでお知らせします。↓
コンピューターの仕組み
すべてCPUによる計算によるものです。( 足し算や引き算など )
「ハードディスク」や「CD-ROM」から取り出して、
一時的に置いておく「作業台」とか、「配送センター」のようなものです。
「CPU」への「命令」を箇条書きにしたもので、
いわば「コンピューターへの作業手順書」ともいえるものです。
[ CPU ] ←(計算式データ)- [ メモリ ]
[ CPU ] -(解答データ)→ [ メモリ ]
「ハードディスク」ほどの容量はないのですが、
磁気ディスクから読み取る手間がかからないため、
CPUとデータをやり取りする際のアクセス速度が高速です。
すべてのデータを置いておく方が速いんですが、
画像のデータや音声のデータは、とても入りきらないので、
必要なデータだけをメインメモリに読み込んでおいて、
その中でも特に、いま行っている計算に必要なデータだけを
レジスタに転送して計算する仕組みをとっているのです。
キャッシュについては、よく使うデータが自動的にストックされるので、
プログラマが操作することはできません。
倉庫管理や、配送などの仕事に通じるものがあります。
よく使う計算結果は、メモリ上に残しておくことで、
データの移動回数や、計算回数を少なくすることができます。
画面が固まることが少なくなり、快適な動作を実現することができます。
アプリケーションの実行ファイルがメモリ上に読み込まれ、プログラムが実行されます。
実際に、プログラムが実行された時、CPUが読み取っているのは
マシン語の命令番号です。 ( 「オペコード」という )
人間からみて、比較的読みやすいC言語でプログラム文を書いておいて、
あらかたできたところで、それを「コンパイラ」というソフトを使って、
マシン語に置き換えるようにしているのです。( これを 「コンパイル」 という )
アプリケーションソフトのフォルダ内にある、「ホニャララ.exe」というファイルがそれです。
これは、フラッシュメモリの一種で、ハードディスクに比べると、 書き込み回数の制限があるものの、データの転送速度が格段に速いため、
メインメモリの少ない非力なシステム環境で絶大なパフォーマンス向上効果があり、
おもに、ノートPCやタブレット端末などでハードディスクの代わりに使用されています。
マルチコアプロセッサ (「MPU」という) による並列処理が一般化したことや、
グラフィックボードの中に、描画処理専用のCPU (「GPU」という) と
ビデオメモリ (「VRAM」という) があるんですが、
これを通常のCPUや、メインメモリの代わりに使う「GPGPU」という技術が、
ゲームソフトなどを中心に導入されています。
64bit化への移行については、後述します。
これはコンパイラや、それを含む開発環境のバージョンによって
対応にばらつきがあるため、本書では、さわり程度にとどめ、
基本的な仕様の理解に力点をおいて解説しています。
デジタルデータは、0か1かの連続。
・「コンピューター」というのは、「電子回路」 のことで、
その中では、 「電気信号」 が超高速で流れています。
・「ツー・トン・ツー・トン・トン」 とする 「モールス信号」のように、
電気信号の有無を、連続して送信することで、
大量のデータを伝えています。
・「ハードディスク」や「CD-ROM」の円盤の表面にも、
この「0か1か」が、「磁気信号の有無」に置き換えられて
記録されています。
・「モールス信号」の場合は、たとえば、
「・・-」 なら 「A」という意味だ! ...というように、
一定間隔の間に、どこでキーを押すのかで
対応する文字を申し合わせておいて、
暗号による通信を実現していました。
・コンピューターの内部のデータ転送も、
これとよく似たことをしています。
・Windowsをお持ちの方は、「電卓」を開いてみて下さい。
・メニューバーの「表示」をクリックして、「プログラマ」を選んで下さい。
・そして、適当に数値を入力した後に、「2進」をクリックしてみて下さい。
・「0」 と 「1」 だけの表示に切り替わったはずです。
・これを「2進数表記」といいます。
・私たちがふだん使っている数字の表記法は、
「10進数表記」というもので、
1ケタの数字が10になると、
1ケタ繰り上がる仕組みになっています。
・「9」に「1」を足すと、1ケタ繰り上がって、「10」になる。
・2進数表記の場合は、0か1しかないため、
1に1を足すと、1ケタ繰り上がって、「10」と表記されます。
・が、これは10進数表記の「2」、
いわゆる2のことです。
----------------
2進数 10進数
----------------
0 0
1 1
10 2 ← ココ で くり上がっている。
11 3
100 4
101 5
: :
----------------
・ようするに、表記法 (書き方) が違うだけなのです。
デジタルデータの単位、「ビット」と「バイト」
・デジタルデータの最小単位は、「1bit」 (ビット)です。
・この「1bit」には、0~1までの
2通りの数値しか記憶できません。
・しかし、実際にあつかわれる数値は、
もっと大きなものばかりです。
・そこで登場するのが、「1byte」 (バイト) という単位です。
・「1byte」は、「1bit」を8つならべたもので、「8bit」のことです。
・コンピュータープログラムでは、メモリ上に記憶されたビットデータを、
この「1バイト」単位で取り出して、
1つの数値として解釈して、操作します。
・それでは次に、この1byteのデータを、
私たちがふだん使っている10進数表記の数値に
戻す方法について説明します。↓
1111 1111
・上記の値を、「2進数」モードで入力してから、
「10進数」モードに切り替えてみて下さい。
・「255」と表示されると思います。
・これが「1byte」に記憶できる最大値です。
・「0」を含めると、0~255までの
256通りの数値を、記憶できる、ということになります。
・この「バイト」という単位は、
メモリ上の、1つの番地に、記録できる値です。
・そして、CPUは、というと、
4byteずつ計算するタイプが、現在の主流で、
CやC++のコンパイラの標準の整数値が
4byte値なのは、そのためです。
・ちなみに、64bit システム ( 64bit版のWindowsなど ) では、
CPUは、8byteずつ計算するため、
標準の整数値も、8byte値になります。