2ntブログ

プログラマに必要な基礎知識(1)

最近はコンピュータの性能が飛躍的に向上した事と、ライブラリと呼ばれるプログラムの部品が充実した開発言語が増えた事でプログラマのレベルが落ちました。
マシン語に最も近いというか、そのものを人間にわかり易い英単語にしたアセンブラでプログラムを作っていた時代は、CPUやその周辺部品の仕組みを知っていないとプログラムは作れませんでした。
現在のJavaだのVBだのはメモリの管理(Cはこれは必要だと言われています)もグラフィックの表示も全部ライブラリや開発言語のコンパイル・デバック機能がやってくれるので、知らなくてもプログラムが作れてしいます。
だから知らない人が多いし、知る必要性もないんですよね。

しかしこういった基礎知識のある人と無い人の作ったプログラムでは、同じ開発言語で同じ動作をするものを作らせても差が出ます。
馬鹿みたいにメモリ食ったり、アホみたいに動作が遅いプログラムを後者は作りがちです。
また不具合も多いです。
不具合とかバグとか言われるもので最も多いのが、オーバーフローです。
これは用意された入れ物、変数とかメモリとか記憶域とかそういうものに入りきらないデータが来てしまって、本来ではあり得ない動作をしてしまうバグです。
コンピュータの仕組みを知っている人は、必ず対策をします。
例えばそのプログラムが扱える以上のデータが入力できないよう、入力数値の上限を設けたり入力文字数を制限したり、あるいは万が一オーバーフローした場合でも、不正確なデータを使って処理が進まないようエラーを出して止めるような仕組みを入れます。

そんな訳で、コンピュータの仕組みを知っておいた方が遥かに高性能・高信頼のプログラムが組めるんですよ。

で、まず最初にメモリの話をするかと思いきや、その前に基礎中の基礎である2進数の話をします。


1.なぜコンピュータは2進数で動くのか?

コンピュータはCPUやメモリやHDDなど全ての部品が2進数しか認識できません。
これすら知らない人は流石にプログラマの中には居ないでしょう。
ではなぜ2進数なんでしょうか?
なぜ我々が日常的に使う10進数で動くように作られなかったのでしょうか?

答えは2進数が最も正確にデータを扱えるからです。
例えば10進数を認識できるコンピュータを作ろうと思ったら、1Vの電流が流れたら1、2Vの電流が流れたら2という風に作らなければなりません。
しかし電圧というのは環境によって微妙に変化(主に低下)します。
電卓とか電池が少ないときに液晶の表示が薄くなりますよね?
でも計算結果は狂ったりしません。
これが10進数のCPUだったら、電圧が下がったら9Vの時は9と認識するという仕組みが正確に働かなくなり(電池の電圧が下がって9Vを出せないため)9+1とかやったら内部では8+1になってしまって答えは9とかなってしまう事もあるわけですよ。
困りますよね?w
2進数なら電流が流れたか流れてないかのみで、それが何Vかは関係ありません。
電池が少なくなっても完全に無くなるまで正確に計算できるんですよ。
これがコンピュータが2進数である理由です。

2.2以上の数値はどうやって表しているのか?

2進数しか扱えない事は分かった。
しかしこのままでは2以上の数字が扱えません。
1+1すら計算できない事になってしまいます。
じゃあ2以上の数値はどうやって扱っているのか?
答えは簡単で「桁」を増やすんです。
そもそも我々が使っている算用数字も0~9までしか種類ないですよね?
十以上の数値を表せないかっていうと「10」という風に桁を増やして表せてますよね?
2進数も同じです。

10進数で1の位、10の位、100の位・・・というのと同じように、2進数にも1の位、2の位、4の位・・・というのがあります。
10進数で「10」は十ですが、2進数で「10」は二です。
「100」なら四です。
「101」なら4の位と1の位が「1」なので4+1で10進数の「5」ということになります。

3.桁数の制限

2進数でも10進数と同じく桁を増やせば無限に数値を表せることは分かったかと思います。
しかし実際問題としてコンピュータに無限の桁数を処理させる事はできません。
メモリの最小単位である1バイトには0~255までの値の数値しか入れられないのがその証拠で、一度に扱える数値には実は上限があるんですよ。
コンピュータが一度に扱える最大の2進数は8桁までです。
2進数で8桁目の位は128になります。
1・2・4・8・16・32・64・128全ての位が1の時、1+2+4+8+16+32+64+128=255になります。
1バイトに入る最大値と一致するでしょ?

なおコンピュータでは8桁の事を「ハチケタ」とは言いません。
8bitと書いて「ハチビット」です。
どっかで聞いたことある単語ですね?
Windows7には32ビット版と64ビット版というのがありますが、あれと同じです。
CPUも古いものは32ビットCPUとかありますが、最近はみな64ビットCPUです。
つまり64ビットのWindows7や64ビットCPUは一回に2進数64桁分のデータまで計算処理できる、あるいはそういう命令をOSが使えると言うことです。

もっとも実際はCPUやOSがいくら64ビットでも、メモリやHDDの最小単位である1バイトには8桁(8ビット)のデータしか入れられない仕組みは変わってないので、64ビットOSやCPUが32ビットOSやCPUの2倍のスピードで処理できることはありません。
それと当然ながら32ビット以下のデータの処理スピードは理論上は同じという事になりますからね。

注:現在のメモリやHDDはこの壁を打ち破るために、2バイト以上を一度に転送できる仕組みを持っている場合があります。
例えばメモリなら連続した2バイト以上のデータを一度に送れるようにCPUへのデータの通り道を2つ以上に増やしていたり、HDDであれば一度に連続した2バイト以上のデータを読み書きできるようなヘッドを持っていたりという感じです。
ただしあくまで連続した、つまり1番地と2番地のデータを1度に転送できるだけで、データが1番地と4番地とか飛び飛びに保管されていた場合はこの限りではありません。
だからデフラグすると速くなるとか言われるのです。

これでコンピュータの最も基本的な2進数について、なぜ2進数でなければならなかったのか?2進数とはなんぞやってのと、その派生としてのビットやバイトの概念は理解できたかと思います。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR