ソフトウェアの仕組み

ソフトウェアの仕組み
Internal representation of program
コンピュータは,メモリの中にプログラムが2値の命令符号として格納され,それが連続的に読み出され
て実行されていること,文字や数値などの記号がコンピュータ内部で,どのように表されるのかについて説
明してきた。今回は,これまでの講義のまとめを兼ねて,データやプログラムが,どのような2値のデータと
して格納されているか,見てみよう。
復習
◎コンピュータは記号を処理する機械
様々な応用分野
「フォン・ノイマンのアーキテクチャ」が基本
◎全ての記号は2値の記号「ビット」の組み合わせで表現される
2値の記号にすると・・処理のための仕組み(回路)の信頼性が高い,高速化もしやすい
データのコピー,保存が容易になる
◎内部表現
基本はビットパターンとの“対応付け”。
しかし,文字や数値などの基本的な記号は,効率と処理のし易さを考慮して共通の形式が標準
化されている。
文字コード 半角英数字は8ビット,漢字ひらがなは16ビット,UNICODEも普及してきた
整数
負の数値は2の補数
有限桁であることに注意
実数
IEEE754浮動小数点形式
◎記号処理の仕組み
チューリングマシン( 入出力用“テープ”を持つオートマトン)による記号処理
2値論理演算と論理回路
→
組合せ論理回路と順序回路(ステートマシン)
「フォン・ノイマンのアーキテクチャ」
CPU
演算や制御をする
ハードディスク
インタフェース
メイン
・
メモリ
・
・
・
・
1
CRT
ディスプレイ
コントローラ
キーボード
インタフェース
・・・・
ハードディスク
ドライブ装置
CRT
ディスプレイ
データやプログラム
を記憶する
キーボード
入出力や通信を行なう
①プログラム内蔵
②逐次処理
③バス接続
#実際のパーソナルコンピュータの構造
CPU
メモリ
チップセット:パソコン構成用の周辺回路をLSI化したもの
「計算機基礎,計算機と情報社会・情報倫理」講義メモ
9-1
コンピュータの仕組みは階層化して理解しよう
2
抽象度高
分割して・まとめて,考える
まとめる大きさを変える
おおまかに考えたり,細かくして考えたり
抽象度も変えて考える
抽象度を高くする→細かな動作ではなく,
“何をしているか”で考える
CPU
・・・・
・
・
・
・・
V
抽象度低
ファイル
ワードプロセッサで作成した1つの文書や,プログラム開発でキーボードから入力したプログラムな
どは,一つのまとまったデータのかたまり,
“ファイル”としてコンピュータの記憶装置に格納される。
OS には,ユーザがファイルに対して,作成,場所の移動,削除などの操作を行えるようなプログラム
が用意されている。図9.1は,OSがコンピュータのディスプレイの画面にファイルを“アイコン”とし
て表示した例だ。
パソコンのディスプレイに表示されているのは,“ファイル”
や“フォルダ”である。紙の文書や,それを整理するフォ
ルダのような外見で表示されている,
このような表示も,プログラ
ムが行っている。
実行形式のファイル。コンピュー
タが実行できる機械語のプログ
ラムをファイルにしたもの
通常,ファイルは,そのファイルを処理するためのソフトウェアと
関連付けられている。Windows OS の場合,ファイル名の末尾
の“.csv”などのような,拡張子で,必要なソフトウェアを指
定する。
図 9.1
OS がコンピュータのディスプレイの画面に
ファイルを“アイコン”として表示した例
ファイル(file)コンピュータがデータやプログラムを保存するときの単位。ファイルは,パソコンの操作画面では様々
なアイコンとして表示されている
OS(operating system)コンピュータを“コンピュータ”として成り立たせている基本的なプログラムのグループ
バイナリエディタ((hex editor または binary file editor, byte editor))ファイルを 2 値データとして編集するためのソフ
トウェア
「計算機基礎,計算機と情報社会・情報倫理」講義メモ 9-2
3
ファイル:通常は,不揮発性 の記憶装置上に保存される
電源を切ってもデータを保持
ハードディスクドライブ(HDD),SSD ,USBメモリなど
様々な種類のファイルがある
Windowsの例:ファイル名.doc→Wordの文書
ファイル名.exe→実行形式ファイル・・・など
ファイルの保存場所:通常,ファイルはハードディスクや
フラッシュメモリなどの不揮発性の記憶装置に保存される。
WordやExcelなどのソフトウェアでファイルを作成し編集
していると,ファイルの内容はメインメモリ上や一時的フ
ァイルに保存されている。“ファイルの保存”をすること
で,ハードディスク上のファイルが作成または上書きされ
る。
ファイルの種類:大きく分けると,文字データで構成され
るテキストファイルと,コンピュータが直接扱うデータの
まま保存されているバイナリファイルに分類される。
また,Windowsマシンでは,どのソフトウェアで扱うため
のファイルかを,ファイル名の末尾の拡張子で区別してい
る。
Wordのファイルで
あることを示す
実行形式のファイルで
あることを示す
Fig.9.2 ファイルのアイコン
Windows OSでは,実行形式,つまり,メモリに格納してCPUが実行できる形式のプログラムをファイ
ルにしたものはファイル名の末尾が“.exe”となっている。このファイルの中身をバイナリ・エディタ
で見ても,0と1が並んでいる点では,他のデータファイルと変わりはない。実際,多くのフォン・ノイ
マン型コンピュータでは,データもプログラムも同じメモリに格納されている。
機械語のプログラム
4
CPUが直接に解釈・実行できる命令符号を並べたもの
人間には,読めない
CPUの細かな動作を一々指示しないといけない
→
機械語によるプログラム
不揮発性メモリ(non-volatile memory)
ハードディスクドライブ(hard disc drive,HDD):磁性体を塗布した円盤(disc)を使う補助記憶装置
ソリッドステートドライブ(solid state drive):半導体メモリを用いて見かけ上 HDD と同じ機能を持たせた補助記憶装置
実行形式ファイル(executable file),命令符号(instruction code),機械語(machine language)
アセンブリ言語(assembly language),高級言語(high-level programming language)
「計算機基礎,計算機と情報社会・情報倫理」講義メモ
9-3
命令符号の構成例
加算などの演算命令の場合,命令符号(機械語)は, 図9.3 に示すように構成されている。
演算符号
格納場所1
OP-code
演算の種類を
指示する符号
格納場所2
Operand
Fig.9.3 演算命令の構成
対象となるデータと演算
結果の格納場所を指
示する符号
命令符号 ソフトウエアの最も細かな部品
CPUの動作を指示するビット列
5
ソフトウェアの低レベルの“部品”
機械が理解できる言語なので“機械語”とも呼ばれる
命令の種類を表すオペコードとデータを指定するオペランドからなっている
演習問題[1] 1語が16ビットのCPUがあり,その命令
符号について右の欄のような説明が示されている。
以下のような命令符号がメモリに格納されている
とき,このCPUがどのような動作を実行するか答えよ。
ただし,命令実行直前のレジスタの内容は,R1 =
0x01,R2 = 0x20とする。
①
0010 1011 1100 1010
0000 0011 0000 1110
0000 0001 0000 0000
②
0000 0011 0000 1110
0000 0000 1000 0000
このプロセッサには2つのレジスタ,R1と
R2を持つ。
0000 0011 1100 1010 ・・・I1
という命令符号(これをI1とする)を読み込む
と,レジスタR2 の内容をR1 の内容に加算し,
結果をR1 に格納する動作
R1 ← (R1)+ (R2)
を実行する。また,R1 の内容からR2 の内容を
減算し,R1 に格納する動作
R1 ← (R1)- (R2)
は,
0010 1011 1100 1010 ・・・I2
で指定される.また,2語を用いる命令,
0000 0011 0000 1110
・・・I3
D15 - 0
は,R1 の内容に,第2語の16ビットデータを
加算する命令
R1 ← (R1)+ D15 - 0
を示している.
0000 0011 1100 1010
「計算機基礎,計算機と情報社会・情報倫理」講義メモ 9-4
演習問題の解答例
①右の説明の文章より,
0010 1011 1100 1010
0000 0011 0000 1110
ⅰ)
ⅱ)
0000 0001 0000 0000
ⅰ)命令符号の0010 1011 1100 1010は,説明
の文章により,R1 ← (R1)- (R2)という動作
を指定する。
ⅱ)その次の命令符号の0000 0011 0000 1110は,
命令符号の次の16ビットデータ D15 - 0,をR1に
加算する。D15 – 0 = 0000 0001 0000 0000 = 25610
なので,2 つの命令を合わせると,
「レジスタR1からR2の内容を減算し,256を加算する動作」
②同様にして説明の文章の中から対応する命令符号を見つ
けることで,「R1の内容に128を加え,それにR2の内容を加
算する動作」であることがわかる。
このプロセッサには2つのレジスタ,R1と
R2を持つ。
0000 0011 1100 1010 ・・・I1
という命令符号(これをI1とする)を読み込む
と,レジスタR2 の内容をR1 の内容に加算し,
結果をR1 に格納する動作
R1 ← (R1)+ (R2)
を実行する。また,R1 の内容からR2 の内容を
減算し,R1 に格納する動作
R1 ← (R1)- (R2)
は,
0010 1011 1100 1010 ・・・I2
で指定される.また,2語を用いる命令,
0000 0011 0000 1110
・・・I3
D15 - 0
は,R1 の内容に,第2語の16ビットデータを
加算する命令
R1 ← (R1)+ D15 - 0
を示している.
0000 0011 0000 1110
0000 0000 1000 0000
0000 0011 1100 1010
質問・意見(抜粋)と回答例(Q:質問,C:意見,R:要求,A:回答)
C:論理和と加算回路の話はよく理解できたが,最後の命令符号の演習問題が全くわからなかった。
(という意見が非常に多数)
A:演習問題は,命令符合つまり「CPU に動作を指示するビット列」がどのようなものか見てもらうための例とし
て挙げました。が,説明不足のようでした。次回に説明します。
しかし,このところ,次回に疑問点を残す展開が続いています。それ自体は,学生さんに知的負荷をかけるこ
とになるので,教育的には良いことなのですが,このところの忙しさで準備不足になっているのも原因なので,
反省しなければなりません。
Q:演習問題[1]の「D15-0」の意味がわかりません。どうして2 進数表現から変える必要があったのですか?
A:一般的な文字式としてデータを表したかったからです。この問題の命令符号は始めの 16 ビットで命令の動作と
対象となるデータの場所を指示します。そして対象となるデータの片方は,次の 16 ビットデータで指示されます。
この 16 ビットデータは,始めの命令符号とは異なりいろいろな値を取ります。このため,
“0110 1110・・・”
のように固定できないので,一般的に表すためにD15 D14・・・D0のように文字式を使っています。
Q:演習問題[1]で「R1 = 0x01,R2 = 0x20」の意味がわかりません。
A:これは 16 進表記であることを指示するために使われている記法です。後述する“アセンブリ言語”や C 言語な
どのプログラムで数値を指定する際にも使われています。ビットになおすと,0x01 = 0000 0001,0x20 = 0010
0000 です。なお,この問題ではレジスタは 16 ビットデータを格納することになっているので,通常の2進数表
記と同じように,上位に 0 を補って扱います。0x0001 とか,0x0020 のように書いてもかまいません。
Q:不揮発性メモリのしくみは,どのようになっているのですか?
A:現在,最も広く使われている HDD は磁性体の“磁化”を利用しています。永久磁石などで縫い針を擦ると,磁
化して,縫い針自体が磁石になる,という実験をしたことはないでしょうか? このような磁化を利用すること
で,電源を切ってもデータを保持する記憶装置ができます。
Q:①SDD ではなく,SSD では? ②SSD は HDD と比べて,どのようなメリット・デメリットがあるのか?
A:①はい,ご指摘のとおり,SSD(solid state drive,そりっど・すてーと・どらいぶ)でした。直訳すると“固
体ディスク”ですが,“半導体ディスク”と訳されるようです。半導体メモリを用いる不揮発性の記憶装置です。
②HDD は強磁性体を塗った円盤(ディスク)を回転させ,読取り・書込み用のヘッドを動かしています。これに
対して SSD は可動部が無いため,高速で,物理的衝撃にも強いのです。しかし,ビット当りの値段は HDD の方
が安いので,同じ値段なら HDD の方が大容量になります。
C:機械語は人間の作ったものなのに,なぜ人間には読めないように作ってしまったのか,わからない。もっとわかりやすくできなかっ
「計算機基礎,計算機と情報社会・情報倫理」講義メモ
9-5
たのかと思った。
A:CPU が実行するときの効率を優先するので,仕方のないことです。
Q:いろいろな質問に答えていますが,これは調べているんですか? それとも,知識の範囲内なのですか?
A:おおむね,知識の範囲内ですが,細かい数値や怪しいところは,web で調べます。ご存知のように web で収集
できる情報の質は玉石混交ですから,皆さんも,
“これは飽くまでも田村の意見”と考え,鵜呑みにせず,必要な
ときは裏を取るようにしてください。
Q:①“BinaryViewer.exe”を作るのは難しいのでしょうか? 「テストの問題を作るため」ということですが,問題を作るより簡単
なのですか?
②BinaryViewer.exe はどのようなソフトを使って作ったのか? ③web にアップロードすることは可能か?
A:①②資料 6-2 に書いてありますように,C#を使い,統合開発環境の VisualStudio2008 を使っています。自分で
は,非常に短いコード(プログラムの文や式)を追加しただけでした。このプログラムの場合,32 ビット浮動小
数点で宣言されたデータのビット列を読み出すところで,プログラム初心者に説明するのはちょっと難しい方法
を使っています。
“テスト問題を作るより簡単か?”と言われると,やはり,問題作るよりは,ずっと時間がかか
りました。それは,C#という使ったことの無いプログラム言語の勉強から始めからですが,それはそれで楽しい
ものです。③GroupBoard にアップロードしておきます。ソースコードも必要でしょうか? 一応,著作権は私
にありますが,コピーフリーも改造も自由です。
Q:抽象度とは何ですか?
A:例えば,
“まず2つのビットx0とy0を加算し,その結果の桁上げ信号をx1とy1の加算回路に入力し,さらに・・・・”
という書き方に対し,
“x3x2x1x0とy3y2y1y0を加算する”と書く方が,抽象度が高いのです。機械語のプログラムは,
実際にCPUが行っている動作を逐一指示するので,ある意味“具体的”です。しかし,一つ目の例にあるように,
一つ一つの細かな動作は明確にわかっても,全体で何をしているかは,わかりません。これに対し,抽象度の高
い表現だと,細かな動作はわからない,つまり内部を“ブラックボックス”として考えますが,大きなかたまり
として何をしているかは,わかりやすくなります。
Q:バイナリエディタは,PC ゲームなどをディスクレス化するために使われています。またフリーソフトに何らかの不備があるかどうか調べ
たり,また直したりする目的で使われています。ずっと使っていて疑問に思ったのですが,上記のようなことは悪いことなのでしょう
か? ディスクレス化は不正コピーにつながり,ソフトウェアの手直しは著作権に触ってしまう可能性があります。いったい,どの行
為までが大丈夫であり,どの行為からがダメなのでしょうか? 今後使ってみたいソフトなので,お願いします。
A:バイナリエディタは,その性格上,リバースエンジニアリング(秘密にしておきたいプログラムや LSI の中身
を調べること)やソフトの改変に使われるので,ご心配のように,違法行為につながる可能性があります。基本
的には,ソフトウェアのインストール(パソコンに組み込むこと)する際などに表示される使用許諾契約の文面
を良く読むこことが大事です。著作権や情報倫理に関しては,この講義の最後のテーマとして準備していますの
で,そのときに,説明します。
Q:どうしてみんな質問ができるのか? 私はどこを質問しなければいけないのか,わからないくらい,たくさんわからないです。わ
からなすぎて申し訳ないです。
A:質問用紙は,成績評価の1つとして捉えている方もいるようですが,私にとって一番の使い道は,講義内容が皆
さんに伝わったかどうかを知ることです。それをもとに次の講義の内容にフィードバックしています。ですから,
質問だけでなく,コメント・感想も書いてもらっています。
“わからない”ということは非常に重要な情報になり
ます。できれば,具体的に講義のどの部分の,どの説明がわからなかったかを教えてもらえれば,さらに助かり
ます。どこを質問してよいかわからない,という状態の人がいることも理解しています。その場合は,
“全部”と
考えると動けなくなるので,まず何でもいいから動いてみて,“始めに触ったところから” 言葉にしていく,と
いうふうにしてみては,どうでしょうか。
また,私の講義は“わからない”人をターゲットにしていますので,基礎的な話に終始してしまい,上級者に
は退屈になる恐れがあります。そこで,
「質問と回答の抜粋」には,少しマニアックな内容も入れてあります。
Q:図 6-1 の命令符号の例で「Register」とある部分はレジスタの番号らしいのですが、2 進数の値なのですか? Register
として入る値は決まっていて毎回同じ値なのでしょうか?
A:もちろんレジスタ指定部は2値のビット列です。この例(ADD 命令)では,ビット 11~9 までの3ビットを使
うので,最大で8個のレジスタから1つを指定することができます。したがって,いつも同じ値ではなく,指定
するレジスタによって値が異なります。(Very Good)
Q:命令符号は,ソフトウェアの構成要素の中で最も細かいものと聞いたが,図を見ても,どのようにして動くのか,わからなかっ
た。
A:この図からは,わかりません。CPU が命令符号を読み込むと,そのオペコード部分が解読用の論理回路(デコ
ーダ)に入力されます。デコーダは,何をする命令かを解読し命令実行を制御する論理回路(コントローラ)に
指示を出します。これらの動作を理解するためには,
「論理回路」(デジタル回路)などの講義を受講する必要が
あります。私が担当している「マイクロプロセッサとインタフェース」の講義では,そのあたりの説明をし,簡
単なプロセッサを設計する演習をやっていますが,A コース用の科目です。
「計算機基礎,計算機と情報社会・情報倫理」講義メモ 9-6
補足
ハードウェアの構成
1)バスの構造
コンピュータ内部では,複数のユニット(部品)がバスと呼ばれる共通のデータ伝送線に並列に接続さ
れている。バスは3つの部分に分かれている。
①データバス:データを伝送する。データのビット幅と同じ数の信号線で構成される。
②アドレスバス:複数のユニットには互いに異なる2進数の番号(アドレス)が割り当てられている。メ
インメモリも,定められたビット幅(通常は1バイト)の単位でアドレスが割り当てられる。アドレス
はアドレスバスを介して伝送され,指定されたユニットだけがバスに対してデータを出力するようにな
っている。
③制御バス:データ伝送の方向,タイミングなどの情報は制御バスと呼ばれる信号線を使って伝送する。
このような構成のバスを使っているため,CPU は一度に一単位のメモリに対してのみ読み書き(アクセ
ス)ができる。この点で,一度に読書きできるのはテープの一区画だけに限定されているチューリングマ
シンと同じである。ただし,チューリングマシンでは,読み書きヘッドは隣の区画にしか移動できないと
想定していたのに対し,現在の CPU とメインメモリは,指定したアドレスのメモリを直ちに読み書きでき
る点が異なる。
番地 0000
0001
0002
0003
・
・
0000 0000
0001 0010
0010 1101
1000 1010
番地を指定して読み書き
・
・
A000
A001
A002
CPU
0101 0110
0001 1110
FFFD
FFFE
FFFF
0000 0000
0001 0010
0010 1101
0000 0001
この内部にも,いろいろな部品が入って
いるが,取りあえず考えない。
(ブラック
ボックスとして扱う。)
アドレス(address,番地)コンピュータ内部のユニットに割り当てられる2進数の番号,データバス(data bus)データ
を伝送するためのバス。語長と同じビット数で構成される, アドレスバス(address bus)アドレスを伝送するためのバ
ス。例えば 16 ビットのアドレスを持つコンピュータでは 216 =64k個(65536 個)のアドレスを指定できる。(つまりnビ
ットアドレスなら 2n 個),制御バス(control bus)データの転送方向やタイミングを知らせるためのバス,アクセス(access)
“接近”,
“交通手段”などの意味だが,コンピュータ用語では,記憶装置やネットワーク上にある情報を読み書きするこ
と。
「計算機基礎,計算機と情報社会・情報倫理」講義メモ
9-7
2)CPU の内部
資料 9-4 の演習問題では,CPU について,その内部の仕組みは伏せて,つまり,
“ブラックボックス”と
して扱っていた。しかし,ブロックボックスの中身について少しは知っていないと,非常に簡単な問題さ
え解けないことがある。
CPUの内部も,複数のユニットに分けて考えることができる。まず,CPU内部のユニットを制御するコン
トローラ(制御回路)部と,データを処理するデータパス部に大きく分けることができる。主なユニット
としては,命令符号を解読する命令デコーダ回路,制御回路,演算を行うALU,一時的なデータ格納装置
であるレジスタなどがある。
クロック
アドレスバス
コントローラ部
データバス
リセット
制御バス
R1
ALU
R2
R3
データパス部
レジスタ
ブラックボックス(black box)内部の仕組みを知らなくても,外からみた動作や機能を知っていれば使えるように作ら
れた機械や装置のこと。もともとは中身の仕組みの見えない機械や装置のこと。命令デコーダ(instruction decoder)こ
こでは,読み込んだ命令符号を解読するための論理回路のこと。一般に,特定のビットパターンに対して特定のビットパ
ターンを出力する論理回路のことをデコーダと呼ぶ。コントローラ(controller)命令デコーダで解読した結果に基づい
て,CPU 内部のユニットを命令を実行するように制御するための論理回路。レジスタ(register)CPU やデジタルシステム
の内部にある小規模で高速なデータ格納装置。クロック(clock)CPU 内部にある複数の回路の同期を取るために供給され
る周期的な信号のこと。リセット(reset pulse)CPU などを初期状態に移行させるための信号。
「計算機基礎,計算機と情報社会・情報倫理」講義メモ 9-8