3.4 仮想化の観点から見た情報科学技術の仕組み

仮想化とは、実際に存在しないものをあたかも存在しているかのように見せかけることである。次に、この仮想化という観点から仕組みをながめてみよう。まず、プログラミング言語における仮想化から述べよう。

 

3.4.1 プログラミング言語の仮想化

プログラムとは、コンピュータがどのように動作するのかということを記述したものである。プログラムとは一定の規則にのっとって記述される。その規則をプログラミング言語と呼ぶ。プログラミング言語は、プログラムを記述するために作られた人工言語であり、文法は、コンピュータが解釈して実行できるように作られている。プログラミング言語には様々なものが存在するが、その中でもっとも基本的なプログラミング言語が機械語である。

12 機械語と高水準言語

機械語は、コンピュータ(正確に言うとCPU)が直接解釈して実行することができる言語である。機械語では、ある長さの0と1の列がCPUの基本命令に対応づけられている。機械語の基本命令自体は単純であるが、単純であるがゆえに機械語プログラムは可読性に欠け、人間が理解するのには困難が伴う。その問題を解消するために使われているのが、高水準プログラミング言語(以下では単に高水準言語)と呼ばれるプログラミング言語である。この高水準プログラミング言語で仮想化の思想が用いられているのである。

機械語プログラムは、具体的な演算装置CPUが想定されているのに対して、高水準プログラミング言語においては、高度な仮想的なコンピュータが想定されている。

この「高度な仮想的なコンピュータ」は計算モデルと呼ばれ、計算モデルがどのような処理を行うのかを定義したものをプログラミング言語意味論と呼ぶ。そしてプログラミング言語意味論に基づいて、プログラミング言語処理系(以下では単に言語処理系)といわれるソフトウェアが作られる。言語処理系を用いて、高水準プログラミング言語のプログラムは実行されることになる。(プログラミング言語意味論を研究する分野も「プログラミング言語意味論」と呼ばれるので注意が必要である。この分野では、プログラミング言語意味論を数学的に記述し、その構造を研究する。言語処理系が想定する意味論が数学的に記述されたものであることもあるが、そうでないことが多い。)

高水準言語の長所は以下のようにまとめられる。

・各種のプロセッサや入出力装置とは独立に作られている。

・具体的なコンピュータに依存しない計算モデルが想定されていて、プログラムは計算モデル上で動作すると考えられている。ここでいう計算モデルとは「仮想的なコンピュータ」である。

・計算モデルは、多くの場合、ある特定の種類のソフトウェアが記述しやすいように作られている。低水準言語と比べて、より抽象的なものとなっている。

これらの長所が得られたのは高水準プログラムが「仮想的なコンピュータで実行される」という考え方のためである。「仮想的なコンピュータ」の上の言語を考えたお陰である。

9:機械語命令

機械語の命令の具体例一つを紹介する。下図は、インテル社のx86シリーズのプロセッサ(Pentium、 Core2Duoなど)の加算命令である。このプロセッサは、0と1が16個からなる列(図では二段で表示)が1つの命令を表わす決まりになっている。

0000000111000010

この2進列が表わしている命令

一時記憶領域 (EAXレジスタ)に格納されている整数と別の一時記憶領域(EDXレジスタ)に格納されている整数を足して、その結果をEDXレジスタに入れなさい。

高水準言語の技術上の要点は、具体的なコンピュータにとらわれない「仮想的なコンピュータ」すなわち、計算モデルを想定し、それに基づくプログラミング言語を設計しているところにある。目標とする計算の記述方法の特性にあった計算モデルを用いることで、適切なプログラミング言語を設計することにより、プログラム作成効率が飛躍的に向上するのである。

計算モデルと高水準言語は、情報科学技術における仮想化の典型例であるといえる。コンピュータを計算モデルに仮想化することにより、プログラム作成者の思考を実際のコンピュータから解放し、プログラムを作成しやすくしているのである。

 

3.4.2 オペレーティングシステムと仮想化

オペレーティングシステムにおける抽象化については前に述べたが、仮想化もオペレーティングシステムにおいて重要な役割を果たしている。

解説7:言語処理系:高水準プログラミング言語が使えるわけ

高水準プログラムが使えるのは、コンパイラとインタプリタと呼ばれる言語処理系のお陰である。

・インタプリタは高水準言語のプログラムを解釈し実行するソフトウェアである。

・コンパイラは高水準言語を機械語プログラムに変換するソフトウェアである(変換された機械語プログラムはプロセッサで実行される)。

インタプリタは、高水準言語を解釈・実行する計算モデルを表現したソフトウェアである。別のいいかたをすると、コンピュータはインタプリタにより高水準言語を機械語とするようなコンピュータに「化ける」のである。

