設計 - みる会図書館


検索対象: コンピュータシステムの理論と実装 : モダンなコンピュータの作り方
145件見つかりました。

1. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

1 . 1 背景 る。後はこの組み立て作業を繰り返すだけである。日が暮れる頃には、「 X 。 r ゲート」 9 よい。良い方法が他にあるはすである。 り、ミスも起こりやすい。そのため、こで述べた組み立て方法は採用しないほうが らに、正しい設計を行ったとしても、組み立て工程を何度も繰り返す作業は時間がか 物理的な構造をいじくり回す必要があり、それはかなり面倒なことになるだろう。さ うかどうか逐一確認を繰り返すテストである。もし出力が期待するものでなければ、 入力ピンに対して ( ) / 1 のさまざまな組み合わせを設定し、そのときの出力が仕様に従 ストを行う必要がある。実験に基づくテストとは、回路を組み立て、電源につなぎ、 雑な回路の多くではそのようなことはできない。そういった場合、実験に基づいてテ うな単純な回路を扱ったので、配線図が正しいことを証明できる。しかし、実際の複 まず第一に、与えられた回路の配線図が正しいという保証はない。ここでは Xor のよ おそらく気づいたかもしれないが、この回路の組み立て方法には多くの問題がある。 うことができる。 たときと同じように、この Xor ゲートをビルディングプロック ( 構成要素 ) として使 他の回路を作ってほしいと頼まれたら、これまで And 、 Or 、 Not ゲートを使ってき という新しい入れ物の中にたくさんの回路ができあがっているだろう。もしこの先、 回路のアーキテクチャを設計し、最適化について考えることがで りに、コンピュータ上でハードウェア記述言語 (Hardware Description Language 、 今の時代、ハードウェア設計者はモノを作るために手を汚さなくてよい。その代わ 1 亠 4 ハードウェア記述言語 (HDL) HDL) を用いて、 て回路の出力をシミュレートし、出力を期待される結果と比較する。そうすることで、 タにテストを行うように指示を与えられる。その仮想回路へのさまざまな入力に対し モリ上にそのプログラムで指定された回路を構成する。続いて設計者は、シミュレー ハードウェアシミュレータは HDL で書かれたプログラムを入力として読み込み、メ ミュレータ (hardware simulator) と呼ばれる特別なソフトウェアツールを用いる。 ンピュータのシミュレータ上で仮想的に行うものであり、具体的にはハードウェアシ 回路の構造を HDL プログラムで表現し、その後で厳密なテストを行う。テストはコ きる (HDL は VHDL としても知られている。 V は Virtual を意味する ) 。設計者は 費量、回路設計全体のコストなどについても注意を払う。ハードウェアシミュレータ 一般的にハードウェア設計者は、回路の正確性に加えて、処理速度、エネルギー消 クライアントの要望した回路と合致するかどうか確かめることができる。

2. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

92 ー 5 章コンピュータアーキテクチャ のメモリ領域のように " 見せかける " ことができる。そのためには各 1 / 0 デバイスに とって排他的なメモリ領域を確保し、専用の " メモリマップ " を構成する必要がある。 入力装置の場合 ( キーボード、マウスなど ) 、デバイスの物理的な状況を常に " 反映 " するようにメモリマップは作られる。出力装置の場合 ( スクリーン、スピーカなど ) 、 デバイスの物理的な状況を常に " 駆動 " するようにメモリマップは作られる。外部の イベントが入力装置に影響を及ばした場合 ( たとえば、キーポードのキーを押す、マ ウスを動かすなど ) 、対応するメモリマップに値が書き込まれる。これと同様に、出力 装置を操作したい場合 ( たとえば、スクリーンに何かを描画する、音を鳴らすなど ) 、 対応するメモリマップに値を書き込む。ハードウェアの視点から考えると、各 1/0 デ バイスにメモリと同じインターフェイスを提供すれば、この仕組みを成り立たせるこ とができる。ソフトウェアの視点から考えると、各 I/O デバイスにはインタラクショ ン仕様が定義されている必要があり、それが定義されていればプログラムは正しい場 所にアクセスすることができる。ちなみに、コンピュータブラットフォームと 1 / 0 デ バイスがたくさん存在することを考えると、「規格」が果たす役割がいかに重要である か、ということがわかるだろう。 メモリマッブド I / O は実用面で非常に重要である。なぜなら、 CPU の設計やプラッ トフォーム全体の設計は I / O デバイスとは完全に独立して行うことができるからであ る。つまり、 I / O デバイスの数や性質、その構成について考えることなく、 cptJ や プラットフォームを設計できる、ということである。もちろん、将来現れるであろう I/O デバイスのことも考えなくてすむ。新しい I/O デバイスをコンピュータに接続 した場合、やるべきことは新しいメモリマップを割り当て、そのべースアドレスを覚 えておくことだけである ( この一度限りの設定は、通常オペレーティングシステムに よって行われる ) 。これをさらに進めれば、どのようなプログラムであっても、 I/O デ バイスを操作することができる。なせなら、やるべきことはメモリ中のビットを操作 することだけだからである。 5.2 Hack ハードウェアのプラットフォーム仕様 がふたっ ( スクリーンとキーポード ) から構成される。このアーキテクチャについて とつ、メモリモジュールがふたっ ( 命令メモリとデータメモリ ) 、メモリマッブド 1/0 Hack プラットフォームは 16 ビットのノイマン型コンピュータである。 cptJ がひ 5 念 1 概観

3. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

1 2 い章ブール論理 テスト 回路に対して品質保証を行うためにテストが行われる。このテストは特定の方法に よって繰り返し行うことができ、ドキュメントとしてもきちんとまとめられた形で行 われる。また、ハードウェアシミュレータは、あるスクリプト言語で書かれたテスト スクリプトを実行するように設計されているのが普通である。たとえば、図 1 - 6 で示 したテストスクリプトの例は、本書が提供するハードウェアシミュレータが理解でき るスクリプト言語で書かれている。このスクリプト言語の詳細については付録 B に説 明がある。 こでは図 1 - 6 で示されるテストスクリプトについて簡単な説明を行う。テストス クリプトの最初の 2 行で、シミュレータに xor . hdl のプログラムを読み込ませ、選 択した変数の値を出力する準備を行う。次に一連のテスト環境を羅列していき、将来 起こり得るであろうさまざまな状況 (Xor ゲートが操作するであろう状況 ) をシミュ レートする。各状況において、シミュレータは回路の入力ピンに指定されたデータ値を 設定し結果となる出力を計算する。そして、指定された出力ファイルにテスト結果を 己録する。 Xor のような単純なゲートの場合、すべての入力の組み合わせをカバーで きる完全なテストスクリプトを書くことは可能である。出力ファイルの結果 ( 図 1 -6 の右図 ) によって、その回路が完全に正しく設計されたものであると実験で検証でき たことになる。後ほど見ていくが、より複雑な回路においては、そのようなすべての 場合を網羅したテストを行うことは現実的ではない。 1 .1 .5 ハードウェアシミュレーション HDL はハードウェアを構築するための「言語」である。そのため、 HDL プログラ ムを書いてデバッグを行う過程はソフトウェア開発と極めて類似している。大きな違 いは、 Java のよう言語で書く代わりに、 HDL で書くことである。そして、コンパイ ラを使ってコードを変換するのに代わって、ハードウェアシミュレータを使う。ハー ドウェアシミュレータはコンピュータのプログラムであり、 HDL で書かれたコードに ついて、その構文解析と解釈の方法を知っている。そしてそれを実行可能な形式に変 換し、テストスクリプトの仕様に従ってテストを行う。現在、商用のハードウェアシ ミュレータは数多くあり、費用、操作性、使いやすさなどの点でさまざまなものが存 在する。本書ではシンプル ( そして無料 ! ) なハードウェアシミュレータを提供して いる。ハードウェアの設計には、このハードウェアシミュレータで十分であろう。さ らに、このシミュレータには必要なツールはすべて含まれており、回路を構築し、テ 一三ロ

4. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

5.3 実司 回路名 入力 関数 reset reset computer / / Hack プラットフォームの最上位回路 101 reset が O の場合は、コンピュータの ROM に格納されたプログラムが実行される。 reset が 1 の場合はプログラムを再実行する。そのため、プログラムの実行を開始 するためには、 reset を 1 に設定し、その後で O に設定するようにしなければなら ない。 これ以降、ユーサーはソフトウェアによって・・支配される " ことになる。プログラマー はプログラムによってスクリーンに描画できる。また、ユーザーはキーホードを使っ てコンピュータと相互にやりとりできる。 Computer 図 5 -6 コンピュータ。 Hack プラットフォームの最上位回路 3 実装 スクリーン キーボード 本節では、 Hack コンピュータのプラットフォームについて、その構築のためのガ イドラインを与える。ここで実装するプラットフォームは、 5.2 節の「仕様」で説明 したさまざまなサービスを提供する。通常どおり、構築を行うための完全な説明は与 えていない。自らが設計について考えてほしい。すべての回路は HDL で作成するこ とができ、本書が提供するハードウェアシミュレータを用いて各自のパソコン上でシ ミュレートすることができる。いつものように、技術詳細についての説明は最終節の 「 5.5 プロジェクト」で行う。 Hack プラットフォームのほとんどすべての処理が CPU で行われているため、 CPU の構築が最も実装の難しい場所である。コンピュータのその他の構築については明白 であろう。

5. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

133 バーチャルマシン # 1 : スタック操作 ジョセフ・ワイゼンノヾウム ( 1923 ー 2008 ) 世界はいかようにも複雑に作ることができる。 プログラマーは世界の創造主である。プログラムによって、 ( fComputer power and Human Reason 』 W H Freeman & CO) は略記による「 VM 」という用語を用いる。 す 1 訳注 : パーチャルマシンは「仮想マシン」「仮想機械」とも呼ばれる。本書では「バーチャルマシン」、また えば、ソフトウェアであるインタブリタによる方法や、専用に設計されたハードウェ マシンの実装はさまざまな方法で実現することができる。さまざまな方法とは、たと トウェアを他のプロセッサと OS 上でも実行させることができる。また、バーチャル であろうから、元となるソースコードを修正することなく、バーチャルマシン用のソフ る。バーチャルマシンを複数のプラットフォームを対象に実装することは比較的容易 優れている点はたくさんあるが、そのうちのひとつは「コードの移植性」についてであ 存在しない。しかし、他のコンピュータ上で再現することができる。このアイデアの るアイデアである。バーチャルマシンは抽象化されたコンピュータであり、実際には (virtual machine 、 (M) す 1 上で実行されるように設計されている。これが基本とな バーチャルマシン 中間コードは実際のプラットフォーム上で実行される代わりに 光を浴びることとなった。 は、 Java や C # などのモダンな言語においてもそのアイデアが取り入れられ、再び脚 は 1970 年代までさかのばる古くからあるアイデアに基づいている。 1990 年代後半に 中間コードは機械語へと変換される ( 7 ~ 8 章 ) 。この 2 段階による変換処理のモデル て説明を行う。高水準プログラムは初めに中間コードに変換され ( 10 ~ 11 章 ) 、その にする。このふたつの段階にはそれぞれ 2 章分のページが割かれ、合計で 4 章に渡っ という作業は相当に困難であるため、我々はその作業を 2 段階に分けて取り組むこと は、オプジェクトべースの一般的な高水準言語をコンパイルする。コンパイラを作る 本章はコンバイラ (compiler) の構築へ向けた初めの一歩である。このコンパイラ

6. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

350 ー付録 B テストスクリプト言語 するメソッドはこのメソッドだけである。 B 念 5 最後の例 本節を終えるにあたって、こでは比較的複雑なテストスクリプトの例を示す。 のテストスクリプトは、 Hack プラットフォームの最上位の回路である computer 回 路をテストするために設計されたスクリプトである。 computer 回路をテストするひ とつの方法は、 その回路に機械語プログラムを読み込み、コンピュータがそのプ ログラムを実行し、一度に命令をひとつずつ進めながら、選択した値をモニタリング することーーーである。たとえば、 RAM[O] と RAM [ 1 ] の最大値を計算し、その結果を RAM[2] に書き込むプログラムを書いたとする。そして、このプログラムを機械語へ と変換し、その機械語プログラムは Max. hack というテキストファイルに保存され ているとしよう。我々が操作する低水準のレベルにおいて、そのプログラムが正しく 動かないとしたら、原因はそのプログラムにバグがあるか、ハードウェアにバグがあ るかのどちらかである ( 完全を期すならば、テストスクリプトやハードウェアシミュ レータにもバグが含まれている可能性もある ) 。こでは、物事を簡単にするために、 テスト対象の Computer 回路を除いて、他のすべてにおいてはエラーは含まれないこ とを想定する。 Cornputer 回路を Max . hack プログラムを用いてテストするためには、 ComputerMax . t st というテストスクリプトを書く このスクリプトは computer . hdl をハードウェアシミュレータに読み込み、それから Max . hack プロ グラムを ROM32K 回路に読み込む。その回路が正しく動作しているかどうかを確認 するには、次のような方法が考えられるだろう。 RAM[O] と RAM[I] に適当な値を設 定し、コンピュータをリセットし、クロックを実行し、 RAM [ 2 ] を検証する。例 B -2 で示したスクリプトは、まさにこのプロセスを実行するように設計されている。 プログラムを実行するのに、クロックサイクルが 14 で十分であると、どのように 判断することができるだろか ? そのためには、たとえば、大きい値を設定し、コン ピュータの出力が安定する時間を確認すれば、おおよそのめどが立つだろう。

7. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

1 . 1 7 月 . 示、 ゲートの実装 ゲートのインターフェイス And out And And out If a=b=c=l then ou 亡 = 1 out=0 3 入力 And ゲートの実装方法。右図の四角形枠は、ゲートのインターフェイスについて概念 図 1 -4 上の境界線を示している 図 1 -4 で行った組み立ては論理ゲートの単純な例であり、論理設計 (logic design) とも呼ばれる。論理設計とは、簡単に言えば、ゲートのつなぎ方に関する技法であり、 それによって複雑な機能を持った複合ゲートを構成することができる。複合ゲートは それ自体プール関数であるため、 " 見た目 " ( 例としては図 1 -4 の左図 ) は基本ゲート と同じである。しかし、その内部構成はより複雑なものになる。 どのような論理ゲートであれ、それをふたつの異なる視点から捉えることができる。 ふたつの視点とは、外部と内部である。図 1 -4 の右図はゲートの内部に関するアーキ テクチャ、つまり、その実装を表す。一方、左図はゲートのインターフェイスであり、 外の世界に対する入力ピンと出力ピンを示している。前者にかかわるのはゲート設計 者だけであり、後者は他の設計者に向けたものである。他の設計者は内部構成を気に することなく、抽象化されたコンポーネントとして使うことができる。 それでは、他の論理設計の例について、たとえば Xor について考えてみよう。先 ほど議論したとおり、 Xor(), のの値が 1 になるのは、“が 1 でわが 0 のとき、ま たは“が 0 でわが 1 のときのどちらかである。別の表現を用いれば、 Xor(), の Or(And(a,Not(b)),And(Not(a),b)) となる。これから図 1 - 5 に示すような論理設計 が導かれる。 こで注意すべきは、ゲートのインターフェイスはただひとっしか存在しない、と いうことである。つまり、それを表現する方法はひとつだけ存在し、通常、真理値表 やプール式、または言葉でその仕様を表現する。しかし、このインターフェイスを実 現する実装方法にはさまざまな方法が存在する。その実装方法の中には、他よりもコ スト、スピート、単純性の点で優れたものがある。たとえば、 Xor 関数は And 、 Or 、 N 。 t ゲートを計 4 つ用いれば実装できる ( 例で示した実装方法はゲートを 5 つ使用し ている ) 。機能的な点から言えば、論理設計の基本要求は、特定のインターフェイスを

8. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

