はじめに
virtualenvの記事ではよく「仮想環境」と紹介されます。しかし私はとあるところでvirtualenvの説明をした時に「仮想」という言葉に違和感があり「独立した実行環境」と表現しました。
何故ならvirtualenvで作ってactivateした場合に動いているpythonは何かをエミュレートしているわけではなく本物だからです。あくまで、「端末立ち上げてそのままpython使うときとは別のパスにあるpythonが使われている」だけということになります。
virtualenvの話はこれだけで以下ポエム的に「仮想」という言葉について思うことを書いていきます。
仮想とは何なのか
コンピュータの歴史は仮想化の歴史と言ってもそれほど過言ではないでしょう。
仮想メモリ
まずすぐに思いつくのは仮想メモリです。
これは何が「仮想」なのかというと、実際に搭載している物理メモリに対してプログラムにはそれよりも多く見せかける(妖精さんが頑張ってスワップアウト、スワップインする)、実際には複数のプログラムが動いているんだけどプログラムには自分一人だけがメモリを占有しているように見せかけるということを行っています。
OS、デバイスドライバ
仮想メモリも含めたリソースの仮想化も大事な概念です。ここでOSが出てきます。
OSの仕事、というかデバイスドライバの仕事は、統一したインターフェースを提供することでアプリケーションプログラムがどのハードウェアが繋がっているのか判断して制御方法変えなくてもいいようにすることです。これは実際の機械ではなく、仮想的な機械がつながっているように見せていると言えるでしょう。
プログラミング言語の仮想マシン
プログラミング言語の話で言うとPythonとかRubyとかJavaとかは仮想マシンで動いています。
まあ今時のJavaは普通JITコンパイルされて動く、RubyもJITが開発されつつあるようですがそれは置いといて、これはプログラムをCPUが理解できる機械語にしないで「言語処理系が定める命令セットを実行する」という仮想機械が実行されているということになります。
仮想マシン
10年ちょい前からいわゆる仮想化技術が一気に花開きました。ハードウェア技術の進歩に加え、ハードウェア自体の仮想化サポートも影響しているのでしょう。
ここでは、「物理的に一台のマシンなのだけど、仮想的に複数台のマシンを動かす」という仮想化が行われています。上の「プログラミング言語の仮想マシン」と違うのは、仮想マシン自体がCPUの機械語を直接実行できるという点です。
そこまで詳しくはないので説明が正しくないところがあるかも・・・
RAID
Wikipediaで確認してたらRAIDも仮想技術ですね。これは複数のディスクをまとめてひとつのディスクに見せるというものです。まあそこまで詳しくないので深くは述べません。
話をvirtualenvに戻す
ところでvirtualenvはドキュメントでどのように説明されているのか。
https://virtualenv.pypa.io/en/stable/
virtualenv is a tool to create isolated Python environments.
isolated、「孤立した」ですね。仮想とは言っていません。
だったらソフト名にもvirtual使うなよという気もしますが、じゃあどの単語がいいのか(isolateはいまいちだしな)となると、私も語彙力がないからvirtualしか思いつきませんね(ぉぃ
余談:仮想通貨
今話題の仮想通貨。ブロックチェーン技術自体も興味深いところですが私は人文系も大好きなので、「通貨が人類の交流に与えた影響」的な話題も大好きです。その点で言うと、「仮想通貨というがそれが実取引に使われるのなら『仮想』ではないのではないか」と考えています。物質としての通貨がないから「仮想」なのかもしれませんが。