なぜプログラムは動くのか (コンピュータ サイエンス 入門) 研修コースに参加してみた
今回参加した研修コースは なぜプログラムは動くのか です。
私はこのコンピュータとプログラムのつながりのお話が苦手で、特に論理演算が何を言っているのか、わからない人間でした。
それが今回、ようやく分かってきました!! 論理演算で加算の仕方がわかったこと、これが私にとって最大の成果です!
という、個人的な感想はそれとして、アセンブラというとっつきにくい言語を、とにかく順を追って丁寧に解説いただいたので、プログラムがどのようにコンピュータに命令して処理していたのか、わかりました。
では、どのような内容だったのか、レポートします!
もくじ
コース情報
想定している受講者 | 特に前提知識なし |
---|---|
受講目標 |
|
講師紹介
登壇されたのは プログラムはなぜ動くのか(日経 BP 社刊行) の著者、 矢沢 久雄さん です。この参加してみたレポートでは久々ですね。
『プログラムはなぜ動くのか』(日経 BP 刊)が大ベストセラー
IT技術を楽しく・分かりやすく教える “自称ソフトウェア芸人”
また、執筆時の秘話を教えてもらえました。
- 日経ソフトウエアから「基礎の特集を書いて欲しい」というザックリした要望からスタート
- 「今どきの若者は基礎がわかってないねぇ」 と言う人の「基礎」を聞いてみた
- 基礎とは?
- ハードウェア
- アセンブラ
このコースで「基礎」がわかるようになります! ということでスタートしました。
ハードウェアとソフトウェア
- 演算装置: CPU 、 記憶装置:メモリ、入力装置:キーボードなど、出力装置:ディスプレイなど
と、よく新人研修で紹介されますが、これを知って何がうれしいのでしょうか。
- 何の役に立つのか?
- ユーザー視点からエンジニア視点に変わる
- コンピュータが入力 演算 出力 記憶 制御 しか出来ない装置として見える
- ハードウェアとソフトウェアの関係がわかる
- プログラムがわかる
- ユーザー視点からエンジニア視点に変わる
- ソフトウェアで示された命令に従ったハードウェアが動く
- 命令とは「~せよ」
- 命令は大きく5つ
- 「 せよ」を意味する命令
- 「 せよ」を意味する命令
- 「 せよ」を意味する命令
- 「 せよ」を意味する命令
- 「ジャンプせよ」を意味する命令
プログラムは入力、演算、出力、記憶という命令文になります。
この 5 つでネットショッピングやチケット予約などを実現しているので、プログラムを一杯書かなくてはなりません(途方もない気がします)。 なので「ラクしたい」から高水準言語でカンタンに書けるようになっているそうです。
とにかく「ラクしたい」というのは技術進化に繋がっているとのことでした。確かにそうですね! 面倒だなと思うことはアイデアの母かも知れません。
ちなみに、その一方で、同じ処理を書くにはラクできるようになったものの、それ以上に複雑な問題を解決できようになって、さらにプログラムは複雑になってる感もあります。うーむ。
なぜ2進数を使うのか?
- 10 進数を表すのに電圧を変えて使いたかった
- 試しに人を押す力を 10 段階で分けてやってみる
- 押された人にどの段階かを聞いてみる
- 当たり前だけど、上手く行かない
- 電圧もこれと同じこと
- ON / OFF ならわかりやすかった -> 2進数
- 更に言うと電圧が低ければ電源消費が抑えやすい
- ON は 5 v ぐらいの微弱電気
- この 2 進数を伝える単位がビット
- いまは 64 ビットまでいける
- 8 ビットを 1 バイトという単位で呼ぶ
- 半角英数字がバイトだと表現できる
量子コンピュータでは、 0 と 1 だけでなくその間の値も扱えるようになります。根底から変わりますね。。
2進数で数えてみよう
では、その 2 進数に慣れるためにちょっとした演習をしてみます。
0
1
10
11
110
:
1111
という書き方ではなく、バイト単位で書くようにしましょう。
00000000
00000001
00000010
00000011
:
00001111
マイコン回路図
ここで実際にマイコンの回路図を使って、I/OからどのようにCPU、メモリと電気が流れているのか、解説いただきました。 (基本情報技術者試験で扱う架空のハードウェア COMMET Ⅱ を使います)
論理演算と四則演算
10 進数の代わりにコンピュータでは 2 進数を使っていることは理解できました。では、どのように四則演算をコンピュータで実現しているのでしょう。
ジョージ・ブールが 真と偽の論理演算の世界を確立し、クロード・シャノンが論理演算は電子回路できることを論文で発表し、 2 進数の演算をコンピュータで実現できるようになりました。
と言っても、何のことか分かりません。。もう少しその論理演算と実現する装置を詳しく解説いただきました。
論理演算
上の表のうち、加算はどのような条件のときに出来ているのでしょうか。
- X = 1, Y = 1 のとき加算が出来ている (桁上り)
- X または Y のどちらかだけが 1 のとき加算が出来ている
ということは AND 演算 (回路) と XOR 演算 (回路) を使えば、加算が出来るのでした。(おおー!)
ちなみに、加算ができれば、減算、乗算、除算は下のように実現できます。
- 減算
- 補数を使う
- ( 10 進数) 7 – 2 の場合
- 2 の補数は 8
- 7 + 8 = 15 の桁上りを消すと 5 になる
- 乗算
- 5 × 15
- 5 から 5 ずつ 15 回加算することを繰り返す
- 除算
- 75 ÷ 5
- 75 から 5 ずつ減算することを繰り返す
アセンブラのプログラム
コンピュータの中でどのように 2 進数を使って演算しているのかわかったところで、いよいよプログラムがどのように動くのか、アセンブラをやってみます。
構文
ワクワクしていると、矢沢さんから衝撃のお話が。
「アセンブラの場合、言語構文は 1 つしかありません。
“~せよ” ”~を”
おしまい。」
(えっ!?)
なので、本にならないそうです。。
命令の種類
言語構文は 1 つですが、もちろん命令がたくさんあります。
これをもとにカンタンなプログラムを考えてみます。
シンプルな加算プログラム
;ラベル オペコード オペランド コメント
KASAN START ;プログラムの先頭
LD GR0, DATA1 ;GR0にDATA1の値をコピーする
ADDA GR0, DATA2 ;GR0にDATA2の値を加算する
ST ANS, GR0 ;GR0の値をANSにコピーする
RET ;プログラムを終了する(OSへ戻る)
DATA1 DC 12 ;12というデータを格納しておく
DATA2 DC 34 ;34というデータを格納しておく
ANS DS 1 ;加算結果を格納する入れ物を用意しておく
END ;プログラムの末尾
- LD: LoaD (ロードせよ)
- ADDA: ADD Arithmetic (加算せよ 算術)
- ST: STore (格納せよ)
- RET: RETurn
- DC: Define Constant (定義せよ 定数を)
- DS: Define Sotrage (定義せよ 記憶領域を)
先程のコンピュータの中身の通り、 CPU で演算し、メモリに値を格納しています。なるほど、なるほど読めますね !!
ただ、一つ一つは難しくありませんが、直感的に見えず、冗長に見えます。(私の感覚でしょうか?)
なお、同じプログラムをC言語で書いたときのサンプルも矢沢さんから見せていただきました。皆さんはどう感じられますか?
#include <stdio.h>
int data1 = 123;
int data2 = 456;
int ans;
int main() {
ans = data1 + data2;
return 0;
}
その他、もう少し複雑な配列を扱うプログラムを、実際に動かせるシミュレーターを使ってデモしたところで、このコースは修了しました。
まとめ
このコースでは、なぜハードウェアがいまのような仕組みになったのか、2進数、論理演算を紐解きながら、そのハードウェアの仕組みを、アセンブラというプログラミング言語を通じて、どのように活用しているのか、解説いただきました。
C や Java 、はたまた Python, Ruby などのスクリプト言語などプログラミング言語が、なぜ「ラク」に書けるように進化しているのか、原点のアセンブラのコードを見て感じられたように思います。
プログラムは書けるけど、レイヤが低い話は苦手だなぁ、私のように論理演算が苦手だなぁ、もしくは「今どきの若者は基礎がわかってないねぇ」と言われた方には、とてもオススメのコースです!!
SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。