計算機オタクがコンピュータの歴史と現代CPUについて語る

## 人類と計算機の馴れそめ

コンピュータと聞くと非常に現代的なイメージを持たれる方が多いと思う
しかし､コンピュータのルーツである｢計算機｣というカテゴリでは､古今東西実に様々なものが存在してきた

誰もが目にしたことはあるそろばんも現存する最古のものでは紀元前300年頃の｢**サラミスのそろばん**｣と言うものがある
近代的には計算尺や古くは石を使ったものや天文学に関する計算を行う目的での機械式のアナログ計算機なども登場している
インカ帝国で使われた｢**キープ**｣と呼ばれる紐の結び目の形で数を表現する道具も見方によっては一種の記憶装置であると言えるし､人類は歴史の中で計算を行い伝えるための様々な道具を生み出してきた

**タイガー計算機**に代表される機械式計算機や計算尺も電卓に取って代わる1970年代頃までは､現役であったのである


## 階差機関

18世紀~20世紀前半にかけてはより大規模な計算機が次々と生まれてくる
1822年には｢**階差機関**｣という用途固定式の機械式デジタル計算機が登場した｡これはチャールズ・バベッジが設計したものであり､後にバベッジは階差機関はより汎用性のある設計が可能であると思いつき､機械式汎用コンピュータの構想として｢**解析機関**｣の設計を開始した｡これはあいにく実現することはなかったが世界で初めてプログラム可能な計算機を考案した功績とその解析機関の特徴から｢解析機関は世界初のコンピュータであるのか｣という議論は今もなされており結論は出ていない｡

![275px-Difference_engine.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/148cbb9a-eeac-f8d5-9a2c-77588c16b957.jpeg)
*バベッジの階差機関* [^babbage-cc3.0-by-sa]

｢プログラム可能な計算機｣と言うと忘れてはならないのがバベッジの弟子であるエイダ・ラブレスである｡数学を愛好した彼女はバベッジから多くの教えを受け､解析機関についてイタリア人数学者が出版したものを英語に翻訳した｡諸説はあるがその中に掲載されたベルヌーイ数を求めるためのプログラムのコードは世界初のコンピュータプログラムと言われている｡プログラミング言語の`Ada`はエイダの名前にちなんで命名されている｡

![167px-Ada_Lovelace_portrait.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/293f3312-8a85-c242-847b-83dc2ca06a47.jpeg)
*エイダ･ラブレスの肖像画* [^public_domain]


## 戦争の道具へ

第一次世界大戦終戦に始まったアメリカの黄金時代と世界恐慌による情勢不安は戦争への機運を一気に高めた｡各国の軍隊や研究者は､暗号技術や弾道計算､レーダー技術の向上や実用化といった需要からより汎用的で高速な計算機を求めた｡

既にデジタル計算機は実用化されていたが桁毎に離散的に値を扱う特性上､歯車を組み合わせた機械式では計算速度の遅さがしばし問題となり､この頃は物理現象を計算に応用したアナログ計算機が主流であった｡

第二次世界大戦以降は､戦争の道具として｢計算機からコンピュータへと発展｣していった時代であった｡
大戦初期から連合国を悩ませ､暗号は解読されていないという慢心からノルマンディー上陸作戦を許した｢**エニグマ暗号機**｣は機械で電気の流れを制御して暗号化､復号を行う電気機械式計算機である｡他にもアメリカ海軍のMark I 射撃管制コンピュータ始め､日本海軍にも船体の傾きや敵機の速度などといった入力から自動で照準を行う九一式高射装置といった機械式アナログコンピュータが搭載されていた｡

弾道計算用に計画され､後にマンハッタン計画で爆縮レンズの計算を行った電子式デジタル計算機である**ENIAC**の誕生など計算機をコンピュータへと進化させ発展させたエピソードには事欠かず悲しきかな戦争はコンピュータに対して正の側面を見せたように思う｡

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/3387baec-012d-d5a2-1187-832be0bcecec.jpeg" alt="Classic_shot_of_the_ENIAC.jpg (public domain)" width="320">

*ENIACのファクションテーブルを操作している様子* [^public_domain]


## 電子式デジタル計算機の幕開け

1930年代後半~1940年代はまさに電子式デジタル計算機時代の幕開けといえる時代であり､｢**○○言語はチューリング完全であるのか?**｣といったプログラマーの間ではおなじみの議論で有名なアラン･チューリングやストアドプログラム方式を発明したフォン･ノイマンが活躍する時代であった｡

ドイツの｢Zuse Z3｣やアメリカの｢ENIAC｣では機械式に代わり｢リレー｣や｢真空管｣といった電気的ないし電子的な**スイッチ**を用いたデジタル計算機が登場した｡Z3は二進数､ENIACは十進数を用いるなど､黎明期ならではの多様性こそあったものの､非常に重要な点にENIACでは｢**ストアドプログラム方式**｣が発明され､後年にノイマンらが二進数電子コンピュータとして開発された｢EDVAC｣の論理設計については[公開](https://ja.wikipedia.org/wiki/EDVAC%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%A0%B1%E5%91%8A%E6%9B%B8%E3%81%AE%E7%AC%AC%E4%B8%80%E8%8D%89%E7%A8%BF)され､今日にも続く｢**ノイマン型コンピューター(アーキテクチャ)**｣としてコンピュータの基礎的な設計の礎となった｡

これまで､軍事技術とされていたコンピュータが1950年代頃になると商用利用されるようになった｡1951年にマンチェスター大学に納入されたFerranti Mark 1がその一号機である｡1ワード20ビットと時代を感じるのは主記憶装置に使用されたウィリアムス管の1列のドット数に合わせた仕様であった｡

主記憶装置というとこの頃の大きな発明に**磁気コアメモリ**がある
仕組みとしてフェライトコアを磁化させることで情報を記憶させるのだが､縦方向､横方向(+読み書き用に斜め方向)に銅線が張られており､X, Yを指定して電流を流すことでアドレスを指定してビットの読み書きが行えるようになった｡この発明により今でこそ当たり前の`Random Access Memory`(RAM)がより一般的に使用されるようになるのである｡

余談だが､2006年まで使用されたインテルの旧ロゴの`e`は､フェライトコアを齧る様子を表しており､インテルが半導体メモリを主力製品とし､磁気コアメモリを置き換えるという創業当初の精神を表したものであった。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/ae348db8-3c89-84d8-f1cf-c4a8ef179871.png" alt="Intel_logo_(1968-2006).svg.png (public domain)" width="160">

*1968年から2006年まで使用されたインテルのロゴ* [^public_domain]


## トランジスタの誕生

これまでコンピュータのスイッチングには､電磁石を用いて機械的にスイッチをオン･オフをする｢リレー｣や､電子の引きつけや反発を利用した｢真空管｣､日本以外では全く普及せず､数年でトランジスタに置き換えられてしまった､｢パラメトロン｣といった素子が利用されてきた｡

これらにはいずれも｢スイッチングが遅い(リレー)｣､｢ユニットの寿命が短い(真空管)｣､｢磁性体を利用するため[熱に弱い](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%BC%E6%B8%A9%E5%BA%A6)(パラメトロン)｣といった短所があった

1947~1948年にベル研究所によって**点接触型トランジスタ**が発見された｡半導体という単語から想像できないほどあまりに泥臭いアナログな手法でチューニングしなければ動作させられないほど不安定な素子であったが､**接合型トランジスタ**が発明されたことで大きなブレイクスルーが訪れる

原理的には真空管に近いが､機械式でないためスイッチングが速く､真空管と異なり**固体素子**であるため長寿命であり､磁性体を用いないため熱に強いといった今日でも使用され続ける無敵のスイッチング素子の誕生であった｡


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/08c9fc63-0522-4ca8-52b8-983bf52e19f5.jpeg" alt="1st-Transistor.jpeg (cc3.0-SA)" width="320">

　*世界最初のトランジスタの実物* [^1st-transistor-cc3.0-by-sa]


余談だが､接合型トランジスタを発明したものの最初の発見の場に立ち会うことのできなかったウィリアム･ショックレーは後に**ショックレー半導体研究所**を設立する｡研究所として大きな成果を残すことはなかったが､ショックレーに不満を抱き退社したメンバーらが｢フェアチャイルドセミコンダクター｣を設立した｡彼らはショックレーから[8人の反逆者](https://ja.wikipedia.org/wiki/8%E4%BA%BA%E3%81%AE%E5%8F%8D%E9%80%86%E8%80%85)と呼ばれた｡8人の反逆者には後にフェアチャイルドを離れ｢インテル｣を創業したロバート･ノイスとムーアの法則で知られるゴードン･ムーアがいた｡フェアチャイルド出身者にはAm386やAthlonを設計･製造､現在ではRyzen設計･販売する｢AMD｣の創業者ジェリー・サンダースらがおり半導体業界に非常に大きな爪痕を残した｡

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/222f8bb5-63cc-b519-abe1-432a704deb43.jpeg" alt="William_Shockley,_Stanford_University.jpg (cc3.0)" width="320">

　*ウィリアムショックレー* [^cc3.0]



## 日本初の座席予約システム

日本の商用コンピュータ利用における重要なエピソードを紹介する｡日立製作所が開発した国鉄の座席予約システムであるマルス1が1960年2月1日に運用を開始した｡マルス1は主要駅をオンラインでつなぎリアルタイムに座席予約ができる日本初のシステムとなった｡この成功は電子計算機をオンラインリアルタイムシステムへ応用する可能性を示したものであった｡ハードウェアやインタフェイスこそ進化すれど今日のオンライン予約システムと殆ど変わらぬ点からも当時から非常に先進的なシステムであったことがうかがえる｡

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/6dbe9180-531b-de6f-828e-a281a1486dad.jpeg" alt="MARS1" width="320">

　*MARS1の中央処理装置* [^mars1-cc4.0-by-sa]

## 電卓戦争

これだけでも一つ記事が作れそうだが､1960年代後半~1970年代にかけて日本では電卓戦争が勃発していた｡
カシオ計算機､キヤノン､早川電機(後のシャープ)やビジコンなどが電卓の更なる高性能化･小型化を目指してしのぎを削っていた時代である｡この戦争の中でより小型で低消費電力な表示装置としての液晶､世界最初期のマイクロプロセッサ4004､太陽電池で駆動するような低消費電力LSI技術の獲得など電卓開発競争によって産み落とされた技術はかつて産業の米とまで呼ばれた80年代~90年代にかけての日本の半導体産業の繁栄と衰退へと繋がっていく｡

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/6c4a766f-5a47-86d4-c173-f32d9fa38f89.jpeg" alt="Casiomini_1972.jpeg (cc4.0)" width="320">

　*答え一発でおなじみのカシオミニ* [^casiomini-cc4.0-by-sa]


## 4004の誕生

トランジスタからICへ､ICからLSIへと､急速にLSI化が進む1972年世界最初期のワンチップマイクロプロセッサである4004が誕生した｡
これは1969年に日本のビジコン社が電卓用チップセット開発をインテルに依頼したことがきっかけとなり､ビジコンからは嶋正利､インテルからはフェデリコ･ファジン､テッド･ホフ､スタンレー･メイザーらが開発に参加し誕生したマイクロプロセッサである｡当初ビジコンはメモリに書き込むプログラムを変えることで､様々なタイプの電卓に対応させる｢プログラム論理制御｣を電卓全体の方式としようとしていた｡これの実現には複数のLSIを設計する必要や大きいパッケージが必要となり設計､製造のリソースが不足していた創業間もないインテルにより難色を示され暗礁に乗り上げつつあった｡事態を打開したのはテッド･ホフであった｡渡米していた嶋に対し口癖の｢My idea is｣に始まった4ビットの汎用コンピュータを1チップに収めるという彼のアイディアがマイクロプロセッサの基となった｡

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149815/bc811b50-d3cc-c927-ddb5-9ebee84886d5.jpeg" alt="Intel_4004" width="120">

*Intel 4004* [^4004-cc3.0-by-sa]

`4004`の思想は後に8ビットに拡張された`8008`や`8080`へと続いていき､インテルプロセッサの代名詞とも言えるx86ファミリーの1号機､`8086`が開発された｡64ビット化された現在でもパソコンに使用されるx86系プロセッサは一貫して当時のプログラムを実行できる互換モードを搭載している｡

ここでも余談だが､ビジコン退社後リコーを経てインテルに引き抜かれた嶋は8080の設計に従事した｡嶋は自らが設計した8080のパターンに嶋家の家紋をプリントした｡これは｢8080 嶋家の家紋｣で画像検索すると確認することができる｡ファジンや嶋が後に設立したザイログ社の｢Z80｣やその互換品はゲームボーイを始め現在でもリモコンやキーボードの制御など多くの製品に使用されている｡特に有名な使いどころとして遊技機の抽選器には実質的にZ80互換のプロセッサが指定されている


## RISCの誕生

1982年`RISC-I`が産声を上げた｡

RISCの考え方自体は1960年代から存在していたが､RISC-Iの誕生により､x86ファミリーに代表されるCISCは過去のものとされた｡

RISCは｢固定命令長｣や｢全ての演算が1サイクルで実行される｣､｢演算にメモリを指定するアドレッシングモードを持たない(レジスタ-レジスタ間のみ)｣などといった制約や特徴を持つマイクロプロセッサであり､これらの特徴はパイプライン処理を実現するために必要な制約であった｡RISCの誕生は複雑な命令を複数の単純な命令に置き換えトランジスタの使用数を減らすと共に回路の利用効率を上げられる新しいプロセッサの方式であった｡代表的なRISCに富岳やスマートフォンで広く使用される`ARM`､ルータなど多くの組込機器に使用されRISCの教科書的な設計であるとされる`MIPS`がある｡

パイプライン処理も当時のCISCにはできない芸当ではあったが最近では事情が異なる｡ノイマン型アーキテクチャを採用し典型的なCISCと呼ばれたx86ファミリーである近年のインテル製プロセッサでは､`μOp`と呼ばれる命令変換技術が使用されている｡これによりx86命令をRISC風の命令へ変換し実行するのである｡その際に**命令のみ**がキャッシュメモリへロードされ実行される為､キャッシュメモリと演算ユニット間の関係だけを見ると完全な**ハーバードアーキテクチャ**である｡しかし､主記憶装置とCPUという関係で見るとx86でありノイマン型アーキテクチャなのである｡逆にRISCもCISCの思想を取り込むなど､当時においてブレイクスルーであったことは間違いが現在ではCISC, RISC　といった分類はあまり意味がないように思える｡


## ベクトル計算機の誕生

計算機科学分野において並列処理を実行する方法の一つにベクトル演算を行うという方法がある｡これをフリンの分類では`Single Instruction Multiple Data`の頭文字から`SIMD`と呼ぶ｡SIMDと聞くと｡Pentium MMXの`MMX`を筆頭に`SSE`や`AVX`といった拡張命令の一種という認識が一般化しているように思う｡

レトロニズム的には古典的なコンピュータのことをスカラ型コンピュータと呼ぶが､1980年代~1990年代にかけては､**ベクトル型コンピュータ**と呼ばれるコンピュータがスーパーコンピュータでは一般的だった｡Cray-1やTOP500首位となったNECの地球シュミレーターなどが代表的なベクトル型スーパーコンピュータである｡

1度の命令で大量のデータを処理できる特殊なコンピュータである｡故にメモリ帯域を必要とするといった特徴を有する｡ビデオカードの性能においてメモリ帯域が重要視される理由もここにある｡ストリームプロセッサと呼ばれるGPUはSIMD(MIMD)風のプロセッサである｡データのフェッチが追いつかないと暇になった演算ユニットは遊ぶのである｡統合グラフィックスの性能が芳しくないのもGPUがCPUとメモリバスを共有してる点やバス帯域がCPU向けに設計されている点などから演算ユニットを増やして性能を上げることが難しいことが一つ理由に挙げられる｡

もっぱら現代のスーパーコンピュータではスカラ型プロセッサにSIMD命令を拡張する方式が一般的であるように思う｡近年ではGPUを多用した安価なスーパーコンピュータも登場している｡


## マルチコア化

2000年代後半Core Duoを皮切りにCore2 Duo, Athlon 64 X2などパソコン向けデュアルコアプロセッサの時代が到来した｡この間にクロック競争や命令の拡張競争などもあったがシングルコアで性能を上げるには発熱が問題となり､1つのパッケージに高効率な同じCPUコアを複数搭載して性能を上げるマルチコアと呼ばれる手法の時代が幕を開けたのである｡
時を近くしてPlayStation 3用に開発され､鳴り物入りで登場した割に全く普及しなかったCellは上記手法とは少し異なる方向性であったが､一般向けには初めて販売されたヘテロジーニアスマルチコアプロセッサであった｡

コア数に関しては2021年現在Ryzen Threadripper 3990Xの物理64コアが1パッケージのデスクトップ向けとして最もコア数が多いプロセッサである｡一般的な用途ではハイエンドで8コア､ローエンドでも4コア辺りが主流であるように思う｡しかし直感的な予想ではあるが特にモバイル向けでホモジニアス型の16コア､32コアが一般的となる時代は来ないように思う｡むしろ違ったアプローチで性能と低消費電力を両立して伸ばして行くように思うので次の章で語る｡


## SoC化とヘテロジーニアス化へ

シリコン製プロセッサ全体で見るとソフトウェアの並列化の難しさ､ムーアの法則の終焉､半導体集積密度の限界によるTDPの制約､モバイル需要を見越した低消費電力化といった観点からSoC化とヘテロジーニアス化が進んでいくように思う｡

特に2010年代~2020年代にかけて､SoCやヘテロジーニアスマルチコアは広く普及したように思う｡代表的なスマートフォン向けSoCであるQualcommのSnapdragonやApple Aシリーズプロセッサは高性能型と高効率型の異なるCPUの搭載､各種コントローラを始めモデムといったアナログ回路やGPUの統合など次々と周辺のチップを取り込んでSoCの更なるSoC化とヘテロジーニアス化を進めている｡

AppleがMac向けにプロセッサの内製化へと舵を切った理由は単純にコア数を増やすだけの方式に効率的な限界を感じたからではなかろうか｡Apple M1プロセッサではそれぞれ4コアの高性能コアと高効率コア､8コアGPUやDSPを搭載したヘテロジーニアス構成となっている｡マイクロソフトがWindows 8(Surface RT)で限定的に､Windows 10では大々的にARMのサポートを進める理由としてはモバイル向けCPUのSoC化を強く見越した判断だったように思う｡

しかし決してx86に見切りをつけたわけではなく特にハイエンドデスクトップやサーバ､HPC分野でのインテルは強い｡FPGAメーカー大手のAlteraの買収やXeon Phiといった挑戦的なプロセッサを市場へ投入する姿勢はこれからもHPC分野が伸びていくことを見越して力を入れているからであるように思う｡


## さいごに

自己満足の記事にお付き合いいただきありがとうございました｡
無事ずっと書きたかったことが全部かけました｡

各章はサラッとまとめていますが､素子の開発一つとっても技術者として魂が震えるようなエピソードが沢山詰まっています｡
少しでも興味のわいた内容があれば是非調べてみてくださると本望です｡


[^babbage-cc3.0-by-sa]: [CC license 3.0 BY-SA - Allan J. Cronin 2009](https://creativecommons.org/licenses/by-sa/3.0/)

[^4004-cc3.0-by-sa]: [CC license 3.0 BY-SA - LucaDetomi 2005](https://creativecommons.org/licenses/by-sa/3.0/)

[^1st-transistor-cc3.0-by-sa]: [CC license 3.0 BY-SA - Unitronic](https://creativecommons.org/licenses/by-sa/3.0/)

[^casiomini-cc4.0-by-sa]: [CC license 4.0 BY-SA - Yagshi](https://creativecommons.org/licenses/by-sa/4.0/)

[^mars1-cc4.0-by-sa]: [CC license 4.0 BY-SA - Hirakawa](https://creativecommons.org/licenses/by-sa/4.0/)


[^cc3.0]: [CC license 3.0](https://creativecommons.org/licenses/by/3.0/)

[^public_domain]: public domain