0 この講義の内容、進め方、評価、参考文献

コンピュータ・アーキテクチャ I 資料
2016 年 前期
この講義の内容、進め方、評価、参考文献
0
0.0
内容
前期で行うこの科目は、コンピュータをハードウェア1 面から見ていきます。
後期で行うコンピュータアーキテクチャII はコンピュータをソフトウェア2 面か
1:意味 金物、機械設備
ら見ていくことを原則とします。これはあくまで原則であって、互いに説明が
2:意味 実行すべきプログラム等
入り混じることになるでしょう。コンピュータはソフトウェアとハードウェアが
入り混じったキメラ (chimera, キマイラ) のようなもので、一面から見ただけで
は片手落ちになってしまいます。。授業の概括としてですが、最初に現在のコン
ピュータの構成を概括しつつ、用語を理解した上で一度過去に遡ってどうして今
の形になったかを覗いた後に中身の話を行う予定です。
0.1
進め方
進め方は年度や機会によって試行錯誤をしながらやっているので、すこしづつ
違っています。またある項目は飛ばしたりもしています。ハードウェア編と概念
編のうちの概念編を先にやることがほとんどです。2010 年はプリントを大きく
変更していて、概念編にチューリングマシンの話を付け加えて、裸のコンピュー
タに近付きやすくしています。戸次先生からはどこが近付きやすいのか (笑) と
言われましたが、私は近付きやすくしたつもりです。私が脳梗塞でまともに発声
ができないので大幅に内容を削減します。
0.2
評価方法
評価は基本的には中間試験と期末試験です。出席は質問票の提出で行いま
す。また時々ミニレポートを課します。質問票とはその授業時間の最後に、講義
に対する質問や要望を紙に書いて提出して頂く紙のことです。こうして集めた質
問や要望は次回の授業のときにまとめて回答しています。また時として先輩が疑
問に思ったことを予めプリントに書いておくこともあります。緊急に回答しなけ
ればならない内容はメールで返事をする場合もあります。
0.3
参考文献
参考文献をまとめて挙げておきます。
• 構造化コンピュータ構成 タネンバウム 2000 年発行原書第 4 版 ISBN-10
4894712245
やや古くなりましたが後期の OS との繋がりの良さから採用しています。
なお、参考文献が古いなどについて
は私が十分な調査ができなかったた
めです。ひとまず大目に見てくださ
るとありがたいです。
基本的にはこの本の内容に沿っています。[参考文献 1]
• コンピュータの 構成 と 設計 -ハードウエア と ソフトウエア の インタフ
ェース (上/下) パターソン, ヘネシー ISBN-10 482228266X(上),ISBN4822282677(下)
平成 28 年 4 月 11 日版
0- 1
ここに挙げたのは第 3 版の翻訳で、現在は原書第 4 版が出ています。残念
ながら新版は一冊だけで刊行されており、 付属の CD-ROM まで全部読ま
ないと授業の範囲をすべてカバーできないのが残念です。とても易しいと
ころから相当高度なところまでをきちんとカバーしていて 好感が持てるよ
い本ですが大局観が少し足らないかもしれません。最初から通して全部や
るには良い本です。 [参考文献 2]
• コンピュータ・アーキテクチャ 定量的アプローチ 原書第 4 版 ヘネシー、
パターソン [参考文献 3] ISBN-10 4798114405 専門家向けに難しい話が出
てきます。これは少し難しいと思います。論文からの引用や比較的新しい
情報の乗っている部分を引用させて頂いています。
以上 4 冊はどれもかなり高価な本です。
• コンピュータの仕組み 尾内 理紀夫 [参考文献 5]ISBN-10 4254127014 ほ
ぼ全てを網羅的に書いてある本。いろいろな部分から少しずつ内容を拝借
しています。電通大の尾内先生には直接お話して授業で使わせていただい
ています。なお尾内先生から「みなさん、この本をぜひ買ってください」
とのことです。よい本だと思います。
• CPU の創りかた 渡波 郁 [参考文献 4]ISBN-10 4839909865 ハードウェ
アに興味がある人には向いていそうです。ロジック IC を用いて、1 から
CPU を作ってみせています。
0.4
大学での勉強方法について
大学とは、学習をするための場ではなく、新しいことにぶつかったときに、ど
1
のようにそれを学び覚えるかを学び取るための場です。
これは一般にメタ学習と
呼ばれています。
教育とはある種の洗脳です。その責任を恐れるものは教育を放棄しています。
その責任に溺れるものは教育者として不適格です (これは私の自戒の言葉でもあ
ります)。
かつてニュージーランドで行われた行政改革の結果、ニュージーランドの大学
の学費は高騰しました。ニュージーランド政府をそれを正当化する理由として、
大学は卒業後の収入を増やす目的で学生が利用する施設であり、それを利用する
かしないかは個人の自由である、それ故、もしそれを利用するならば受益者負担
2
の原則を守る義務が生じる。
と説明しています。
もし皆さんがこの説明に頷いたなら、ぜひ引用文献を読んでみてほしいと思い
ます。ニュージーランドの行政改革によって何が起こったか、そしてその影響が
どのように他の問題に波及したかがわかります。
平成 28 年 4 月 11 日版
0- 2
1:少なくとも、過去はそうでした。
今後は変わる可能性がありますが...
蛇 足:JABEE
(Japan Accreditation
Board
for
Engineering
Education、
http://www.jabee.org) と い う
のがある。大学工学部など工学系
技術者養成の学校で、「学生の品質
保証」をするために導入が進んで
きている。 「今そこに存在して
いる現象を定式化すること」も立
派な研究でそれをさらに外挿する
ためには必要なこと。そこで思考
停止してはいけない。その点にお
けるベクトルを求め、さらに先に
進む/進路を変更するために...
2:レポート「ニュ−ジ−ランドの
行政改革と高等教育および科学研
究への影響」http://www.ac-net.
org/doc/00c/nz-honbun.html か
ら引用
この節は飛ばす予定です。消すのはもったいないので残してありますがメ
ンテナンスはされていない可能性があります。
コンピュータアークテクチャとは
1
さまざまなコンピュータとその分類
1.1
下の表は参考文献 1 を元に作成) コンピュータにはさまざまな種類があり、さ
まざまな利用者が想定されています。これらを価格帯 (概算) で分類してみると、
使い捨てコンピュータ 100 円以下 メロディIC とも呼ばれ、バースデーカードなど
につけて音楽を演奏するものです。http://www.rakuten.co.jp/denshi/
から 10 個 500 円くらいで入手可能です。使い方は http://asaitou-web.
hp.infoseek.co.jp/r19/oru/rika000.html をご覧下さい。 組み込み用コンピュータ 500∼5,000 円 家電の時計や炊飯器、洗濯機等の自動制
御用です。車の各種部分にも用いられています。Z-80 http://homepage3.
nifty.com/z80/ 日本で開発された CPU の SH ファミリ (DreamCast で使
われた) は http://www.hitachi.co.jp/New/cnews/9711/1110.html や
http://www.jp.superh.com/index.htm などが参考になります。また PIC
や AVR は小型化され各種の I/O を持った組み込み用コンピュータで、これら
を使った工作の WEB ページが以下にあります。http://nonchansoft.at.
infoseek.co.jp/、http://homepage2.nifty.com/denshiken/index.html
家庭用ゲームマシン 5,000∼40,000 円 下はファミコン (6502)、ゲームボーイ
(Z-80)、ゲームボーイアドバンス、Nintendo DS[どちらも ARM プロセッ
サ] から、PS(MIPS)、PS2、PSP、PS3[どれも MIPS のカスタマイズ版]、
ゲームキューブ、Wii、XBOX 360(IBM PowerPC ないしその拡張版) ま
で幅広い種類が使われています。特に PS3 は現在のパソコンの性能を突き
抜けているようです。http://www.nintendo.co.jp/ などが参考になるで
しょう。
パソコン 40,000 円-... 皆さんが普通に使っている、いわゆるコンピュータで
す。CPU が特異だと言っていいと思います。パソコンしか触らないとそ
の特異さに気が付かないのですけれど。CPU は intelhttp://www.intel.
com/jp/index.htm や amd(advanced micro devices) http://www.amd.
com/jp-ja/ など。一式だと、http://www.jp.dell.com とか。
スーパーコンピュータ 40,000,000,000 円 かつて世界 1 を誇っていた地球シミ
ュレータ。http://www.ne.jp/asahi/comp/tarusan/index.html の 2003
年アーカイブズ中の記事が参考になる。
ほかにも使用領域 (データベース用、ファイルサーバ用とか) とか使用環境 (軍
事用、民生用とか) とか分類する観点はいくつかありますが、上に挙げたものは
すべてコンピュータです。これらに共通の背骨を見つけることがこの授業の目標
です。
平成 28 年 4 月 11 日版
1- 1
1.2
コンピュータ・アーキテクチャの定義
上記で述べたように様々な値段の様々な種類のコンピュータがあり、それらは
それぞれ異なったコンピュータ・アーキテクチャを持っています。それではコン
ピュータ・アーキテクチャとは何を指すのでしょうか。
コンピュータ・アーキテクチャとは、ある利用者から見たときにコンピュー
タがどのように見えるか、という模型 (=モデル) のことです。また、このモデル
は議論をするためのモデルでもあります。
なぜこのようなモデルを必要とするかは、後の節で述べます。
英辞郎 (www.alc.co.jp) の architecture の説明「【名-2】《コ》アーキテクチャ、
〔ハードウェアまたはソフトウェアの〕基本設計概念{きほん せっけい がいねん}
蛇足:すごく遠回りになりますが、愉しいサイトを 3 つ紹介しておきましょう。
「たるさんのパソコンフィールド」 http://www.ne.jp/asahi/comp/tarusan/
index.html
「今日の必ずトクする一言」 http://www.tomoya.com/
「魅惑の似非科学」 http://www.geocities.co.jp/Technopolis/8931/
いちばん下のサイトは更新が停止されていますが、その楽しさは今も変りませ
ん。真ん中のサイトも時々こっそりと更新されています。
平成 28 年 4 月 11 日版
1- 2
コンピュータのモデルであるチューリングマシン
2
この節のチューリングマシンや文法の説明を試験に出題することはありませ
ん。だからといって勉強しなくてよいというわけではありませんが。
2.1
チューリングマシンの大雑把な説明
コンピュータの数学的モデルはチューリング マシンです。これはアラン チュー
リング (Alan Turing) が考えたモデルです。この人には数多くの 逸話1 が残って
いますが、それはさておき、
このモデルはいきなりぽつんと産まれ出たわけではありませんが、彼の天才
がなければ数学とコンピュータ、そして言語学が結合されることはなかったで
1. 曰く、マラソンが好きでオリンピッ
クを目指していた、同性愛者だった、
青酸カリによって死亡した、その死
について自殺説、事故説、暗殺説な
どがある。
しょう。
ノームチョムスキー2 (N oamChomsky) という言語学者が言語学に数学の概念
をもちこむという偉業を成し遂げたときに、言語の数学的意味での階層付けと分
類、そしてその各階層でどんなことが表現できるかを述べました。
Turing Machine はこれらの中でもっとも広い部分を表現しています。この外
側の話、つまりチューリングマシンでは覆うことのできないものの話は戸次先生
にお尋ねください。
この分類は概ね以下のようになります。この間にも階層とそれで表現されるも
のは存在するので興味があったら調べてみて下さい。なお、この説明はとてもい
い加減なもので、厳密性よりも直感的なわかりやすさを重視しています。
平成 28 年 4 月 11 日版
2- 1
2. この頃は彼の唱えた計算と言語の
融合は主流ではなくなりつつあるよ
うです。ちなみに、まだ存命で 2014
年 3 月に日本で講演しました。
オートマトンの種
文法とチョムス
言語とおおまかな説明
どのようなオートマトンか
類
キー階層
有限状態オートマ
正規文法, タイ
a*.[ch] など 正規表現で
もっとも制約されたオートマトン。メモリ (記憶)
トン (Finite State
プ3
書かれたものはこの階層
を持たず、与えられた入力に対応して状態を移動
に属する。
する。ゴールに着くか、入力が尽きたら終わる。内
Automata)
部状態がないため、初期状態から同じ入力を与え
ると同じ結果が返る。
プッシュダ ウ ン
人間の使う自然言語はこ
メモリ (レジスタ) が1つだけで、メモリを保存す
オ ー ト マ ト ン 、 タイプ 2
文 脈 自 由 文 法,
の階層では表せない。コ
るためのスタックが別にある。メモリに書く。メ
プッシュダ ウ ン
ンピュータ言語はこの階
モリから読む。メモリをスタックにプッシュ、ス
ス タック オ ー ト
層の非常に小さなサブセ
タックからメモリにポップという命令があり、命
マトン
ットである。
令の列を入力として与えられて、それに従って状
(Pushdown Automata,
Pushdown Stack
態を遷移する。ゴールに着くか入力が尽きたら終
わる。内部状態を持つので、初期状態にメモリの
初期化を与えないと、同じ入力を与えても同じ結
Automata)
果が返るとは限らない。
線形有界オート
文 脈 依 存 文 法,
帰納的推論が可能。自然
有限サイズのテープがあり、そこに書き込む命令
マトン、 線形拘
タイプ 1
言語はタイプ 1.5 といわ
として、テープを一つ左、一つ右へ動かす、テー
束オートマトン
れ、これよりもさらに限
プに書く、テープより読む、などがある。命令列
(Linear Bounded
Automata)
定的でタイプ 1 とタイプ
(無限でもよい) を入力として与えると命令を読み
2 の中間の階層に属する。 取って動作する。
「終わり」という命令を読み取る
と終わる。無限ループを作るかもしれないし、い
つか止まるかもしれない。テープが途中でどんど
ん書き換わるかもしれない。テープに書いた命令
を実行せよ、というのもあり。元の状態?何それ?
チュー リ ン グ
自由文法, タイ
帰納的可算、つまりこれ
もっとも制約の少ないオートマトン。メモリとな
マ シ ン (Turing
プ 0 に属する全ての要素を列
るのは無限の長さを持つテープで、命令などは上
Machine
,Linear Unbounded
挙するようなアルゴリズ
と同様。
Automata)
間が掛かってもよければ、
ムが存在して、無限に時
全ての数を印刷できる。
ここまでのすべての言語
を包含し、かつそれ以上
のものをも受理できる。
我々がよく知っているコンピュータはどれが一番近いでしょうか。実はチュー
リングマシンではなく、その下の線形有界オートマトンがもっとも近くなりま
す。表現できるのが 2 型のすべてと 1 型の一部です。現実のコンピュータのモデ
ルはプッシュダウンスタックオートマトンのスタック、レジスタと有界線形オー
トマトンのメモリが合体したようなものです。
いい加減な表ですが、現実のコンピュータに置き換えてみると、
平成 28 年 4 月 11 日版
2- 2
オートマトン
現実のコンピュータ
テープ
コンピュータのメモリと同じ (有限)。
スタック
コンピュータのメモリの一部を利用 (有限)。
(スタックオートマトンの) メモリ
状態 (オートマトンでの)
入力列
レジスタ (通常一つではなく複数)。
命令 別の状態に遷移する
命令を実行する。結果としてどこかに影響を与える。
テープを左右に動かす
プログラムの中の別な場所へジャンプする。
メモリをプッシュする
レジスタからメモリへの転送命令。専用命令かもしれない。
メモリにポップする メモリからレジスタへの転送命令。専用命令かもしれない。
テープに書いたものを命令として実行
ライブラリにある関数を実行する。
プログラムのどこを実行しているか。
(事前にメインメモリへ書き込んでおく)
となります。
たとえ自動車の制御や電気炊飯器の制御に使われるようなワンチップコンピュー
タであっても、内部にはレジスタがあり、書き換え可能なメモリがあるために
言語としては 3 型ではなく、2 型の文法の判定ができ、プログラムの実行ができ
ます。
2.2
入力、ビットとバイトとワード
これらのオートマトンでいう入力とはどんなものでしょうか。一番シンプルな
答えはビット (bit) という情報の最小単位の列です。しかし現実は「バイト (byte)」
というデータが使われます。メモリの番地もバイト単位に振られており、ビット
へのアクセスは「何番地にあるバイトの第 n ビット目」という形で行われます。
あるバイト中のビットの一番大きなものを MSB(Most Significant Bit) とい
い、一番小さなものを LSB(Least Significant Bit) といいます。
1 バイトは通常 8 ビットから成ります。バイトとはもともと文字の単位でした。
1 バイトで示すことのできるのは、欧米圏の文字 1 文字です。また 1 バイトに数
値を置くこともできます。数値として解釈する場合は 0 から 255 までの値となり
ます。
その他のデータ、例えば整数のデータは現在では 8 バイトを使って表現しま
す。メモリの番地は 32 ビットコンピュータでは 4 バイト、64 ビットコンピュー
タでは 8 バイトを使って表現します。この長さはコンピュータにとって一番自然
な「数」の表現であり、これをワード (Word) といいます。
あるバイトが文字として解釈されるのか、数値として解釈されるのか、それと
も命令として解釈されて「どこかへジャンプせよ」とか「メモリを 0 でクリアせ
よ」などとコンピュータに指令するかは状況によります。コンピュータがどのよ
うにその特定のバイトを認識するかによります。
2.3
ノイマン型アーキテクチャ
コンピュータに与えるものが命令なのかデータなのかを区別しない方式を、コ
ンピュータの数学的モデルを立てたノイマン (John von Neumann) の名前を
借りてノイマン型アーキテクチャ (von Neumann architecture) と呼んでい
ます。
C や JAVA などの言語から見るとこれらのデータは区別されているようですが、
オートマトンや、実際にコンピュータが動いているマシン語 (machine code)
平成 28 年 4 月 11 日版
2- 3
から見ると「現在の入力」に対応する命令、つまりメモリ上に置かれている情報
はデータと区別されておらず、どれが命令なのか、どれがデータなのかは実際に
それを実行するまで判別できません。ですからあるときに命令だと思って書いて
いたデータが実は単なる表の一部だったり、逆に機械的に生成した表のデータと
思っていたら、その番地を呼び出す命令が実行されたりということが起こるかも
しれません。
2.4
コンピュータ内部の文字表現
コンピュータで用いる文字の表現を覚えておきましょう。
創世期には文字コードはコンピュータごとに勝手に定めていてばらばらでし
た。それがある時から大きく2つの流派に分かれます。
一つは IBM が定めた EBCDIC コード (Extend Binary Coded Decimal Code)、
もう一つは通信の世界 (TELEX、テレックス) から生れてきた ASCII(American
Standard Code for Information Interchange) です。 現在世界標準で用いられて
いるコードはほぼ ASCII とその後継の unicode(utf-8,utf-16 など) となりました。
アスキーコード表を示します。
ASCII コード表
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+A
+B
+C
+D
+E
+F
00
NUL(Null)
SOH(StartOfHeader)
STX(StartOfText)
ETX(EndOfText)
EOT(EndOfTransmisson)
ENQ(Enquiry)
ACK(Acknowledgement)
BEL(Bell)
BS(BackSpace)
HT(HorizontalTab)
LF(LineFeed)
VT(VerticalTab)
FF(FormFeed)
CR(CarriageReturn)
SO(ShiftOut)
SI(ShiftIn)
10
20 30
DLE(DataLinkEscape)
SPC(Space) 0
DC1(DeviceControl1)
!
1
DC2(DeviceControl2)
"
2
DC3(DeviceControl3)
#
3
DC4(DeviceControl4)
$
4
NAK(NegativeAcknowledge)
%
5
SYN(SynchronousIdle)
&
6
ETB(EndOfTransmissonBlock)
’
7
CAN(Cancel)
(
8
EM(EndOfMedium)
)
9
SUB(Substitute)
*
:
ESC(Escape)
+
;
FS(FileSeparator)
,
<
GS(GroupSeparator)
=
RS(RecordSeparator)
.
>
US(UnitSeparator)
/
?
40
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
50
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
60 70
‘
p
a
q
b
r
c
s
d
t
e
u
f
v
g
w
h
x
i
y
j
z
k
{
l
|
m
}
n
~
o DEL(Delete)
00-1F のコードは制御コード (コントロールコード) と呼ばれ、伝送制御に用
いられます。平たく言えば、紙の上に出来る限りきれいに表を打ち出したりする
ために用いらた歴史があります。これらを入力するには、コントロールキーを押
しながら@,A,B,C... のキーを押せばよいのです。また、コード 00 はコントロー
ルキーを押しながらスペースキーを押す場合もあります。
3
コンピュータとそれを用いた問題の解き方
デジタル音楽を作曲して楽しむ人たちなどの間では、シーケンサというソフト
やハードが有名です。これは音階、音の長さ、テンポなどを順に入力していき、
曲のデータを作成するものです。これはコンピュータで処理されています。コン
ピュータ自身もこれと全く同じ構造をしています。ただ、一方は音楽を再生し、
もう一方はプログラムを実行して計算をします。
一方異なる部分もあります。コンピュータは毎秒 1 ギガ (10 億) 命令もの命令
を実行して、一瞬のうちに計算を終了させます。また、現在のコンピュータはと
ても複雑な構造をしているため、命令するためには様々な計算機の言語を覚えた
うえで、計算の手順をコンパイラに処理させて、裸の機械が実行できる機械語
(マシンコード) に直す必要があります。
こうしたコンピュータを理想化したオートマトン (複数はオートマタ)やチュー
リングマシンというモデルがあり、それを研究する研究者もいます。
平成 28 年 4 月 11 日版
3- 1
3.1
コンピュータで問題を解くには
チューリングマシンやそれを現実化したコンピュータを、なんの助けもなし
にそのまま利用しようというのは、とても大変な仕事です。かつて我々はそれを
やっていました。が、もう一度やる気には到底なりません。
我々が買ってくるコンピュータは Microsoft Windows か Mac OS か IOS、An-
droid が最初から入っています(携帯電話もコンピュータの一種です)。そうで
なければ自分で Linux などを入れたりして使います。これらをすべて否定して、
OS を 1 から自分で作ろうというようなものです。
別な例えをすると、コンピュータが欲しいというので、秋葉原で CPU とメモ
リチップだけを買ってきて、マザーボードなど他のものを全部自分で作ろうと
いうようなものです。実際には CPU よりもマザーボードやビデオカードの方が
少なくとも中身は複雑です。ちなみに RAM ですらその中身に触って読んだり書
いたりするのはとても大変な仕事になります。現在の RAM(DIMM;Dual Inline
Memory Module) は、ちょうど SD メモリカードを読み書きするようなイメージ
で読み書きします。ただ、電源を切ると中身は消えます。
これと同様、問題を解くためのソフトウェアの作成する場合でも同じようなこ
とが言えます。その作業を少しでも軽くするために、OS(Operating System) が
あるのですが、この話はコンピュータアーキテクチャII で行います。
では具体的にどこがどう難しいのでしょうか。OS やビデオ、プリンタなどの
デバイスドライバーなど、コンピュータに密着したもののプログラミングや機械
語によるプログラミングは、
より問題を解くことに特化し、抽象度の高い記述ができる JAVA や C 言語、
ruby や python などを使ったプログラミングに比べて手掛かりが少なく、難しい
のです。この頃のドライバは、アセンブリ言語は最小限の記述に止め、ほとんど
全部を高級言語で書いてあるものがあります。
また、難しさの別な側面は
コンピュータで大きな問題を解決するにはどうすればよいのか?
という問題の解決方法に由来しています。
3.2
Keep It Simple and Stupid
問題を分割する場合にだけ適用するものではありませんが、一般的に設計を行
う場合には KISS の原則1 を適用するべきだとされています。コンピュータで解
決する問題はどんなものであっても、細部まできちんと実現しようとするととて
つもなく巨大なものになります。こうしたものの骨組みとなる中心部分は単純で
簡潔なものであればあるほどよいのです。
「KISS の原則」を W ikipedia 内で検
索すると様々な類似の概念にあたることができます。
次の節では、コンピュータで問題を解くに際して、どのようにそれを小さな問
題の集まりに分割するのかについて述べます。
3.3
部分問題への分割
コンピュータを用いてある種の問題 (例えば人間の声に応じて反応を返させる)
を解くことを考えます。この問題をより細かい部分的な問題 (サブタスク=sub
task) に分割し、それを一つ一つ解決していくことが一般的に行われます。この
方法を分割統治法 (divide & conquer) と呼びます。以下に慶応大学の「情報
平成 28 年 4 月 11 日版
3- 2
1
処理基礎」という Web ページの 例を引用しています。
1:http://ipl.sfc.keio.ac.jp/
text/basic-2006-9/main_c1_
s2.html
例として「クラスの飲み会 (1) の幹事をする」という問題を考えましょう。
幹事の仕事には次のようなものがあります。
• 店を探す
• 出欠を確認する。
• 会計をする。
このように、元の問題をいくつかの部分問題に分け、ひとつずつ片付けて
いく解決法を分割統治法 (Divide and Conquer) と呼びます。当然ながらあ
る部分問題の解決が他の部分問題に影響を与えてはいけないため、いい加
減に分割してもうまくいきません。
また部分的に解決した問題は、他の問題と同時並行的に実行可能な場合と、問
題を計算するときに他の問題の結果が必要なために、同時並行的に計算できない
場合があります。並列に処理できる問題を同時に複数台のコンピュータで一度に
処理できれば問題を高速に解くことができます。
かつてアメリカで開発され「世界最初」と呼ばれたエニアック (ENIAC) と
いうコンピュータがあります。残念ながら「世界最初のコンピュータ」という
地位からは滑り落ちてしまいましたが、このコンピュータは ある「必要」2 が
あって分割統治法で解決すべき部分問題の一部として開発されました。また
これとは異なる目的で作られたコロッサス (Colossus) というコンピュータも
3
別な任務に就いていました 。
2:その「必要」とはなんだったのか
調べてみましょう。戦争と関係があ
ります。
3:このコンピュータについても調べ
てみるとよいでしょう。様々な面白
いトピックが見つかります。
よく「キーボードではなく、マイクとスピーカーでコンピュータが使えれば
いい」と考える人がいます。実はこの欲求はかなり昔からあって4 、いろいろな
方法が考えられ、また改良されてきています。
目的に適えばどう作られていようと効果は同じだ。と考えるのが今の世の中で
は一般的ですが、実はその問題を解く経路によって、技術進歩の過程で得られる
副産物 (by-products) の量が全然違っています。そうした副産物や失敗からの学
習から次の技術や新しいヒントを得ることが多いのです。問題を自ら解くことを
4:20 年 以 上 昔 の IBM の 論
文 「Composing letters with
a simulated listening typewriter」http://portal.acm.
org/citation.cfm?id=358100&
dl=ACM&coll=portal はもしも音
声を聞き取ってそのまま印刷して
くれるタイプライタができたらど
んなに効率的かをシミュレーショ
ンによって実験したものです。一読
の価値があります。
放棄して、他からの技術移転などを行ってもらうと、こうした失敗からの知見が
得られないので、少し進んだ先でまた行き詰ってしまいます。失敗は恐れる必要
などないということを憶えておきましょう5 。
5:最近は、失敗させない教育が流行
のようですが...
問題:パスカル (Blaise Pascal), ライプニッツ (Wilhelm von Leibniz), バベジ
(Chales Babbage) と計算機の係わりについて調べて、各人がなんのために計算
機 (計算器) を作ったか調べてみましょう。
3.4
階層的アプローチ
階層構造 (hierarchical structure) は、様々なコスト (≒手間 ) を削減する必
要から発生した概念です。ここでいうコストとは、人的コスト、予算的コスト、
時間的コストなどの全てのコストを含んでいます。これはソフトウェアでも同様
に適用できます。
階層構造とは下部にある構造が上部にある構造を支えている、ちょうど積み木
平成 28 年 4 月 11 日版
3- 3
のような構造を指します。階層構造で重要なのは下部構造が崩壊すると上部構造
も一緒に崩壊してしまうということです。
ここで得られる教訓は下の段階で失敗をしては取り返しがつかなくなるという
ことです。しかし実際に仕事をする上で、失敗から学ぶことも多いです。
1
ではどうすればよいかですが、 失敗はそのコストが安い場所 で存分にして
1:失敗が安くつく場所とは大学など
の教育機関を指しています。
おいて、コストが高いところで失敗しないで済むように十分に学習しておくべき
だ。ということです。
前提: 人間はコンピュータに Z という高級な仕事をさせたいが、
コンピュータは A という非常に低級な仕事しかできない。
このギャップを埋めるためにどのようなアプローチをすればよいでしょうか?と
りあえず話を簡単にするため、Z を「ある言語で記述されたプログラムを実行し
て、結果を求める」ことだとしましょう。どうしたらいいでしょうか?
この前提への取り組み方は大まかにわけて 2 通りあります。コンパイラを用い
る方法とインタプリタを用いる方法です。
3.5
コンパイラ
コンパイラ (compiler) は問題を、より処理しやすい形に変形するプログラムの
ことです。コンパイラはある種のトランスレータ (translator、翻訳器) で何段
階もの変換処理を行い、最終的にコンピュータが直接処理できる命令の列から成
るマシン語 (machine code, 機械語) のプログラムに変換してくれます。また必
要に応じて (殆どいつも必要になるのですが)、リンカ (linker) やローダ (loader)
がライブラリ (library) と呼ばれる、予め作成されたプログラム群を付加したり
します。この後で過去の C コンパイラがどのように問題を分割したかという例
を見ることにします。
コンパイラは問題をより易しく理解しやすい形へ変換したりするわけではあり
ません。今日のコンパイラは一般の利用者よりもはるかにどうすれば早く動くプ
ログラムになるかを熟知していて、出てきたマシン語のプログラムはユーザに
とっては直感的には動作を理解できないような奇妙な形をしています。
3.6
インタプリタ
インタプリタ (interpreter) はもとの意味は通訳で、われわれ人間が記述した
プログラム言語を、一度に必要最小限だけコンピュータが理解できる形に直して
実行し、実行した結果をまた再び人間用に通訳し直す作業を延々と繰り返すプロ
グラムのことです。
今日のインタプリタはコンパイラ・インタプリタと呼ばれます。処理するべき
作業について、人間が理解できてコンピュータでの処理もある程度高速となるよ
うな「仮想的なマシン語」を考えて、そのマシン語へのコンパイラを用いて翻訳
し、仮想的なマシン語の列を作成します。この仮想的なマシン語を 1 語 1 語逐次
的に解釈しつつ実行するインタプリタが予め作られています。
Java,Perl,Python,PHP といった一般によく使われる言語の殆どはこのコ
ンパイラ・インタプリタという二段構えの構成となっています。こうすることに
より、コンパイラで得られる「実行を行う前に出来る限りエラーを除去できる」
という利点をインタプリタでも得ることができます。
平成 28 年 4 月 11 日版
Q. ところで、インタプリタとコンパ
イラの実行速度の差はどこで発生し、
それはどの程度のものでしょうか?
3- 4
これらはどちらも「Z を解釈する仮想的なコンピュータが存在している」と解
釈できます。ただ、その実行方法が違っているだけです。
3.7
アセンブラ
アセンブリ語、アセンブラというのは、マシン語と一対一で対応して、マシン
語で ED7C などと書く内容を move や add などのシンボルを用いて書くことが
できる言語のことです。コンピュータのプロセッサの種類の数だけアセンブリ語
の種類はあります。さらに同じ CPU であっても使用している OS の数だけ異な
るアセンブリ語があります。c 言語では cc -S test.c などとしてコンパイルする
と、アセンブラのソースコードを出力させることができます。
3.8
コンパイラとインタプリタの違い
コンパイラとインタプリタは互いに反対の関係ではありません。ただ、作業を
遂行するための異なる方法を提供しているだけです。コンパイラが生成するコー
ドは現実の CPU が実行するマシン語に極めて近いコードですが、ライブラリが
存在することを前提としており、ライブラリがなければ動作しません。またコン
パイラ・インタプリタが生成し解釈実行するコードは理想的なマシン語ですが、
これを動かすためにはそれを実行するためのインタプリタが必要です。どちらの
コードであっても、そこにもう一段階余分な機能が必要となります。
3.9
ローダ
コンパイラの場合、コンパイラが必要とする余分な機能を提供するプログラム
はローダ (loader) と呼ばれます。これは後期で学ぶ OS と関連しています。コ
ンパイルの最終段階で必要となるライブラリの一覧を作成しますが、その時に
必要となる関数、変数などの名前と参照情報を作成し、それを含んだライブラリ
は何かを決定します。プログラムを実行している途中でそのライブラリが必要に
なると実行を中断して制御が OS に移り、OS が必要なライブラリを読み込んで
ライブラリ内のコードを実行し、その後で元のプログラムに制御を返してくれ
ます。
大昔には動的にライブラリを実行できず、すべての参照関係は実行前に決定さ
れている必要がありました。
3.10
仮想マシン (VM)
コンパイラ・インタプリタのコンパイラが生成したコードをそのまま実行す
るような仮想的なコンピュータを仮想マシン (virtual machine,VM) と呼びま
す。世の中には様々なコンピュータが存在しており、それぞれ実行できる命令が
違います。その各々でプログラムを実行するためにはそのコンピュータ用の仮想
マシンインタプリタを書けば、コンパイラ・インタプリタ全体を書く必要なく
プログラム言語が利用できます。それだけでなく、別なコンピュータでコンパイ
ルした仮想マシンのマシン語プログラムを、新しいコンピュータで動かすこと
ができます。JAVA 言語はこの方式を採用することでどんなコンピュータや OS
でも同じプログラムが動くとしています。現実にはなかなかそうはいかないよう
です。
平成 28 年 4 月 11 日版
3- 5
3.11
現実の問題を解くには
今日では CPU が極めて高速になり、すべてのプログラムをインタプリタで実
行しても不満を感じることは少なくなっています。しかし、天気の予測など、計
算の速さが命であるようなプログラムももちろん健在であり、こうしたものは実
行速度が高速で、優秀なコード生成効率のコンパイラを用いて実行されるのが普
通です。コンパイルされたコードが高速であることはもちろんですが、巨大なプ
ログラムを何度もコンパイルする必要があるため、コンパイラそのものの実行も
高速である必要があります。
仮想マシンがあれば問題は複雑にならずにより単純な形へと置き換えることが
できて、実行速度も十分に高速化できるために、全ての問題は解決するように見
えます。
残念ながら現実にはこのような CPU は満足いくだけ高速化することが極めて
難しく、今日の技術では高速な CPU にはいくつかのいびつな特徴を持っている
必要があると考えられています。
人工知能の問題などある種の課題はコンパイラであってもインタプリタであっ
ても、そもそも問題を記述することが難しい場合があります。そこで分割統治法
を用いて、問題そのものを記述するのに適した言語を作成し、その言語でまず問
題を記述します。そして、その言語をよりコンピュータが解釈しやすい別の言語
に置き換えるというアプローチを取ります。もしそのような問題の分割が一段階
で済まない場合にはその間をいくつかの中間段階で埋めていけばよいのです。
仮想マシン VM0 と VM1 が動き、VM0 は A を VM0 を用いて実行し、その
VM0 は VM1 という仮想マシンで記述して、それで足らなければ、VM0 や VM1
の構成をさらに細かく分割して、と。分割すればするだけ得られる速度は落ちて
1
いきますが、ともかく 動くものが手に入ります 。
Wikipedia でもデザインパターンの中の Interpreter パターンとして、「特化
言語は汎用の言語よりも数倍から数百倍高速に問題を解ける場合が多い。」と記
されています。
ただ、インタプリタ言語を用いてインタプリタを書くといった入れ子の構造を
作ることで、実行はどんどん遅くなっていきます。
3.12
チューリング完全とエミュレータ
あるプログラム言語がチューリングマシンと同等の計算ができるとき、この言
語がチューリング完全 (Turing-complete) であるといいます。これは言い換える
とある言語を用いて別の言語を作成することができることを示します。
同様に、あるコンピュータがチューリングマシンを模倣できるのならば、その
コンピュータは他のコンピュータの命令やデータを解釈し、実行するようなプロ
グラムが書けることになります。
他のコンピュータのプログラムを実行するためのプログラムをエミュレータ
(Emulator) と呼びます。昔の任天堂のファミコンや SONY の Playstation のエ
ミュレータは様々なゲームマシン、パソコンなどで動きます。かつては Macintosh
の上で Windows を動かすためや、現在の Macintosh の上で過去の Macintosh の
ソフトウェアを動かすためにもエミュレータは用いられました。それだけでなく
現実には存在しないコンピュータのエミュレータや、動かしているコンピュータ
と同じ命令セットのエミュレータなども存在し、これから作成されるコンピュー
タのソフトウェアを、完成前から作成してテストするなどの用途に使用されてい
ます。
平成 28 年 4 月 11 日版
3- 6
1:現実にはバグが発生するので、な
かなかそううまくはいきませんが...
3.13
階層の例
昔の UNIX で動いていた昔の C コンパイラ (Portable C Compiler) では、も
ともとの C 言語から実行可能なバイナリ (binary) プログラムを作り出すまでに
5∼6 個の中間段階を経ていました。以下がその例になります。
cpp #define などのマクロ言語 (macro language) 処理を行う。
cc1 コード生成木 (code generation tree, code tree) の準備をする。
cc2 アセンブラ言語 (assembly language, assembler) によるコード生成 (code
generation) を行う。
copt 最適化処理 (オプティマイザ=optimizer) この処理は無くてもよいが、あ
ると高速になる。
as アセンブリ言語を再配置可能な (リロケータブル=relocatable) マシン語 (machine code) に変換する。
ld ライブラリ (library) の参照を解決して実行可能ファイル (executable file) を
生成する。
この分割統治の例をみていくと、下の層 (レイヤ (=layer)) はよりシンプルで
大量のコードからなり、上の層はより洗練されて高度なものとなっていることが
わかります。なお最近の C コンパイラや JAVA のコンパイラはほとんどを内部
処理して一度にコードを出すようになっています。
ハードウェアの階層について、参考文献 1 ではコンピュータの構成は以下のよ
うになっています。レイヤ (layer) とは層を示します。
レイヤ 5 高級言語 (=high level language) レベル
↓ [コンパイラが処理してレイヤ 4 へ。]
レイヤ 4 アセンブリ言語レベル [ポインタ操作 (pointer)、スタック操作 (stack
operation) などがよく見える。]
↓ [アセンブラが処理してレイヤ 3 へ。]
レイヤ 3 オペレーティングシステムレベル (operating system、しばしば OS
と略される)、システムコール (system call)、スケジューリング (sheduling)、
プロセス (process) などが見える。
↓ [一部を CPU が直に実行し、一部をシステムコールレベル
で解釈実行する。]
レイヤ 2 マイクロコードレベル、ないし命令セット (instruction set) アーキ
テクチャレベル。
↓ [かつてはマイクロプログラム (microprogram) で解釈実行
していた。現在ではハードウェアで直接実行する。本当の命令レベル]
レイヤ 1 マイクロアーキテクチャ(micro architecture) レベル算術論理演算器
(ALU=Arithmetic Logic Unit)、レジスタ (=register)、データパス (data
path) が見えるレベル。
↓ [ゲート回路ハードウェアレベル]
レイヤ 0 デジタルロジック (=digital logic) レベル (ゲート (=gate) レベル)
ゲート、AND、OR、NOT、レジスタなどが見えるレベル。
平成 28 年 4 月 11 日版
3- 7
この授業では主としてレイヤ 0,1,2,4 を扱います。レイヤ 3,4,5 はコンピュー
タ・アーキテクチャII で扱う予定です。またレイヤ 3 の一部はこの授業でも触れ
る予定です。
平成 28 年 4 月 11 日版
3- 8
コンピュータの性能指標といくつかの「法則」につ
4
いて
4.1
性能指標としてのクロック、メモリ量、ディスク容量
2011 年現在の時点で、皆の使っているコンピュータはどのくらいの能力を持っ
ているでしょうか?またその情報を提示するのにどのようなことを示せばいい
でしょうか?一般的には CPU のタイプとクロック (clock)、メモリ (memory) 容
量、ディスク (disk) 容量、周辺機器 (=peripheral) などを示すことが多いようで
す。パソコンを買った時期とその価格というのは指標になりうるか、少し考えて
みてください。
今日典型的な Windows の動くパソコンとしては
CPU Core i7-4770K 3.5GHz / Core i7 3820QM 2.7GHz
メモリ 4GB-16GB(DDR3)
ディスク容量 4TB 3.5inch/1TB 2.5inch
その他 Blu-Ray ドライブ、USB 3.0 ポート
くらいの能力だと標準的でしょう。
お茶の水女子大学の情報科学科演習室には Intel 製 CPU を使った Macintosh が
導入されています。時間が経てばパソコンの CPU のクロックが上がり、メモリ
やディスクの容量が増えていくのは当然のように思われています。
4.2
ムーアの法則
しかし、実はこれはあまり自明のことではありません。技術進歩によって性能
が向上するのは当然と思うでしょうが、今日ほどあまりにも頻繁に、かつ劇的
に電子デバイス (electric device) の性能が向上するのはこれまでの歴史で例がな
かったことです。この進歩の速度を測る一つの法則 (正確には経験則) があり、
「ムーアの法則」(Moore’s law)
と呼ばれています。Gordon Moore(intel 創業者, 名誉会長) が見出した経験則で
1965 年に発表されています。元の論文は ftp://download.intel.com/research/
silicon/moorespaper.pdf で読むことができます。この中 (2 ページめ、右側
の第 2 パラグラフ) で「半導体の集積度は 1 年で 2 倍になり、これがしばらく続
くだろう。(The complexity for minimum component costs has increased at a
rate of roughly a factor of two per year. Certainly over the short term this rate
can be expected to continue, if not to increase.)」と書かれています。現在では
この言葉は修正されて「半導体の集積度は 18ヶ月ごと 2 倍になる」と予言して
おり、これが今日までおよそ 40 年間続いているのです。また、この法則の系と
して、
「CPU のクロックも同じ速度で向上する」というのもあり、こちらも概ね
当たっていま す1 。
また、以下のような奇妙な法則も存在します。 ネイサン (Nathan Myhyrvold、
マイクロソフトの元技術最高責任者) の
1:なお今回は触れていませんが、イ
ンターネットに関してはギルダーの
法則、メトカーフの法則などがあり
ます。こちらも調べてみて下さい。
ソフトウェアの第一法則 ソフトウェアは気体であって、それを収容する容器の
大きさまで膨張する (1997 年発表)2
平成 28 年 4 月 11 日版
4- 1
2:オ リ ジ ナ ル は
http:
//research.microsoft.
com/acm97/nm/sld001.htm
か ら 。な お 、こ れ が 発 表 さ
れ た 学 会 で あ る ACM は
American Computer Machinary
というアメリカ最大、ひいては世
界最大のコンピュータ科学の学会
である。
ソフトウェアの第二法則 ソフトウェアはムーアの法則で制限を受けるようにな
るまで膨張する
ソフトウェアの第三法則 ソフトウェアの膨張はムーアの法則を起こさせる
ソフトウェアの第四法則 ソフトウェアは人間の野心と期待にのみ制限される
も一見すると荒唐無稽に思われるのですが、奇妙に附合するようです。ただこ
のプレゼンテーションそのものはそうとう怪しいものです。これが発表された
ACM は懐が深いと思います。
最後に、ビル・ジョイ3 の警告 (2000 年発表) を以下に示します。
核兵器のように希少で高価な原料に依存する技術なら、おのずと利用できる人
3:Bill Joy,BSD UNIX の開発者
の一人で、元 SUN Microsystems
取締役
間は限られる。しかし新しい技術 (ここでは遺伝子工学、ナノテクノロジー、ロ
ボット工学を指す) は個人や小さな集団が簡単に入手でき、事故や悪用を招く恐
れがある。技術は、知識さえあれば誰でも利用できる。その破壊性は、自己複製
により途方もなく増大する 。4
平成 28 年 4 月 11 日版
4:元 記 事 は
http:
//www.wired.com/wired/
archive/8.04/joy.html で 読 め
る 。ま た 翻 訳 が http://www16.
plala.or.jp/maknakat/Tech_
Info2/html/BillJoy.html
に
ある。
4- 2
デジタルな数値表現
5
5.1
2 進数、BCD(2 進化 10 進数)、8 進数、16 進数、64 進数
Q. 片手の指 5 本を使っていくつまで数えられるでしょうか?
A-1. 答えは 31 まで。指の折り曲げにそれぞれに意味を持たせて 1 の桁、2 の
桁、4 の桁、8 の桁、16 の桁とすればよい。
A-2.63 まで数えられる。親指が左右どちらになるか (つまり手のひらを向け
るか、手の甲を向けるか) でもう 1 ビット余分に情報をあらわすことができる。
これらが 2 進数の基礎となります。コンピュータの中は 2 進法のロジックで動い
ています。これは、信号の 0 を微弱電圧か電流が流れていないことで、1 を高電
圧ないしは電流が流れていることで表すことが効率的だったためです。かつて日
本が開発した「パラメトロン」というデバイスでは、共振を用いて記憶する方式
で多値の安定点があったために、これが通用しなかったことがあります。いずれ
多値のロジックが復権するかもしれないが、ここまでさまざまなものが高速動作
するようになった現在では、可能性は低いようです。
2 進数は 10 進数に変換するのに手間が掛かるので、2 進 4 桁で 10 進 1 桁を表現す
るという流儀がかつてありました。この数は BCD(binary coded decimal) 数と呼
ばれ、COBOL(コボル=COmmon Business Oriented Language) といった古く
から使われている言語以外では殆ど絶滅したようです。UNIX の文化では、かつ
ては 2 進数の 3 桁を一まとめにして、8 進数 (octal number) として用いることが
Q:なぜ BCD 数は絶滅したのか考
えてみて下さい。
一般的でした。現在では 2 進数 4 桁を一まとめにして扱う 16 進数 (hexadecimal
number) として扱うのが一般的になっています。また base64 と呼ばれる 64 進数
も mime(マイムと発音、Multipurpose Internet Mail Extension) フォーマットで
使われています。
Q.16 進数は 0 から 9 と A から F までを使うが、64 進数はどのような文字を数
字として使うのか調べてみてください。
Q. 皆さんの目の前の椅子と机の置き方を工夫した場合、どのくらい異なる種類
の情報を伝えられるでしょうか?チャレンジしてみてください。この課題は例年
出していて、過去に最大で数万種類の情報を伝えるやり方 (但しそれほど安定は
していないが) を考えてくれた人がいます。
5.2
キロ (K)、メガ (M)、ギガ (G)、テラ (T)、その先は?
コンピュータでは非常に大きな数の単位ととても小さな数の単位が簡単に現れ
ます。これは「そういうものだ」諦めて丸暗記をするよりは、光の速度と距離に
関係付けると理解しやすいです。光が 1 秒間に移動する距離を基準として、
時間
空間
注釈 1,000,000s(11.6 日くらい)
1,000s(16 分 40 秒)
:
:
300t(テラ)m
300g(ギガ)m
(適切な例がみつかっていません。)
地球から太陽まで一往復
1s(1 秒)
1ms(1 ミリ秒)
1µs(1 マイクロ秒)
:
:
:
300,000,000m
300,000m = 300km
300m = 300m
地球 7 週半 ここを中心に考える
:
:
0.3m = 30cm
0.0003m = 0.3mm
肘から手首までくらい
1ns(1 ナノ秒)
1ps(1 ピコ秒)
東京から名古屋くらい
400 mトラック 3/4 周
プランクトンサイズ
平成 28 年 4 月 11 日版
5- 1
数については、http://www.ss.iij4u.or.jp/~ana/kazu.htm が詳しいよう
です。これによれば、テラの次はペタ (P)、エクサ (E)、ゼタ (Z)、ヨタ (Y ) と
続く1 とあります。 現在ディスク (DVD、ハードディスク) は G バイトを主要
単位としていましたが、最近は T バイトに達しました。ただ容量増加に関して
はだんだんゆっくりになりつつあるようで、シリコンディスク (SSD,Solid State
Disk) が追いついてきています。
蛇足:ご存知と思いますがこの速度
は真空中を基準としたものなので、
電線を電子が流れる速度はもっと遅
いです。
1:この先のグルーチョ、ハーポ云々
は「Jargon ファイルで... マルクス
兄弟から取った」とあるのですこぶ
る怪しいのですが、本気で使うつも
りのようです。なお、東洋古来の 4
桁ずつ上がる単位系の方は 1068 ま
であるので、ヨーロッパにちょっと
勝った気分になれます。
脱線:自分のパソコンを持っている
人は、100MB 以上のファイルを検
索してその中身が何かを調べて見て
ください。私がやってみたところ、
100MB 以上のファイルは 10 個で
CDROM のイメージファイル、ディ
スクのイメージファイル、システム
のスワップファイルでした。この頃は
TV 番組をディスクに録画したファ
イルになるのではないでしょうか。
平成 28 年 4 月 11 日版
5- 2