数理解析・計算機数学特論 3 第 1 章 序論 1.1 講義録の目的 以前はコンピュータとは, その名前の通り「計算をする道具」であった. しかしながら, 近年単に計算を するだけではなく, 各種の「情報」を処理する道具としてのコンピュータの役割が脚光を浴びている. また, 我々の生活の中でもコンピュータは色々なところに使われている. 通常我々が目にするディスプレ イ, キーボードなどを兼ね備えたコンピュータだけではなく, 単に CPU といつくかの LSI だけから構成さ れるようなコンピュータが我々のまわりにたくさんあることに気がつく. 例えば, 炊飯器にも各種の制御を 行なうために小規模なコンピュータが搭載されている. また, 一方では家庭用ゲーム機(ファミコン, スー パーファミコン, Nintendo64, PlayStation など1 )に代表されるような, 特別の用途に専用に使われるコン ピュータも大きな発展を遂げている2 . さらに近年になって, ネットワークを利用したコンピュータの利用が盛んになり, 将来コンピュータがど のような変化を遂げるのか, どのような利用法がされるのかについては, 誰もわかっていないのが現状で ある. この講義録では, 高度な発展を続けるコンピュータの基礎的な理解を目的とし, 数学という観点に立って, コンピュータとは何かという問に答えることを目標に種々のテーマに対する解説を行う. このような立場 でコンピュータを見ることにより, 次世代のコンピュータの姿や役割を切り開いていく創造性を身につけて もらいたい. 1.2 コンピュータとは コンピュータとは何かを考える上で, 少なくともその歴史と近年の現状を振り返ることは必要不可欠であ る. ここでは, コンピュータとネットワークの歴史3 , 近年のコンピュータの概念について考察してみよう. 1.2.1 アナログ計算機と機械式計算機 アナログ計算とは, 数学辞典(第3版)によると, 「図による計算や, 計算しようとする数式と同じ関係 で記述される物理的な系に基づく計算の総称である」とされている. 代表的な例としては, 計算尺 (slide rule), 面積計 (planimeter) が良く知られている. 計算尺は1980年代頃までは技術計算で頻繁に利用されていた道具であり, 2本の「定規」に「関数目 盛」をふり, 2本の「定規」をスライドさせることにより, 計算を行う道具である. 「関数目盛」として適 切なものを選ぶことにより各種の計算が可能であるが, 最も簡単なものは「乗算・除算」を行う目盛であ る. たとえば, a + b という計算を物理的な系で行おうとすると, 長さの同じ2本の定規を用意し, それぞれ 1 ファミコン, スーパーファミコン, Nintendo64 は任天堂の登録商標です. PlayStation は SONY Computer Entertainment の登録商標です. 2 この原稿の初版を書いたのは1996年頃の話である. 既に, 内部バスが128ビットである CPU を搭載した PlayStation2 (これも SONY Computer Entertainment の登録商標)が発売され, Pentium3 なども 1GHz のクロックを持つ時代となってし まった. 時代の流れるのは速いものである. 3 はじめに断っておくが, ここにかかれたコンピュータの歴史については, 筆者の独断・偏見が入り交じっている. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 4 の定規の a, b に対応する目盛りを一致させる. この時, 片方の定規の基線に一致するもう片方の定規の目 盛りが a + b を表すことは容易に想像できる. L a+b 0 a b 0 L この場合, 通常の定規に与えられた「関数目盛」は「線形関数」であると理解することができる. Exercise 1.2.1 2本の定規を使って引き算を行う方法を考えなさい. Exercise 1.2.2 2本の定規を使って掛け算と割り算を行う方法を考えなさい. この場合, 定規に与えられ た「関数目盛」はどのような関数か? 面積計(左)と計算尺(右) 面積計は平面上の閉曲線で囲まれた面積を計測する道具である. (写真では上の)重りを 図面上に固定し, (写真では下の)針で閉曲線をなぞることにより, 支点にある回転目盛 上で面積が計測される. 日本計算器販売社(現ビジコン社)の手廻し計算器の外観写真と, 内部構造. 内部は歯車 とカムだけで出来ている. Exercise 1.2.3 面積計で面積を計測することができる理由を数学を用いて説明しなさい. 一方機械式計算機はパスカル型計算機とも呼ばれ, 歯車とカムを利用して各種の計算を行う機械である. こ の考え方は, 1642年に, 当時16才であった B. Pascal が Pascaline という機械式計算機を開発したこ とから始まる. Pascaline は加減算のみを行う機械であったが, その後, 1673年 G. Leibniz により, 加 減算と乗除算を行うことが出来る機械式計算機が開発された. 上の写真にある「手廻し計算機」は, 1900年代の機械式計算機の代表例で, 歯車を利用して加算・減 算を行い, 桁移動によって乗算・除算を行うことが出来るものである. この他にも周期関数のフーリエ変換 を計算する調和解析機 (harmonic analyzer) なるものも存在する4 . このように, アナログ計算機や機械式 計算機の歴史は非常に古く, 近年まで積極的に利用されてきたのだが, 汎用的な計算を行うことは難しい. 4 潮汐(汐の満引き)は多くの周期的な要因から決定されている. それぞれの要素の周期とその振幅がわかれば, それらを合成し て, すなわちフーリエ級数の和を計算することにより, 潮汐の様子を予測することが可能である. 調和解析機とは, この計算を歯車な どを利用して機械的に行い, 潮汐の様子を図示する機械であると思われる. 筆者はその現物を国立科学博物館で見た. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 1.2.2 1.2.2.1 5 コンピュータの歴史 1940年代まで –デジタル計算のはじまり– 理論的にコンピュータの原型と考えられる5 ものとして, チューリング・マシン (Turing machine) と呼 ばれる概念がある. 1936年, イギリスの数学者 A. Turing は, ある計算のプロセスの中で「計算可能」 な対象を分類するという研究を行った (cf. [1, 2]. その理論の中で, 実際に計算プロセスを与える仮想的な 計算モデルが「チューリング・マシン」と呼ばれるものである. チューリング・マシンとは, 有限の状態を 持つ機械(有限状態オートマトン)と外部記憶装置に対応するテープからなり, 有限状態オートマトンは テープの情報により状態が遷移し, テープのデータを書き換えることが出来る仮想機械である. この仮想 機械の概念は, 現在のコンピュータの動作原理を的確に表していることがわかる. さらに, 1937年, C. Shannon の MIT における修士論文 “A Symbolic Analysis of Relay and Switching Circuits” [3] におい て, 2進計算を電気回路で実現する方法が提示される. 1940年代に入り, J. von Neumann によって, プログラム内蔵型計算機(現在ではノイマン型コン ピュータともいう)の概念が提唱される. プログラム内蔵型計算機とは, 計算機内の記憶装置に計算手順を 示した命令の列(プログラム)を内蔵し, そのプログラムを取り替えることにより, 各種の計算を行うこと が出来る計算機のことをいう. この概念にしたがって, 1946年, アメリカ陸軍弾道研究所で, 大砲の弾 道を計算するために開発されたのが ENIAC と呼ばれる, 今日のコンピュータの始まりとされている機械 である. ENIAC は電子式のデジタル計算を行う機械としては, 世界初のものとされている6 . ENIAC はお よそ2万本にのぼる真空管から構成され, それらによって加算器などの演算回路を実現していた. これは, 現在のコンピュータの基本構成である, 入出力装置・主記憶装置・アキュムレータ(今日でいう CPU )を 持ったタイプのものではなく, 演算に応じて回路を組み替えて計算を行う機械であった. そのような意味で, ENIAC はプログラム固定内蔵方式のコンピュータといえるであろう. 現在のコンピュータは, ノイマン型コンピュータの構造を持ち, 主記憶装置に可変な命令(プログラム) とデータが格納され, アキュムレータは主記憶装置から命令を一つづつ取り出すことでデータの処理が行わ れる. 1949年には, 可変なプログラムを内蔵するノイマン型コンピュータが完成する. 世界初のプログ ラム内蔵型コンピュータはケンブリッジ大学で開発された EDVAC と呼ばれるものである. 1940年代 終りに登場したコンピュータのハードウェアの基本型は, 今日のコンピュータまで依然として変化していな いことに注意しよう. 1.2.2.2 1950年代, 1960年代 –商用コンピュータと汎用コンピュータの時代– 1950年以後 UNIVAC, IBM といったビジネス機器メーカがコンピュータの開発に取り掛かり, 真空 管に変わりトランジスタやそれを集積したICを採用した(今日でいう)汎用コンピュータの時代に入る. このころ, コンピュータの動作の基本部分(入出力や命令の実行手順)の制御等を行うソフトウェアと, 具 体的な作業のためのプログラムを区別し, プログラム開発を容易に行うという考え方が発生した. 今日でい うオペレーティング・システムの概念である. 1969年には, AT&T のベル研究所で, K. Thompson と D. Ritchie により, DEC 社の汎用コンピュー タ PDP-8 上で動作するオペレーティング・システムであるUNIXが開発される. 現在 System V と呼ば れる系統のUNIXシステムはこの時代に始まる. 当初のUNIXは Thompson 自身の設計によるBと呼 ばれる言語で記述されていたが, 1970年, PDP-11 にUNIXを搭載するために, B. Kernighan と D. Ritchie により, C言語が開発されC言語により, UNIXが再構築された. C言語はハードウェアの構造 5 少なくとも現在でも理論的なコンピュータはこの域を脱していない 6 最近の研究では, 1939年アイオワ州立大学で作られた, ABC というものがあり, それが世界初の電子式デジタル計算機であ るということが判明した. しかし, ABC は最終的な完成には至らなかった. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 6 と相性のよい言語であったため, 他の機械でC言語の処理系を実現することが容易であった. UNIX自身 もそのほとんどの部分がC言語で記述されていたため, Calfornia 大学ではUNIXを全くに書き直すこと が行われた. このUNIXは現在 BSD と呼ばれる系統のUNIXにその流れが残っている. IBM-PC の ためのオペレーティング・システムとしては, IBM 自身が開発したものの他に, CP/M と呼ばれるものが 独自に開発されていた. これらのパーソナル・コンピュータ用のオペレーティング・システムは, 基本的に UNIXの影響を受けている. 1.2.2.3 1970年代 –汎用CPUの開発– 1970年代に入り, 命令の読み出し・解読・実行などを単一のチップで実現したものが登場する. 今日 でいうところの汎用CPUの開発である. 世界初の汎用CPUは, インテル社とビジコン社の共同開発によ る 4004 である. この後, 1970年代半ばには, インテル社による8ビットCPU 8080, 8085, ザイログ 社による Z80 等が開発され, 比較的安価なコンピュータの開発が始まる. 1970年代後半には Apple 社が設立される. Apple の創業者の一人である Bill Atkinson は, Xerox 社の Palo Alto 研究所 (Palo Alto Research Center: PARC) で ALTO と呼ばれるオペレーティング・シ ステムを見る. ALTO は今日でいう GUI (Graphical User Interface) を備えた汎用コンピュータであった. ALTO に実装されていた GUI はハードウェアで構築されていたのだが, Atkinson はこれをソフトウェア で作られていると勘違いする. 今でいう「歴史的な勘違い」である. Atkinson は帰宅すると ALTO にあっ た GUI と同等なものをソフトウェアで実現することになる. これが今日の Macintosh の GUI の始まりで あり, この思想は S. Jobbs に受け継がれ, 今日まで続く Apple の歴史が始まる. 1.2.2.4 1980年代 –パーソナルコンピュータの時代– 1979年, IBMは汎用CPUを用いた「パーソナル・コンピュータ」と呼ばれる小規模のコンピュー タを開発する7 . 俗にいう IBM/PC の発売である. IBM/PC の開発により, コンピュータが比較的安価に 入手できるようになり, コンピュータは科学技術計算以外にも多くの情報処理の世界で使われるようにな る. しかし, このころのパーソナル・コンピュータは汎用コンピュータに比較して, 余りに性能が劣ってい たため, 大規模計算などのためには依然として汎用コンピュータが利用されていた. このころの汎用コン ピュータはデータやプログラムの入力のために「紙テープ」や「パンチカード」が, 外部記憶装置としては 磁気テープを用いていた. IBM/PC はそのハードウェア仕様を完全に公開していたため, 同等の機械を他社が発売することが出来 た. 当時 8088 を使ったコンピュータ上で動作するオペレーティング・システムとして, Digital Research 社の G. Kildall の開発した CP/M と, Microsoft 社の B. Gates が権利を持っていた MS-DOS が存在して いた8 . IBM は IBM/PC に搭載するオペレーティング・システムとして, MS-DOS を選択9 する. 現在ま で続くパーソナル・コンピュータの発展はこのころに始まる. 1.2.2.5 1990年代 –ネットワークの時代– 一方, 1980年頃, SunMicrosystems 社が創業し, 現在でいう商用UNIXワークステーションの開発 が始まる. 1969年, アメリカ国防総省 (DoD) が ARPANET と呼ばれる, 電話回線によるコンピュー タ・ネットワークを構築し, 遠隔地に置かれたコンピュータ同士を接続して, 相互にデータの交換を行うと 7 当初の IBM/PC はインテルの 8088 (16ビットCPU 8086 の8ビット版)を利用していた. Gates は 8088 上の BASIC 処理系を開発し, Microsoft 社を創業していた. MS-DOS は B. Gates 自身がはじめから開発 したものではなく, Seattle Computer Products 社の QDOS の権利を購入し, それをチョコチョコっと書き直したものである. 9 なぜ IBM が MS-DOS を採用したかについては, [4] のコラムにおもしろい話が載っている. 8 B. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 7 いう実験が始まる. 今日のコンピュータ・ネットワークの始まりである. 1979年, 電子メール等を交換 するためのボランティア・ベースのネットワークである, USENET がスタートする. USENET は電話回線 によるデータの交換を行っていたが, 1982年, ARPANET は TCP/IP と呼ばれる, 現在の「インター ネット」の基礎となる通信規格を採用する. この通信規格は, UNIXワークステーションであればどのよ うな機器でも動作することが出来た. このように, 今日のコンピュータ社会を構成している重要な概念は1 980年代前半までにはほぼ出そろっていることがわかる. その後, 1970年代からはCPUの開発競争が行われ, CPUの速度などは極めて高速になっていく. 1980年代には複数のCPUを用いて単一のコンピュータを構成する「マルチ・プロセッサ」の技術も開 発され, 並列計算という複数のCPUに分散処理を行わせる技術が発展していく. この技術は「スーパー・ コンピュータ」を生み, 高速科学技術計算に大きな役割を果たした. CPUの発展はCPU自身の構造を 複雑にし, 高速動作の妨げになることもわかってきた. それを避ける概念として, RISC(縮小命令アー キテクチャ)と呼ばれるCPUの概念が生まれ, 現在ではRISC・CPUを搭載したパーソナル・コン ピュータも生まれ, 高速コンピュータをネットワークを利用して相互に接続する分散環境が現在の高速計算 の姿であり, 現在ではパーソナル・コンピュータが少し前のスーパー・コンピュータ以上の処理能力を持つ ことも稀ではない. 1990年代には, コンピュータネットワークが飛躍的に発展する. UNIXワークステーションや汎用 コンピュータだけがネットワークを利用していた時代から, パーソナルコンピュータもネットワークに接続 されるようになる. 一方で, 世界各地のコンピュータネットワークが相互に接続されるようになり, オフィ スや家庭でネットワークに接続されたパーソナルコンピュータから, 世界中のコンピュータネットワークへ の通信が可能になった. 当初分散コンピューティングはローカルエリア・ネットワークを用いて行われて いたが, 現在では, 「インターネット」を用いた世界規模の分散コンピューティングも可能な時代に入って いる. 1.2.2.6 2000年代 –??の時代– CPUの開発競争はとめどなく行われ, 良く知られた「ムーアの法則」10 の示す通り, トランジスタ集積 率は18ヶ月余りで2倍になり, 動作周波数も驚異的な速度に達している. しかし, トランジスタのスイッ チング速度の限界や, 電子信号による信号伝達速度の問題, 電子信号による熱発生の問題など, 現在の電子 技術の未来は必ずしも明るくはない. 一方, コンピュータネットワークは電気信号の時代から, 光信号の時 代へと変りつつあるが, 現在の光ネットワーク技術は, 2点間の信号を光で伝達するという域を脱していな い. すなわち, コンピュータネットワークを制御している技術そのものは, 相変わらず電気信号である. コ ンピュータの歴史を遡ればわかるように, その技術的な発展は1950年代から1970年代の時点から大 きな発展をしているわけではない. 今後, 「量子コンピュータ」の開発や「光コンピューティング」など, 新しい技術を採用した機器の発展が必要だろう. 一方, 1990年代のコンピュータネットワークの発展は, 既存の技術の枠組みのなかで新しい利用方法 を見つけ, それが成功を治めた例である. このように, 既存の技術の枠内で実現可能な新しいアイデアを 見つけることが, コンピュータの発展にとって大きな役割を果たしてきたことも事実である. 現在のコン ピュータ技術の延長線上にどんな未来が待っているのだろうか? 10 むーあのほうそく (Moore’s law): インテル社の創業者の一人 Gordon Moore が, 1965年に「発見」した法則. 半導体の 性能と集積度は18ヶ月で2倍になるというもの. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 8 1.2.3 コンピュータの分類 コンピュータの歴史でも見てきたように, 昔からコンピュータはその規模, 用途などによって様々な名前 で呼ばれてきた. 以下の二つの表は規模, 用途に応じた分類である. しかし低価格帯における処理能力の格 差が少なくなった現在では, このような分類は意味をなさなくなってきている. 規模による分類 名 称 特 徴 スーパーコンピュータ 極めて高速なプロセッサを並列で継ぐことにより, 処理 能力の向上を図った高価なコンピュータ. 高速演算を行 なうため常に冷却しなければならなく, ランニングコス トは非常に高い. 通称スパコン. 大型計算機 スーパーコンピュータを使うほどではないが, 相当の処 理能力が要求される科学技術計算などを行なわせるため に開発されたコンピュータ. 小型で高速なコンピュータ の出現により, その存在意義は薄れている. ミニコンピュータ オフィスコンピュータの類に使われていた. 現在はあま り使用されない. 通称ミニコン. マイクロコンピュータ マイクロプロセッサを使用したコンピュータ. 主にパー ソナルコンピュータとして使用される. 通称マイコン. 用途別の分類 名 称 特 徴 汎用フレーム 大型計算機とほぼ同義. OS は各社独自 (IBM 系が多い). プログラミング言語は FORTRAN が主流である. かな りの量の科学計算用ライブラリが蓄積されている. ワークステーション 小人数で共有するマシンを複数台持つことで処理能力を 上げようという思想に基づいた開発用コンピュータ. 汎 用フレームより圧倒的に安価. 主に UNIX やそれに準ず る OS で動作する. プログラミング言語は C が主流で ある. オフィスコンピュータ OA 用に開発されたコンピュータ. 基本的に業者の提供 したプログラムを使うだけのもので, 開発環境ではない. 通称オフコン. パーソナルコンピュータ 個人向けに設計されたコンピュータ. マイクロコンピュー タが多い. 近年は処理能力の向上により開発環境として も多用される. OS は MS-DOS, Windows95 , MacOS な ど様々. DOS/V, Macintosh などがこれに該当する. 通 称パソコン. 組み込みシステム 携帯電話, リモコン, 家電製品などで利用されるシステム に組み込まれたコンピュータ. 現在, 利用されているコン ピュータの台数としては, 組み込みシステムが最多と考 えられる. 近年では, スーパー・コンピュータと呼ばれるものも, 超高速ワークステーションを数台から数十台つな いで, 分散環境を実現したものを指すことも多い11 . 11 ワークステーションのクラスタ接続と呼ぶ. joron.tex,v 1.32 2003-06-02 15:39:51+09 naito Exp 数理解析・計算機数学特論 9 第 2 章 コンピュータとは 2.1 コンピュータ・ハードウェア ハードウェア (hardware) とは, コンピュータを構成する物理的な機械のことを指す1 . 今日のコンピュー タのハードウェアは CPU (Central Processing Unit: 中央演算処理装置) と呼ばれる演算装置が中心となっ ている. 今日我々が目にするコンピュータはモニタ, キーボード, ディスク装置, マウスなどの周辺装置を 持ったものが多いが2 , 古くは CPU, 少量の記憶装置(メモリ)と極めて簡単な入出力装置だけを持ったも のから始まっている. コンピュータの基本的な構成は, CPU と入出力装置, 内部記憶装置(メモリ), 外部記憶装置からなる. CPU は外部から与えられた命令にしたがって, メモリ内のデータをレジスタと呼ばれる演算装置に格納 し, しかるべき演算を行なった後, そのデータをメモリに格納する操作を行なっている. 一方, (何らか の)入出力装置を動作させるためには, それらを制御しているコントローラと呼ばれる LSI (Large-Scale Integration: 大規模集積回路) に CPU から命令を出すことが必要となる. これら CPU や LSI は半導体素 子 (semiconductor chip) と呼ばれ, トランジスタと同等の動作をする素子の集合体である. 古くは, こ れらの動作をすべてそれぞれの LSI が直接理解可能なコードで記述していた. CPU コントローラ コントローラ コントローラ コントローラ キーボード ディスプレイ メモリ ディスク 入力装置 出力装置 内部記憶装置 外部記憶装置 しかしながら, 入出力装置が複雑になってくると, そのようなコードを利用者が直接与えることが困難になっ てきた. そのため, コンピュータを動作させる基本的なソフトウェアとして OS (Operating System) が開 発された. ここでは OS などの話は後にし, ハードウェアを構成するそれぞれについて詳しく見ていこう. 2.1.1 半導体素子 半導体 (semiconductor) とは, 金属のような電気抵抗が極めて低い導体と, 紙のような電気抵抗が極め て高い絶縁体(不導体)との中間的な電気抵抗をもつ物質のことである. 半導体の代表例としては, シリコ ンやゲルマニウム3 が良く知られている. シリコンやゲルマニウムの純粋な結晶中に5価の原子であるリン やアンチモンを不純物として少量加えたものを n 型半導体, 3価の原子であるガリウムやインジウムを不 純物少量加えたものを p 型半導体と呼ぶ. n 型半導体中の不純物の余分な電子は結晶中で自由電子となり, 1 アメリカで “hardware” という看板を掲げた店が数多く存在する. これはコンピュータを扱う店ではなく, 「金物屋」のことで ある. 2 Palm に代表されるような PDA (携帯情報端末)が世間を席巻し, このような形のコンピュータは早晩滅びてしまうのかもし れない. 3 これらはすべて4価の原子であることに注意しよう. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 10 電流を流す役目を果たす. 一方 p 型半導体では, 完全な結晶を構成するためには電子が足らず, あたかも 「正電荷を持つ電子」が自由に動き回るかの構造を持つ. 2.1.1.1 pn ダイオード 簡単に, p 型半導体と n 型半導体を接合すると, 次の図のようにどちらかの方向の電流だけを流すような 素子 (device) を作ることが出来る. +- − + +- − p 型半導体 + −- p 型半導体 n 型半導体 −- + − n 型半導体 − + 電流が流れる 電流が流れない この素子のことをダイオード (diode) と呼び, 右はしに書いた記号であらわす. 2.1.1.2 トランジスタ p 型半導体を n 型半導体で挟んだ構成をもつ素子をバイポーラ・トランジスタ( npn バイポーラトラン ジスタ) (bipolar transistor) と呼び, 単にトランジスタといったときにはバイポーラ型のものを指す. E エミッタ領域 ベース領域 コレクタ領域 n p n C E C I B B いま, エミッタを接地し(電位 0 にすること), ベースに電流を 0 から順に増やしていくと, コレクタに流 れる電流はベースの電流が増幅されてでてくる. すなわち, トランジスタは電流の増幅作用がある. この増 幅作用を利用して, ベース電流を 0 と飽和状態の切り替えを行うことにより, トランジスタを用いてスイッ チング動作を与えることができる. Remark 2.1.1 ここで, なぜトランジスタが電流増幅作用があるかを考えてみよう. いま, エミッタを接地し, ベー スに正の電圧をかけると, 電子はエミッタ領域からベース領域に流れ込む. この時, ベース領域の厚さが極めて薄けれ ば, 電子はコレクタ領域にも到達する. この時, エミッタ領域から流れ出した電子のうち α がコレクタ領域に到達する と仮定すると, ベース領域から流れ出す電流 IB と, コレクタ領域から流れ出す電流 IC は IC = αIE , IB = (1 − α)IE という関係をみたす. そこで, IB をトランジスタへの入力電流, IC を出力電流と考えると, β := α IC = IB 1−α が出力電流の増幅率となる. ベース領域を極めて薄くとると, 0.5 < α < 1 を満たすようにできることがわかり, この 場合増幅率 β は β > 1 を満たすこととなる. 2.1.1.3 IC と LSI IC (Integrated Circuit) や LSI (Large Scale Integration) とは, シリコン結晶の基盤上に極めて多数の トランジスタ(や他の素子)を配置した回路のことである. この場合に用いられるトランジスタはバイポー hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 11 ラ型のものではなく電界効果型トランジスタ (FET) と呼ばれるものが利用される. FET の代表的なもの は MOS FET と呼ばれる, シリコン結晶の表面に金属酸化膜が施されたトランジスタである. 2.1.2 デジタル回路 世間では「コンピュータは2進法で動作する」とか, 「コンピュータはデジタル回路で出来ている」とか ということがいわれている. コンピュータ・ハードウェアは特定の2種類の電圧の状態4 によってその動作 が決まっている. そのような意味で, 「2進法」で動いているといってもいいし, このような2状態で回路 が動作するものをデジタル回路と呼ぶ. 1台のコンピュータのそれぞれの素子を協調して動作させるため には, 外部から一定の時間刻みを与え, その刻みごとに状態が変化するようにすると回路上のそれぞれの素 子の間の状態のやり取りが容易になる. コンピュータ上でこのような時間刻みを与える素子が水晶発振子 であり, その時間刻み幅がそのコンピュータの動作速度を決定する第一の要因となる. この刻み幅のことを ベースクロック (base clock) と呼ぶ. マザーボード上でベースクロックは分周され, すなわち, ベースク ロックの整数倍または半整数倍のクロックが生成され, そのクロック信号により各種のチップが同期動作を 行う. ベースクロック 分周クロック この図は回路上を流れる電流の電圧を表し, 一般に は高電位は +5V, 低電位は −12V となっている. 電 位が高電位となっている時に 1 を, 低電位となって いる時に 0 を表すのが正論理と呼ばれる通常の方法 である. これを逆にしたものは負論理と呼ばれる. 従って, より高速なコンピュータを作るために最も単純な方法は, 高速クロックで動作する素子を組み合わ せれば良いが, 実際には外部から電流を流すことにより, 素子の状態を変化させるため(スイッチングを行 う)には一定の(極めて短い)時間が必要となる. これを素子のスイッチング速度と呼び, 高速素子を作る ためにはスイッチング速度が高速なものを開発しなければならない. もちろん, スイッチング速度が高速に なっても, 内部の回路が複雑であれば, 実際の動作速度をあげることが困難になるので, LSI 全体の速度を あげるための要因は単純ではない. 2.1.3 マザーボード 今日の多くのコンピュータはマザーボード (mother board) と呼ばれる一枚の回路基盤が基本になっ ている. マザーボードには CPU を搭載するためのソケット (socket), 標準的な周辺装置を接続するため のインターフェース (interface) とそのためのコントローラ, メモリを搭載するためのソケット, 拡張機器 のコントローラを接続するためのバス (bus) などが搭載されている. また, マザーボード上には水晶発振 子があり, ベースクロックを供給している. マザーボードの設計はコンピュータの仕様に依存するところが多いが, 今日では基本的なインターフェー スのコントローラは1つ又は2つ程度の LSI に集積されていることが多い. 4 私たちのまわりで見掛けるパーソナル・コンピュータやワークステーションは, −12V と +5V の2状態をとる. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 12 チップセット PCIバス CPUソケット AGPバス 電源ソケット メモリソケット BIOS 電池 ATA水晶発振子 フロッピーディスクコネクタ この写真は Aopen の “AX3S Pro” マザー・ボードで, 周辺コントローラ は, 一つのチップにまとまったチップセット (chip set) の形で搭載されて いる. CPU ソケットは Socket 370 と呼ばれる, Intel 系の CPU のための ソケットであり, チップセットは Intel 815 を採用している. マザーボード上には, 電源投入時に実行されるプログラムを内蔵した素子がある. メーカやマザーボードの 用途によって呼び名は様々だが, BIOS, EEPROM などと呼ばれることが多い. また, マザーボード上には 小さな電池5 が搭載され, BIOS 内部のカレンダ・タイマや, BIOS 内部にある様々なデータを保持するた めに利用される. マザーボードに通電されているときにはこの電池を使わないように設計されているが, 通 電されていない状態が長時間続くと電池が消耗し, BIOS 上のデータが消えてしまうことがある. 2.1.3.1 インターフェース “interface” という単語を辞書で調べると, 「中間面」とか「界面」という言葉が載っている6 . インター フェースとは, コンピュータ・ハードウェアの世界では, 複数のハードウェア(またはハードウェアの部品) を接続する際に用いられるハードウェアまたはソフトウェアのことを指す. 多くの場合, インターフェース とは実際にケーブルを差し込む部分に用いられているハードウェアや, そこで用いられている通信(電気) 規格のことを指していると理解して良い. 実際, IBM-PC/PS2 のマザーボード上には, キーボードを接続するための PS2 インターフェース, マウ スを接続するためのバス・マウス・インターフェース, シリアル接続のためのシリアル・インターフェース が搭載されている. 最近では, 外部機器接続のための IDE (ATA) インターフェース, USB インターフェー ス, IEEE 1934 インターフェース等が搭載されていることが多い. 2.1.3.2 バス コンピュータに周辺機器を搭載する場合, それぞれの周辺機器ごとに特別なインターフェースを用意して いては, マザーボードの設計に限界が出たり, 各種の周辺機器を接続できなくなる. そのため, 標準的には マザーボード上には搭載しないインターフェースを接続するために, ある一定の規格を用いた基盤であれ ば, どのようなものでも接続できるように一般的なインターフェースが用意されていることが多い. これを バスと呼び, バス・コントローラによって制御されている. これは, 1段多くのコントロールを受けること になるが, より多くの種類の周辺機器を接続できるという利点がある. 古い IBM-PC では ISA bus, EISA bus と呼ばれるものが採用されていた. 古い Macintosh では NuBus, Sun Microsystems のワークステーション7 では SBus 等が採用されていた. すなわち, 各メーカごとに異 5 近年はリチウムイオン電池を使うことが多い. 6 研究社「新英和中辞典」第4版. 7 Sun Microsystems のワークステーションでは, 以前は CPU さえも SBus に接続していた. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 13 なったバス規格を採用していた. しかし, 今日では PCI bus と呼ばれる高速に動作するバス規格で多くのコ ンピュータが統一されかかっている. 統一規格を用いることにより, 拡張ボードの開発を容易にしたり, 機 種を跨がって同一のボードが利用できたりするという利点があり, ワークステーションメーカさえも, 元々 はパーソナル・コンピュータの規格であった PCI バスを採用していることが多い8 . 現在の IBM-PC/PS2 では, 具体的には, ネットワーク・インターフェースや高速外部記憶装置を接続す るための SCSI インターフェースなどは PCI バスに接続することが多い. また, 外部出力のためのビデオ カードは AGP という PCI バスを高速化したバスに接続する. これら性能が進化するタイプの周辺装置を バスに接続することにより, 必要に応じてそれらを取り替えることが可能となるという利点も見逃すこと が出来ない. 2.1.4 CPU CPU とはいわずと知れた, コンピュータの中心をなすものである. CPU の基本的な構成は, • 演算レジスタおよび演算機構 • 命令読み出し機構 • 命令解読機構 • データ読み出し・書き込み機構 からなる. 現在の CPU はこの他に • 浮動小数点演算レジスタおよび浮動小数点演算機構 • キャッシュ • パイプライン 等を持つことが多い9 . 8 しかしながら, これら, 共通規格のボードを実際に動作させるためには, それぞれのオペレーティング・システムに対応した, 周 辺機器のドライバが必要となる. 9 このような CPU 構成や, コンピュータ全体のチップ構成のことをアーキテクチャ(architecture) と呼ぶ. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 M1 MREQ IORQ RD WR RFSH HALT -WAIT -INT -NMI -RESET -BUSREQ BUSACK -CLK -+5V -GND A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 D0 D1 D2 D3 D4 D5 D6 D7 Z80 pin functions - 6 Bus 8 bits Data Data Bus Interface Data Bus CPU Bus Control CPU Control Instruction Register Address Bus System Control 14 6 Internal Data Bus - ALU ? ? Instruction Decoder Register Array 6 ? Address Logic & Buffers ? CPU - CPU Timing Timing Control 16 bits Address Bus ? ? ? 8 systems 5 CPU Control & CPU Input Control Output Z80 Internal Block 世界で最初の CPU は Intel 社とビジコン社の共同開発による 4004 と呼ばれる4ビットCPUであった10 . それまでは各種の LSI を演算回路に相当するように配置して演算レジスタを構成していた. 4004 では, LSI 上にソフトウェア(今日では, マイクロ・コードと呼ばれる)を搭載する領域を作り, マイクロ・コードの 変更を行うことにより各種の演算を行える設計になっていた. 初期の CPU は今日で言うコンピュータで はなく, いわゆる「電卓」に相当する機器を作るために使われた. Intel 社製 Cerelon 700 中央に見える部分が CPU の コアである. 裏面は 370 本の ピンがあり, socket 370 と呼 ばれる CPU ソケットを利用 する. Motorola 社 製 PowerPC 604e 放熱のために Cerelon や Pentium が空冷ファンを利用する のに対して, PowerPC では巨 大なヒートシンク (heat sink) を利用する. 10 1971年. クロック周波数は 750KHz, 1命令あたり8クロックから16クロックかかったと言われている. http://www.busicom-corp.com/ には, 4004 のチップ画像や Intel 社との共同開発の契約書などが掲載されている. この契約は 1970年2月6日から発効し, 4004 を両社の “Desk-Top Electronic Calculators” に搭載すると書かれている. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 15 Intel 社製 i468 DX2 Zailog 社製 Z80 Z80 は Intel 社 8080a の上位互換機, 8 ビット CPU の中では, 非常に幅広く利用された. この写真は世界 中で作成された Z80 互換製品のうち, Sharp 社製の もの. CASIO 社製プログラム電卓 “FX-502P” (1979年:左) Hewlett Packard 社製 “HP-28S” (1988年:右) FX-502P は初期のプログラム電卓で, アセンブラに似た制御プログラムに より, 各種の計算を行った. Hewlette Packard 社は1970年代後半から, 「逆ポーランド記法」を用 いる電卓を開発していた. HP-28S はその到達点とも言える機器. 2.1.4.1 演算レジスタ ノイマン型コンピュータにおける CPU の基本的な役割は, メモリから命令およびデータを読み出しお よび解読を行い, データに対する演算を行って, 演算結果をメモリに書き出すことである. この時, デー タに対する演算を行うために CPU 内部に用意された回路が演算レジスタ (register) (アキュムレータ (accumulator)11 )と呼ばれる部分である. CPU の速度12 を表す表現として「XXビットの CPU 」と いった表現がとられることがあるが, ここで用いられる「XXビット」とは, 演算レジスタの長さであるこ とが多い13 . CPU 内部でデータに対する演算を行う場合には, データを演算レジスタ(一般に複数存在す る)に格納してから演算を行う. ここで, 基本的な CPU 演算の例を考えてみよう. • データをレジスタ内に読み出す場合には, 演算レジスタにデータの「アドレス」を格納し, データの 読み出し命令を行う. • 2つの数の和を計算する場合には, 「2つの数をそれぞれをレジスタ A, レジスタ B に格納し, レジ スタ A の値にレジスタ B の値を加える」という命令が行われる. 11 アキュムレータは「加算器」と呼ばれ, 演算機能を与える特別なレジスタである. 他のレジスタは演算のためのデータ格納や, 演 算経過における状態変化(フラグ (flag))の記録, 現在のプログラムの位置(プログラム・カウンタ)等に用いられる. 12 実際には速度とは全く無関係な数値である. 13 以前の CPU は演算レジスタ長とデータ読み出し線の本数は一致していたので, 「XXビット」というときには演算レジスタ長 でも, データ読み出し線の本数でも同じ数であったが, 最近の CPU はこれらの数値が異なるものが多く存在し, 「XXビット」とい う言葉が何を意味しているかを考えなくてはならなくなっている. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 16 したがって, CPU が扱うことのできるメモリ量や数値の大きさの範囲は, 基本的には演算レジスタ長で決 定されている. はじめて CPU の話を聞く場合に, 演算レジスタの実感がわかないことが多いが, 「電卓」の機構を考え てみると演算レジスタの想像は容易になる. 最も単純な「電卓」は2つの演算レジスタ X, Y をもち, 次の ような操作が行われていると考えて良い. 1. 数値を入力する:レジスタ X に数値を格納する. 2. 演算キーを押す:対応する演算へのジャンプ命令が用意される. 3. 数値を入力する:レジスタ Y に数値を格納する. 4. 「=」を入力する:演算回路が実行され, レジスタ X に結果を格納する. 8080 Internal Registers 2.1.4.2 name length purpose A 8 bits accumulator B 8 bits general purpose C D 8 bits 8 bits general purpose general purpose F H 8 bits 8 bits flag registor general purpose L 8 bits general purpose SP PC 16 bits 16 bits stack pointer program counter 浮動小数点演算レジスタ 後に解説するが, CPU 内部における「整数」と「実数」は全く異なる方法で表現されている. すなわち, 「整数」の 1 と「実数」の 1.0 は CPU 内部では全く異なるデータとして扱われる. CPU 内部で「実数」 を表す表現方法として今日広く用いられているものが, 「浮動小数点」と呼ばれる表現であるが, 浮動小数 点数の演算は非常に複雑であるため, 通常の演算レジスタと演算回路を用いると演算に時間がかかるため, 浮動小数点数のみを扱う特別な演算レジスタと演算回路を用意した方が効率が良い. そのために用いられ るのが浮動小数点演算レジスタである. 以前の CPU は浮動小数点演算レジスタを外部プロセッサとして もち, 浮動小数点演算を行うために, わざわざ他のプロセッサにデータを転送して演算を行っていた14 . 近年は Intel 社 Pentium の MMX, Motorola 社 PowerPC の AltiVec などに代表されるように, 浮動 小数点演算ユニットを CPU の一部として組み込むことが多くなってきた15 . そのような意味で CPU は MPU (Main Processing Unit) と呼ばれることも多い. 2.1.4.3 演算機構とパイプライン 演算レジスタ上のデータに対する演算は CPU 内部でハードウェアとして, すなわちのトランジスタ間 の回路として実現するか(これをワイアード・ロジック (wired logic) と呼ぶ), または極めて小規模なメ 14 1980年代のパーソナル・コンピュータに利用されていた, Intel の CPU 80286 の浮動小数点コプロセッサ 80287 が有名で あるが, Sun Microsystems の CPU SPARC も浮動小数点コプロセッサを別に利用していた. 15 正しくは, MMX や AltiVec は浮動小数点演算ユニットではなく, 整数演算や浮動小数点演算をベクトル化して計算するための, ベクトル演算ユニットである. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 17 モリとプログラムを用いて実現するか(これをマイクロ・コード (micro code) と呼ぶ)で行われている. 以前の CPU の発展は, より多くの命令を CPU 内部の演算として実現する方向で発展してきた. それによ り, CPU 内部のマイクロ・コードが肥大化し, 演算の内容(加減算・乗算・除算・分岐等)によって一つの 演算に掛る時間も増大する傾向が出てきた. CPU 自身も外部から供給されるクロックにしたがって動作す るが, マイクロ・コードが肥大化し, 一方ではクロックが高速化することにより, 単純な命令(加減算)等 でも1クロックで動作しない可能性が出てきた. そのため, CPU の命令を極めて少数の基本的なものに限 り, CPU 自身の動作速度を高速化するという考え方が発生する. これを縮小命令アーキテクチャ (RISC) と呼ぶ. RISC CPU では命令をわずかなものに限ったため, 一つの命令を実行している間に次の命令を読 み出したり命令の解読を行ったり出来るようになった. この機構をパイプライン (pipe line) と呼び, 今日 の RISC CPU のアーキテクチャの基本をなしている16 . 命令読み出し 命令解読 命令読み出し 実行 命令解読 命令読み出し 実行 命令解読 命令読み出し 実行 命令解読 実行 パイプライン なお, CPU のキャッシュ (cache) とは, CPU 内部に既に読んだ命令やデータを保存しておき, そのデータ 等が変化していない限り, メモリにデータを読み出しに行くのではなく, キャッシュに保存されたデータを 読むことで代用するための CPU 内部のメモリである. 2.1.4.4 CPU の速度評価 CPU の実行速度を表す数値としては, クロック速度が一般的に用いられている. 仮に加減算やメモリか らのデータ読み出しが1クロックで行われるのであれば, クロック速度は CPU の演算速度としての評価と なるが, 実際にはそれらの演算が1クロックで行われているとは限らない17 . そのため実際的な CPU の速 度評価のために用いられる数値は, 1秒間に何回の基本演算を行うことが出来るかという数値であり, 1秒 間に行える演算回数を表したものが MIPS (Million Instruction Per Second) である. たとえば1秒間に1 00万回の命令実行を行える CPU の MIPS 値は 1 MIPS であるという. また, 浮動小数点演算の高速化 を目指した CPU (たとえば DEC Alpha 等)では, 1秒間に行える浮動小数点演算回数を表したものを 用いる. これを FLOPS (FLoating point Operaritions Per Second) である. たとえば1秒間に100万回 の浮動小数点演算を行える CPU の MIPS 値は 1 FLOPS であるという. すなわち, Pentium がクロック 周波数 1GHz で, PowerPC が 733MHz であるといっても, 実際の演算性能はクロック周波数だけで決まる わけではなく, 必ずしも Pentium 1GHz の方が高速というわけではない18 . 16 Pentium は命令セットの構成は CISC (RISC ではない CPU) に分類されるが, 10数段のパイプラインと, 高速クロックを用 いて高速動作を実現している. 17 実際, メモリからのデータ読み出しに関しては, ウエイトがかっていることが多い. 18 安易に考えると, どのような場合でも高速な CPU の方が良いように思えるのだが, 新開発の CPU ほど CPU のロジックにバ グがあったり, 動作が不安定であったりすることが多い. 実際, 1997年打ち上げの NASA Mars Pathfinder Mission で用いられ た, 火星表面探査機 “Mars Microrover” では, Intel 社の 80C85 (8085 の CMOS 版) という極めて古い8ビット CPU が搭載さ れた. これは, 火星表面という極めて過酷な条件下でも安定して動作することを求めた結果, 信頼性の高い CPU を用いるという結論 に至った典型的な例である. ([5]) hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 18 Maker Processor Intel Intel SUN Intel SUN DEC DEC MIPS Intel Motorola Intel AMD Motorola 8086 i486DX Hyper Sparc Pentiumn II Ultra Sparc II Alpha 21164a Alpha 21264 R12000 Celeron PowerPC 750 (G3) Pentiumn III Athron(K7) PowerPC 7400 (G4) 各種CPUの速度比較 CPU Info Center の資料より http://bwrc.eeec.berkeley.edu/CIC/ Date Bits Clock SPECint92 SPECfp92 78 89 96 98 98 97 98 98 99 99 99 99 99 16 32 32 32 64 64 64 64 32 32 32 32 32 5 25 150 400 450 600 667 300 400 400 800 700 450 14.2 180 - 6.7 245 - SPECint95 SPECfp95 4.1 15.8 19.6 18.4 44 18.4 15.1 19.2 33.0 31.7 21.4 4.9 12.4 27.1 21.3 66 34.4 11.8 13.1 29.0 24.0 20.4 この表にある SPEC CINT 2000, SPEC CFP2000 は, それぞれ整数演算速度, 浮動小数点演算速度の ベンチマークテスト (Benchmark Test) の方法一つであり, SPEC (Standard Performance Evaluation Corporation) が作成しているものである. 現在 CPU の命令実行速度を測定するための標準的な方法19 と なっている. [6] 2.1.5 メモリ コンピュータの回路上に置かれた記憶装置のことを内部記憶装置といい, 通常は半導体素子で作られて いるものを用いる. 内部記憶に用いられる半導体素子をメモリ (memory) と呼ぶ. BIOS などのプログラ ムの基本部分は半導体素子上に電流を流さなくても消えることが無いように書き込まれている. このよう に設計されたメモリを ROM (Read Only Memory) と呼ぶ. ROM の作り方は様々だが, 強力な紫外線を 当ることにより書き込んだデータを消去できるような素子であることが多い. 一方, 通常に利用するメモリは自由に書き換えが可能である. そのようなメモリを RAM (Random Access Memory) と呼ぶ. また書き込んだデータを保持するためには常時電流を流しておくことが必要と なる. RAM には, その目的に応じて電気的特性の違いによりいろいろな種類が存在する. 主記憶に用いら れるものは, スイッチング速度がそれほど大きくなくても良いが, 保持電流を多く必要とし, 集積度の大き なものが用いられる. また, キャッシュ・メモリには集積度が小さくても良いが, スイッチング速度が高速 なものを, BIOS の書き換え可能部分には保持電流の小さなものが用いられる. 現在のパーソナル・コンピュータやワークステーションでは, SIMM (Serial Inline Memory Module) や DIMM (Dual Inline Memory Module) と呼ばれる, 複数個のメモリ素子を小さな回路上にのせたモ ジュール形式で利用されることが多い. このようなモジュール形式をとることにより, エラー訂正コードを 含めた内部記憶装置として実現したり, メモリ全体を連続した素子に割り当てるのではなく, 書き込み遅延 を考慮したメモリ構成(メモリ・インターリーブと呼ぶ)を実現することが容易になる. また, このような モジュール化は, メモリなどの構成部品を安価に供給するために重要な役割を果たしている. 19 実際には CPU 単体の測定ができるわけではないので, それなりのシステム上を作成して, その上での各種のベンチマークテス トの比較として値を得ている. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 19 ROM チップの写真. AMI 製の BIOS (左). 右はシールを剥がしたも の. 中央の窓に紫外線をあてると ROM の内容がクリアされる. Sun Microsystem 社のワークステーション (EnterPrise 420R) で使用す る, 256M バイトの DIMM の画像. 基盤の両面に 64M ビットと思われる メモリ・チップを36個使用している. 64 × 36/8 が整数とならないのは, エラー訂正コードを利用したメモリ書き込みを行うため, 256M バイトの データを保存するためには, 誤り訂正符号の冗長度の分だけ余分に記憶領 域が必要なため. 2.1.5.1 メモリの構造と種類 メモリを実現するには, 1ビットの記憶を行う素子を大量に用意すれば良い. 初期に考えられた方法は, 多数の電線を格子状に並べ, その交点にリング上の強磁性体を配置したものであった. この時に用いられた 強磁性体はフェライトと呼ばれる炭素を添加した鉄で出来ていたため, このようなメモリをフェライト・コ ア・メモリと呼んだ. しかしながら, コア・メモリは磁化の劣化が大きく, 集積率も低いため, 他の構造に よるメモリ素子に替っていった. A B C D 1 2 3 4 例えば, A と 1 の交点にあるコアにデータ 1 を書き込 むには, A に左向きの電流を, 1 に上向きの電流を流す. この時, 各コアの磁化の向きは右の図のようになる データ読み出しのためには, 磁化を大きく変化させない ような微弱な電流を流し, 電流の変化によってデータを 読むことができる. データを 0 に変えるには, 各線に逆向きの電流を流せば 良い. A - - - B 6 C 6 D 6 1 2 3 4 メモリの集積度をあげるために, 各種のメモリ素子が開発されたが, 近年では, 不揮発性のメモリにはコ ンデンサを, RAM などのように記憶保持のために電流を用いても良いものには, トランジスタをもとにし たフリップ・フロップ回路 (flip-flop circuit) を用いることが多い. 2.1.6 入出力装置 コンピュータに命令を入力したり, 実行結果を出力したりするために, 入出力装置は無くてはならないも のである. 今日のパーソナルコンピュータやワークステーションでは, 入力装置としてキーボードやマウ ス20 , 出力装置としてディスプレイを用いることが多い. 歴史的には, 他の入力装置として穿孔テープ(紙テープ)やパンチカードを用いていた時代もあった21 . また出力装置としてはライン・プリンタを用いていた. ライン・プリンタとは, 1行分の「活字」を一列に 並べて高速に印字を行うプリンタであり, 汎用コンピュータの出力装置として, 数年前まで実際に使われて いた. 20 ディスプレイ上の特定の場所を指定するというタイプの入力装置を, ポインティング・デバイスと呼ぶことがある. マウスはその 典型的な例であるが, 他にタブレット等も良く見掛けるようになった. 21 ここに写真を載せようにも, 実物が手元にない. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 20 2.1.6.1 キーボードとマウス キーボードとマウスのインターフェースはマザーボード上に実装されていることが多い. 今日ではキー ボードのインターフェースは比較的統一されているが, PS/2, ADB などのキーボード(およびマウス)専 用インターフェースを用いるものや, Sun のようにシリアル・インターフェースを利用するもの, USB な どの多目的インターフェースを利用するものなどがある. 最近は USB インターフェースを利用するものが 多くなってきている. また, キーボード配列にはいくつかの種類があり, 日本国内では JIS 配列のものを良く見掛けるが, 他に ASCII 配列や各国独特の配列を持つものがある. キーボードはキーを押すとキー・スキャン・コードと呼 ばれる, 配列に従った特定のコードを発生する. キー・スキャン・コードと実際に入力される文字との間に は, 本来は関係が無く, それらを関連づけているのはソフトウェアであることに注意しよう. 2.1.6.2 ディスプレイ ディスプレイはビデオ・カード, フレーム・バッファ等と呼ばれる装置で制御されている. ビデオ・カー ドはマザーボード上に存在することもあるが, 最近ではバスを経由する拡張カードなっていることが多い. ビデオ・カード上にはディスプレイを制御するコントローラ・チップであるビデオ・チップと, 画面情報を 保持するための VRAM (Video RAM) がある. 画面上一つ一つの点を画素と呼び, 1画素ごとの色情報 が VRAM 上に保持される. 近年は, 画面上に矩形などのあらかじめ定まった図形を描画するためには, 各画素を書き込むのではなく, ビデオ・チップに矩形描画命令を出すことにより, ビデオ・チップが実際の計算を行い描画を行うように なっている. この原理を高度にしたものをグラッフィック・アクセラレーションと呼び, 「ジュラッシク・ パーク」や「アポロ13」で有名になった Silicon Graphics のワークステーションや, PlayStation 2 は CPU 性能が良いというよりもビデオ・チップのアクセラレターが高速であるため, グラッフィックスを高 速に動作させることが出来る. ディスプレイ装置は古くからある CRT (Cathord Ray Tube) だけでなく, 最近は液晶ディスプレイやプ ラズマディスプレイが安価に入手できるようになった. しかし, CRT と液晶やプラズマによるディスプレ イはその構造に決定的な違いがある. CRT はアナログ・ディスプレイと呼ばれ, 赤・緑・青の3色に対応 する電子線をディスプレイ表面の蛍光面に当て画像を表示する. この時, ディスプレイ上には VRAM 上の 1画素に対応する素子が存在するわけではない. したがって, アナログ・ディスプレイは回路の条件が許す 限り, いくらでも荒い画面表示にも, 細かい画面表示にも変更することが可能である. 一方, 液晶ディスプ レイに代表されるデジタルディスプレイは, 画面上に素子が並んだ形をしていて, VRAM 上の1画素に画 面上の1画素が対応する形で表示が行われる. したがって, 画面上の素子数よりも大量の画素情報を表示す ることは出来ないし, VRAM の画素数が画面上の素子数よりも少なければ, 画面上の一部分のみを利用し て画像情報を表示することとなる. それでは, 上に書いた「回路の条件」とは何かを考えてみよう. CRT では電子線は横方向に走査され, そ の走査線が上から下へと動いていく構造をとることが多い. この時, 横方向の走査線が左端から右端へ到達 する時間の逆数(1秒間に何回という単位)が水平同期周波数であり, 走査線が上端から下端までに到達 する時間の逆数が垂直同期周波数である22 . また, 1枚の画面を表示するために, 上から下まですべての画 面情報を順に描画する場合, プログレッシブ・モードまたはノン・インターリーブであるといい, 横の走査 線 n 本おきに画面情報を描画する場合インターリーブであるという23 . (この場合, インターリーブ・ファ 22 水平同期周波数はおよそ数十 MHz, 垂直同期周波数は 数十 Hz 程度である. 垂直同期周波数が v Hz であるとき, 1秒間に v 枚の画像を表示していると考えて良い. 23 現在の日本国内のアナログ・テレビ放送の規格 (NTSC) は, 垂直走査線本数 525 本, インターリーブ・ファクタ 2 で描画され ている. さらに, 垂直周波数は 60 Hz である. すなわち, 1秒間に 30 枚の画面( 15 フレーム)が表示される. 2004年から始ま hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 21 クタは n + 1 であるという.)このように, アナログ・ディスプレイに描画を行うためには, 解像度(縦横 にそれぞれどれだけの画素があるか)以外に, 水平・垂直解像度という情報が必要となる. (これらの情報 をあわせて解像度と呼ぶことが多い.)ビデオ・チップは各種の解像度のアナログ信号を出力することが出 来るが, この信号を CRT が読み取り, 正常に表示できるかどうかは, CRT 上の回路構成に依存する. した がって, CRT をビデオ・カードに接続する場合には, ビデオ・カードが出力できる解像度と CRT が表示 可能な解像度が一致している必要がある24 . ビデオ・カードから出力される信号は, このようなアナログ信 号であるため, 液晶ディスプレイでは, VRAM 内部のデジタル情報を一旦アナログ信号に変換したものを, ディスプレイ内部でデジタル情報に変換するという無駄なことが行われている25 . プログレッシブ インターリーブ これらのことから, CRT に代表されるアナログ・ディスプレイの場合には, ディスプレイが対応する周 波数帯域内であれば, どのような解像度の表示をも可能である26 が, LCD などのデジタル・ディスプレイ の場合には, ディスプレイ側の解像度と出力信号の解像度を一致させることが必要となることがわかる. 2.1.6.3 プリンタ プリンタを接続するためには, 以前はセントロニクス・パラレル・インターフェースと呼ばれるものが使 われていたが, 最近は USB, IEEE 1394 などのユニバーサルなインターフェースを利用したり, プリンタ をネットワークに接続して, ネットワーク経由でプリンタを利用するようになってきた. プリンタ仕様言語, すなわち, 印刷したい内容をどのような情報としてプリンタに送るかを記述した言語 は, プリンタのメーカにより様々なものが用いられているが, レーザ・プリンタのようなページプリンタ, すなわち, 印刷が1ページ単位で行われるもの27 の場合には PostScript28 を代表例とするページ記述言語を 利用する. る, 地上波デジタル放送では, 垂直走査線本数 1125 本, プログレッシブ・モードが利用される. 24 正確には, 水平・垂直同期信号をどのように入力するかということも一致させなければならない. 現在の PC で用いられている 信号は, 水平・垂直同期信号を RGB 信号とは独立の入力線に割り当てる方法で, セパレートシンク (separete sync) と呼ばれて いる. 他の代表的な方法としては, 垂直同期信号を緑の信号と混在する方法で, シンクオングリーン (sync on green) と呼ばれる ものがある. 25 最近, デジタル信号を出力するビデオ・カードも現れたが, デジタル信号の規格に2種類ほどがあるため, まだまだ混乱している のが現状である. 26 もちろん, キレイかどうかは別問題である. 27 元々は, プリンタは「連続紙」と呼ばれる, 論理的にはページの区切りがない紙に印字することを前提としていた. 28 PostScript は米国 Adobe 社の登録商標. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 22 2.1.7 外部記憶装置 長期間にわたって大量にデータを保存するためには, 電源保持や集積度の問題があり, メモリのような記 憶装置を用いることが出来ない. そのため, 外部記憶装置と呼ばれる, 大規模なデータを保存するための装 置が必要となる. 一般には, CPU から直接アクセス可能ではないような記憶装置のことを外部記憶装置と 呼ぶ. 2.1.7.1 外部記憶媒体 外部記憶装置に用いる記憶媒体には, 磁気テープのようなデータが直列に並んだものと, ディスクに代表 される, ランダムにアクセスが可能なものがある. ソフトウェアからデータを読み書きするための外部記憶 として, 古くは磁気テープを用いていたが, 今日では, ディスクのようなランダムアクセス可能な媒体を利 用することが多い. しかし, 磁気テープは極めて大規模なデータを安定に保存することが可能であるため, 現在でもデータの長期間保存(バックアップ)のために利用されている. 2.1.7.1.1 媒体の種類 ここでは, 近年見掛ける各種のディスク媒体に話を限ることにしよう. 最近利用 されているディスク媒体は大まかに言って, 磁気記憶媒体と光記憶媒体に分類できる. 磁気記憶媒体にはフロッピー・ディスク, ZIP, 光磁気ディスク (MO), などのリムーバブル・メディアと, ハードディスクのような固定メディアがある. これらは( MO を除くと)ディスク表面に塗布された磁性 体上に信号を電気的に記録29 することより, データの保存を行う30 . ハードディスクは磁性体が塗布された 金属盤やガラス盤を数枚重ねた構造をしていて, 回転時には気流を利用して数ミクロンの高さに浮かせた 磁気ヘッドを利用してデータの読み書きを行う. 磁気ヘッドがわずかながら浮いていることにより, 高速回 転が実現でき31 , 極めて高速に目的のデータを読み出すことが可能になっている. 一方, 光記憶媒体には CD-ROM, DVD-ROM に代表される, 読み出し専用媒体, CD-R のような Write at once な媒体, CD-RW, DVD-RW のような Read/Write 可能な媒体等が存在する. 読み出 し専用媒体はディスク表面に刻印された凹凸をレーザによって読みとることでデータを読み出すことが出 来る. CD-R, CD-RW などではディスクに強力な光を当てることによって光学特性が変化する色素を塗布 し, レーザによって色素を変化させることでデータを記録するように作られている. この中でも CD-ROM は元々音楽を記録するために開発された媒体であるため, CD-ROM ドライブの読 み出し速度は「X倍速」という表現をとることが多い. これは, 音楽CDを読み出すために必要な速度, す なわち, 標準的な1枚のCDすべてを読むために74分かかる速度に対する比率を表している32 . このように次々と新しい媒体が発表されてくるが, データを保存するフォーマットとともに, やがてこれ らの媒体を読み出すための機器が利用できなくなったり, たとえ機器が存在しても, そのデータ・フォーマッ トに対応したソフトウェアが見つからないという深刻な問題が発生している. また, 近年はシステムの肥大化やデータファイルの肥大化が進み, 取り出し可能な各種のディスク(ZIP, MO, CD-R, DVD-R など)の容量が不足するという問題が発生している. これは, ハードディスクの容量 が飛躍的に増大していることと比較して, 取り出し可能なメディアの容量が増大していないことが原因で ある. 2.1.7.1.2 媒体のフォーマット ディスク状のランダムアクセス可能な媒体を利用する際には, 書き込ん だデータの位置を表す「番地」をつけなければならない. そのため, ディスクはセクタ (sector) と呼ばれ 29 なお, 磁性体上の磁気データとして保存するので, 長期間保存は難しい. はレーザを照射して熱を加えることにより, 媒体の磁気的性質を変化させデータを記録し, 記録されたデータを電気的に読 み出している. MO は他の磁気記憶媒体とは異なり, 書き込みと読み出しが異なった方法で行われる特殊な媒体である. 31 最近のハードディスクでは 10000 rpm (rotation par minites) 等という, 超高速回転のものもある. 32 およそ 200 rpm 程度. 30 MO hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 23 る, データを記録するための基本単位となる部分が集まって構成されることになる. ハードディスクなどの 磁気記憶媒体は, ディスク上に同心円上に並んだシリンダ (cylindar) 内に, (現在では)外部ほど多くの セクタが並んだ構造を持っている. ディスクにいくつのシリンダとセクタがあるかなどの情報を, ディスクのフォーマット情報と呼び, 外部 記憶媒体をコンピュータからアクセスする場合の基本情報となる. ディスクがどのようなフォーマット情 報を持つかは, 製品ごとに異なり, その製品を利用するためには必要不可欠な情報である. 実際にディスクにデータを記録する際には, セクタ単位で書き込みが行われる. すなわち, データは常に セクタ単位で記録され, 書き込みデータが1セクタの記憶容量33 を越えると, 次の空きセクタに書き込みが 移動する. したがって, たとえ1バイトの情報を記録する際にも必ず1セクタは消費される. 上はハードディスク内部の写真. 3枚の金属板の表 面に磁性体が塗布されているのが分かる. 下左は通常のハードディスクの外観. 下右は内部が 見えるように作られたハードディスク. シリンダとセクタ 仮にセクタに欠陥が発生すると, そのセクタに対してはデータの読み書きが出来なくなる. 一般に「ディス ク・クラッシュ」と呼ばれる現象は, セクタに欠陥が発生した状況を指す. また, ハードディスクなどは出 荷時に既に欠陥セクタが存在していることがあり, (出荷検査されたハードディスクは)欠陥セクタのリス 33 セクタあたりの記憶容量は 512 バイトとか, 1024 バイト程度である. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 24 ト(「ディフェクト・リスト」 (defect list))が, ハードディスク内に書き込まれていて, ディフェクト・リ ストに載っているセクタは利用できないように制御されている. 2.1.7.2 外部記憶装置 外部記憶装置を接続する際に使われるインターフェースの代表的なものをあげておこう34 . 2.1.7.2.1 SCSI インターフェース SCSI (Small Computer System Interface) は, ハードディスクな どを接続するために比較的以前から利用されている, 標準的インターフェースである. 必ずしも記憶媒体と は限らないものも接続できるシステム・インターフェースで, 現在ではワークステーションなどの高価格機 などで中心的に利用されている. SCSI では接続元となるコンピュータ自身も1台の SCSI 機器として認識 され, バス接続で接続し, 接続された全体の構成を SCSI バスと呼ぶ. SCSI バスの両端には信号の反射を 防ぐための終端抵抗(ターミネータ terminator)を必要とする. SCSI バス上ではすべての SCSI 機器は アドレスによって区別される. 標準的な(今日では) SCSI-1 と呼ばれる規格ではアドレスは3ビットで 記述されていたため, バス上に接続できる SCSI 機器は8台までとなる. また, バス上を流れる信号の劣化 が起るため, バス全体に渡るケーブル長には制限がある35 . SCSI はその後各種の拡張が行われ, 現在では SCSI-160 と呼ばれる超高速転送を可能にしたものも市販されている. 規格名 転送速度 アドレス長 ケーブル・ピン数 転送幅 転送方式 SCSI-1 Fast 5 MB/sec 10 MB/sec 8 8 50 50 8 bits 8 bits SE SE Fase Wide 20 MB/sec 16 68 16 bits SE Ultra Ultra Wide 20 MB/sec 40 MB/sec 8 16 50 68 8 bits 16 bits SE SE Ultra 2 Ultra Wide 2 40 MB/sec 80 MB/sec 8 16 50 68 8 bits 16 bits LVD LVD 16 SCSI の規格36 68 16 bits LVD Ultra-160 160 MB/sec 終端抵抗 終端抵抗 DEVICE DEVICE バス型接続 DEVICE DEVICE DEVICE DEVICE デージー・チェーン接続 34 パーソナルコンピュータのフロッピー・ディスクは専用インターフェースを用いることが多いので, ここでは省略する. しかし, 多くの場合それほど気にしなくて もよい(そんな長さにすることは少ない)が, SCSI だけはケーブル長に気をつけた方が良い. 36 40 MB/sec の “B” とは「バイト」を表す. また “b” を使ったときには「ビット」を表す. SCSI はパラレル転送を行うため, 転 送速度の単位は「バイト」となる. 一方, IEEE 1394, RS-232C などはシリアル転送を行うので, 転送速度の単位は「ビット」である. 35 各種のインターフェースでケーブル長の制限はほぼ必ずといって良いほど存在する. hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 25 DEVICE DEVICE HUB DEVICE DEVICE IDE インターフェース HOST DEVICE HUB DEVICE DEVICE スター型接続 2.1.7.2.2 DEVICE ツリー型接続 IDE (Integrated Drive Electronics) は, ATA とも呼ばれる, 近年 パーソナル・コンピュータの内蔵用外部記憶装置の接続のために多く用いられるインターフェースである. IDE バス上にはマスターとスレーブと呼ばれる2つのデバイスを接続することができ, マスター・デバイ スが優先的に読み込まれる. SCSI はケーブル長の制限や SCSI アドレスの重複を防ぐ必要があるなど, 初 心者には面倒なインターフェースであった. また, SCSI は実際のデータ転送のために CPU を利用するの でなく, SCSI コントローラで実現している. そのため, コントローラが高価になる傾向があった. しかし, 近年 CPU 性能が向上し, データ転送を CPU で行うことが可能になり, 簡便に記憶装置の接続を行えるよ うにしたのが IDE であり, それを正式な規格としたものが ATA である. IDE/ATA はデータ転送を CPU が行うため37 , CPU 負荷が大きくなる傾向があり, 高性能を要求されるワークステーションなどでは余り 利用されない. 2.1.7.2.3 USB インターフェース USB (Universal Serial Bus) は記憶装置に限らない, 各種の外部機 器を簡便に接続するために Intel 社によって設計された規格である. SCSI がバス接続を行い, ホスト・コ ンピュータも1台の SCSI 機器であるという特徴を持っていたことに対して, USB は USB ハブを経由し てツリー接続を行い, ホスト・コンピュータからの上りと下りの区別がある. USB 比較的低速の装置を簡 便に接続するために設計された規格38 で, バス内のアドレスは動的に割り当てられる. また, 電源が入って いる状態でも機器の抜き差しが基本的には可能である39 . 2.1.7.2.4 IEEE 1394 インターフェース IEEE 1394 は Apple, SONY 等で設計された, 動的にアド レス割り当てを行う外部機器を接続するための規格である. 別名を firewire という. USB とは異なり, 基 本的にはデージ・チェーン接続を行うが, ハブを経由してチェーンの分岐も可能である. IEEE 1394 では ホスト・コンピュータも1台の機器として扱われる. IEEE 1394 の特徴は, データ転送をパケット転送で 行うということであり, 一種の簡単なネットワークをなしている. 標準的な IEEE 1394 はシールドつき同 軸ケーブルを用いて最大転送速度 400Mb/sec, 最大転送距離 4.5m を実現している40 . なお, SONY のAV 機器に搭載されている i.link は IEEE 1394 インターフェースのことである. 2.1.8 シリアル・インターフェース コンピュータ上にこの他に搭載されているインターフェースとしては, シリアル・インターフェースが ある. シリアル・インターフェースとは標準的には RS-232C または RS-422A インターフェースのこ 37 最近の ATA/100 などの規格は, データ転送のための CPU 利用率を落とすように設計されている. USB-2 という高速な規格がある. 現在の USB (USB1.1) は最大転送速度 12Mbps であり, いくつかの通信モード(高 速バルク転送モードや低速モード)をサポートする. USB-2 (USB2.0) では最大転送速度 480Mbps という規格が発表されている. 39 hot plag 可能であるという 40 P1934b と呼ばれる, IEEE 1394 の拡張規格が提唱されていて, シールドつき同軸ケーブルのほか, マルチモード光ファイバや UTP-5 ケーブルなどを用いて, 最大転送距離 100m, 最大転送速度 3.2Gbps が計画されている. 38 最近は hardware.tex,v 1.35 2003-06-03 09:27:17+09 naito Exp 数理解析・計算機数学特論 26 とであり41 , 他のコンピュータと1対1の通信を行ったり, モデムを接続するためのものである. 「シリア ル」という名の通り, データを非同期に順に送り出すものであり, 対向する機器と1秒間に送り出すデータ 量(ボー・レート)や1バイトのビット数, ストップ・ビット長等を一致させておかなければならない. 2.2 コンピュータ・ソフトウェア ソフトウェア (software) とは, コンピュータ・ハードウェアに目的の動作させる一連の命令の列のこ とを指す. ソフトウェアには CPU や各種コントローラに内蔵され, それらを駆動するために使われるも の(マイクロ・コード (micro code)), コンピュータ本体の起動や各種周辺機器自身を制御するために, BIOS やコントローラに内蔵されるもの(ファーム・ウェア (firmware))のような, 一般ユーザとは縁の ないものから, ワードプロセッサ等ユーザが直接利用するアプリケーション・ソフトウェア (application software) まで, 各種の種類が存在する. 古くは, コンピュータのハードウェア構成が単純だったこともあり, 周辺装置を含めたコンピュータの制 御は易しく, ソフトウェアも単純な構成をしていた. しかし, 周辺装置の種類が多くなり, 構成も複雑にな るにつれて, ユーザがそれらを個別に制御することが困難になってきた. そのため, コンピュータの入出力 を統一的に扱うためのソフトウェアである, オペレーティング・システム (Operating System, 以下簡単 に OS という.) という概念が現れた. ここでは OS を中心にコンピュータ・ソフトウェアとは何かを考え てみよう. 2.2.1 OS とは OS とはコンピュータのもっとも基本となるソフトウェアで, 簡単に言ってしまえば, CPU, ディスクシス テム(ファイルシステム), キーボード, マウス, ディスプレイなどのハードウェアとそれを利用するユー ザとの間をとり持つソフトウェアである. ユーザがコンピュータを利用する, すなわち, ユーザが意図した動作をコンピュータに行わせ, その結果 を得る42 ためには, ユーザがコンピュータに対して何らかの入力を行い, それに対する出力を得ることが必 要である. この時, ユーザが入力を行うためには, 入力装置からの反応を CPU が解釈し, 必要に応じて外 部記憶装置からデータを読み, その実行結果を出力装置に送るという作業を行っている. この手順の中では 各種周辺装置(入出力装置や外部記憶装置など)とのやり取りも必要であるし, 外部記憶装置にどのように データを保存するかの手順もきめなければならない. さらに, ユーザがこれらの命令を与えるためにはどの ような入力をすべきかもきめなければいけない. OS はこれらの方法を与えるソフトウェア群である. ここ で, OS は単一のソフトウェアからなるのではなく, いろいろな役割を持つ各種のソフトウェアの集合体で ある43 . Example 2.2.1 OS の例としては, UNIX, MacOS, MS-DOS, Windows 95/98 などがある44 . 以下では, OS の各種ソフトウェアの役割を簡単に見ていこう. 2.2.1.1 カーネル カーネル (kernel) とは, その名の通り, OS の中心をなすものであり, 他のプログラムの実行制御や周辺 41 RS-232C の “RS” とは Recommended Standard の略. (job) と呼ぶ. 43 どこまでのソフトウェアを OS の一部と見なすかは, 解釈の違いでもあり, いろいろな OS の主張でもある. 44 正確には Windows 95/98 そのものは OS と言えるかどうか良くわからない. 42 この一連の作業をジョブ software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 27 装置とのデータの交換を行う. OS の基本的な性質はカーネルによって決定され, たとえば, UNIX が持つ 基本的な性質である, • マルチユーザ(同時に1人以上が利用できる) • マルチタスク(同時に1つ以上のプログラムを実行でき, それらの間に十分な関係を持たせることが できる) • マルチスレッド(一つのプログラム内の処理を同時に平行して処理する機能) • ネットワーク機能(他のコンピュータとの高速な通信ができる) のうち, マルチタスク機能はカーネルによって与えられる機能である. 周辺装置の取り扱いの基本的な方法 はカーネルによって決定されるが, 実際に周辺装置とのデータの交換を受け持つ部分(デバイス・ドライバ (device driver) )は, カーネルとは別のプログラムとして与えられる. また, 複数の CPU を使ってプロ グラムを動作させるマルチプロセッサ機能も, カーネルで実現される機能である. Example 2.2.2 UNIX では, ( UNIX の種類によって異なるが) vmunix, kernel などと呼ばれるもの がカーネルである. カーネルは起動時に主記憶上に読み込まれ, OS が終了するまで主記憶上に存在する. MacOS では system というのがカーネルに相当する. ここまでは「狭い意味でのカーネル」の概念であり, 実際に「カーネル」と呼ばれる部分(UNIX での vmunix など)には, 以下に述べる「デバイス・ドライバ」や「拡張モジュール」が内包されていることが普通で ある. 2.2.1.1.1 マルチタスク機能の実現 ジョブは必ずしも単一のプログラムとして動作するのではなく, 複 数のプログラムが順にまたは同時に動作することによって一つのジョブを構成している. ジョブの中で実 行されるプログラムの動作をタスク (task) と呼ぶ. また, プログラムが実際に動作している物理的な状況 のことをプロセス (process) と呼び, タスクとプロセスは区別される. マルチタスク (multi-task) とは, ユーザから見たとき, 同時に複数のタスクを実行できる OS の機能を指す. マルチタスクは, カーネルによって, プロセスを適切なスケージューリングの元に順に実行することで実 現される. すなわち, マルチタスクを実現するには, 複数のプロセスを(見掛け上)同時に実行することが 必要になるが, カーネルは複数のプロセスを主記憶上に配置し, それらをプロセス・テーブルと呼ばれる 「表」で管理し, 優先順位の高いものから順に時間を分割して一定時間づつ実行していく. この時, 分割され た時間が十分に短ければ, ユーザから見たとき, 複数のプロセスが同時に実行されているようにみえる. こ れを時分割実行制御 (time sharing processing) と呼ぶ. しかし, マルチタスクを実行するためには, 時分割が実現するだけでは不十分であることに注意しなけれ ばならない. 単に複数のプロセスを主記憶上に配置し, 時分割実行するだけでは, 実行中のプロセスが利用 している主記憶領域(プロセスが利用しているメモリ領域)が他のプロセスによって書き換えられたり, 一 つのプロセスが読み書きしている外部記憶上のデータを他のプロセスが書き換えたりすると, プロセスは 予想もつかない動作をすることになる. したがって, 一つのプロセスの持つ主記憶領域を他のプロセスに使 わせないこと(主記憶の排他的制御45 )だけでなく, 外部記憶のデータ(ファイル)の排他的なロックの機 能を持たなくてはならない. さらには, プロセス間どうしの通信の機能を持たなくては, プロセス間でデー タの交換が出来なくなる. 45 Windows で「一般保護モード違反」などと言う意味不明のエラー・メッセージが出ることがあるが, Windows では, 主記憶領 域の排他的制御に問題があり, 排他制御に違反した場合のエラー・メッセージと理解するのが良いだろう. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 28 2.2.1.2 デバイス・ドライバ コンピュータには, キーボード, ディスプレイをはじめとする様々な周辺機器が必要になることは, これ までに見てきた通りであるが, それら周辺機器の制御コントローラの仕様は, 機器の種類の違いだけでなく, 製品の機能の違いによっても異なり, カーネル内で周辺機器のコントロールを行うことは, 周辺機器を追加 するたびにカーネルを変更しなくてはならなくなり, 極めて不都合が大きい. そのため, カーネルでは周辺 装置をデバイス (device) という, 仮想的なファイルとして扱い, そのファイルに対する入出力として, 周 辺装置との入出力を扱う. カーネルがデバイスへの入出力を行った際, そのデータを受け取り, 周辺機器へ データの入出力を行うプログラムがデバイスドライバ (device driver) である. デバイス・ドライバを経由することにより, OS から見たとき, 周辺機器の差異を気にすることなく, そ れらへの入出力を扱うことができるという利点がある. また, 新しい周辺機器を追加した場合にも, カーネ ルを書き換えることなく, それらへの入出力を行うことが出来る. Example 2.2.3 UNIX では「カーネル・コンフィグレーション」 (kernel configuration) と呼ばれる手法 により, 新しいデバイス・ドライバ, 拡張モジュール等を vmunix や kernel の中にいれたり, 不要なもの をはずしたりすることが可能である. MacOS ではデバイス・ドライバは system に組み込まれている基本的なもののほかに, 「機能拡張」に 追加する形でデバイス・トライバを追加することが出来る. 2.2.1.2.1 拡張モジュール 拡張モジュールとは, 必ずしも周辺機器とは関連しないが, OS に新たな機能 を与えるプログラムの一般的な呼び方である. 拡張モジュールの動作の形態はその機能に依存するところ が大きいが, (広い意味での)カーネルの一部に組み込まれる形態のものも多い. Example 2.2.4 MacOS の「機能拡張」に追加されるものなどは, これに相当するものが多い. UNIX で はカーネルに追加するモジュールとして与えられるものがいくつか存在する. 2.2.1.3 ファイル・システム 外部記憶装置に記憶されたデータは, 物理的には1つ以上のセクタに記録されているが, それらのつなが りも同時に記録され, このデータの集まりに対してアクセスするための「名前」が付けられる. この名前の ついたデータの集まりをファイル (file) と呼び, 外部記憶装置内にはファイルの名前とそれが格納されて いるセクタの情報との対応を与えるテーブル46 が存在する. この名前の付け方, テーブルの構成方法をファ イル・システム (file system) と呼ぶ. 2.2.1.3.1 ファイル・システムのフォーマット 外部記憶装置は, それぞれの媒体と利用する OS に合わ せて, 適切なファイル・システムとしてフォーマット (format) される. すなわち, 外部記憶装置のフォー マットとは, ソフトウェア的にはファイル・システムに合わせて, アロケーション・テーブルを適切なセク タに書き込むことである47 . ファイル名としてどのような長さや規約で名前をつけることが出来るかは, ファイルシステムに依存す る概念である. すなわち, アロケーション・テーブル内のファイルの名前を格納する部分の長さによって, ファイル名の長さが決まる. 46 このテーブルのことをファイル・アロケーション・テーブル (file allocation table) と呼ぶ. この操作は論理フォーマット (logical format) と呼ばれ, 物理フォーマット (physical format) と呼ばれる操作 により, アロケーション・テーブルを作成した後, すべてのセクタをクリアすることが出来る. 逆に言えば, 論理フォーマットはアロ ケーション・テーブルをクリアすることのみで, データの読み出しを出来なくしているだけで, 各データ・セクタにはデータが消去さ れずに残っている. 一般に, 各媒体にどのようなフォーマットが可能かは, OS に搭載されたモジュール, デバイス・ドライバ, デバイ ス内のファームウェア等に依存する. また, 物理フォーマット時に欠陥セクタの検出を行うことが出来るソフトウェアもあり, 出荷時 以後に発生した欠陥セクタをディフェクト・リストに追加することも出来る. 47 正確には, software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 29 allocation table sector foo bar - next allocation table next ファイル・アロケーション・テーブル ファイル・システムには様々なものがあるが, カーネル内にそれぞれのファイル・システムを扱うためのモ ジュールを追加することにより, 各種のファイル・システムを利用することが出来る. Example 2.2.5 UNIX の標準的なファイル・システムは UFS (Unix File System) と呼ばれるものであ る. UFS はコンピュータ内部にあるハードディスクに対するファイル・システムである48 . また, UNIX で はネットワークを経由して他の UNIX ホストに接続された外部記憶装置を, あたかも自分の記憶装置の如 く扱うことが出来る. このようなファイル・システムを NFS (Network File System) と呼ぶ. MacOS では HFS または HFS+ と呼ばれるファイルシステムが使われる. MacOS の HFS は, ハード ディスクだけに限らず, フロッピー・ディスク, MO 等にも適用される. MS-DOS で利用されるファイル・システムは MS-DOS FS と呼ばれ, ファイル名の長さが8文字+3文 字という形式をとる. Windows で利用されるファイル・システムも MS-DOS FS を利用しているが, OS 内部のファイル・システムに関するドライバの機能により, より長い名前を(ファイル・システム内にかか れた名前とは別に)与えることが出来る. CD-ROM, CD-R などの媒体に対しては, ISO9660 に代表される特徴的なファイル・システムが使われ る. ISO9660 の標準的な定義によれば, ファイル名は MS-DOS FS と同じ形式を持つが, ISO9660 の拡張 (Joliet などと呼ばれる各種の拡張形式が定義されている)を用いると, より長い名前をつけることが出来 る. 各種の OS では ISO9660 を読むためのドライバを経由して CD-ROM の読み出しを行っている. 最近のハードディスクは数十GBという巨大な容量を持つ. ハードディスクの容量は未フォーマット時容 量(ただし, 1KB = 1000B )で表される. ハードディスクをフォーマットした後, 実際にデータの格納と して利用できる容量(ただし, 1KB = 1024B )は, 未フォーマット容量からある程度減少する. 2.2.1.3.2 OS から見たファイル・システム 現在のコンピュータでは, このような巨大なハードディス クを複数台設置して運用することが多いが, 複数のハードディスクに格納されたファイル・システムを, OS 側からすべてアクセスするために, それらを一つの仮想的なファイル・システムとしてまとめることが必 要となる. これをディスクのマウント (mount) と呼ぶ. UNIX ではディスクをマウントすることにより, ユーザはそれぞれのファイルがどのディスクにあるかを気にすることなく, 仮想的なファイル・システム全 体を利用することが可能になる. 一方, Windows では, ドライブ (drive) と呼ぶ概念があり, 各ディスクに ドライブ名をつけ, ファイル・システム全体をまとめる構造を持っている. このように仮想的な巨大なファイル・システムを構成しても, 一つのファイルを複数のディスクに跨がっ て格納することは出来ない. このままでは, データーベースなど数十TB等という巨大なデータを扱うこ とが困難になる. そのために近年開発された技術がストライピング (striping) であり, ドライバのソフト ウェア的な機能により, 複数のディスクを仮想的に連結して, 巨大な仮想的なディスクを構成することが出 来るようになった. また, ファイル・システムに書き込むデータを, 複数台のディスクに同時に書き込みを 行うディスク・ミラーリング (disk mirroring) の技術が発達し, 1台のディスクがクラッシュしてもデー タの保全をはかる方法が発達している49 . 48 OS のベンダーによって, 多少の拡張が行われている部分がある. RAID (Redundant Arrays of Independent Disks) と呼ばれる方法であり, ディ スクや CPU など各種コンピュータデバイスの多重化, 冗長化の技術は, 近年驚くほど発展した. 49 ミラーリングを高度に発展させたのが, software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 30 なお, 余談だが, ハードディスクのいくつかのセクタに欠陥が発生しても, そこに書き込まれているデー タが読み出せなくなるだけだが, アロケーション・テーブルのセクタに欠陥が発生すると, ディスク全体が 読み出せなくなる. またハードディスクの最内周には Initial Programming Loader (IPL) などと呼ばれる 部分があり, ここに欠陥が発生すると, そのディスクからは起動できなくなる. 2.2.1.3.3 デバイスの扱い 外部記憶装置に対するデータの読み書きを行う場合に, ファイル・システム に依存せず, 統一的な方法で入出力が行える必要がある. すなわち, プログラムを書く場合, 読み書きする データがどのようなファイル・システム上にあるかによらず, 同じ方法で読み書きが出来る必要がある. 近年の OS では, デバイス・ファイル (device file) という概念があり, ファイル・システムごとに適切 なデバイス・ファイルを設定することにより, 外部記憶装置への入出力をデバイス・ファイルへの入出力と いう形で扱うことができ, ファイル・システムに依存する部分は極力デバイス・ファイルとデバイス・ドラ イバに吸収する構成をとっている. カーネルから周辺装置にアクセスするに は, デバイス・ドライバの仕様がわかっ カーネル デバイス・ドライバ 周辺装置コントローラ ファーム・ウェア 周辺装置 2.2.1.4 ていれば十分である. コントローラの仕 様がわかっていればデバイス・ドライバ を記述することが出来る. シェル 入力装置(仮想的な入力デバイスを含む)から入力された, ジョブの実行要求をコマンド (command) と呼ぶ. シェル (shell) とは, コマンドを解釈し, カーネルに対してタスクの実行を要求するコマンド・イ ンタプリタ (command interpreter) である. 簡単に言えば, ユーザが入力装置から入力した命令を, シェ ルで定義された文法にしたがって解釈し, コマンド実行をカーネルに伝えるソフトウェアのことである. こ のようなコマンド・インタプリタのうち, キーボードからの入力を利用するものをシェルと呼ぶ. 通常ユーザが対話的 (interactive) にコマンドを入力し, それに対する応答を表示する. シェルにはコマ ンドを解釈するための文法があり, ユーザはその文法にしたがってコマンド実行を要求しなければならな い. 一方, シェルに定められた文法にしたがって, コマンド列を記述したファイルを用意し(シェル・スク リプト (shell script) と呼ぶ), スクリプトをあたかも実行できるプログラムであるかのようにして, ジョ ブの実行を要求することが出来る. このような利用法を非対話モード (non-interactive mode) と呼ぶ. (バッチモード (batch mode) と呼ぶことも多い.) Example 2.2.6 UNIX に標準的に用意されたシェルとしては, Boune shell (通常 sh というコマンド. 単に “Shell” と書いたら, UNIX の世界では Boune shell を指す. B-shell とも言う. ), C shell (通常 csh というコマンド)がある. 現在ではこれらを拡張した bash, tcsh 等が使われることが多い. MS-DOS のコマンド・インタープリタは command.com であった. MacOS にはこのような対話型コマン ド・インタープリタは標準的には存在しない. 2.2.1.4.1 標準入出力 シェルを利用する場合にユーザが標準的に利用する入力デバイスや出力デバイス は, シェルから見たとき仮想的なファイルとして扱われる. それらをそれぞれ, 標準入力 (standard input), 標準出力 (standard output) と呼ぶ. 簡単に言えば, シェルを使っているときにキーボードからの入力は シェルには標準入力からの入力と扱われ, シェルは標準出力への出力をディスプレイに表示する. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 31 また, 第2の出力として, 標準エラー出力 (standard error output) と呼ばれるものがシェルに定義さ れていることが多い. これは, 通常のコマンド出力とコマンドからのエラーを出力する先を論理的に区別す るために用意されている. 通常は標準エラー出力はディスプレイに結合されている. これら(エラー出力を含む)標準入出力はシェル上で実行されるプロセス単位で定義され, シェルは(エ ラー出力を含む)標準入出力これらを他のデバイスやファイルに結合したり, 他のプロセスの標準入出力と 結合させたりすることが出来る. これらをそれぞれ, リダイレクト (redirect), パイプ (pipe) と呼び, シェ ル・スクリプトの実行時に有効に働く. プロセス 標準出力 標準入力 プロセス 標準出力 標準入力 標準入力の切り替え 標準入出力 標準出力の切り替え リダイレクト プロセス 標準入力 プロセス 標準出力 標準入力 標準出力 パイプ 2.2.1.5 コマンド群 正確には OS の一部とはいえないが, OS には各種の基本的なコマンド群が付属している. たとえば, ファ イルのコピーをするコマンド, ファイルの一覧を表示するコマンド等がそうであり, これらのコマンド群は OS の機能とある程度関連している. 広い意味で OS と呼ぶときには, これらのコマンド群まで含めたもの を意味する. Example 2.2.7 MacOS X はカーネルに mach カーネルと呼ばれるものを利用し, コマンド群には BSD のものを利用している. 2.2.1.5.1 デーモン コマンド群の中で, OS の起動時に実行され, OS の稼働中いつも動作しているタイ プのものがある. UNIX ではこれらのコマンド群をデーモン (daemon50 ) と呼ぶ. ネットワークサービス を提供する各種のサーバ・プログラムは, デーモンの形で実行され, ネットワークからのサービスのリクエ ストを監視し, リクエストが発生するとそれに対する処理を実行する. また, UNIX におけるデーモンは, 必ずしもネットワークサービスのデーモンに限らない.51 MacOS などのマルチタスクではない OS では, OS 起動時に読み込まれ, 主記憶内に常時存在するソフ トウェアがあり(常駐型ソフトウェア), これらがデーモンのかわりの役割を果たしている. これらのソフ トウェアは, MacOS では「機能拡張」の形で提供されている. UNIX のデーモンはプロセスの形で実行さ れるため, 必要に応じてプロセスを止めたり殺したりすることが可能であるが, MacOS や Windows など の常駐型ソフトウェアは一旦主記憶内にロードされると, それらを停止する方法は, 一般には提供されてい ない. 2.2.1.5.2 ユーザ・コマンド ユーザ・コマンドとは, OS に関連するコマンド群のうち, 一般ユーザがコ マンドの形で実行可能なものを指し, ファイルのコピー, ファイルの消去, ファイルの一覧表示などのコマ ンドが含まれる. 50 研究社英和中辞典第3版によると, “daemon” とは「ギリシャ神話に登場する神々と人間の間に介在する霊魂」とあり, 人間(ユー ザ)と神(カーネル)の間にあるソフトウェアという意味がある. 決して “demon” (悪魔)ではないことに注意しよう. 51 例えば, ジョブの定時実行を制御する cron など. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 32 2.2.1.5.3 ライブラリ OS が提供するコマンド群に関連するソフトウェアのうち, 最も重要なものがラ イブラリ (library) である. ライブラリを理解するため, 一つの例として, ファイルのコピーやファイルの内容の表示するというコマ ンドの場合を考えてみよう. この場合, 両者のプログラムに共通の操作として, • 「与えられたファイル名を持つファイルの情報を得る」, • 「与えられたファイル名を持つファイルの中身を読み出す」, • (必要ならば)「標準(エラー)出力に対して情報を書きだす」 という操作が含まれる. これら, 多くのコマンド群やアプリケーション・ソフトウェアで共通に使われる部 分を, コマンド群で共通に利用できるように準備しておくと都合が良い. 仮に, 「ファイルの情報を読む」 部分に欠陥があったとしても, コマンド群全体を入れ替えることなく, その部分だけを入れ替えることも可 能になる. このように, 多くのコマンド群で共通に使われる部分や, OS の機能に深く依存する部分を抜き 出して, ソフトウェア作成時に共通に利用できるようにしたものがライブラリである. 上の例の中で, 「ファイルの情報を得る」部分は, ファイル・システムの構造に依存し, OS に深く関わ る部分であるが, 異なった OS 上で同じプログラム・コードを利用するためには, プログラムの記述方法は 同じであっても, 利用するライブラリを取り替えれば, 違う OS で利用できるという構造も与えることがで きる5253 . ライブラリを利用する場合, プログラムを記述する側から見たとき, ライブラリの呼び出し方法 がわかっていれば, その中身を知らなくても機能を実現できるという意味で, ライブラリの呼び出し手段の こと(または, ライブラリそのもの)をアプリケーション・プログラム・インターフェース (Application Program Interface: API54 ) と呼ぶことがある. また, 実際にライブラリを利用する際には, プログラム作成時にライブラリのコードをプログラムに結合 してしまう方法(静的リンク (static link))と, プログラム実行時にライブラリのコードを読み出して実 行する方法(動的リンク (dynamic link))があり, 用途によって使い分けれられている. 今日, UNIX に おける標準的なライブラリ55 は動的リンクが行われる. また, MacOS, Windows などでも動的リンクが使 われ, Windows の DLL とは Dynamic Liking Library の略であり, DLL に欠陥が発生すると, その DLL を利用しているソフトウェア全体に影響がおよぶ. 2.2.1.6 グラフィカル・ユーザ・インターフェース 近年のコンピュータにはグラフィカル・ユーザ・インターフェース (Grafical User Interface, GUI) と呼ばれる, グラフィックスで操作を行う環境が搭載されていることが多い. 本来, GUI は OS の機能とは別個のものであり, ある OS 上に異なった GUI を搭載すること(ただし同 時に複数の GUI を動作させることは困難)や, 共通の GUI を異なった OS 上に搭載させることが可能で ある. 52 このような共通化された手続きの中で, OS の依存する手続きのことをシステム・コール (system call) と呼ぶ. また, このよ うなライブラリ等が「低レベル」とか「高レベル」という表現がとられることがあるが, それらは, 程度が低いとかという意味ではな く, カーネルに近い動作をするものほど「低レベル」であるという表現をする. 53 CPU の主演算レジスタ長がいくら長くても, カーネルやライブラリがその長さの演算をサポートしない構成になっている場合が ある. たとえば, Sun Microsystems の Ultra SPARC II CPU は主演算レジスタ長が 64 ビットだが, その上で動作する OS である Solaris 2.6 は 32 ビット OS である. これは, カーネルおよびライブラリの実装(インプリメンテーション)が 32 ビット長を基本と して書かれていることを意味する. これは, 古い CPU でも OS を動作させるための「下位互換性」のために定められた仕様である. 54 MacOS が MacOS 8 から MacOS 9 に移行する際に, MacOS X への移行を考慮して, API を大幅に変更した. これは, ライ ブラリのコールの手続きを変更したことに相当し, これをやってしまうと, プログラム・コードそのものを大幅に書き直さなくてはな らなくなり, プログラマにとっては大変な作業が発生する. しかし, MacOS X への移行を考えた場合, API の変更は仕方ないところ であろう. なぜなら, Carbon Library と呼ばれる, MacOS のライブラリは, MacOS X のライブラリへのインターフェースの機能 を持ち, Carbon を利用することにより, MacOS 9 で動作させることの出来るアプリケーションを, (9 と X では OS の性質その ものが完全に異なっているにも関わらず), なんの変更もなしに MacOS X で動作させることが可能になっている. 55 標準ライブラリに何が含まれるかは, 後程解説する. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 33 Example 2.2.8 MacOS (MacOS 9 以前)の GUI や Windows 95/98 の GUI は, OS から独立させる ことが出来ない. しかし, UNIX の X11 Window system や, X11 ライブラリを利用した CDE (Common Desktop Environment) は, X11 のシステムを構築できる環境さえあれば, どのような OS 上でも動作させ ることが可能である56 . また, Windows 3.1 以前の Microsoft Windows は MS-DOS 上に GUI を提供す る環境であった. MacOS X の GUI “Aqua” は Aqua Desktop Environment と, Aqua への API である Quatz とに分離されていて, X11 を Quatz 上に実装できるなど, OS と GUI との分離が考慮されている. 一般に GUI は大量の主記憶を利用するため, よほど慎重に記述しないと, 動作が安定しない. また, X端末 のような, ネットワーク上の他のホストを利用するための GUI 専用ホスト等も存在するが, そのようなホ スト上では GUI を動作させるために必要な最小限の機能を持った OS (と言うよりもカーネル, デバイス ドライバ, ライブラリの集まり)が動作し, それ上で GUI が動作している. この場合には, GUI を動作さ せるための記憶領域は GUI が動作しているホスト上のものを利用する. なお, GUI は本来 OS の機能とは無関係のものであり, 異なった OS の上でも同じ GUI を動作させるこ とが可能であり, 逆に同じ OS の上に異なった GUI を動作させることも可能である. 2.2.2 2.2.2.1 コンピュータの起動とプログラムの実行 コンピュータの起動 ここでは, これまでに解説したハードウェアとソフトウェアの知識を元に, コンピュータがどのように起 動されるかを見ていこう. 基本的には, UNIX ワークステーションやパーソナル・コンピュータの起動の方 法だが, その他のコンピュータであってもそれほど変るものではない. 以下の起動手順はブート (boot) と呼ばれ, 起動の手順が各種の装置を順に検索して行われる. 電源の投入 コンピュータに電源が投入されると, マザー・ボード上の BIOS にある起動プログラムが実 行される. 起動プログラムは, 拡張バスを含めた周辺装置を検索し, 周辺装置のチェックを行う. この段階で周辺装置に欠陥があることがわかると, 起動プログラムの実行が停止してしまう. MacOS で はこの状態になると, 警告音がならされる. 起動メディアの検出 次に, BIOS にはマザー・ボード上に実装されている, 起動可能な周辺装置のリスト と, バス上で検出された起動可能デバイスのファームウェアから得た起動可能な周辺装置のリストから, そ の優先順位にしたがって, 周辺装置に起動可能メディアが存在するかどうかを検索する. 具体的には, バス 上にある拡張ボードに接続されたものを含めたハードディスク, フロッピーディスク, CD-ROM 等が起動 可能メディアとして選択される. BIOS は優先順位にしたがって起動メディアを検索するが, 起動メディアを検出できないと, 一般には “no boot media” などのメッセージを表示して起動が停止する. MacOS では “?” の顔をした Mac があらわれ る状態である. また, 近年のコンピュータでは, ネットワーク上に存在する他のホストから起動を行うことが出来る(ネッ トワーク・ブート)が, その場合には, まずネットワークの初期化を行ってから, ネットワーク上の起動メ ディアの検出を行う. IPL の読み出しとカーネルのロード 起動可能メディアを検出すると, 一般にはメディアの最内周にある起 動プログラムが呼び出される. この起動プログラムは Initial Programing Loader (IPL) または, boot loader と呼ばれることがある. IPL にはそのメディアのどのセクタに初期ソフトウェアがあるかが書かれ 56 実際には X11 は UNIX を前提に書かれているので, そのほかの OS で動作させることは困難. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 34 ていて, IPL を読んだ後にその初期ソフトウェアが実行され, 初期ソフトウェアが OS のカーネルを適切な メディアから読み出して, カーネルが実行される. もし, 初期ソフトウェアが破壊されているなどの致命的な欠陥が発生していると, 何らかのメッセージを 表示して起動手続きが停止する. MacOS では “泣き顔の Mac” があらわれる状態である. カーネルの実行 カーネルは内蔵するデバイス・ドライバを用いて, デバイス・ドライバに対応するデバイ スの検出を行った後, 指定された方法で, 各種のデーモン(またはそれに相当するモジュール)を実行し, OS が正常に起動する. この段階でモジュールの読み出しに問題が生じると, UNIX ではそのデーモンの実行をあきらめるだけ になるが, MacOS ではモジュールの性質・状態によって, 起動手続きが停止したりすることがある. また, Windows で “safe mode” を要求される状態とは, このようなモジュールの読み出しに失敗した場合である. このような場合, UNIX 等では “single user mode” と呼ばれる状態, MacOS では「すべての機能拡張」を はずした状態, Windows では “safe mode” で起動し, それらのモジュールに対して適切な方法で修復を行 えば, 正常に起動できることが多い. (それでも正常に起動できない場合には, BIOS (Mac では PRAM) を初期化することにより, 正常に起動できるようになることが多い.) 2.2.2.2 プログラムの実行 OS が正常に起動すると, 各種のコマンドやアプリケーション・ソフトウェアを実行できる状態になる. ユーザがプログラムの実行を指示すると, カーネルはプログラムを主記憶上に配置し, そのプログラムが利 用する主記憶領域を確保してから, プログラムの先頭(プログラム・エントリ・ポイント)に CPU 内のプ ログラム・カウンタを移動することにより, プログラムの実行が始まる. プログラム内で利用される主記憶 領域の大きさはプログラムの先頭に指定されたヘッダに記述されていて, それに相当するだけの領域をその プロセスが利用できるようにカーネルから許可が出される. もしも, それ以外の領域にアクセスが行われる と, いわゆる主記憶の排他制御に違反し, カーネルから致命的なエラー (fatal runtime error) であると いう割り込み (interrupt) を受け, プロセスの実行が停止する57 . また, プログラムはそのときの状態に応 じてカーネルに対して主記憶の追加割り当てを受けることが出来るが, 追加割り当て部分の処理が不当に なると, メモリー・リーク (memory leak) という状態になり, ユーザからのコントロールを失うことがあ る. そのような場合にもプロセスは停止せずに実行状態になっていることがあるが, この場合には, ユーザ はプロセスに停止命令58 を出すことにより, プロセスを停止させなければならない. 2.2.2.3 コンピュータの停止 OS の正常実行中には, 各種のデーモンが稼働している. したがって, OS を正常に終了する, すなわちコ ンピュータを停止させるためには, いきなり電源を切ってはならない. 特に UNIX の場合, ディスク書き込 みの効率をあげるため, ディスクに書き込み要求が行われたデータは, 即座にディスクに書き込まれるので はなく, 一旦「キャッシュ・メモリ」と呼ばれる部分にデータが蓄えられ, キャッシュがいっぱいになるた びにディスクに一度に書き込みを行っている. そのため, いきなり電源を停止すると, データが途中まで書 き込まれた状態となり, ディスクの整合性(アロケーション・テーブルの整合性)が失われることがある. 最悪の場合, データの読み出しが出来なくなることがある. OS を停止するには OS に定められた手順で終了手続きを行わなくてはならない. 57 MacOS では「タイプ1のエラー」または「タイプ2のエラー」などがこれに相当する. 他の実行時エラーも, いくつかは主記憶 制御に関する致命的エラーのものがある. 58 UNIX では, そのプロセスにシグナルを送れば良い. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 2.3 2.3.1 35 コンピュータにおけるデータ表現 データの表現と演算 多くのコンピュータでは, その内部でのデータは2進数によって表現されている59 . しかしながら, 2進 数ではその表現が冗長になるので, 16進数で書くことが多い. 2進数1桁の情報を1ビット (bit) と呼び, 8ビットを1バイト (byte) と呼ぶ60 . 1バイトの情報は明 らかに2桁の16進数で表現できる. また, その計算機内部において自然な長さのバイトの単位を1ワード (word) と呼ぶことがある61 . 例えば, 16ビットが自然な長さ(標準的な演算レジスタ長)である計算機 においては, 1ワードは2バイトである. コンピュータ内部ではすべての情報はビット単位, バイト単位もしくはワード単位で処理される. すなわ ち, コンピュータ内部では, すべての数値, 文字等は2進数で表現され, バイト単位でメモリ, レジスタ等に 格納され, 計算が実行される. はじめにコンピュータ内部でビット単位で行なわれる演算のもっとも基本的なものを確認しておこう. ビット単位のデータとは, 0 または 1 で表現されるデータであり, これらに対する基本演算には, AND, OR, NOT, XOR がある. AND とは論理積と呼ばれる2項演算であり, 次の演算規則を持つ. AND 0 1 0 0 0 1 0 1 この表の横に書いてある記号はデジタル回路で AND を行う素子の記号であり, 左から2つの 0/1 入力が 与えられたとき, 右に2つの入力の AND を出力する. OR とは論理和と呼ばれる2項演算であり, 次の演算規則を持つ. OR 0 1 0 0 1 1 1 1 NOT とは否定と呼ばれる単項演算であり, 次の演算規則を持つ. NOT 0 1 1 0 0 の NOT は 1, 1 の NOT は 0 である. すなわち, ビット反転のことである. XOR とは 排他的論理和 (exclusive or) と呼ばれる2項演算であり, 次の演算規則を持つ. XOR 0 1 0 0 1 1 1 0 これは, EOR と書かれることもある. また, XOR の素子は次の回路と等価である. 59 データが2進数で表現される理由は, デジタル回路におけるチップ内部の状態が −12V と +5V という2状態をとるからであ る. 世の中には変なチップもあるもので, 内部状態が4ビットになっているチップも存在していたようだ. そのようなチップでコン ピュータを構成すると, 当然内部データは4進数で表現されることになる. 60 1バイトのビット数は, その計算機の “自然” な長さと定義されている. 我々が通常目にする計算機は(大型計算機を除くと) 1 byte = 8 bits である. 61 正確には, (多分)次のような定義と考えられる. 1バイトとは, CPU が直接メモリにアクセスできる最小の単位のことであり, 1ワードとは, 標準的な演算レジスタの長さである. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 36 Exercise 2.3.1 上の論理回路が XOR を表すことを確かめなさい. これらの論理演算を数学的に見れば, 以下のように理解することが出来る. はじめに, AND, OR, NOT を 集合の特性関数の言葉で表現してみよう. 集合 A の特性関数 χA とは, χA (x) = 1 x ∈ A, 0 x ∈ A で定義される関数である. • AND の規則は, 集合 A, B に対して, χA∩B (x) = χA (x)χB (x) を与える演算に等しい. • OR の規則は, 集合 A, B に対して, χA∪B (x) = χA (x) + χB (x) − χA∩B (x) を与える演算に等しい. • NOT の規則は, 集合 A に対して, χAc (x) = 1 − χA (x) を与える演算に等しい. ここで, Ac は A の 補集合を表す. また, XOR の規則は, 各ビットの値を Z2 の元と見た時に, Z2 での和を与える演算に等しい. コンピュータにおけるすべての演算は, 遡っていくと, 各ビットの論理演算から生成されている. Exercise 2.3.2 排他的論理和には次のような性質がある: n ビットの情報 {ai }ni=1 のすべての XOR をとった値を a0 とする. この時, いずれか一つの ak , k = 1, · · · , n の値が失われたとき, a0 と失われていない {ai } たちの値を利用して, ak の値を復元することが できる. 失われた情報を復元するための方法を考え, それが元の値を復元していることを証明せよ. このように, データのすべてのビットの XOR をとった値をそのデータのパリティ(parity) と呼び, その ビットをパリティ・ビット (parity bit) と呼ぶ. また, パリティ・ビットのような, 冗長な(余分な)デー タを付け加えて, データの一部が失われても, 元のデータを復元できるようにすることを誤り訂正と呼ぶ. Remark 2.3.3 上で示した AND, OR, NOT の論理素子を半導体素子を用いて実現するには, 以下のような回路を 構成すれば良い. +V +V A not A B A A or B A and B B AND OR A NOT ただし, これらの回路は正論理で動作する. 正論理とは, 電位が低い状態を 0, 電位が高い状態を 1 とみなすものであ る. それに対して, 電位が高い状態を 0 と考える回路を負論理と呼ぶ. AND, OR 回路はダイオードだけで構成しているので, 出力部分にトランジスタをつけて増幅しなければ, 多段に繋 ぐことはできない. そのため, 今日では論理回路はトランジスタを用いて構成されている. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 2.3.2 37 コンピュータ内部での数値の表現 コンピュータ内部で表現される数には(一般に) 「整数」(integer) と「浮動小数点数」(floating point number) の2種類が存在し62 , それぞれに対して異なった演算規則を用いるのが普通である. 各種の文字 なども「整数」として認識されているため, コンピュータ内部の演算ルーチンのうち「整数」に対するもの が最も基本的となる. 2.3.2.1 整数の内部表現 コンピュータ内部において, 「整数」を表すためのデータ構造を考えてみよう. データを格納する領域は, 演算レジスタの長さに依存するのは明らかであるが, ここでは1バイトで表現される「整数」の内部表現を 考える. 以下では 1 byte = M bits と仮定しよう. 以下では「整数」として, 符号を持つものと符号なしのものの2通りを考えるが, 容易にわかるように, どちらと考えてもその演算回路は一致する. 2.3.2.1.1 符号を持つ整数の表現 符号を持つ整数の表現方法は, 簡単に思いつくのは次の2通りが考え k られる. はじめに, n を −2 + 1 ≤ n ≤ 2k − 1 を満たす任意の整数とする. すると, n は n = (−1)bk k−1 bi 2i i=0 と一意に書けるので, ここで現れる bi を並べて, k + 1 桁の2進数 bk bk−1 · · · b1 b0 と書く. ここで, M = 8 と仮定すると, −127 ≤ n ≤ 127 であるので, 0 ≤ k ≤ 7 である. ここで, 最上位ビット (Most Significant Bit: MSB) は, n ≥ 0 の時は 0 であり, n < 0 の時には 1 と なる. このように用いられるビットのことを符号ビット (sigunature bit) と呼ぶ. これに対して, もう一つの方法は, 2の補数による表現63 であり, −2k ≤ n ≤ 2k − 1 であるような整数 n に対して, n = −2k bk + k−1 bi 2i i=0 で表される. この表現によると, 0 = (0000 0000)2 127 = (0111 1111)2 −1 = (1111 1111)2 −128 = (1000 0000)2 となる. このことより, 負の数を, 2の補数で表現すると, 最上位ビットは必ず 1 になる. この表現による と, 負の数を含む加算が, 単なる加算として計算できることがわかる. すなわち, 次に述べる符号なしの整 数の演算と同一の回路で演算回路を実現することができる. このようにして, 整数を表現しておくと, N バイト( = N M ビット)の記憶領域では −2N M−1 ≤ n ≤ 2N M−1 − 1 の範囲の数を表現できることがわかる. 62 それぞれが通常の「整数」と「実数」に対応している. 63 2の補数は, 各ビットを反転して(1の補数をとって) 1 を加えたものに等しい. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 38 2.3.2.1.2 符号なしの整数 コンピュータ内部では, 0または正の整数のみを用いて演算を行う方が都合 が良いことがある. そのような整数を符号なしの整数と呼ぶ. 符号無しの型は, 2進数展開で表現されてい るのが普通である. したがって, N バイトの記憶領域では, 0 ≤ n ≤ 2MN − 1 の範囲の数を表現できることがわかる. 2.3.2.1.3 整数の演算と論理回路 整数の加算を論理演算を利用して表現してみよう. 2進数で表現され た数の加算を行う準備として, 1ビットの数値 a と b からその加算の結果の下位ビット s と, 繰り上がり (carry) c を求めることを考えてみよう. すなわち, 以下の表に挙げる演算を実現することを考える. a b s c 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1 この表から, a と b から s, c を得るためには, s = a XOR b, c = a AND b とすれば良いことがわかる. したがって, これを論理回路で表現すれば以下のようになる. a c = a AND b s = a XOR b b この2入力2出力をもつ回路を半加算器 (half adder) とよぶ. さて, 実際に加算を実現するには半加算器では不十分である. なぜなら, 多ビットの加算を行う際の各ビッ トの加算では, 下位ビットからの繰り上がりが存在する. すなわち, 実際の多ビットの加算の各ビットでの 演算は, 各ビットの2つの値 a, b と下位ビットからの繰り上がり c を入力に持ち, その結果 s と繰り上が り c を出力する, 以下のような3入力2出力の回路を構成する必要がある. a b c s c 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 1 1 演算の意味から, s = a XOR b XOR c, であることは明らかであり, c = 1 となる条件は, a と b の和の繰り上がりがあるか, a と b の加算結果と c との和で繰り上がりがあるかのいずれかであるので, 求めるべき論理回路は software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 39 c = a AND b a b c = (a AND b) OR ((a XOR b) AND c) half adder s = a XOR b (a XOR b) AND c half adder c s = a XOR b XOR c a XOR b XOR c となる. この3入力2出力の回路を全加算器 (full adder) と呼ぶ. 特に全加算器の下からの繰り上がり c0 , 入力 a0 , b0 に対して, その出力 s1 , 上への繰り上がり c1 は, s1 = a 0 ⊕ b 0 ⊕ c0 c1 = (a0 · b0 ) + ((a0 ⊕ b0 ) · c0 ) = a 0 · b 0 + a 0 · c0 + b 0 · c0 と書ける. ここで, a XOR b = a ⊕ b, a AND b = a · b, a OR b = a + b と表現した. 全加算器を利用すると, 加算回路を構成することができ, 例えば4ビットの加算器は以下のような回路構 成となる. a3 b3 c a2 3 b2 c a1 2 b1 c a0 1 b0 c = 0 0 full adder full adder full adder full adder ? c4 s3 s2 s1 s0 次に, 負の整数の表現として2の補数が用いられているときに, 減算を論理回路を用いて表してみよう. そのためには, まず次の補題を証明する必要がある. Lemma 2.3.4 正の数 x のすべてのビットを反転させた数(これを1の補数と呼ぶ)を x とする. この 時, x の N 桁の2の補数 x̃ を x̃ = 2N − x と定義すると, x̃ = x + 1 が成り立つ. N −1 N −1 (Proof) 正の数 x が x = k=0 ak 2k であるとき, その1の補数は x = k=0 ak 2k , ただし ak + ak = 1 と書くことができる. この時, x+x+1= N −1 (ak + ak )2k + 1 k=0 = N −1 2k + 1 = 2N k=0 が成り立つ. すなわち, x + 1 = 2N − x = x̃ となる. ここで, 負の整数の表現と2の補数との関係をみておこう. Lemma 2.3.5 負の整数 −x の N ビットの2の補数による表現は, x の2進 N 桁の2の補数 x̃ のビッ ト列のならびに等しい. すなわち, x̃ のビット列を (x̃N −1 x̃N −2 . . . x̃0 ), x のビット列を (xN −1 xN −2 . . . x0 ) (ただし, x̃N −1 = 1, xN −1 = 0 である.)とするとき, −2N −1 + N −2 k=0 x̃k 2k = − N −2 xk 2k = −x k=0 が成り立つ. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 40 (Proof) これを示すためには, N −2 (x̃k + xk )2k = 2N −1 k=0 を示せばよい. いま, x の1の補数 x は x̃ = x + 1, N −1 N −1 k=0 k=0 (xk + xk )2k = 2k = 2N − 1 をみたしている. そこで, xN −1 = 0, x̃N −1 = 1 に注意すれば, N −2 (x̃k + xk )2k = N −1 k=0 = xk 2k + k=0 k=0 N −1 N −1 xk 2k + k=0 = N −1 xk + 1 − x̃N −1 2N −1 xk + 1 − 2N −1 k=0 N −1 (xk + xk )2k − (2N −1 − 1) k=0 = 2N − 2N −1 = 2N −1 が成り立つ. 以上により, 負の整数を2の補数で表現することの妥当性が証明できた. 2の補数を用いることは, 減算の 方法が容易になるという利点がある. Lemma 2.3.6 2進整数 x, y に対して, x − y = x + ỹ が 2N を法として成り立つ. (Proof) いま, 正の整数 y の2の補数 ỹ とは, y + ỹ = 2N をみたす正の整数のことである. したがって, x − y = x + ỹ − 2N が成り立つ. この結果から, 次の定理を得ることができる. Theorem 2.3.7 2進整数 x, y の減算 x − y は, x + y + 1 に 2N を法として等しい. すなわち, 2の補数を用いれば, 減算は加算として実現することができ, 2の補数は1の補数から容易に計 算可能である. よって, 加算回路を少しだけ改良することによって, 加減算の両方に適用できる回路を構成 できる. 例えば, 4ビットの加減算回路は以下のようにして実現できる. a3 b3 c a2 3 b2 c a1 2 b1 c a0 1 full adder full adder full adder ? c4 s3 s2 s1 b0 c = 0 0 減算の制御線 full adder s0 ただし, 「減算の制御線」は減算を行うときに 1, 加算を行うときに 0 となる信号線であり, 制御線との交 わりの部分には, 次のような素子をおく. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 41 c b 0 1 s この素子はマルチプレクサ (multiplexer) と呼ばれ, 制御線 c = 0 の時, b の値を出力し, c = 1 の時 NOT b を出力する. 実際の CPU では, マルチプレクサを利用して, ビットごとの AND, OR もできる演算回路が搭載されてい る. この加算器を基本とした演算回路を算術論理演算ユニット (Arithmetic Logic Unit, ALU) と呼ぶ. ALU の構成として, このままの回路を用いると, 実際の計算に多くの時間がかかってしまう. 例えば, 3 2ビット ALU の場合, 加算を行うためには, 1段の全加算器の動作時間の32倍の時間を要する. なぜな ら, 各桁の全加算器が動作するには, 下の桁からの繰り上がりの値を必要としているため, 下の桁の全加算 器の動作が終了してから, はじめてその桁の全加算器が動作する. このようなタイプの全加算器を順次桁あ げ加算器 (ripple carry adder) と呼ぶ. このような欠点を補うために, 桁上げの先見とよばれる手段を用いることができる. いま, 桁上がり部分 がどのように計算されているかをみてみると, ci+1 = ai · bi + (ai + bi ) · ci となっていることがわかる. そこで, g i = ai · b i p i = ai + b i と書くと, ci+1 = gi + ci · pi ci+2 = gi+1 + ci+1 · pi+1 = gi+1 + (gi + ci · pi ) · pi+1 = gi+1 + gi · pi+1 + ci · pi · pi+1 となる. つまり, gi = 1 ならば, 下からの繰り上がり ci の値に関係なく ci+1 = 1 となり, (すなわち, gi = ai · bi は繰り上がりの生成子 (generator) である.)gi = 0, pi = 1 の時には ci+1 = ci となる. (すな わち, pi = ai + bi は繰り上がりを伝搬する作用 (propergator) を持つ.) これを4ビット加算器で具体的に書けば, c1 = g 0 + p 0 · c0 c2 = g 1 + p 1 · g 0 + p 0 · p 1 · c0 c3 = g 2 + p 2 · g 1 + p 1 · p 2 · g 1 + p 0 · p 1 · p 2 · c0 c4 = g 3 + p 3 · g 2 + p 2 · p 3 · g 1 + p 1 · p 2 · p 3 · g 0 + p 0 · p 1 · p 2 · p 3 · c0 となる. したがって, 入力信号が g1 = a1 · b1 = 1 を満たすならば, c0 , c1 の値に依らず c2 = 1 であること がわかる. これを桁上げの先見 (carry-lookahead) とよぶ. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 42 このような桁上げの先見の機構を持った4ビット加算器を4つ組み合わせることによって, 16ビット加 算器を構成することが可能になる. 実際, P0 = p0 · p1 · p2 · p3 P1 = p4 · p5 · p6 · p7 P2 = p8 · p9 · p10 · p11 P3 = p12 · p13 · p14 · p15 G0 = g3 + p3 · g2 + p3 · p2 · g1 + p3 · p2 · p1 · g0 G1 = g7 + p7 · g6 + p7 · p6 · g5 + p7 · p6 · p5 · g4 G2 = g11 + p11 · g10 + p11 · p10 · g9 + p11 · p10 · p9 · g8 G3 = g15 + p15 · g14 + p15 · p14 · g13 + p15 · p14 · p13 · g12 とすれば, 4ビット加算器からの繰り上がり C1 , C2 , C3 , C4 は, C1 = G0 + P1 · c0 C2 = G1 + P1 · G0 + P0 · P1 · c0 C3 = G2 + P2 · G1 + P1 · P2 · G1 + P0 · P1 · P2 · c0 C4 = G3 + P3 · G2 + P2 · P3 · G1 + P1 · P2 · P3 · G0 + P0 · P1 · P2 · P3 · c0 となり, 4ビット加算器の桁上げ先見機構と同一の式を得ることができる. Example 2.3.8 16ビット加算器において, 順次桁上げ機構を用いたときのゲート遅延を計算してみよ う. 1ビット加算器では, c1 = a 0 · b 0 + a 0 · c0 + b 0 · c0 より, 桁上げ c を得るために通過する素子の数は2である. したがって, 順次桁上げ機構を用いると, 16 段の加算器を経由するため, 桁上がり c16 を求めるためには, 32段のゲート遅延が発生する. Example 2.3.9 桁上げ先見機構をもつ16ビット加算器で c16 を求めるためのゲート遅延を計算してみ よう. これは, C4 を求めることになるが, C4 は, いくつかの AND の OR で求めることができるので, 2 段のゲートを通過する. また, C4 にあらわれる Gi も2段のゲートにより求めることができ, Pi は1段の ゲートで求めることができる. したがって, c16 = C4 を求めるためには 2 + 2 + 1 = 5 段のゲート遅延が発 生する. これら2つの例により, 桁上げ先見機構を用いる加算器の方が 32/5 倍程度高速に動作する可能性がある. 2.3.2.1.4 整数の加算 計算機内部における整数演算は, 本質的には上で述べたような論理回路によって 実現されている. このような整数演算がどのような特徴を持つのかを調べてみよう. ここでは, 簡単のため 8ビット整数を考え, 負の数を考える場合には8ビットの2の補数で負の数を表すと仮定する. 2.3.2.1.4.1 符号なし整数の加算 8ビット符号なし整数は, 明らかに 0 ≤ n ≤ 255 の範囲の数を表す. ここでは n + m の演算結果が 255 を越えた場合にどのような処理が行われるかを考えてみよう. Example 2.3.10 n = 255, m = 1 としたとき, n + m を計算する. 8ビット整数では, n = (255)10 = (1111 1111)2, m = (001)10 = (0000 0001)2, software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 43 と表現されている. この時, 加算回路の演算によって, n + m = (256)10 = (1 0000 0000)2 となるが, 8ビット演算であるので, 最上位ビットの繰り上がりは無視64 され, n + m = (0)10 = (0000 0000)2 として値が格納される. Example 2.3.11 n = 255, m = 2 としたとき, n + m を計算する. 8ビット整数では, n = (255)10 = (1111 1111)2, m = (002)10 = (0000 0010)2, と表現されている. この時, 加算回路の演算によって, n + m = (257)10 = (1 0000 0001)2 は, 最上位ビットが無視され, n + m = (1)10 = (0000 0001)2 として値が格納される. これらの例からわかる通り, 8ビット符号なし整数の加算は, 28 を法とした演算が行われる. 一般に n ビッ ト符号なし整数の演算は 2n を法とした演算が行われると考えて差し支えない. 2.3.2.1.4.2 符号つき整数の加算 8ビット符号つき整数は, 負の数を2の補数で表す場合, −128 ≤ n ≤ 127 の範囲の数を表す. ここでは, 正の数 n, m に対して n + m の演算結果が 127 を越えた場合にどのよ うな処理が行われるかを考えてみよう. Example 2.3.12 n = 127, m = 1 としたとき, n + m を計算する. 8ビット整数では, n = (127)10 = (0111 1111)2, m = (001)10 = (0000 0001)2, と表現されている. この時, 加算回路の演算によって, n + m = (1 0000 0000)2 となる. このビット表現に対応する数は, 符号付き整数においては (−128)10 である. したがって, 127 + 1 = −128 という演算結果となる. この例からもわかる通り, 符号付き整数では, その格納範囲を越えた場合の演算は, ビット表現が符号なし 整数の加算に従い, その表現に対応する数が得られると考えて良い. Remark 2.3.13 上の例と演算回路の構成を考え合せれば, CPU 内部の演算のレベルでは, 整数が符号な しか符号付きかは関係がないことに注意しよう. すなわち, ビット表現に対応してどのような数として理解 するかは, CPU の問題ではなく, プログラム言語レベルの問題である. 64 多くの CPU では, 加算回路で最上位ビットの繰り上がりが発生した場合には, キャリ−フラグ (carry flag) がセットされる. このフラグを監視することにより, 繰り上がりの発生を検出することが出来るが, C言語などの高級言語からはキャリーフラグを見る ことはできない. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 44 2.3.2.1.5 整数の乗算 整数の加算回路を用いると, 整数の乗算を行うことができる. ここでは, 整数の 乗算のアルゴリズムについて簡単に考察しておこう. 以下では, 整数 a, b の積 a × b を計算するアルゴリ ズムを考察するが, a を被乗数, b を乗数とよぶことにする. 2.3.2.1.5.1 正の整数どうしの乗算 2進表現された正の整数どうしの乗算は, 本質的には筆算と同等の 方法で行うことができる. Example 2.3.14 a = (1001)2 = (9)10 , b = (0111)2 = (7)10 とすると, その筆算の様子は以下のように なる. 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 × + + + したがって, a × b = (0011 1111)2 = (63)10 となる. この方法をアルゴリズムとしてまとめてみると, 以下のようになることがわかる. アルゴリズム 2.3.15 (正の整数の乗算) N ビットの正の整数 a, b に対して a × b を求める. 1. 積の値を 0 にする. 2. 乗数の最下位ビットを判定する. 乗数の最下位ビットが 1 ならば, 被乗数を積の値に加える. 3. 被乗数を左に1ビットシフトする. 4. 乗数を右に1ビットシフトする. 5. 繰り返し回数が N 未満ならば, 2 に戻る. そうでなければ終了する. Example 2.3.16 a = (1001)2 = (9)10 , b = (0111)2 = (7)10 の積 a × b を, 乗算のアルゴリズムにそって 計算する. 回数 ステップ 乗数 被乗数 積 0 初期値の設定 0111 0000 1001 0000 0000 1 乗数の最下位ビット = 1, 被乗数を積に加える 0111 0000 1001 0000 1001 被乗数を左にシフト 乗数を右にシフト 0111 0011 0001 0010 0001 0010 0000 0111 0000 0111 乗数の最下位ビット = 1, 被乗数を積に加える 0011 0001 0010 0001 1011 被乗数を左にシフト 乗数を右にシフト 0011 0001 0010 0100 0010 0100 0001 1011 0001 1011 乗数の最下位ビット = 1, 被乗数を積に加える 0001 0010 0100 0011 1111 被乗数を左にシフト 0001 0000 0100 1000 0100 1000 0011 1111 0011 1111 被乗数を左にシフト 0000 0000 0010 0100 1001 0000 0011 1111 0011 1111 乗数を右にシフト 0000 1001 0000 0011 1111 2 3 乗数を右にシフト 4 乗数の最下位ビット = 0 software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 45 このアルゴリズムにより, N ビットの整数同士の乗算は, N ビットの乗数レジスタ, 2N ビットの被乗数レ ジスタと積レジスタ, および, 2N ビットの ALU によって実現することができる. さらに, これを改良する ことにより, N ビットの被乗数レジスタと 2N ビットの積レジスタ, N ビットの ALU で乗算を実現する ことが可能になる. (cf. [7]) 2.3.2.1.5.2 負の整数を含む乗算 負の整数を含む乗算として最も単純な方法は, 先に乗数と被乗数の符 号を調べておき, 正の数になおして乗算を行ってから, 符号をつける方法である. しかしながら, 負の整数 が2の補数の表現を用いていることを使えば, より単純なアルゴリズムを得ることができる. いま, a × b を計算するために, b が2の補数で表されているとしよう. すなわち, b = bN −1 (−2N −1 ) + bN −2 2N −2 + · · · + b0 20 であるとする. この時, a × b = a × (−bN −1 2N −1 + bN −2 2N −2 + · · · + b0 20 ) = a × (bN −2 − bN −1 ) × 2N −1 + a × (bN −2 − bN −1 ) × 2N −1 + a × (bN −3 − bN −2 ) × 2N −2 + ··· + a × (b2 − b1 ) × 21 + a × (b−1 − b0 ) × 20 −1 が成り立つ. ただし, b−1 = 0 とした. すなわち, 被乗数 b のビット列 {bi }N i=0 の代わりに, ビット列 −1 {bi−1 − bi }N i=0 を考えて, 上記の「正の数どうしの乗算アルゴリズム」の 2 を, • ビット列 b−1 − b0 が 1 ならば, 被乗数を積の値に加える. • ビット列 b−1 − b0 が −1 ならば, 被乗数を積の値から引く. • ビット列 b−1 − b0 が 0 ならば, なにもしない. と書き換えれば良い. このアルゴリズムを Booth のアルゴリズムと呼ぶ. Example 2.3.17 a = (1001)2 = (9)10 , b = (1011)2 = (−5)10 の積 a × b を, Booth のアルゴリズムに そって計算する. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 46 回数 ステップ 乗数 被乗数 積 0 初期値の設定 1011 0 0000 1001 0000 0000 1 最下位ビット列 0 − 1 = −1, 被乗数を積から引く 被乗数を左にシフト 1011 0 1011 0 0000 1001 0001 0010 1111 0111 1111 0111 乗数を右にシフト 1101 1 0001 0010 1111 0111 最下位ビット列 1 − 1 = 0, なにもしない 1101 1 0001 0010 1111 0111 被乗数を左にシフト 乗数を右にシフト 1101 1 1110 1 0010 0100 0010 0100 1111 0111 1111 0111 最下位ビット列 1 − 0 = 1, 被乗数を積に加える 1110 1 0010 0100 0001 1011 被乗数を左にシフト 乗数を右にシフト 1110 1 1111 0 0100 1000 0100 1000 0001 1011 0001 1011 最下位ビット列 0 − 1 = −1, 被乗数を積から引く 1111 0 0100 1000 1101 0011 被乗数を左にシフト 1111 0 1111 1 1001 0000 1001 0000 1101 0011 1101 0011 2 3 4 乗数を右にシフト したがって得られる答えは (1101 0011)2 = (−45)10 となる. この例からもわかるように, 乗数は負であるため, 左へのシフトの際には「符号付き」でシフトを行わなけ ればならない. 2.3.2.1.6 整数の除算と剰余 ここでは, 正の数どうしの除算を考えてみよう. 乗算の時と同様に a/b の a を被除数, b を除数と呼ぶ. Example 2.3.18 a = (1000 1100)2 = (140)10 , b = (1100)2 = (12)10 に対して, a/b の商と剰余を求める. 1 1 0 0 1 − 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 − − − この計算によって, a/b の商は (1011)2 = (11)10 , 剰余は (1000)2 = (8)10 であることがわかる. 10進の除算と異なり, 2進の除算では各桁の商として 0 または 1 しかあらわれない. このことから次の ようなアルゴリズムで商と剰余を求めることができる. アルゴリズム 2.3.19 (正の整数の商と剰余を求める) N ビットの正の整数 a, b に対して a/b の商と剰余 を求める. 1. 商の値を 0 にする. 剰余の値に被除数 a を代入する. 除数を N ビット左にシフトする. 2. 剰余から除数 b を引き, 結果を剰余に代入する. 3. 剰余が正または0ならば 3a へ, 剰余が負ならば 3b へ, software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 47 (a) 商を左に1ビットシフトし, 最下位ビットに 1 を設定する. (b) 剰余に除数を加えて値をもとに戻す. 商を左にシフトし, 最下位ビットに 0 を設定する. 4. 除数を右に1ビットシフトする. 5. 繰り返し回数が N + 1 回未満ならば 2 に戻り, そうでなければ終了する. Example 2.3.20 a = (1000 1100)2 = (140)10 , b = (1100)2 = (12)10 に対して, 上のアルゴリズムで a/b の商と剰余を求める. 回数 ステップ 商 除数 剰余 0 初期値の設定 0000 1100 0000 1000 1100 1 剰余から除数を引く 0000 1100 0000 1000 1100 剰余 < 0, 剰余を戻し, 商を左にシフト, 最下位ビットに 0 を入れる 除数を右にシフト 0000 0000 1100 0000 0110 0000 1000 1100 1000 1100 剰余から除数を引く 0000 0110 0000 0010 1100 剰余 ≥ 0, 商を左にシフト, 最下位ビットに 1 を入れる 除数を右にシフト 0001 0001 0110 0000 0011 0000 0010 1100 0010 1100 剰余から除数を引く 0001 0011 0000 1111 1100 剰余 < 0, 剰余を戻し, 商を左にシフト, 最下位ビットに 0 を入れる 除数を右にシフト 0010 0010 0011 0000 0001 1000 0010 1100 0010 1100 剰余から除数を引く 0010 0001 1000 0001 0100 剰余 ≥ 0, 商を左にシフト, 最下位ビットに 1 を入れる 除数を右にシフト 0101 0101 0001 1000 0000 1100 0001 0100 0001 0100 剰余から除数を引く 0101 0000 1100 0000 1000 剰余 ≥ 0, 商を左にシフト, 最下位ビットに 1 を入れる 1011 1011 0000 1100 0000 0110 0000 1000 0000 1000 2 3 4 5 除数を右にシフト ここでアルゴリズムは終了し, 商は (1011)2 = (12)10 , 剰余は (1000)2 = (8)10 となることがわかった. 2.3.2.2 浮動小数点数の内部表現 コンピュータ内部で「実数」に対応する数の表現として, 「浮動小数点数」と呼ばれるものが存在する65 . 2.3.2.2.1 浮動小数点数とは 浮動小数点数 (floating-point number) とは, 底と呼ばれる正の整数 k, 仮数部と呼ばれる数 a, 指数部と呼ばれる整数 を用いて a × k と表現した数のことであり, a は 0 < a < k を満たすようにとられる66 . この表現を k を底とする浮動小数点表示 (floating-point expression) と 呼ぶ. Example 2.3.21 1. 底 k = 10 としたとき, 10進整数 123 を浮動小数点数として表現すると, 1.23 × 102 となる. この 時, 仮数部は a = 1.23, 指数部は = 2 である. 2. 底 k = 10 としたとき, 10進で小数表示された有理数 12.3 を浮動小数点数として表現すると, 1.23 × 101 となる. この時, 仮数部は a = 1.23, 指数部は = 1 である. 65 古くは演算回路を単純にするため, 「固定小数点数」と呼ばれる表現が存在した. 固定小数点数とは, 常に指数部を固定した小数 点表示を行うものである. 66 a = 0 の場合を除く. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 48 3. 底 k = 10 としたとき, 10進で小数表示された有理数 0.123 を浮動小数点数として表現すると, 1.23 × 10−1 となる. この時, 仮数部は a = 1.23, 指数部は = −1 である. 良く知られたように, 任意の実数 x は, 底 k を固定すると, x=± n aj k j + j=0 ∞ ai k −i , 0 ≤ aj < k, 0 ≤ ai < k, an = 0 i=1 と表示することができる. ここで得られた {aj } たちを順に並べることにより, 実数 x の k 進小数表示 ±an an−1 · · · a0 .a−1 a−2 · · · を得ることができる67 . また, 小学校以来親しんできた「有理数の小数表示は有限小数または循環小数であ り, 逆に小数表示が有限小数または循環小数となる実数は有理数である」という事実は, 底 k の取り方によ らない68 . したがって, 底 k を固定すると, 任意の実数 x は (an .an−1 · · · a0 a−1 · · · ) × k −n と浮動小数点表示することができる. Example 2.3.22 1. 10進で小数表示された有理数 0.1 の10進浮動小数点表示は 1.0 × 10−1 であり, 2進浮動小数点 表示は 1.10011001100 · · · × 2−3 である. √ 2. 有理数でない実数 2 の10進浮動小数点表示は 1.4142 · · · × 100 であり, 2進浮動小数点表示は 1.0111 · · · × 20 である. この例からもわかる通り, 浮動小数点表示という概念は, 必ずしも計算機のメモリ内での表現に限ったこと ではない. 2.3.2.2.2 浮動小数点数のメモリ内での表現 しかし, 計算機内部で浮動小数点数を表現しようとしたと き, 仮数部の長さに制限を加え, 指数部を一定の範囲の数に限るという条件を付けない限り, 浮動小数点数 を一定のメモリ量で表すことができない. 以下では, 浮動小数点数を計算機内で表現するために使われて いる方法を解説し, それによる問題点を調べてみよう. ここに述べる方法は IEEE (Institute of Electrical and Electronics’ Engineers) 標準 754 で規定された, 2進浮動小数点数とその演算の規格による69 . IEEE 754 による浮動小数点数には • 単精度浮動小数点数 (single precision binary floating-point number), (32ビット=指数部8ビッ ト, 仮数部23ビット, 符号部1ビット) • 倍精度浮動小数点数 (double precision binary floating-point number), (64ビット=指数部11 ビット, 仮数部52ビット, 符号部1ビット) • 拡張倍精度浮動小数点数 (extended double precision binary floating-point number), (80ビット 以上=指数部15ビット以上, 仮数部63ビット以上, 符号部1ビット) 67 ここで, a a n n−1 · · · a0 が x の整数部分であり, .a−1 a−2 · · · が x の小数部分である. ただし, x が負の場合には, 「整数部分」 という言葉の意味は曖昧である. 68 底 k を取り替えることにより, 有限小数として表示できるかどうかという性質は変わってしまう. 69 IEEE Standard 754 は, この規格が規定される以前に事実上の標準 (de facto standard) となっていたものを整理した規格で ある. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 49 • 4倍精度浮動小数点数 (quadruple precision binary floating-point number), (128ビット=指数 部15ビット, 仮数部112ビット, 符号部1ビット) という4種類が規定されている. ここでは, 単精度浮動小数点数を例にとり, その表現と浮動小数点数の対 応を見てみよう. 単精度浮動小数点数では, 32ビットの幅で2を底とする浮動小数点数を表現する. この時, 32ビット のデータを次のように分解する. S e1 ∼ e7 e8 b1 ∼ b7 b8 ∼ b15 b16 ∼ b23 ここで, S は符号ビットと呼ばれ, 正ならば 0, 負ならば 1 が入る. e1 から e8 は指数部を表し, b1 から b23 が仮数部を表す. この時, 仮数部は (1.b1 b2 · · · b23 )2 = 2 + b1 2−1 + b2 2−1 + · · · + b23 2−23 または, (0.b1 b2 · · · b23 )2 = b1 2−1 + b2 2−1 + · · · + b23 2−23 の形であるとする. 上の形を正規数, 下の形を非正規数と呼ぶ. Remark 2.3.23 無限桁の2進浮動小数点数の体系では, 表示する数が 0 でない限り, その最上位桁は必 ず 1 となる. したがって, 「有効桁」が24桁以上あるときには, 最上位桁に 1 があると仮定すると, 格納 すべき桁を1つ余分にとることが可能になる. 指数部は 2 のベキを表し, 以下のように表現されている. (指数部が 0 でない限り, 正規数を表している.) e1 ∼ e8 2 のベキになる数 FF オーバーフローしたことを示す FE .. . 127 .. . 80 1 7F 0 7E .. . −1 .. . 01 −126 00 この時, 非正規数 すなわち, 指数部は「7F = 127 のバイアス付きの2進整数」で表され, 最大値 F F と最小値 00 は特別な 意味を持っている. さらに, 指数部 0, 仮数部 0 の時には, 符号つきの 0 を表している. このことより, 単精度浮動小数点数 の最大値は, (1.111 · · · 1)2 × 2127 これより大きな数は単精度浮動小数点数では扱えず, オーバーフロー (overflow) と呼ぶ. 絶対値の最小の 0 でない数は, (0.00 · · · 01)2 × 2−126 であることがわかる. これより小さな数は単精度浮動小数点数では扱えず, アンダーフロー (underflow) と呼ぶ. 演算途中や結果がオーバーフローまたはアンダーフローになった場合には, 例外処理 (exception) software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 50 が行われる. 一般に, 例外処理が行われると, その演算結果は保証されない. これらの表示すぐにわかる通 り, 計算機内の浮動小数点数は, その有効桁が高々有限であり, 有効桁数は単精度浮動小数点数の場合, 高々 24桁に過ぎない70 . また, |x| < 2128 の範囲内であっても, 全ての実数を表すことはできない. ここでは, その様子を見るために, 仮数部2桁, 指数部 −1 ≤ e ≤ 1 の2進浮動小数点数で表すことができる数を数直 線上にプロットしてみよう. subnormal e=0 e = −1 e=0 e=1 Underflow e=1 overflow e = −1 overflow - 7/2 = 1.11 × 21 6/2 = 1.10 × 21 5/2 = 1.01 × 21 4/2 = 1.00 × 21 7/4 = 1.11 × 20 6/4 = 1.10 × 20 5/4 = 1.01 × 20 4/4 = 1.00 × 20 7/8 = 1.11 × 2−1 6/8 = 1.10 × 2−1 5/8 = 1.01 × 2−1 4/8 = 1.00 × 2−1 3/8 = 0.11 × 2−1 2/8 = 0.10 × 2−1 1/8 = 0.01 × 2−1 0 = 0.00 −1/8 = −0.01 × 2−1 −2/8 = −0.10 × 2−1 −3/8 = −0.11 × 2−1 −4/8 = −1.00 × 2−1 −5/8 = −1.01 × 2−1 −6/8 = −1.10 × 2−1 −7/8 = −1.11 × 2−1 −4/4 = −1.00 × 20 −5/4 = −1.01 × 20 −6/4 = −1.10 × 20 −7/4 = −1.11 × 20 −4/2 = −1.00 × 21 −5/2 = −1.01 × 21 −6/2 = 1.10 × 21 −7/2 = −1.11 × 21 この浮動小数点数の体系で表現できる数は, 図のなかの黒円で示したものに限られる. ま た, “subnormal” と示した数は, 有効桁が少なくなっていることに注意. したがって, 1/2 + 1/8 = 5/8 と正確に計算することが可能であるが, 1/2 + 1/16 は正確 な計算ができないことがわかる. 次に単精度浮動小数点数の体系で, いくつかの数を2進数の浮動小数点数として表現してみよう. Example 2.3.24 もっとも簡単な浮動小数点数は 0.0 である. 0.0 : S = 0, (ei ) = (0)2 , (bi ) = (0)2 −0.0 : S = 1, (ei ) = (0)2 , (bi ) = (0)2 2.0, 0.5 = 2.0 × 10−1 などは, 次のような表現を持つ. 2.0 : S = 0, (ei ) = (1000 0000)2 = 80H, (bi ) = (0)2 1.0 : S = 0, (ei ) = (0111 1111)2 = 7F H, (bi ) = (0)2 0.5 : S = 0, (ei ) = (0111 1110)2 = 7EH, (bi ) = (0)2 ところが, 0.2, 0.1 は2進数では有限桁では正確に表現できない71 . 0.1 : S = 0, (ei ) = (0111 1011)2 = 7BH, (bi ) = (100 1100 1100 1100 1100 1101)2 0.2 : S = 0, (ei ) = (0111 1100)2 = 7CH, (bi ) = (100 1100 1100 1100 1100 1101)2 したがって, 10 ∗ 0.1 よりも 1.0 の方が精度が高い可能性がある. これらをまとめると, 次のようになる. 70 2進24桁は10進に直すと, わずか7桁程度である. 倍精度浮動小数点数では53ビットの有効桁を持つが, それでも10進で は15∼16桁程度である. 71 ここで, 0.1 の2進浮動小数点表示の仮数部の最後の桁が 1 となっていることに注意して欲しい. 0.1 など, 2進では有限桁では 正確に表現できない数や, 有限小数あっても仮数部の桁が足りない場合には, 丸め (rounding) という操作が行われる. すなわち, 仮 数部の桁に収まるように「切り捨て」, 「切り上げ」, 「四捨五入」のいずれかの操作を行う. 0.1 の2進表現での32桁・33桁めは 01 となっているため, 「切り上げ」または「四捨五入」を行うと, 32桁めが 1 となる. しかし, 「切り捨て」を行うと32桁めは 0 となる. したがって, もし「切り捨て」を行う処理系であれば, 0.1 の2進表現の仮数部 の最後(32桁め)は 0 となる. なお, 最近の CPU の多くは「四捨五入」を行っているようである. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 数値 51 指数部 仮数部 符号 00 0 任意 正規数 00 より大きく FF より小さい 0 でない 任意 (−1)sign ∗ 21−bias ∗ 1.f 非正規数 00 0 でない 任意 (−1)sign ∗ 2−126 ∗ 0.f +INF FF 0 0 正の無限大 −INF FF 0 1 負の無限大 NaN (Not a Number) FF 0 でない 任意 オーバーフロー (符号つきの) 0 意味 値 単精度浮動小数点数 倍精度浮動小数点数 +0.0 00000000 00000000 00000000 −0.0 80000000 80000000 00000000 +1.0 3F800000 3FF00000 00000000 −1.0 BF800000 BFF00000 00000000 +2.0 40000000 40000000 00000000 +3.0 40400000 40080000 00000000 最大正規数 7F7FFFFF 7FEFFFFF FFFFFFFF 正の最小正規数 00800000 00100000 00000000 最大非正規数 007FFFFF 000FFFFF FFFFFFFF 正の最小非正規数 00000001 00000000 00000001 +∞ 7F800000 7FF00000 00000000 −∞ FF800000 FFF00000 00000000 NaN 7Fxxxxxx 7FFxxxxx xxxxxxxx または または xxxxxxxx xxxxxxxx xxxxxxxx この表現を見ると, 仮数部, 指数部がバイト単位で区切られていないため, その演算回路は非常に複雑にな る. そのため, 最近の CPU では浮動小数点演算のためのプロセッサを別に持ったり, 浮動小数点演算は異 なったレジスタを用いて演算を行うなどの工夫がされている72 . なお, IEEE浮動小数点数フォーマットは, 通常, 以下のようになっている. 72 Pentium MMX の “MMX” と呼ばれるユニット, PlayStation2 に搭載された emotion engine などは, 浮動小数点演算を大 量に高速に行うためのユニットである. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 52 Single Real Sign - Exp. M Fraction 31 30 23 22Implied Integer Double Real Sign Sign - 0 Exp. Fraction M 52 51Implied Integer Extended Real 6362 ? Exponential M 7978 6463 Integer 62 0 Fraction 0 Remark 2.3.25 固定小数点数 (fixed-point number) または, 固定小数点表示 (fixed-point expression) とは, 底 k (正の整数)と整数 n を用いて, x=± L aj k n−j , を ± a1 a2 . . . an .an+1 . . . aL j=1 と表する方法である. この時, L のいかんに関わらず, n が固定されている, すなわち小数点の位置が固定 されているのでこのような名前がついている. 一般には n = 0 ととることが多い. 固定小数点表示では, 0 がたくさん並んだり, k n に比較して大きな数や小さな数を表現しようとすると, その有効桁に関わらず, 桁数が非常に大きくなるという欠点を持つ. 2.3.2.2.3 浮動小数点数演算の例 ここでは浮動小数点演算の例として, 10進の 0.1 を何回か加えて, 10進の 0.5 または 1.0 と比較することを考えてみよう. Example 2.3.26 計算内容 (0.1)10 の 5 回加えたものと (0.5)10 を比較する. 浮動小数点精度 単精度浮動小数点 丸め 四捨五入 前の Example から, 単精度浮動小数点数では, (0.1)10 = (1.100 1100 1100 1100 1100 1101)2 × 2−4 , (0.5)10 = (1.000 0000 0000 0000 0000 0000)2 × 2−1 software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 53 となっている73 . さて, (0.1)10 を5回加えるとは, (1.100 1100 1100 1100 1100 1101)2 × 2−4 +(1.100 1100 1100 1100 1100 1101)2 × 2−4 +(1.100 1100 1100 1100 1100 1101)2 × 2−4 +(1.100 1100 1100 1100 1100 1101)2 × 2−4 +(1.100 1100 1100 1100 1100 1101)2 × 2−4 を計算することに他ならない. はじめに, (0.1)10 + (0.1)10 を計算してみよう. 浮動小数点演算では, 仮数部にもう一桁余分な桁(保護桁 (garde digit) を付け加えて演算が行われる. そのため, (0.1)10 + (0.1)10 は次のように計算が行われる: + = 1. 1. 11. 1001 1001 1001 1001 1001 1010 1001 1001 1001 1001 1001 1010 0011 0011 0011 0011 0011 0100 0.1 0.1 0.2 ここで, 下線で示した桁が保護桁であり, 計算結果の最終桁(灰色で示した桁)は, 切り捨てられる桁であ る. したがって, 0.1 + 0.1 の結果は (1.100 1100 1100 1100 1100 1101)2 × 2−3 となり, 確かに (0.2)10 の表現と一致している. 残り4回の和をとってみよう. + = + = → + = + = 1. 1. 11. 1. 100. 100. 1. 110. 1. 1000. 1001 1001 0011 1001 1100 1100 1001 0110 1001 0000 1001 1001 0011 1001 1100 1100 1001 0110 1001 0000 1001 1001 0011 1001 1100 1100 1001 0110 1001 0000 1001 1001 0011 1001 1100 1100 1001 0110 1001 0000 1001 1001 0011 1001 1100 1101 1001 0110 1001 0000 1010 1010 0100 101 111 00 10 10 10 00 0.1 0.1 0.2 0.1 0.3 0.3 0.1 0.4 0.1 0.5 ここで, 0.3 の計算結果は, 保護桁に 1 が出ているので, 「四捨五入」を行っている. この場合は, 確かに 0.1 を5回加えることで 0.5 を得ることができる. 次に, 丸めとして切り捨てを行うとどうなるかを計算してみよう. Example 2.3.27 計算内容 (0.1)10 の 5 回加えたものと (0.5)10 を比較する. 浮動小数点精度 単精度浮動小数点 丸め 切り捨て 切り捨てを行った場合には, (0.1)10 = (1.100 1100 1100 1100 1100 1100)2 × 2−4 となる. この場合に 0.1 の5回の和を求めると, 73 (0.1) 10 の2進浮動小数点表示の最後の桁が 1 となっているが, これは, (0.1)10 を代入する時点で, 仮数部33桁めを「四捨五 入」した結果である. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 54 + = + = + = + = 1. 1. 11. 1. 100. 1. 110. 1. 111. 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1000 1000 0000 100 100 10 00 10 10 0.1 0.1 0.2 0.1 0.3 0.1 0.4 0.1 0.5 となり, 結果は 0.5 とは異っている. 丸めとして「切り上げ」を考えるとは, 丸める桁が 0 でない場合に上の桁に 1 を加える操作であるので, 2 進の場合には「切り上げ」は「四捨五入」と等しい. ここまでで, 0.1 を5回加えるという計算では, 「四捨五入」では結果が 0.5 と等しくなり, 「切り捨て」 では結果が 0.5 と異ることがわかった. それでは, 「四捨五入」の丸めを採用すればいつでもこのような 「正しい」計算ができるのだろうか? Example 2.3.28 計算内容 (0.1)10 の 10 回加えたものと (1.0)10 を比較する. 浮動小数点精度 単精度浮動小数点 丸め 四捨五入 この場合に 0.1 の10回の和を求めると, + = → + = → + = → + = → + = 1000. 1. 1001. 1001. 1. 1011. 1011. 1. 1100. 1100. 1. 1110. 1110. 1. 10000. 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 1010 1001 0011 0100 1001 1101 1110 1001 0111 1000 1001 0001 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0.5 0.1 0.6 0.6 0.1 0.7 0.7 0.1 0.8 0.8 0.1 0.9 0.9 0.1 1.0 となり, 結果は 1.0 を越えた値となる. ここまでの計算では, 保護桁に 1 があらわれた時点で「四捨五入」を行っている. 「四捨五入」が行われ るのは, 演算結果がメモリに格納される時点であり, これらの計算は 0.1 を加えるごとに結果をメモリに格 納していることに他ならない. それでは, 結果をメモリに格納せずに, レジスタ内だけで計算したら正しい結果を得ることができるのだ ろうか? Example 2.3.29 software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 55 計算内容 (0.1)10 をレジスタ内で 5 回加えたものと (0.5)10 を比較する. 浮動小数点精度 単精度浮動小数点 丸め 四捨五入 この場合に 0.1 の5回の和を求めると, + = + = + = + = 1. 1. 11. 1. 100. 1. 110. 1. 111. 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1001 1001 0011 1001 1100 1001 0110 1001 1111 1010 1010 0100 101 111 10 01 10 11 0.1 0.1 0.2 0.1 0.3 0.1 0.4 0.1 0.5 となり, レジスタ内では (0.5)10 とは異る値となる. しかし, この結果をメモリに格納する時点で丸めが行 われ, (0.5)10 と等しい値を得ることができる. ここまでの計算は単精度浮動小数点を用いていた. 精度をあげれば計算結果は正しくなるのだろうか? Example 2.3.30 計算内容 (0.1)10 の 10 回加えたものと (1.0)10 を比較する. 計算は毎回メモリ に格納することによって行う. 浮動小数点精度 倍精度浮動小数点 丸め 四捨五入 倍精度浮動小数点で, 丸めが四捨五入の時, (0.1)10 の仮数部のビットパターンは, 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 となる. この場合に 0.1 の10回の和を求めると, software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 56 + = + = → + = → + = → + = → + = → + = → + = → + = → 1. 1. 11. 1. 100. 100. 1. 110. 110. 1. 111. 1000. 1. 1001. 1001. 1. 1011. 1011. 1. 1100. 1100. 1. 1110. 1110. 1. 10000. 10000. 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1100 1100 1001 0110 0110 1001 1111 0000 1001 1001 1001 1001 0011 0011 1001 1100 1100 1001 0110 0110 1001 0000 0000 1001 1001 0011 1001 1101 1101 1001 0110 0110 1001 1111 0000 1001 1001 1010 1001 0011 0100 1001 1101 1110 1001 0110 1000 1001 0000 0001 1010 0 1010 0 0100 0 1010 0010 010 101 101 110 101 111 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0.1 0.1 0.2 0.1 0.3 0.3 0.1 0.4 0.4 0.1 0.5 0.5 0.1 0.6 0.6 0.1 0.7 0.7 0.1 0.8 0.8 0.1 0.9 0.9 0.1 1.0 1.0 となり, 結果は 1.0 を越える値となる. したがって, 精度をあげたからと言って, 必ずしも「正しい」計算ができるわけではないことがわかる. Remark 2.3.31 Sun Microsystems 社製品 Solaris 2.6 上の gcc 2.95.1 では, C言語内で定数として 0.10 と書くと, 1.00000000000000005551e-1 としてアセンブルされる. また, int main(int argc, char **argv) { double x = 0.10 ; x += 0.10 ; x += 0.10 ; x += 0.10 ; fprintf(stdout, "%f\n", x) ; return 0 ; } というCプログラムコードからは, 1. 最適化を行わない場合(オプション -O0 を使った場合)には, 実際に 0.10 を加え, メモリに格納す る操作を3回繰り返すアセンブラコードが出力され, 2. 最適化を行う場合(オプション -O1 または -O2 を使った場合)には, レジスタ内で 0.10 を3回繰 り返すアセブンラコードが出力される. したがって, 浮動小数点演算の結果は, 最適化によって変わりうることがわかる. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 2.3.3 57 文字の表現 コンピュータ内ですべての文字は文字コード (character code) と呼ばれる整数値を利用して表現さ れる. 2.3.3.1 アスキーコード はじめに, 英数字の代表的な表現方法を考えてみよう. 英数字は(通常) ASCII コード74 と呼ばれる表 現によって符号化されている75 . 英数字の ASCII コードは, 8ビット(実際には7ビット)で表現され, そ れを2桁の16進数で書く. 具体的な ASCII コード表は以下の通りである. 例えば, 以下の表のように表現されている. 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0 NULL DLE SP 0 @ P ‘ p 1 SOH DC1 ! 1 A Q a q 2 STX DC2 " 2 B R b r 3 ETX DC3 # 3 C S c s 4 EOT DC4 $ 4 D T d t 5 ENQ NAK % 5 E U e u 6 ACK SYN & 6 F V f v 7 BEL ETB ’ 7 G W g w 8 BS CAN ( 8 H X h x 9 HT EM ) 9 I Y i y A LF SUB * : J Z j z B VT ESC + ; K [ k { C FF FS , < L \ l | D CR CS - = M ] m } E SO RS . > N ^ n _ F SI US / ? ) _ o DEL ASCII コードで定義された英数字の最上位ビットは必ず 0 である. ASCII コードの 0x20 未満の部分は, ファイル制御のためのコードに指定されている. ASCII コードの特徴は 0 から 9 の数字, A から Z, a か ら z の英字が連続して割り当てられていることにある. 汎用コンピュータ等では, 1バイトが8ビットで あっても ASCII コード以外のコードが使われることがある. たとえば次の EBCDIC コード (Extended Binary Coded Decimal Interchange Code) と呼ばれるのが有名である. 74 ASCII 75 1 とは Americal Standard Code for Information Interchange の略. byte = 8 bits の機械では ASCII コード以外のコード体系が利用されることが多い. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 58 0 1 2 3 4 5 6 SP & - 7 0 NUL DLE DS 1 SOH DC1 SOS 2 STX DC3 FS 3 ETX TM 4 PF RES BYP PN d m u D M U 4 5 HT NL LF RS e n v E N V 5 6 LC BS ETB UC f o w F O W 6 7 DEL IL ESC EOT g p x G P X 7 / SYN 8 9 A B C D E F { } 0 A J 1 a j b k s B K S 2 c l t C L T 3 8 CAN h q y H Q Y 8 9 EM i r z I R Z 9 A SMM CC SM B VT CU1 CU2 C FF IFS D CR IGS ENQ E SO IRS ACK F SI IUS BEL ! : CU3 . $ , # DC4 < * % @ NAK ( ) _ ’ + ; > = ? " SUB | LVM EO Exercise 2.3.32 1バイトの情報で表現できる文字の数はいくつか? 2.3.3.2 日本語文字コード 日本語の文字を表現しようとした時には, 1バイトでは足りないことがわかる. そこで, 日本語などの多 くの文字を表現する場合には, 2バイトを利用して表現する. 日本語の場合, そのコード体系には(基本的 に)3種類ある76 . • EUC 漢字コード. UNIX などで多く使われる. EUC-JP コードと呼ばれる.(8ビット系). • MS 漢字コード (シフト JIS コード) . パーソナルコンピュータで利用されている. (8ビット系) • JIS 漢字コード77 . “ここから日本語”, “ここまで日本語” というコード78 を利用する. (7ビット系). また, JIS 漢字コードは ISO (International Standard Organization) によって, ISO-2022-jp とい うコードとして国際規格になっている. ここで, 8ビット系という意味は, それぞれの文字の各バイトを表現するには8ビットが必要な体系である ことを意味する. 多くのワークステーションの漢字コードは EUC-JP 漢字コードであり, パーソナル・コ ンピュータの漢字コードは MS 漢字コードを用いている. 実際に “あ” という文字は, それぞれのコード系で次のように表現される. 76 日本語コード等に関しては, 「日本語情報処理」 [8] が詳しい. JIS (日本工業規格, Japan Industrial Standard)で定められているのではなく, 他の2つも JIS によって定めら れているが, JIS の規格 X 0208 「7ビット及び8ビットの2バイト情報交換用符号化漢字集合」の最初に出てくる「7ビット」の コードが JIS コードであり, 「8ビット」のコードが EUC-JP コードである. EUC とは Extended Unix Code の略である. 韓 国語文字(ハングル)を利用する UNIX システムで用いられる EUC コード体系 (EUC-KR) など, 他の言語の Extended Unix Code と区別するために EUC-JP と書く. また, MS 漢字コードはこの規格の「附属書1(規定)シフト符号化表現」によって定め られているので, これをシフトJISコードと呼ぶ. 78 このようなコードをエスケープ・シーケンス (escape sequence) と呼ぶ. ISO-2022-jp においては, 日本語の始まり (SI) は ESC-$-B, 日本語の終わり (SO) は ESC-(-B を用いる. また, このようなエスケープ・シーケンスを用いて, 文字状態を変化させる コード体系を状態遷移エンコードと呼ぶ. 77 これだけが software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 59 EUC-JP 漢字コード a4a2 MS 漢字コード 82a0 JIS 漢字コード 2422 しかしながら, 1ワードの情報をどのバイトを先にして(上位にして)表現するかは, CPU によって異 なり, 上位バイトを先にするものを little endian, 逆のものを big endian と呼ぶ. 2.3.3.2.1 ユニコード JIS 漢字コード (ISO-2022-jp) は16ビットの文字体系であり, 日本語で利用 される文字の大部分を含んでいるので, JIS 漢字コード用いたシステム上で日本語文書を作成するだけで あればほとんど問題は生じない79 . 他国語(たとえば韓国語(ハングル文字), 中国語80 やアラビア語等) を表示する際には, そのファイルがどのようなコード体系の元に書かれているかがわかれば, (後述する) フォントを切り替えることにより, それぞれの文字体系で表示することは可能である. しかし, 多国語が混 じったファイルを作成したり, コード体系の指定なしにファイルを交換したりするためには, 世界中のすべ ての文字を含むコード体系が必要と考えられ, そのために開発されたコード体系がユニコード (Unicode) である. 実際にはユニコードとは, コードのエンコーディング (encoding) を指定したコード体系ではなく, 実際 のエンコーディング(すなわち, どの文字にどのようなコードを割り当てるか)を指定したものが, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 などと呼ばれる各種のユニコードのコード体系である.81 このようなユニコードの定義の中にも, 日本語・中国語で使われるすべての文字が定義されているわけで はなく, JIS 漢字コードに定義されているもの以外に, ユニコードで定義されている日本語文字は極めて少 ない. MacOS X では日本語文字コード体系として, MS 漢字コードではなくユニコード (UTF-8) を採用 した. ユニコードを用いることにより, 一つのテキストファイル中にいろいろな言語の文字が混在していても, それらを正しく表現することが可能となり, MacOS X ではこの性質を利用して, システム全体の「国際化」 を極めて単純な形で実現しようとしている. 実際に “あ” という文字は, それぞれのコード系で次のように表現される. EUC-JP 漢字コード a4 a2 MS 漢字コード 82 a0 JIS 漢字コード 24 22 ユニコード (UTF-8) e3 81 82 ユニコード (UTF-16) fe ff 30 42 ユニコード (UTF-32) 00 00 fe ff 00 00 30 42 ユニコード (USC-2) 30 42 79 JIS 漢字コードで定義されている文字数はおよそ6万5千文字であり, 日本語で利用される漢字も文字数よりは, 実はかなり少な いとされている. そのため, このようなコード体系に定義されない文字を含む文書の表現に問題が生じたり, コード体系に定義されな い文字が消滅するのではないかと危惧を抱く人たちも多い. 80 日本語と合わせて, これらの東アジア系の文字を CJK (Chinese-Jananese-Korean) 文字と呼ぶこともある. なお, 中国語文字 集合は2種類あり, それぞれ「中文簡体」と「中文繁体」と呼ばれる. 81 UTF-8, UTF-16 などは, それぞれのコード体系での1文字を表すための基本となるビット数を表す. 例えば, UTF-8 では, 1 文字の最小単位は8ビットであることを示している. さらに, UTF-8 では8ビットを単位(これがユニコードでの1バイト)とす る複数バイトを利用して1文字を表す. したがって, UTF-16 では, たとえ ASCII 文字であっても, 16ビットを用いて表現する. UTF エンコーディングでは1文字の長さは可変長になる. UCS-2 は, 1文字が必ず2バイトで表現される固定長エンコーディングである. 現在のユニコードの定義では, 定義済みのすべての文字は32ビットで表現可能であるので, UTF-32 (これは UCS-4 と同じで ある)を利用すればすべての定義済み文字を「1バイト」で表現可能となるが, コンピュータ上で最も多く利用される ASCII 文字集 合に属する文字も32ビットで表現されるため, ファイルの冗長度が大きくなってしまう. そのため, 実用に用いられているユニコー ドは UTF-8 が多い. なお, UTF-8 では, Latin 文字集合は平均するとおよそ 1.1 バイト程度で表現される. すなわち, ほとんどの 文字は1バイトであり, 残りわずかの文字が2バイトで表現される. CJK 文字集合などは3バイトを用いる. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 60 2.3.3.2.2 外字 OSが利用する文字コード体系は ShiftJIS や EUC-JP など, 正式の「規格書」に記述 された体系を基礎にしているが, 実際には「規格書」に記載されていない文字が利用できるようになってい る場合が多い. 具体例としては, Microsoft Windows で利用されている「数字が丸で囲まれている文字」や, MacOS (MacOS 9.x 以前) で利用されている「曜日が括弧で囲まれている文字」などがある. これら, 規格には存 在しない文字は, コード表の中で空欄になっている部分を利用している文字で, 外字と呼ばれる. 同じOSを利用している間は外字を利用しても問題が発生しないが, 外字を含むデータを他のOSで利 用しようとすると, 意図しない文字として表示される. 2.3.3.3 フォント コンピュータにおける文書データの内部表現は文字コードによって表現されていることがわかった. し かし, それらを実際に出力装置に表示するためには, それぞれのコードで表された文字の「図形的な形」を 表現しなくてはならない. そのために用いられるデータがフォント (font) と呼ばれるものである. フォン トとは「字形」という意味であり, 文字コードに対して, その文字の図形的な形を表現するためのデータの 集まりである82 . したがって, 文書データを出力装置(ディスプレイやプリンタ)に出力する場合には, そ の文書データの文字コードセットに対応したフォントを選択する必要がある. 特別にフォントを指定しな い場合には, その出力装置に応じたデフォールトのフォントが用いられる. ASCII 文字集合に対応したフォントには, Adobe 社による Times-Roman, Times-Bold, Times-Italic な どのフォントが有名であり, Roman とは通常の「立体」の文字を, Bold は「太文字」を, Italic は「斜体文 字」を表す. 一方, 同じく Adobe 社による Symbol というフォントもある. Symbol には「記号図形」が 定義されていて, ASCII 文字集合で書いた文書を Symbol フォントで表示すると「変な記号の羅列」にな る83 . フォントにはその文字の大きさ84 に応じて異なったデータを用いるもの(いわゆるビット・マップ・フォ ント (bit map font))と, 大きさを自由に変更できるデータとなっているもの(いわゆるスケーラブル・ フォント (scalable font))があり, ビット・マップ・フォントはグリフ・データを点の集まりで表現して いる. ビット・マップ・フォントを拡大・縮小すると, 「ギザギザの字体」になる. 一方, スケーラブル・ フォントはグリフ・データを線の集まり(ベクトル・データ)で表現しているため, 拡大・縮小を行っても 字形は「ギザギザ」にはなりにくい. 実際のフォントの形式には多くの形式(フォント・フォーマット)が あり, ソフトウェアによって利用できるフォント・フォーマットが異なるため, すべてのソフトウェアで共 通にフォント・ファイルを使えるわけではない85 . 2.3.3.4 地域情報 オペレーティグシステムでは, 各ユーザがどの言語(またはどの文字体系)を利用して作業をしているか を表す情報が必要となる場合がある. 例えば, プログラムが文字列処理を行う場合, 文字コード体系を指定しない限り, そのコード体系におけ 82 フォントデータに含まれる個々の文字の形のことをグリフ (gliph) と呼ぶ. 文字集合に対応したフォントがどのような字体であるかを調べるためには, “A quick brown fox jumps over the lazy dog.” という文章が用いられる. これは大文字・小文字の区別を除けば, すべてのアルファベット文字を用いた文章になっている. 84 ポイント (point) という単位が用いられ, 72 point = 1 inch = 2.54 cm である. 85 フォントと同様に, グラッフィクスを表現する場合にも, ビット・マップで表現する場合と, ベクトル・データで表現する場合が あり, ベクトル・データで表現したものは拡大・縮小が自由に行える. たとえば, 写真などのデータはビット・マップで表現されるが, Adobe 社の有名な Adobe Illustrator というソフトウェアでは, ベクトル・データのグラッフィクスを生成する. ベクトル・データ のグラッフィクスは, 今日では Adobe 社の PostScript という言語を利用して記述することが, 事実上の標準 (defact standard) となっている. 83 ASCII software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 61 る「1文字」を正確に判断することはできない. また, 場合によっては, プログラムが出力するメッセージ も, ユーザが利用する言語とコード体系に依存したメッセージを出力することも必要となる. このような, 各ユーザがどの言語(またはどの文字体系)を利用して作業をしているかを表す情報を地域 情報 (locale) と呼ぶ.86 例として, UNIX の地域情報の与え方をみておこう. 特に地域情報を与えない場合, すなわち, 出力はす べて ASCII 文字に限り, メッセージは英語で出力する場合は LANG 環境変数に C を指定する. この “C” と いう文字の意味は, C言語で利用可能な文字セットを利用するという意味である. また, EUC-JP 漢字コー ドを用いる場合には LANG 環境変数に ja または ja_JP.euc を指定することが多い. (正確にはシステム に依存する.) 2.3.4 情報量の表現 大量の情報量や短い時間を表現する場合には, それらの単位の前に接頭辞をつけて表現する. はじめにそ れらの接頭辞をまとめておこう. 記号 10 1 da 読み deca 10 記号 読み −1 d deci −2 2 10 103 h K hect kilo 10 10−3 c m centi milli 106 109 M G mega giga 10−6 10−9 µ n micro nano 1012 1015 T P tera peta 10−12 10−15 p f pico femto 1018 1021 E Z exa zetta 10−18 10−21 a z atto zepto 1024 Y yotta 10−24 y yocto 1Kバイトは 103 バイト=1000バイト, 1n秒は 10−9 秒というような使い方をする. ただし, 1Kバ イト=1024バイト = 210 バイトという単位の取り方をすることもある. この場合には, 103 の代りに2 の巾で最も近いものである 210 を繰り上がりの単位としている. ハードウェア的な量を表現するときには 1Kバイト=1000バイトの単位を用い, ソフトウェア的な量を表現するときには1Kバイト=1024 バイトの単位を用いると考えても良い. Exercise 2.3.33 日本語の新聞1ページを格納するために必要なデータ量はどれだけか?ただし, 1ペー ジは15段からなり, 各段は82行, 各行は12文字からなる. また, 1日の新聞は20ページからなる時, 新聞1年分(365日分)はどのくらいのデータ量になるか? クロック周波数 1GHz の CPU では 1 nsec ごとにクロックが発生していることを意味している. Exercise 2.3.34 クロック周波数 1GHz の CPU の1クロックの間に真空中を光が進む距離はおよそどれ だけか? Exercise 2.3.35 1バイト=8ビットとして, 4Tバイトのメモリ領域を表現するために必要なビット数 は何ビットか? 86 地域情報は, 単に言語やコード体系を指定するだけではなく, 日付・時刻の表示方法も制御している場合がある. ただし, システ ムの時刻(時間帯 (timezone))は, 地域情報で決定するのではないことが多い. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 62 2.3.5 実際の演算 コンピュータ内部で, 実際に演算が行なわれる様子をもっとも簡単な場合に見ていこう. CPU から見たメモリは, バイト単位でアクセス可能であり, 一意的にメモリ上の場所を指定する方法が 与えられている87 . その場所のことをメモリのアドレス (address) とよぶ. この時, 次のような演算を考え よう. • 2つ(ここでは整数)のデータをメモリから読みだし, その和を計算して, 違うメモリ上の場所に格 納する. この演算を行なうために, CPU が知っているべき情報としては, • 読み出すべきデータの入っているメモリのアドレスとその種類, • データを書き出すべきメモリのアドレスとその種類. が必要である. データの種類とは, それが整数のデータであるのか, 浮動小数点数のデータであるのかとい うことであり, それによって, 和をとる演算, データを読み出したり, 書き出したりする命令が異なる. また, それによって, データの長さが決まっている. ここでは, 読み出すデータのアドレスを a, b とし, その長さを とする. さらに, データを書き出すべき アドレスを c とする. (簡単のために, a < b < c とする.)すると, データが重ならないためには a + ≤ b, b + ≤ c が必要になる. この時, CPU はこの演算を行なうために, 次のようなことを行なう. • メモリの a 番地から(例えば整数の)データを読みだし, レジスタ X に格納する. • メモリの b 番地から(例えば整数の)データを読みだし, レジスタ Y に格納する. • レジスタ X にレジスタ Y の内容を加える. この時, 結果は再びレジスタ X に格納される. • レジスタ X の値をメモリの c 番地に格納する. ここで, レジスタとは, CPU に置かれた, 演算を実際に実行するための場所であり, すべての演算はレジス タ上で行なわれる. この演算を行なうプログラムを C 言語で書けば, 次のようになる. #include <stdio.h> int main() { int a,b,c ; c = a + b ; return 0 ; } コンピュータ内部での CPU の動きを忠実に表しているものは, アセンブラと呼ばれる言語であり, アセ ンブラでこのプログラムを書けば, 次のようになる. 87 実際には, バンク切替えなどの方法により, アドレスとして指定可能なメモリ量よりも多くのメモリ量を扱う技術がある. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 ld [%fp-8],%l0 ld add [%fp-12],%l1 %l0,%l1,%l0 st %l0,[%fp-16] 63 これは, 上の演算をそのまま書いたものである. 一行目は, [%fp-8] という番地88 から, レジスタ %l0 に データを読み込む命令である. このアセンブラコードによると, (この計算機では)整数のデータの長さは 4バイトであることがわかる. C 言語で書いたプログラムは, どの計算機上でも動作するが, アセンブラは, その CPU の種類に依存し たコードであり, CPU の種類が違えば, 異なった書式のコードとなる. 実際に CPU が実行するコードは, このアセンブラコードを機械語と呼ばれるコードにさらに翻訳して実 行される. 機械語とは, アセンブラにおけるそれぞれの命令(ニーモニックと呼ばれる)や, その引数(命 令を受けるレジスタやアドレスのこと. オペランドと呼ばれる)を, CPU が理解できる2進数に翻訳した ものである. 2.3.6 テキスト・ファイルとバイナリ・ファイル 通常ユーザが作成する ASCII コードや漢字コードに基づいたファイルをテキスト・ファイル (text file) という. しかし, データや実行可能なプログラムコードなどは, データの場合それぞれのソフトウェアに合わせた 表現がとられてたり, 実行可能コードは CPU のコードに合わせた表現がとられているので, ASCII コード などで表現されているわけではない. このようなファイルをバイナリ・ファイル (binary file) と呼ぶ. テキスト・ファイルでは行末や改行, TAB などを表すコードが入っていて, それらのコードはファイル 中で特別な役割を果たしている. しかしながら, バイナリ・ファイル中では, 同じコード(改行コードなど) が違う役割を果たしていることになるので, そのファイルがテキストなのかバイナリなのかはそれなりに区 別しなくてはならない. また, どのようなコードが改行コードになっているかは OS によって異なるので, 同じテキストファイルでも, 違う OS のものは違うコードで表現されている可能性がある. Example 2.3.36 UNIX における標準的な行末コードは LF (0x0A, 010) を用い, MacOS では CR (0x0D, 012), Windows では CR+LF (0x0A 0x0D, 010 012) を用いる. そのため, 異なる OS 間でのテキスト・ ファイルの交換には, 漢字コード変換のほかに行末コード変換を行わなくてはならない. バイナリ・ファイルの典型的な例は, 上で述べたアセンブラコードを機械語に翻訳したものであり, すな わち, 実行形式となっているプログラムのほとんどはバイナリ・ファイルである. 2.3.7 プログラム言語とは プログラム言語とは, コンピュータを動作させるために必要な方法を(わかりやすい)文法にしたがって 記述する言語体系である. 88 正しくは, レジスタ %fp に格納された数値から 8 を引いた数値をアドレス. このようなアドレス指定方法を間接アドレス指定と 呼ぶ. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 64 2.3.7.1 言語処理系 それぞれの言語には, その言語を実現するためのプログラムが存在する. そのプログラムのことを言語処 理系と呼ぶ. それぞれの言語処理系は, それぞれの言語の(もし存在すれば)標準仕様を実現している. こ れらの言語処理系には, プログラム・コードを機械語に翻訳を行うタイプのもの(コンパイラ (compiler)) と, プログラム・コードが直接実行でき, 実行時に逐次的に翻訳を行いながら実行するタイプのもの(イン タープリタ (interpreter))がある. 一般には, 各言語の性質により処理系がコンパイラ形式となるか, イ ンタープリタ形式となるかが決まるが, インタープリタ形式で動作するものには, 対応するコンパイラがあ ることがある. また, 最近は必ずしも最終的な機械語形式に翻訳を行うのではなく, 中間的なオブジェクト・コードを生 成し, 言語特有のライブラリとリンクさせるタイプのものもある. 2.3.7.2 代表的なプログラム言語 どのようなものがプログラム言語に相当するかは議論の余地があるが, ここでは, まあプログラム言語と 呼べそうなものをいくつか挙げ, その特徴などを解説する. また, プログラム言語には, C などのように, プログラム言語としての文法は機種や OS に依存しない定 義がされているものと, アセンブラのように, すべての命令が機種, OS に依存しているものがある. 前者の 場合は, その処理系が機種依存性のほとんどすべてを吸収する仕組みになっている. 2.3.7.2.1 C C は B. W. Kernighan, D. Ritchie 著「Programing Language C」の初版89 で定義され た, UNIX を記述するために作られた言語である. に書かれた内容が標準的な仕様であった. 「Programing Language C」の初版に定められた規格を K&R の規格と呼ぶ. しかし, 1983 年に ANSI(American National Standards Institute: アメリカ国内標準規格協会) によって, 新しく C の標準的な仕様が定められた. これ を ANSI 規格と呼ぶ. C は入出力などの規格をすべて標準ライブラリとして定め, 言語規格の外に定義し た. これにより, 標準ライブラリを変更することにより, 多くの機種で同一のプログラムを利用することが 可能になっている(移植性 (portability) と呼ぶ). また, C はメモリ等のきめ細かい操作が可能であり, OS 等を記述することに適しているとされている. 2.3.7.2.2 C++ C++ は C を拡張する形で 1980 年代半ばに登場した. 特徴はオブジェクト指向 (object oriented) と呼ばれる概念を C の上に導入したことである. C では, 構造化プログラミング (structured programming) と呼ばれる概念にしたがって, 変数の隠蔽などのモジュール化が行われた が, それをより進めた概念がオブジェクト指向である. オブジェクト指向とは, プログラム内のコードを「ク ラス」という概念によって分割し, クラス内での変数の隠蔽や共通化などを行うことにより, プログラム開 発効率の向上を目指した概念である. しかし, C++ の段階では, C にオブジェクト指向の概念を持ち込ん だに過ぎないと思われる. (cf. [9, 10]) 2.3.7.2.3 JAVA JAVA は C/C++ の拡張と考えられる, 高度にオブジェクト化された言語であり, 現在のオブジェクト指向の一つの集大成をなすと考えられている言語である. JAVA は 1990 年代半ばに Sun Microsystems によって開発された. JAVA は種々のクラスに対応するライブラリ(クラス・ライブラリ)上で動作するが, JAVA コンパイ ラはクラス・ライブラリにしか依存しないコードを生成する. 一方, クラス・ライブラリは JAVA Virtual Machine (JAVA 仮想機械 (sandbox))と呼ばれる, 仮想的な機械を構成することにより, 機種依存性を完 89 Kernighan-Ritchie の第2版は ANSI 規格準拠. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 65 全に sandbox 上で扱うことにより, プログラム・コードだけではなく, JAVA コンパイラが生成したオブ ジェクト・コード自身が, 異なったプラットフォーム90 上も動作するという構造を持つ. これにより, JAVA オブジェクト・コードをネットワーク上で配信することにより, ネットワーククライアントの機種に依存せ ず同一の動作を行わせることが出来る. 現在では, 各種の WEB ブラウザ上に sandbox があるため, WEB ブラウザ上で JAVA オブジェクト・コードを実行することが出来る. 2.3.7.2.4 Pascal Pascal は 1960 年代後半に N. Wirth によって設計された教育用プログラム言語で ある. 現在では ANSI によって標準化されるとともに, 処理系依存の拡張機能によって, システムの記述も 可能になっているが, 言語設計が教育用とされているため, C ほどの柔軟性は持たないが, アルゴリズムの 正確な表現が可能である. 一見したところ C と非常に良く似たプログラム言語であるが, 実は根本的に異 なる部分が随所に見られる. (cf. [11]) 2.3.7.2.5 Modula-2 Modula-2 は Pascal にオブジェクト指向の概念を持ち込み, プログラム言語の 構造の研究のために開発された言語である. (cf. [12]) 2.3.7.2.6 Fortran Fortran は 1960 年代に科学技術計算用として開発され, 現在利用されているのは 1977 年の標準化による Fortran 77 と, 1990 年の標準化による Fortran 90 である. Fortan 77 は, その頃パンチカードによるプログラム入力が主流であったため, 1枚のパンチカードに対 応する行番号の概念を持つ. C に比べ制御構造が強力でなく, サブルーチン呼び出しの方法も柔軟でない ため, 一部のアルゴリズムが実装できないという欠点があったため, 構造化 Fortran と呼ばれる新しい言語 (RatFor や PL/I 等) が開発された. 現在でも科学技術計算には Fortran が使われることが多い91 . これは, 汎用コンピュータを中心に, Fortran でかかれた多くの計算パッケージが残っていることによる. しかし, これの計算パッケージも現在では C に移植されつつある. 2.3.7.2.7 BASIC BASIC は Beginers All purpose Symbolic Instruction Code の略語であり, Fortran を元に初心者用に設計された言語である. Fortran では「型」は暗黙に宣言されていたが, BASIC では明 示的な型を持たせることが可能である一方で, 型を指定せずに文脈に依存した型の利用が可能である. 2.3.7.2.8 LISP LISP はリスト (list) と呼ばれるデータ構造を扱い, 人工知能などの実現を念頭にお いて開発された言語である. リストは我々が考える「連想」や「知識」を表現したデータ構造とも考えら れる. LISP はすべての制御を関数呼び出しで行うため関数型言語と呼ばれる92 . LISP には ANSI, OSI などによって決められた標準的な規格は存在しないが, Common Lisp と呼ばれ る極めて標準的と考えられている処理系が存在する. また, emacs の動作は emacs LISP と呼ばれる LISP 系の言語によって記述されるため, UNIX 上でも emacs を LISP インタープリタとして利用することも出 来る. 2.3.7.2.9 Prolog Prolog は LISP と同じく, 人工知能などの実現のためにかかれた言語であり, リス ト形式のデータを扱う手続き型の言語である. Prolog はカット・オペレータなどの他の言語にはない強力 な制御構造を持つ. 90 コンピュータ・アーキテクチャと OS を合わせてプラットフォーム (platform) と呼ぶ. 年頃に「本当のプログラマは Pascal を使わない」という論文 [13] があった. これは, 当時流行をはじめていた C, Pascal と Fortran との比較が行われた論文であり, C や Pascal がある程度アルゴリズムを決定しておかなければ書くことが出来ない言語 であるのに対して, Fortran の弱い構造化の中では, プログラミングの柔軟性を確保できるという主張である. 92 これに対して, C, Pascal, Fortran などの言語は, 制御構造は文法の一部になっていて, 一つ一つの命令を手続きとして呼び出す 形をとっている. これらの言語を手続き型言語と呼ぶ. 91 1980 software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 66 2.3.7.2.10 perl perl は UNIX に古くから実装されていた sed, awk といった, テキスト処理を行う フィルタ系の言語を拡張したものである. 強力な正規表現 (regular expression, 文字列を表現する一つ の方法)と, 文脈依存の変数形式を持ち, テキスト処理に適しているため, UNIX 上の各種のテキスト処理 に広範囲に用いられている. また, perl version 5 ではオブジェクト指向の概念が持ち込まれ, システム記 述のためのパッケージなども配布されている. 近年, python, ruby と言った, オブジェクト指向の概念を perl 以上に持ち込んだ高度なフィルタ系言語が登場している. なお, perl は基本的にはインタープリタで 動作する. 2.3.7.2.11 yacc & lex lex は字句解析 (lexing) を行うための C の補助言語, yacc は字句解析した文 字列の構文解析を行うための C の補助言語である. ともに, コンパイラが出力するコードは, それぞれの目 的を達成するための C のプログラム・ソースを出力する. コンパイラを作成するためには, その文法にし たがった構文解析を行う必要があり, yacc を利用すると, 言語仕様を与えることにより, 言語コンパイラの 構文解析ルーチンを作成することが出来る. そのような意味で yacc を「コンパイラ・コンパイラ」である という言い方もある. なお, GNU Project では yacc に対応する処理系を bison と呼んでいる. 2.3.7.2.12 シェル・スクリプト UNIX などのシェルのコマンド列を記述したファイルを実行形式にし たものをシェル・スクリプトと呼ぶ. Boune Shell の場合にはかなり強力な制御文法を持ち, リダイレクト と組み合わせることにより, UNIX のコマンド群を組み合わせて各種の操作を行うことが可能である. スク リプトと言う以上はインタープリタ形式で動作する. 2.3.7.2.13 PostScript PostScript は Adobe 社によってページプリンタ制御言語として開発された. しかし, プログラム言語としては, 各種の制御構造を持ち, もちろん計算機能も持っているため, 通常のプロ グラム言語として利用することも不可能ではない. 内部メモリをすべてスタックと呼ばれる形式で扱う. 2.3.7.3 プログラムのバグ プログラムのバグ (bug) とは, プログラムがプログラマの意図に反する動作をすることをいう9394 . プ ログラムの文法に一致しない記述をしたものは文法エラーと呼び, バグではない. ソフトウェアにはバグはつきものであるが, プログラマは可能な限りバグのないプログラムを書くこと が必要である. そのためには, きちんとしたアルゴリズムと適切なデータ構造をを利用してプログラムを書 くことが必要であり, また, 利用するプログラム言語の仕様に関する十分な理解が必要である. その上で適 切なテスト, すなわち, 通常の利用法だけでなく, ユーザの立場に立った各種のテスト95 を繰り返し, 可能な 限りバグを減らす努力が必要となる96 . 一方, ユーザはアプリケーションを利用して, 異常な動作をした場合, それをすぐにアプリケーションの バグと判断するのではなく, 利用環境, すなわち, OS や各種のトライバとの整合性を試し, 明らかにソフト ウェアのバグと判断できるのかどうかを試す必要がある. 実際には, ソフトウェア自身のバグではなく, ト ライバ等との整合性によって不具合が出ている場合が多い. 93 C でプログラムを書いていると, なかなか意図した通りには動いてくれない. まあ, それを「バグ」というのだが, そんなとき, C のプログラムに精通した人(Cウィザード (wizard))に見せると, 「バグじゃないよ仕様だよ」なんていわれてしまうことがある. 94 「バグ」に関しては, ネットワークニュースで有名なやり取りが行われた. ある人が「私のプログラムが思った通りに動いてくれないのですが」聞いたのが始まり. それに対する答えとして, 「コンパイラ は正しく解釈しています」というのが返ってきたのだが, 「良いコンパイラをお持ちですね」というチャチャから始まり, 「それはよ い OS をお持ちですね」, 「よい CPU をお持ちですね」などと, 発展していった. この話で笑えるようになれば, fj.lang.c の話 についていけるようになるだろう. 95 極端な場合, 異常な利用法をしても適切に処理が行われる必要がある. 96 明らかなバグが見つかっても, それを「仕様」と称して修正をしないソフトウェアメーカも存在する. software.tex,v 1.39 2003-06-03 09:37:38+09 naito Exp naito 数理解析・計算機数学特論 2.3.8 67 アプリケーション OS 上で動作する各種のソフトウェアをアプリケーション (application) ソフトウェアと呼ぶ. アプリ ケーションは, 通常何らかのプログラム言語で記述されたものを, 実行形式にしたものが外部記憶装置内に 保存され, ユーザはその実行形式を実行することにより, アプリケーションを利用することができる. 2.3.8.1 エディタ エディタ (editor) と呼ばれるものは, テキストファイルを作成するためのアプリケーションの一般名称 であり, プログラムのソースコードを記述したり, 様々な文書を作成するために利用される. ワードプロセッ サ (word processor) も文書を作成するための道具であるが97 , ワードプロセッサの作成する文書ファイ ル中には, 文書の書式を指定する各種の制御コードなどが含まれる. そのため, ワードプロセッサとエディ タはその機能がかなり異なることに注意しなければならない. 2.3.8.2 日本語かな漢字変換 日本語文書を入力するために利用されるアプリケーションとして, 日本語かな漢字変換フロントエンド と呼ばれるアプリケーションが存在する. これは, エディタや各種のアプリケーションの入力を一旦横取り し, ローマ字入力された文字列を日本語漢字文書の文字列に変換して, アプリケーションの入力層に渡すと いう動きをする. UNIX でのかな漢字変換は, 一般には入力端末ごとに動くのではなく, ネットワークを経由して, かな漢 字変換サーバと通信する形で動作するものが多く, かな漢字変換サーバはローカルホストで動作している 場合と, 他のホストで動作している場合がある. 97 通常ワードプロセッサと言う場合には, 画面に表示されたそのものの形の文書を作成するソフトウェアを指す. このようなタイ プのワードプロセッサを WYSIWYG (What You See Is What You Get) と呼び, TEX のように, 制御コードを利用して文書を 作成するタイプのワードプロセッサを, 文書清書システムと呼ぶことが多い. part1-a-1.tex,v 1.3 2003-06-02 16:17:19+09 naito Exp 69 References [1] Alan Turing. On computable numbers, with an application to the entscheidungsproblem. Proceedings of London Mathematical Society (2), 1936-7. [2] Alan Turing. Correction of “on computable numbers, with an application to the entscheidungsproblem”. Proceedings of London Mathematical Society (2), 1937. [3] Claude E. Shannon. A symbolic analysis of relay and switching circuits. Transaction American Institute of Electronic Engineers, 1938. [4] P. van der Liden. エキスパートCプログラミング. アスキー出版局, 1996. [5] NASA JPL. Mars Microrover Telecommunication Frequently Asked Questions. http://mars.jpl.nasa.gov/MPF/rovercomm/rovfaq.html. [6] Standard Performance Evaluation Corporation. . http://www.spec.org/, . [7] D. A. Patterson and J. L. Hennesy. コンピュータの構成と設計(第2版). 日経BP社, 1999. [8] K. Lunde. 日本語情報処理. ソフトバンク, 1995. [9] R. Sethi. プログラム言語の概念と構造. ピアソン・エデュケーション, 2002. [10] O.-J. Dahl, E. W. Dijkstra, and C. A. R. Hoare. 構造化プログラミング. サイエンス社, 1975. [11] K. Jensen and N. Wirth. PASCAL(原書第4版). 培風館, 1993. [12] N. Wirth. アルゴリズムとデータ構造. 近代科学社, 1990. [13] E. Post. Real programmers don’t use Pascal. http://www.mit.edu/people/rjbarbel/Humor/Computers/real.prog 1982. [14] 徳田雄洋. 情報ってなんだろう. 岩波書店, 1997. [15] A. Frisch. UNIX システム管理. オライリージャパン, 1998. [16] S. Garfinkel and G. Spafford. UNIX & インターネットセキュリティ. オライリージャパン, 1998. [17] C. E. Spurgeon. 詳説イーサーネット. オライリージャパン, 2000. [18] D. B. Chapman and E. D. Zwichy. ファイアウォール構築. オライリージャパン, 1996. [19] C. Stall. カッコウはコンピュータに卵を産む. 草思社, 1991. [20] 前川守. オペレーティングシステム. 岩波書店, 1988. [21] 田村進一. ディジタル回路. 昭晃堂, 1986. 数理解析・計算機数学特論 70 [22] 久保仁. 教育学部におけるコンピュータ教育とその実践. 常葉学園教育学部紀要. [23] bit 別冊, 数値計算における誤差. [24] 伊理正夫 and 藤野和建. 数値計算の常識. 共立出版, 1985. part1-a-1.tex,v 1.3 2003-06-02 16:17:19+09 naito Exp
© Copyright 2024 Paperzz