境目がぼやけてきたソフトとハード
2001.01.27 by Heroicus
コンピュータのプログラムというのは、初期にはその機械独特の機械語なり、その発展形のアセンブラで記述されていた。しかし、コンピュータでは機種更新はつきものなので、一度プログラムを書けば別の機種でもプログラムを書き直さずに実行できるようにしたいという要求が強く、そのための努力が積み重ねられてきた。以下に、そのいくつかを紹介する。
(1)プログラム言語
各機種ごとに同じプログラム言語のコンパイラ(バージョンが同じならベスト)があれば、アプリケーション・プログラムは、コンパイルし直すだけで実行できた。しかし、実際には、機種固有の部分がどうしても変換できずに残り、一部(場合によっては多くの)手直しが必要であった。
(2)ファームウェア
メインフレーム(大型計算機・《汎用機という言い方があるが、私は好きではない。コンピュータというものはマイコンと呼ばれていた頃のパソコンも含めて、汎用…色々な用途に使える…だから》)では昔から、性能の違う機械を一つのシリーズとして販売していた。これらの間では、ハードウェアロジック(回路設計)は同じにする必要はなく、低位の機種は簡素な回路を作り、命令のデコード後の段階にファームウェア(高速のROMを使ったマイクロプログラム)をとり入れ、同じ機械語プログラムを実行できるようにしていた。
(3)UNIX
UNIX は、今日、全く異なる多くの CPU 上で稼働するOSである。しかも、それらは、機械語としては全く異なるはずなのに強い仲間意識を持っている。それは、C言語のソースプログラムさえあれば、基本的なCコンパイラを各CPUごとに作成し、そのソースをコンパイルする作業を繰り返せば(Cコンパイラの複雑化も行う)、システムプログラムも含めて、すべてのプログラムが移植可能だからである。つまり、C言語のソースレベルでの統一があり、全てのアプリも、CPUは違ってもC言語のソースプログラムは基本的に同一である。アプリの発表・配布はソースプログラムで行うことが UNIX 界での基本的なモラルとされている。これが、UNIX とフリーウェアの深い関係の源だと思う。ソースプログラムはテキストなので、内容を隠しようがない。(今日では、ソフトベンダーが入ってきて、この面がぼやけ始めている部分もある)。ここでは、Cコンパイラの出来がすべてを左右した。
ここまでは、ソフトウェアの側の工夫で、互換性を確保してきたものの、最終的には機械語のプログラムを作成することが目標であることには変わりはなかった。CPUが高速になってくると、機械語に変換することは目指さずに、中間言語(あるいは仮想機械の"機械語")に変換することでことが足りるようになってきた。実行時にはランタイム・ライブラリと実行エンジン(JITコンパイラを含む)があれば十分であり、互換性の方が大切だという考え方である。(古くは低速CPUの時代にも PASCAL などで使われている p-code という考え方もあったが、実行速度が遅すぎて実用にならず、時期尚早であった)。また、インターネットの普及もあって、インターネットを介して、多くの機械が一つのコンピュータであるかのように振る舞うことも見られ出した。この観点から、次の2つに触れてみたい。
(4)JAVA
インタープリタである JAVAバーチャルマシンを各機種・CPUごとに作成すれば、コンパイルし直さずに、プログラム(中間言語・バイトコード)を実行できる。プログラムやデータの受け渡しが、インターネットを介して、別の機械との間でできる。完全なオブジェクト指向の言語である。ただ、登場の時期が若干早すぎたのではないだろうか。SUNが扱っているようなワークステーションでは問題ない速さかもしれないが、JAVA登場当時のパソコンにとっては、まだ処理が重たすぎた。ここから、JAVAは遅い、という悪評が広まり、一時、パソコンへの普及が妨げられた。今日では、サーバ側の共通言語として、着実に普及を再開している。パソコンのCPUが十分に高速になる、これからは、クライアント側へも普及するチャンスがあるかもしれない。ただ、言語がC++の改訂版のようなもの一つだけ、というのは、次に述べるライバルと比べて不利になるか? ライバルが、宣伝されているほど出来が良くなかったり、実装にもたつくことがあれば、天下をとれるか?
(5).NET
ソフトウェアの巨人、Microsoft が、パソコンのCPUの高速化と、高帯域インターネット普及の時期を見計らって出してきた戦略的なプラットフォーム。独占批判による行き詰まり打開のために、社運を賭けて取り組んでいるようだ。
JAVA同様にインタープリタであるCLR(Common Language Runtime)を各機種・CPUごとに作成すれば、コンパイルし直さずに、プログラム(中間言語)を実行できるし、プログラムやデータの受け渡しが、インターネットを介して、別の機械との間でできる。JAVAと異なって、たくさんのプログラム言語が使用できる。ただし、どれも完全なオブジェクト指向に基づいている。各言語をコンパイルした結果は、アセンブラのような単一の簡単な言語(MSIL)になる。この共通言語のおかげで、各言語間でクラスの貸し借りができる。つまり、各プログラマがそれぞれ得意な言語を使って作成した部品をつなぎ合わせて、一つのアプリを作ることが簡単にできる。この点がSUNのJAVAより勝っている。プログラミングの基盤として、これまでのいろいろな言語の実行時ライブラリのいいところを寄せ集め、Windowsからの移行も配慮した、CLR(Common Language Runtime)を利用可能である。結局はインタープリタだが、CPUがこれだけ高速になり、JITコンパイラの効率が良ければ、従来の機械語と変わらない感覚で動いてくれそう。マイクロソフトが高速なJITコンパイラを作る技術を持っていることはJAVAで実証済みである。実行時には、インターネットを介して別の機械にあるクラス・ライブラリも利用可能。
一方、CPUの側からも互換性確保の努力がみられる。トランス・メタ社のCPUである。
(6)クルーソー
今日、トランス・メタ社の製作しているクルーソーは省電力・X86互換CPUという面から紹介されることが多い。しかし、それはクルーソーの一面にすぎない。ベンチマークで遅いのどうのと騒ぐのは、的はずれである。トランス・メタのCPUは、プログラムを入れ替えればどんな機械語でも処理できる。容易に、PowerPCにも、 Alphaにも、 SPARCにも変身できるのだ。もちろん、JAVAバイトコードを機械語とするCPUにもなれるし、MSILの機械語を処理するCPUにもなりうる。
役者が出そろったところで、新世紀のコンピュータ界を考えてみると、Microsoft とトランス・メタが手を組めば、向かうところ敵なしで、新世紀を制覇できそうな気がする。.NETと、MSILクルーソーのコンビだ。(そうすると、また、独占禁止法に引っかかるかも)。
Microsoftはこれからもコンピュータソフトの主導権を確保していくだろう。ただ、Windows は、これまでintelのX86互換CPU上で動作するものが主流であったが、これからは決してそうとはかぎらない。Windows NT や Windows CE は多くのCPUをサポートしているし、intelの64ビットCPUはX86互換を捨てた。Windows.NET は当然、X86には縛られないものになっていくだろう。つまり、X86はWindowsとintelを繋ぐキーワードではなくなっていく運命にある。このような時期にX86互換64ビットCPUを作ったと自画自賛で宣伝している企業があるが、それは近視眼的な見方だと思う。
|