一方、コンパイラにおいては、高水準言語が想定する計算モデルの位置付けは間接的なものとなる。高水準言語が想定する計算モデルはコンパイラという変換を通してコンピュータと対応づけられている。

 インタプリタ

 

 コンパイラ

オペレーティングシステムは、その上で動作するアプリケーションシステムに対して、抽象化され、かつ、仮想化されたコンピュータの姿を見せている。

仮想化の典型的な仕組みが、マルチタスキングである。これは複数のプログラムの処理を同時に行うもので、CPUが一つしかなかったとしても、一つのCPUを十分短かい時間感覚で切り替えて複数のプログラムが同時に動作しているように見せかける仕組みである。CPUの処理速度と比例して、CPU以外の装置の処理速度やコンピュータを利用する人間の処理速度が圧倒的に遅いため、CPUを十分短かい時間で切り替えればあたかも複数のCPUが存在するように見せかけることができるのである。

他にもオペレーティングシステムでは、仮想記憶という実際には存在しない量のメモリをあたかも存在するように見せかける仕組みがある。

他の例としては仮想機械というソフトウェアがある。オペレーティングシステムが提供する仮想化は、抽象化の仕組みと組み合わさっており、オペレーティングシステムで動作するプログラムから見ると、プログラムが記述しやすいような理想的な環境がコンピュータのイメージとして提供されている。それに対して、仮想機械ではもっと具体的なコンピュータのイメージが提供されている。実際に存在するコンピュータ、たとえば、インテルx86シリーズのCPUを搭載したパソコンを仮想的に実現した仮想機械も存在する。言い方を変えると、これはコンピュータそのものを仮想的に実現するソフトウェアであり、一種のインタプリタといえる。通常のインタプリタが解釈するのが高水準言語であるのに対して、仮想機械の場合は機械語そのものである。

最初に提案された(ハードウェアを模した)仮想機械としては、IBM VM/370があげられる。近年では、パソコン上で動作する仮想機械でパソコン自身を模するものとして、VMWare、Microsoft VirtualPC、Xenなどが盛んに使われ、これらは、複数のオペレーティングシステムを同一のコンピュータ上で同時に使用することを可能とし、利用者の利便性を向上させている。

これらの仮想機械は、オペレーティングシステムと同等にハードウェア上で直接動作するものもあれば、オペレーティングシステム上のアプリケーションソフトウェアとして動作するものもある。また、仮想機械が動作するCPUと仮想機械が仮想化の対象とするCPUが同一の場合もあれば異なる場合もある。

実際に存在する、もしくは、過去に存在したハードウェアを仮想化する仮想機械の他に、実際には存在しない仮想的なコンピュータを仮想化した仮想機械も存在する。

13  パソコン上の仮想機械ソフトウェア

これは、高水準言語を対象とするインタプリタに近い存在であり、両者の違いは、対象が機械語であるか高水準言語であるかという点である。このような仮想的なコンピュータを実現した仮想機械として現在代表的なものとしては、JVM(Java Virtual Machine)があげられる。プログラミング言語Javaの標準的な言語処理系(すなわち言語提唱者であったSun Microsystemsが提供するもの)は、Javaで書かれたプログラムをいったんJavaバイトコードという仮想的な機械語にコンパイルし、それをJVMの上で実行する。JVMを実装するだけでJavaバイトコードのプログラムを動作させることができ、JavaプログラムからJavaバイトコードプログラムへのコンパイラは共通のものが利用できるというのが、この方法の最大の利点である。現在では、パソコンをはじめとして、携帯電話、そして、スマートカードに至るまで多種多様なコンピュータでJVMが実現されている。

この種の、仮想機械が実行機械とする仮想的なコンピュータの機械語は、バイトコードと呼ばれる。Javaのようにバイトコードにコンパイルして、仮想機械で実行するという方法は、Java以前より様々なプログラミング言語で使われてきた。

仮想化はソフトウェアに留まらず、最近ではCPUのようなハードウェアにおいても仮想機械というアイディアが使われている。たとえば、インテル社のPentium ProからCore2Duoに至るCPUでは、それ以前のCPUの機械語と同じものを使用しているが、実際にはμOPsと呼ばれるハードウェアで処理しやすい機械語に変換してから実行している。したがって、CPU自体が既存のCPUを模倣する一種の仮想機械となっている。本来であれば、CPUのハードウェア的な特徴を反映した機械語を定義して、性能を十分引き出せるようにコンパイラを作成した方が、プログラムの高速化が期待できると考えられる。

14  さまざまなコンピュータ上のJVM

しかし、既存のソフトウェア資産を継承する方が重要であるために、このような手法が取られてきたが、実装技術の進歩により、十分の成果が得られた。この二つのアプローチのいずれが有利なのかは、まだまだ議論の余地がある。