【新・言語進化論】アレで使われている言語って何?
第4回:C++からJavaへ分散コンピューティング環境を移植した
著者:NTTデータ 渡辺 出
公開日:2007/11/22(木)
移植時に問題となる言語・ライブラリの違い
「第3回:cell computing βirthでハイビジョンアニメを作る」では、2007年11月15日にスタートした分散コンピューティングプロジェクト「デジタルハイビジョン環境における第3世代アニメーションの研究と実証(HD-Animation)」の概要として、システム環境とそこで使われているソフトウェアについて解説した。
このプロジェクトでは、もともとC++で記述されたクライアントをJavaに移植している。そのメリットとして前回の記事では、「マルチプラットフォーム」と「マシンアーキテクチャに依存しない関数精度・丸め誤差が保証できる」点をあげた。
今回は、筆者が実際にC++からJavaへの移植を行った際に遭遇した、それぞれの言語やライブラリの違いについて解説する。
マルチプラットフォーム対応したcell computing®
筆者が参加している分散コンピューティングプロジェクトとは「皆さんが持っているPCの余っている力を集め、膨大な計算能力を必要とする計算を行う」ことを目的としている。そのための手法として「cell computing®」という分散コンピューティング技術に取り組んでいる。
今回利用したソフトウェアは「Boinc(http://boinc.oocp.org/)」のクライアントソフトと、レンダリングツール「Aqsis(http://www.aqsis.org/)」の2つだ。これらのソフトウェアはもともとWindows版のもので、C++言語によって記述されていた。
これは「小さな力をたくさん集める」という分散コンピューティングのコンセプトに対して、使用可能な環境が限られるという点で問題となる。しかしJavaに移植することができればマルチプラットフォーム性を高められると考え、実際に移植作業を行うこととなった。
BoincのソースコードはLGPLで、AqsisのソースコードはGPLでそれぞれ公開されている。今回移植を行ったソフトウェアも移植元と同様のライセンス形態になっており、以下のURLよりダウンロードできるようになっている。
Javaに移植することによって、WindowsだけでなくLinuxやMac OS Xを組み合わせての分散コンピューティングを行うことができるようになる。これは「JVMの搭載された情報家電の力も利用する」といった将来像も考えた上での選択だ。
C++言語とJava言語の違いとして「JavaはC++と違ってメモリ管理の手間がない」ことや「Javaはマルチプラットフォーム対応だけど遅い」といった点があげられる。しかし実際に移植を開始したところ、それ以外の点でさまざまな違いを感じることとなった。
まずはじめに気になったのは「Generics」の問題だ。JDK 5.0からJavaにもGenericsが導入され、C++と同様に扱えるようになった。Genericsはアルゴリズムとデータを切り離して記述できることが特徴であり、C++やJava以外の言語でも採用されている。
では、Genericsの問題についてサンプルコードを基に説明しよう。 次のページ