Darios Laboratory - プログラミング研究室


C++入門 - 1 「プログラミングで必要となる基礎知識」



プログラミングを行う上で最低限、知っておいた方が良い事柄について書いてみた。何やら全然足りないような気がするが、現時点では思いつかないので縦しとしておこう。



●プログラムとは?

まずは「プログラムとは何か?」について考えてみよう。『プログラム』とは「行動/処理などの手順が示されている何か」を指す言葉である。運動会や演奏会などで配られる「プログラム」と書かれた小冊子に記述されている内容はまさにプログラムそのものだ。では、プログラムの具体的な例を示してみよう。

01.400cc以上の容量を持つ鍋を取り出す

02.鍋に水を張る

03.鍋を火にかける

04.カップラーメンの蓋を半分程度開ける

05.中身を確認、具材が入っている袋がカップ内に存在しない場合は「09」へ移る

06.カップの中から具材が入っている袋を取り出す

07.具材が入っている袋を開封する

08.袋に入っている具材をカップの中に移す

09.鍋の水が沸騰するまで待機する

10.湯をカップに注ぐ

11.カップに蓋をする

12.箸を用意する

13.カップに湯を注いでから約3分間経過するまで待機する

14.カップの蓋を取り外す

15.「いっただっきま〜す♪」と発声する

16.箸を手に取る

17.食事を開始する

一見すると馬鹿げた内容だが、これでも立派なプログラムである。それにしても、たかだかカップラーメンを食すだけでも、これほどの手順を踏まなければならないことが解る。しかも、これは非常に端折った内容であり、実際には数十倍、いや、或いは数千億倍もの細かい工程を経なければならないだろう。真の意味での『プログラム』は分解可能な最小単位まで細分化された手順が記述されたモノなのだ。

●コンピューターが管理している情報

生活の至る所にコンピュータが入り込み、パソコンに触れる機会も非常に多くなった今日であるが、「コンピューターが扱える情報は『数値』だけであり、あらゆる情報が数値によって表現されている」、という事実は世間一般では殆ど理解されていない…と思う。今日のコンピューターでは文字やグラフィックが当たり前のように表示されているが、これらは全てコンピューター内部では数値によって表現されているのだ。例えば次のようなデータ列があったとしよう。

0x48,0x65,0x6C,0x6C,0x6F,0x20,0x57,0x6F,0x72,0x6C,0x64,0x21,0x00

これだけでは16進数で表現される無意味な13個のデータの羅列でしかないが、これに『データ列はASCIIコード表現による文字列で、終端は文字コード「0x00」で表現される』というルールを適用すると…

Hello World!

…という文字列であると解釈できる。このようにルールを設けることによって単なる数値に意味を持たせているのだ。ちなみに、ASCIIコードは次のように定義されている。

- ASCIIコード表 -

  0 1 2 3 4 5 6 7
0 NULL DLE SPACE 0 @ P ` p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
A LF SUB * : J Z j z
B VT ESC + ; K [ k {
C FF , < L \ l |
D CR - = M ] m }
E SO . > N ^ n ~
F SI / ? O _ o DEL

●単位について

コンピューターの世界では『bit(ビット)』という言葉を割と耳にすると思う。これはコンピューターが扱う情報の最小単位であり、1bitで「0」又は「1」を表現することができるが、実際には1bit単位で扱うことはなく、今日のコンピューターは最低でも8bitを一塊として扱っている。なお、8bitで一塊とする場合、通常は『byte(バイト)』という単位を用いる。

コンピューターの世界では特定の「切りの悪い」数値を目にすることがある。代表的なものとしては「256」「1024」「65536」などだろう。これらはコンピューターが基本とする2進数ベースで見た場合には「切りの良い」数値となり、それらを2進数で表現すると「100000000」「1000000000000」「10000000000000000」となる。切りは良くないがゲームなどで頻繁に目にする値として「255」が挙げられるが、これは2進数表現では「11111111」となり、10進数でいうところの「99」のようなもので8bit表現における上限になる。

●数値表現

コンピューターはあらゆる情報を数値によって表現しているわけだが、今日のコンピュータには『整数』と『実数』の2種類の数値表現が存在する。整数表現は読んで字の如く、整数しか表現できない。また、表現できる値の範囲も意外と狭く、32bit精度でも10進数で10桁程度でしかない。それに対して実数表現は小数を含む値の表現が可能であり、扱える値の範囲も整数とは比較にならないぐらい広い。

一見すると良い事づくめの実数表現であるが、実際に利用される頻度は非常に低い。その理由の一つに、整数表現に比べると処理速度が遅いという問題がある。加えて、実数表現を実現している『浮動小数点』表現の特性上、微妙な誤差が生じやすく、整数の値を要求された際、何も考慮しないと致命的な誤差が生じることが多々あり意外と不便だったりする。だが、使用頻度が低い最大の理由は実数表現を行う必要性が殆どないところにある。

●データ精度

コンピューターが扱う情報は原則として俗に「メインメモリ」と呼ばれる領域に保存される。扱われるメモリの最小単位は『byte』という単位で8bitの精度を持っており、表現可能な値の範囲は「-128〜127」もしくは「0〜255」となっている。より大きな値を表現したい場合は複数のメモリエリアを一塊と捉えることで実現しており、32bit精度の表現を行いたい場合は4byteを一塊として扱う。この場合の値の表現可能な範囲は「-2147483648〜2147483647」もしくは「0〜4294967295」と飛躍的に拡大する。ちなみに、表現可能な値の範囲を2通り示しているが、これもまたルールによって見方が変わるためだ。