13 章 さらに先へ 探求をやめてはならない。 探求とは、最終的には初めの場所に戻り、その場所を初めて理解することである。 イギリスの詩人 T ・ S ・エリオット ( 1888 ー 1965 ) ために用いるバッチファイルを除くと、コードはすべて Java で書かれている。これらのソ すべて、そのソースコードをオープンソースとして公開している。プログラムを起動する そのような修正や拡張を読者が行えるようにするため、本書で使用したソフトウェアは シミュレータのビルトイン回路として、それをモデル化したいと思うだろう。 新たな入出力デバイスを追加したいと思うかもしれない。その場合は、ハードウェア 応するようにエミュレータも変更したいと思うだろう。また、 Hack コンピュータに れない。たとえば、 VM の仕様やハードウェアの仕様を変更したとすれば、それに対 る。また、別の要素として、本書が提供したソフトウェアを拡張したいと思うかもし の仕様を満たすように、アセンプラ、コンパイラ、 OS の実装を書き直すことができ ティングシステム (OS) は、好きなように拡張することができる。仕様を変更し、そ オペレー ロロロ、 Jack 高ロ、 の設計を取り入れることができる。たとえば、アセンプリ これまでのプロジェクトであなたが実装してきたソフトウェアを修正・拡張し、別 こに行く方法だけでなく ) 指示したいのかもしれない。 かもしれない。もしかすると、あなたは操縦席に座り、どこに行くかということを ( そ いるかもしれない。もしかすると、より広範囲なシステムを設計したいと思っている クチャを設計できるかもしれない。もしかすると、新たな機能を追加したいと思って の設計を自分で行いたいと思う人もいるだろう。もしかすると、より優れたアーキテ タを設計したのは筆者らである。読者の中には ( 特に好奇心旺盛な読者の中には ) 、 うことだ。結局のところ、設計することが最も楽しい作業のひとつであり、コンピュー その秘密とは、筆者らは本書の執筆を読者の方以上に楽しんだ ( と思っている ) 、とい こで、秘密を打ち明けたいと思う。 を楽しんでくれたことを筆者らは願っている。 おめでとう ! コンピュータシステムの構築はこれで終わりである。読者がこの旅路

9. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

356 ー付録 B テストスクリプト言語 と push 、算術コマンドだけを実装し、サプルーチン呼び出しは無視した。そのため、 7 章のプロジェクトで使用するテストプログラムは、 " 生の " VM コマンドから構成さ れる (function や return などは使用しない )。そのようなコマンドを使って非公 式なテストを行うために、 VM 工ミュレータは " 生の " VM コマンド この VM コ マンドは、適切に初期化が行われす、ファンクションの形でまとめられていない を実行できる機能を備えている。 仮想メモリセグメント バーチャルマシンの命令をシミュレートする間、 VM 工ミュレータは Hack VM の 仮想メモリセグメント (argument 、 1 〇 cal など ) を管理する。これらのセグメン トはホストの RAM 上に割り当てる必要がある。これは、通常工ミュレータが行うタ スクであり、 call 、 function 、 return コマンドの実行をシミュレートした結果 として現れる。これが意味することは、 サプルーチン呼び出しを含まない " 生の " VM コードをシミュレートするときは、 RAM 内で仮想セグメントを明示的に設定す るように VM 工ミュレータに強制しなければならない ということである。都合の 良いことに、この初期設定はスクリプトのコマンドによって行うことができる。この スクリプトコマンドは、ポインタを操作し、仮想セグメントの RAM アドレスのべー スを制御する。このスクリプトコマンドを使って、 RAM で選択された領域に仮想セ グメントを配置することができる。 B. 4.1 例 FibonacciSeries . vm は一連の VM コマンドから構成され、フイボナッチ数列 の最初のれ個を計算する。このコードはふたつの引数を取る。ふたつの引数は、れの 値と、計算した結果を格納するメモリアドレスの開始位置である。例 B -4 のスクリプ トは、 6 と 4000 を引数に用いてテストするように設計されている。

10. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

1.4 展望ー 多ビットマルチプレクサ 23 れ配列マルチプレクサの実装は、 2 値のマルチプレクサをれ個用意し、そのすべて に同じ選択ビットを入力するだけである。この作業もまた退屈ではあるが、できあが る回路はとても重要なものとなる。 1 .4 展望 複数入力ゲート 実装の助言 : フォーク ( 分岐 ) を考えよ。 要なテーマについては電子と物理の知識が必要になる。 特徴がある ( スピード、消費電力、製造コストなどの点で差異がある ) 。そのような重 行っていない。もちろん、それを実現するためにはいくつも方法があり、それぞれに である。たとえば、シリコンに埋め込まれたトランジスタの仕組みについては説明を この他に我々が説明を省略したテーマは、ゲートと回路の物理的な実装方法について コンピュータサイエンスや電子工学の専門家は最適化に多くの時間を費やしている。 には特に注意を払わなかった。最適化を考えることは実践上極めて重要なことであり、 たり、設計によって生じるであろうワイヤの交差について考えたりすることなど 本章では、最適化ーー - 複合ゲートを構築するために使われる基本ゲートの数を考慮し の理論と実践について詳しく書かれてある。 る。「デジタル設計」や「論理設計」についての標準的な教科書には、そのような構造 は、すべての幾何学の定理は異なる公理からスタートしても証明できることと似てい できる。これらの論理設計のアプローチは理論上どれも等しいものである。このこと しくは And 、 Or 、 Not ゲートの組み合わせから、完全なコンピュータを作ることも チも可能である。たとえば、 Nor ゲートだけからスタートすることも可能である。も る。我々は最小単位のビルディングプロックとして Nand を用いたが、他のアプロー た。次章では、 こで作ったゲートを用いて、より複雑な機能を持っゲートを作成す 本章では、デジタル設計のプロジェクトにおける初めのステップについて説明を行っ