2ntブログ

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

コンピュータはCPUもメモリもHDDも全ての部品が内部構造的に2進数の電気信号で動いている事は前回お話しました。
しかしメモリやHDDなど記憶域の最小単位の1byte(イチバイト)は2進数1桁ではなく、2進数8桁分を保管できます。
またCPUが扱う演算命令の最小単位も2進数8桁、つまり8ビットです。
これらは人間が見える形で表記する場合、そのまま2進数8桁だと01001010とかになってしまって見難いし、表示数も多くなってしまうので、通常は16進数2桁に直します。
16進数はその名の通り、「16」で1桁あがる表記法です。
我々が日常的に使っている10進数の算用数字は0~9までしかありませんが、16進数では10~15までも1桁で現さなければならないので、英字のA~Fまでを用います。
0Fなら10進数の15って事です。

どんな開発言語でプログラムしても、最終的にはこの16進数の羅列に変換されます。
EXEでもCOMでも良いので、中身を直接そのままの形で見てみれば分かります。
実行形式のファイルやあるいはテキストや音楽や映像でもなんでも、コンピュータに保管されているそのままの形で中身を見るには、「バイナリエディタ」というツールを使います。

CPUの8ビットとか16ビットとか32ビットとか64ビットというのは、主に1回で計算できる量が関係しています。
8ビット時代でも16ビット、つまり16進数4桁、2バイト分のデータを処理する命令(マシン語)は存在しましたが、2サイクル掛かりました。
今のCPUは64ビットなので、16進数16桁、8バイト分のデータを1サイクルで扱える命令が存在しているはずです。
CPUが計算処理を行う場合、メモリから対象データをCPUの作業域ともいえる内部メモリに一度取り込んで処理して内部メモリから元のメモリへ返すわけですが、この内部メモリを「レジスタ」と言います。
この「レジスタ」も64ビットのものがあるはずです。
私も詳しい事は8ビット時代のCPUまでしか分からないのですが、その時代はレジスタは基本的に8ビットでした。
有名なZ80という8ビットの代表的なCPUがありますが、それが使えるレジスタはA(アキュームレータ:一番高速で基本となる計算用レジスタ)をはじめとして、サブ用のBや計算には使えないがメモリの番地を記憶できるものなど数種類がありました。
これら全ては基本的に8ビットで、それ以上のデータを扱う場合ABなどのように2つのレジスタを合わせて16ビット分のデータを扱っていました。
ちなみに16ビットより大きなデータを扱う場合は、分割して計算するしかありませんでした。
その分処理も複雑になるし(桁上がりなどの管理をプログラム側でしなくてはならないので)、速度も遅くなりました。
もっとも当時はそんなに大量の大きなデータを扱う事はまずありませんでしたので、さして問題は無かったですが。

古い、ファミコン時代のゲームとかのステータスやレベルの上限がよく255なのはこの為です。

これらを知っていて今の時代に何の役に立つかと言えば、まぁせいぜいメモリを食わないプログラムを組めるぐらいでしょう。
コンパイラが優秀なら速度アップも見込めるかも知れません。
なぜなら今の開発言語はCPUが直接理解できる命令はまず無いからです。
複数のマシン語で実現できる命令を人間がソースとして書いて、それをコンパイラが複数のマシン語の命令に変換して保存するんです。
この変換作業の時に、0~255までの範囲内の計算ならば8ビットの計算処理命令という早いマシン語に変換してくれるかもしれないということです。

VB(ビジュアルベーシック)などに、プログラム中で使う変数の型を宣言できる命令がりますが、あれらで0~255の範囲内しか絶対にあり得ない場合に使う「バイト型」というのがあります。
一番メモリを使わず高速に処理できるはずです。
何も宣言しないと「バリアント型」という数値でも文字でも何でも扱える、メモリを沢山使う型にされてしまいます。
当然、コンパイル時にバリアント型の変数の計算処理命令はたとえ中身が8ビットに収まる数値でも、16ビットや32ビットあるいは64ビットの計算命令に変換されてしまうわけです。

何が言いたいかというと、プログラムを作る時は全てのデータは16進数2桁を基準に考えろって事です。
仕様書にはこのデータは0~10000までの整数しかあり得ませんとか、20文字の日本語ですとか定義されているはずですが、それらをそのままプログラムに起こすのではなく、一度頭の中で16進数に変換して考えろって事です。
0~10000の整数なら当然8ビットには収まりません。
しかし16ビットになら収まります。
なぜなら16ビット、つまり2バイト、16進数4桁で現せる数値は0~65535だからです。
また20文字の日本語の場合、日本語など半角で表せない文字は基本的に2バイトの文字コードを使いますので、2×20で40バイトものメモリを消費するんだなぁとか思えるわけですわ。
そうすると、たとえばそれを1万件保管したい場合に、どんぐらいHDDの容量が必要かもわかりますよね?
それらを知らないと、これこれこういうデータを最大100万件保管できるだけのデータベースサーバを構築して下さい言われた時に、ストレージ(サーバなど業務用の大型コンピュータのデータを保管するためのHDDをいくつもはめ込んで1つの記憶装置として使える装置)どんぐらい用意すりゃいいのかとか検討もつかんわけです。
まぁプログラムとは関係ない、サーバの運用・構築の話になってしまいますが。

とにかくプログラマだけでなく、なんかコンピュータの技術者的仕事をしてる人は、こういうの分かっていないと困りますよって事です。

コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

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

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

この人とブロともになる

QRコード
QR