JAVAの幻想

JAVAとは?

珍しく1990年代に生まれた言語であるらしい。
というのはコンピューター言語というのはどこが本当に“独立”したのかが良く分からないものだからだ。一般的には誰かの頭の中にあってそれが言語仕様書が書かれたり実際に作られたり(実装されたり)したとき、いったいどれが本当の誕生日なのかがわからないからだ。
なんにせよ、現在JAVA言語というものはきちんと存在しそれを使って開発が行われている。
総元締めはSumMicrosystems社らしい。
基本的にコンパイラ自体は無償配布しており、各プラットホーム(実際に動く機器)ごとにそれに追加してSDKという形で配布が行われているようだ。

特徴

ざっとみるとC言語以上、C++言語未満といった感じがする。
スレッドの考え方が言語として導入されているなど、近代のプラットホームに実状をあわせている部分も見受けられるが、スレッドを導入してもあまり意味の無いプラットホームもあるからどうなんだろうというところか。
オブジェクト指向であるのはもちろんとして、継承や関数のオーバーライド等が導入されている。残念なのは新しく導入した型(クラス)に対しての演算子のオーバーライドがないことか。
これは例えば文字列という型を導入したとして、S=S1+S2のような記述ができないことに相当する。この機能の導入はともすると混乱を招くが上手に使えば非常に簡潔で見通しの良い記述ができる。
S=S1+S2 とstarcat(s,s1,s2) とどちらが直感的であろうか?

幻想?

JAVAというのはオブジェクトレベルでの互換をもつということが特徴とされている。
これはJAVA VM(VM = Virtual Machine)によって実現されているとしている。
Virtual Machineといえばなんのことやらであろうが、要するに適当に仮想の機械をでっちあげてそれをなんらかにモノでエミュレートするということである。
そのエミュレータをいろんな機械(プラットホーム)に移植してやればその上で動く、ということになる。
旧くは大型計算機時代のP-CODEという話になるらしいがそういうことはおいておいて、そんなに目新しい話でもない。
例えば実際にDOS、Windows、Mac、UNIXなどいろんなところでGameBoyエミュレータが稼動しているという話は聞いた事ぐらいはあるだろうが、もちろんその上で動くソフトはどれも共通(ROMから吸い出したものだから同じにきまってるよね)といっているのと大差はない。
もしかしたらイメージのフォーマットが若干違うかもしれないがヘッダがちょっとだけ違うとかそんな程度であってソフト本体は違うものではないだろう。

では実際はというとどうも?をつけざるを得ない。 なんらかの機器をエミュレートしているというより単にCPUをエミュレートしているだけのようだからだ。
簡単に言ってしまえばWeb用に作ったJAVAアプリが、携帯電話のJAVAアプリとして動くか?というと当然NOであろう。
要するに結局手直ししてコンパイルし直す必要があるということになる。
これではC言語であろうがなんであろうが大差ないということになる。

Web用に作ったJAVAアプリは、そのWebブラウザがなんであろうと、その機械が例え8086系であろうとPowerPCであろうと共通には動くからそのメリットはもちろんある。
携帯電話のiアプリにおいてもその携帯電話のCPUがなんであろうともとりあえず動く。
何段階かにJAVAというVirtualMachineを定義しておいてくれればもう少しオブジェクトレベルの共通性とかを謳えたと思うのだがそれを避けたのはそれによる縛りのほうを怖れたのだろうか。

ソースとしてのJAVAコード

エミュレートするわけだから当然遅くなる。
そこでJAVAのコードをその機械のCPUが直接解釈できるコードに変換し直す、ということが行われているようだ。
JAVAの機械コードをいちいち変換して動かす(インタプリタに近い)から一度変換(コンパイル)してしまって動かそうという手法になる。
別の言い方をすればJAVAコードというのをソースファイルとみなして処理をしようという立場になる。
変換するのには時間がかかるのを嫌う場合は、これの中間のやりかたとして一度変換したものは覚えておいて2度目からは覚えていたのを実行する、という手法もある。

WindowsCE

さて、異なるCPUであっても同一のOS(類似したプラットホーム)が動いている場合、とあるプログラムを共通に動かしたい、と考えるケースはいくつかある。 このための方法論として現在2つの方法が具体的に存在している。
一つは今まで述べたVirtualMachineを想定する事。
もう一つはソースコードを公開、配布しそれぞれでコンパイルし直してもらう。これはUNIX流。
そういえばWindowsCEも同じような境遇にある。複数のCPUで共通のOSを載せると構想段階からあったはずだ。しかし上記方法のいずれもとらずにCPUごとのプログラム(オブジェクトコードの配布)という形を取った。
ある意味、実に堅実ではあるが実にユーザーの事を考えていない、中途半端な対応ではないかという疑念を持たずにいられない。
たとえばJornada680のプログラムはJornada680でしか動かない、ということを示唆しているようなものだからだ。つまり同じWindowsCE同士での互換性というものを軽視しているということにも繋がる。
例えばJornada680を今後5年なり継続して販売してくれれば良いのだがそんなことは期待できない事だ。もちろんJornada680に限った事ではなくほかのメーカー、機器でも同じ事である。
これは機器メーカーの責任ではなく間違いなくOSベンダーの責任問題でもある。
もちろんOSベンダーは採用したのは機器メーカーなのだからうちは知らない、というのであろう。確かにそんな無責任なOSを採用したほうも悪いが、いい加減なものを提示しているほうも悪い。
もっとも、過度な期待をWindowsCEにするほうが間違っているのかもしれない。
そもそもユーザーがWindowsCEのプログラミングをするのはOSベンダーとしては歓迎していなかったようだしそのあたりはWindows以下の意識であったのだろう。
なにしろWindowsNTのフルセット開発環境を揃えた上でさらに追加する、という開発環境の敷居の高さからそれは十分に窺い知れる。
WindowsCEというWindowsの名前に惑わされずに別物とはっきり意識する必要がある。
他の機種のソフトが使えればラッキーくらいの意識を持っていないといけないのだろう。
これはWindowsだからソフトは共通に使える、という幻想を持ってしまったユーザーサイドの問題でもあるからそのあたりの意識は切り替えないといけないのだろう。
残念ではあるが。

コラム一覧に戻る
トップページに戻る