Q 質問 Visual Studio .NETでJava言語を使ったアプリケーション開発が可能になったと聞きました。既存のJavaとどう異なりますか?また,Javaアプリケーションを移行する場合の注意点を教えて下さい。

A 回答 APIが大きく異なります。移行ツールを使用しても,修正や動作確認が必要です。移行メリットは少ないでしょう。


 Java言語処理系のVisual J# .NET(以降J#)は,2002年に米Microsoftが開発環境Visual Studio .NET(VS.NET)のアドオン・ソフトとして出荷しました(図1[拡大表示])。マイクロソフトのJ#のサイト(http://www.microsoft.com/japan/msdn/vjsharp/)からの無償ダウンロードなどで入手可能です。J#は,Visual J++ 6.0の.NET対応版という位置付けで,Visual J++ 6.0同様,JDK(Java Development Kit)1.1.4を基にしています。一方,Javaは1998年にJ2SE(Java2 SDK, Standard Edition)1.2へバージョン・アップ,以降はJava2と呼ばれています。

 動作環境は似て非なるものです(図2[拡大表示])。どちらも,ソース・コードをコンパイルして中間コードを生成,クラス・ライブラリやランタイムなどから成る実行環境上で動作します。Javaでは,Javaバイトコードという中間コードを生成し,JavaVM(Java VirtualMachine)という実行環境が必要です。同様に,J#ではMSIL(Microsoft Intermediate Language)という中間コードを生成し,CLR(Common Language Runtime:共通言語ランタイム)という実行環境が必要です。ただし,それぞれの中間コードと実行環境は非互換のため,JavaバイトコードをそのままCLRで動かすことはできません。

図1●JavaとJ#の歴史
Javaの現在の主流はJava2。J#はJDK1.1.4をベースにしている
 
図2●JavaとJ#の動作環境
どちらも,ソース・コード-中間コード-実行環境(仮想マシン)の3層構造になっている

移行ツールを無償で提供

図3●3つの移行方法
移行ツールは無償で入手できる。ただし移行しても,JDKのバージョンなどが原因で,.NET環境で動作しないことがある。Java2のAPIを使用している部分の修正は必須だ

 既存のJavaアプリケーションを.NET環境へ移行する方法は3つあります(図3[拡大表示])。(1)Javaのソース・コードをJ#へコピーして,VS.NET上で再コンパイルする,(2)J#に同こんされているJBIMP.EXEで,JavaバイトコードをMSILへ変換する,(3)JLCA(Java Language Conversion Assistant)ツール(英語版のベータ2をJ#サイトから無償ダウンロード可能)で,Javaのソース・コードを,米Microsoftが提供するJavaに似た言語であるC#のソース・コードへ変換。その後,VS.NET上でコンパイルする――です。

 ただし,移行ツールを利用しても,アプリケーションの修正は必須です。JavaとJ#は,「文法は同じでも,使用するAPIは大きく異なる」(マイクロソフト デベロッパーマーケティング本部 デベロッパー製品部 Visual Studio .NET プロダクトマネジャー 渡邊忠典氏)ためです。

APIやクラス・ライブラリは別物

 つまり,“J#はJDK1.1.4をベースにした独自拡張クラス・ライブラリを持つため,Java2とJDK1.1.4の一部のAPIセットを利用できない”のです。具体的には,(1)SwingやAWTなどのJavaアプレットを使用できない,(2)Javaからネイティブ・コードを操作するJNI(Java Native Interface)が使用できないため,.NETではWindows OSのAPIを呼び出す「P-Invoke」を用いる,(3)メソッドの遠隔呼び出し技術であるRMI(Remote Method Invocation)が使用できないため,.NETではWebサービスやリモーティングを利用する,などです。

 企業システムではJ2EE(Java2 Platform, Enterprise Edition)をはじめJava2が多く利用されています。移行ツールを使用しても,利用するAPIの多くが変換できなければ,修正コストは高くなります。

 結論としては,JavaアプリケーションのJ#への移行は非常に困難であるといえます。現状では,「VS.NETの拡張ツールであるMobile Internet Toolkitを利用して,携帯電話の新規機種対応の保守開発コストを下げたい」など,現状のJavaアプリケーションが抱える問題を.NETの機能が解決する場合以外は,移行メリットは無いといえるでしょう。

 .NETが備えるWebサービスなどのクラス・ライブラリを利用するアプリケーションの新規開発であれば,C#を利用する方法もあります。

(本誌)