今日は 8086 の発表日(1978)。
16bit 時代の覇者です。
僕としては、1980年代はまだ 8bit の時代だったイメージがあるので、70年代末にはすでに開発されていた、ということが驚きです。
8bit 時代の覇者は Z80 。
これはインテルの 8080 をベースに改良されたものですが、インテルからスピンオフした技術者が作ったザイログ社のものでした。
インテルとしては、あくまでも 8080 の「上位互換プロセッサ」として 8086 を作成します。
上位互換とはいっても、バイナリレベルでの互換はありません。
1978年の時点では、まだパソコンは普及しておらず、ソフト資産もないからね。
自分が作ったプログラムを、自分が作ったのだから理解していることを前提に、「ちょっと改良したら動く」で十分だった。
8bit から 16bit になっているのだから全然違うのですが、アセンブラのソースプログラムがあれば、レジスタ名や命令などを一括置換して再アセンブルすれば、8割がた動く、というあたりを目標に設計されたようです。
現実的な落としどころのように思います。
8bit CPU と互換性を持たせるため、メモリの構造に特徴があります。
8bit CPU では、8bit のレジスタを2本くっつけた 16bit のレジスタで、メモリアドレスを指定するのが普通でした。
この方法だと、64KByte のメモリ空間を持つことができます。
そして、8086 でも、16bit のアドレスレジスタでアドレスを指定します。
ただし、別のレジスタで「64KByte の起点となるアドレス」を指定できました。
これで、1MByte のメモリ空間の中から、任意の 64KByte を自由にアクセスできる、という構造を作り出しています。
ベースアドレスはプログラム中で変更可能なので、多少工夫すれば 64KByte を超えるデータだって扱えます。
8bit 資産も引き継げますし、16bit らしい大容量も扱える。
非常にうまい方法でした。
1978年の時点ではメモリも高価で、64KByte を超えるようなメモリを搭載する、ということがあまり現実的ではありませんでした。
1981年に発売された初代 IBM-PC は、16KByte のメモリしか搭載していません。
でも、あっという間にメモリは安くなり、大容量を搭載できるようになります。
90年代に入ると、64KByte 以上のメモリに連続アクセスできない、というのは足枷にすぎなくなります。
…もっとも、これはインテルだけの責任ではありません。
1985年には、後継の CPU 80386 が作られています。
8086 と、その後継の 80186、80286 までは、互換性を持つ 16bit CPU でした。
しかし、80386 は新規設計の 32bit CPU で、8086 互換モード「も」持っています。
互換モードでは、単に高速な 16bit CPU として動きます。
本来の能力を発揮すれば、メモリ空間も 4GB の連続アクセスが可能となりました。
インテルとしては、時代の要求に応えたものは作った。
これを使ってくれれば問題解決、というわけです。
でも、ここで「互換性」の問題が現れます。
8080 から 8086 に移行した時は、互換性とは「移植しやすければよい」という程度のものです。
しかし、時代は変わり、ソフトは買ってくるものになりました。
今までお金を払ったソフトを捨てないと 80386 には移行できないのです。
80386 を搭載したマシンは徐々に発売されていきますが、過去の資産を活かすため、単に高速な 8086 として使われていました。
ここで登場するのが Windows 。
3.0 の登場を覚えている人はいるでしょうか?
サポートする CPU 80286 以上でした。つまり、3.0 はまだ「16bit」で、8086 の呪縛を引きずっています。
アプリケーションを作るにも、16bit の呪縛が残っています。
だったら、Windows よりも普及している MS-DOS 用に作ったほうが、多くの人に使ってもらえるだけマシです。
それが、3.1 になった時に、80286 のサポートを打ち切り、80386 専用になります。
見た目はあまり変わらないのですが、80386 の性能を活かせる OS として作り直されていました。
アプリケーションを作りやすくなったのです。
#勘違いがありました。指摘感謝。
僕は日本語版しか使ったことが無かったのですが、3.1が386以降専用となったのは、日本語版だけだそうです。
英語版では、8086で動かなくなったものの、80286でもまだ動きました。
ところで、Windows 3.1 は、まず MS-DOS を起動し、MS-DOS 上から Windows 3.1 を起動する、という構成でした。
内部に MS-DOS を持っているのです。
これを利用し、Windows 3.1 のアプリケーションの一つとして、仮想的な MS-DOS を実行することができました。
互換性は完全ではありませんでしたが、最悪の場合、Windows を終了すれば MS-DOS に戻れます。
先に書いた「過去の資産」問題への対策もできているのです。
このために、Windows 3.1 は大ヒット。
見た目の上ではあまり変わりませんでしたし、バージョン番号も 0.1 しか違いません。
しかし、やっと 8086 の古い設計から逃れられるようになったのです。
現在は、8086系統の CPU は、さらに改良されて 64bit になっています。
とはいえ、基本的に互換性を確保しながらの改良なので、設計が古いところは多数あります。
メモリが貴重だった時代、命令の必要性に応じて、データの量を可変にする「可変長命令」はいいアイディアでした。
しかし、現在となっては可変長命令は命令の取り込みをややこしくし、実行速度を低下させます。
Intel の CPU では多くの工夫によって速度低下を防いでいますが、「互換性」さえ気にしなければもっと簡単に速くできるのです。
命令セットも、時代に合わせてつぎはぎに拡張を繰り返した結果、複雑怪奇になっています。
スマホなどでは、過去の資産がないところから始まったため、8086 系の CPU を使う理由もなく、主に ARM が使用されます。
設計が簡素で強力…だったから使われ始めたのですが、こちらもすでに拡張を繰り返し、複雑化しつつあります。
8086 の設計は、すでに 40年近くも前のものです。
今のプロセッサに 8086 互換機能はないのですが、基本部分はバイナリ互換性を保ちながら拡張されてきました。
まだ完全互換を取り続けていました。指摘くださった方、ありがとうございます。
言い訳ついでに説明すると、リアルモードと呼ばれる動作モードに入ると、8086完全互換になります。
ただ、この機能を使うと最新の CPU の機能(たとえば膨大なメモリ空間)も使えなくなるため、普通は仮想 86モードを使用します。
仮想 86モードは、基本部分は互換なのですが、完全互換ではありません。
Windows では、MS-DOS のソフト資産を仮想 86 モードで動かし、完全互換でない部分に関しては、ソフトウェアで違いを吸収していました。
しかし、WindowsNT が導入されたとき、この「ソフトウェアによる 8086 互換の努力」は無くなりました。
Windows 95 系列との互換性のほうが重要になったためです。
このときに、すでに完全互換ではない、という記事を読んだ記憶が、最近の CPU は 8086完全互換ではないのか、というふうに記憶の中に残っていたようです。
現在の Core i7 でも、8086互換のリアルモードは残っていますので、8086 互換機能はまだあります。
そして、8086系列は今もまだ主流であり続けています。
おそらく一番「長寿」な CPU アーキテクチャのように思います。
公開後すぐに追記
IBMのメインフレームのほうが長く互換性保ってますよ、と教えていただきました。
メインフレームは使ったことないので不勉強でした。
IBM なんだから、途中で POWER に移行しているのだとばかり思っていた。
1年前の記事ですがIBM のメインフレームが50年間互換性を保証している、と書かれていますね。
インテルの CPU と同じように改良・拡張もあるのだろうけど、PCほど激しい競争のある世界でもないから、それほど汚いことにはなっていないのかな…と予想。
インテルの CPU は、誰もが言うけど汚い。
ただ、どんなに罵られようとも、実用性が高いのも事実です。
汚くなっているから設計コストだって馬鹿にならないだろうし、事実インテルは過去に何度も「新設計の CPU に移行」を試みては失敗しているので、もうやめたい気持ちだって大きいのでしょう。
それでも続けているのは、ある意味立派だと思います。
#マイクロソフトも過去製品のサポートを続けていて立派だと思っていたのだけど、Win10 への移行で「もうサポートしたくない」という態度をはっきりさせた。
インテルもいつか「非互換です。嫌なら使うな」という態度をとるかもしれない。
というか、一度そういう態度をとったら AMD に美味しいところかっさらわれて、慌てて追いかけたのだけど。
いつかインテルが互換性を取るのに限界を感じた時、混乱なく事態を収拾できるだろうか?
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 【あきよし】 ところで、間違えていたことは申し訳ないとお詫びしつつ、間違った駄文はこれからもどんどん書く予定です。書かないことには何も始まらないから。 勉強は精進しますが、限界もありますし、間違い指摘があれば素直に受け入れます。 (2016-08-03 12:11:31) 【あきよし】 気付くのが遅れましたが、各種指摘ありがとうございます。 80386サポートは、当時僕が98版しか知らなかったための勘違いでした。 また、8086互換性について、仮想86モードが完全互換ではないことと混同がありました。 以上、記事中にも追記しています。 (2016-08-03 11:38:28) 【名無し】 Windows 3.1は80286もサポートしています。80386以上専用になったのはMSKKが販売していた日本語版では? (2016-06-19 00:50:35) 【6809】 初めてコメントを書かせて頂きます。他の方も軽く指摘していますが,思い込みや知識不足によると思われる誤りが散見されます。 多くの誤りがあるのでいちいち指摘はしませんがせっかくこうして書かれるのであればx86とWindowsについてきちんと勉強をして書き直しをされたらいかがでしょうか。このままではちょっと恥ずかしいです。 (2016-06-17 21:39:43) 【G-SHOES】 あれ、今のプロセッサにも8086の互換機能はあると思いますよ。 (2016-06-10 09:57:13) 【あきよし】 メインフレームはあまり知らなかったのですが、互換性保ち続けていたのですね。 IBMだから、POWERに変わっているのだと思っていた。不勉強でした。 http://japan.zdnet.com/article/35065282/ (2016-06-09 13:17:52) 【m.ukai】 長寿なのはIBMメインフレームでは? s/360から現役のzまで互換を保ちつつ拡張されてますよね。(s/360 と 370 の互換の程度は実は知らないんですが s/370 以降は上位互換) (2016-06-09 13:13:27) |