TOPシステム開発> 【新・言語進化論】アレで使われている言語って何?> 第4回:C++からJavaへ分散コンピューティング環境を移植した (2/3)

【新・言語進化論】アレで使われている言語って何?

【新・言語進化論】アレで使われている言語って何?

第4回:C++からJavaへ分散コンピューティング環境を移植した

著者:NTTデータ 渡辺 出

公開日:2007/11/22(木)

サンプルコードで見るC++とJavaの違い

簡単な例を用いてGenericsの使用例を説明する。Genericsが導入される以前のJavaでは、コレクションを利用する場合、追加したオブジェクトを取り出す時にキャストを行う必要があった(リスト1)。

このため、取り出す際のキャストの型指定を間違えてしまうと正しくプログラムを動作させることができなくなってしまう。またこのエラーは実行時にエラーとなって検出される。

JDK 5.0以降では、導入されたGenericsを用いることで上記のコードをリスト2のように書くことができる。

これにより、もしキャストミスがあった場合でもエラーをコンパイル時に検出することができ、実行前にエラーを修正することが可能になる。また使用前にキャストをする必要がなくなるためコードの量も減ることになる。

C++のGenericsの書き方もJavaのGenericsの書き方もほぼ同様であり、オリジナルソフトウェアのC++で記述されたソースコードを眺めていた時点で筆者は「Genericsに関する問題は特になさそうだ」と判断していた。

しかし、実際にコードを書いて検証をしたところ、C++言語では問題ないものでもJavaでは同様に記述できない箇所があることがわかったのだ。リスト3およびリスト4が、非常に簡略化した形での比較サンプルコードだ。

リスト1:sampleコード(Java Generics導入前)
ArrayList array = new Arraylist();
array.add(new String("Hello world")); //Stringオブジェクトを追加
String test = (String)array.get(0); //Stringにキャストしてから取り出す

リスト2:sampleコード(Java Generics導入後)
ArrayList<String> array = new ArrayList<String>(); //コレクションの要素がStringである、と宣言
array.add(new String("Hello world"));
String test = array.get(0); //キャストせずにStringオブジェクトとして取り出せる

リスト3:sampleコード(C++)
template <class T>
class TestClass
{
   void testMethod(){
      T obj = new T(); //C++だとOK
   }
}

リスト4:sampleコード(Java)
class TestClass<T>
{
   void testMethod(){
      T obj = new T(); //JavaだとNG
   }
}

リスト5:sampleコード(C++)
template <class T>
class TestClass
{
   std::vector<T> vector;
(省略)

   void problemMethod(){
      vector.resize(10); //この部分で問題発生
   }
}

具体的な例としてあげられる問題が「Genericsのインスタンス化」である。C++言語ではGenericsで型パラメータのコンストラクタを呼び出すことができるため、指定された型パラメータをインスタンス化することが可能だ。

例えば、GenericsにTという型パラメータが指定されていた場合には「T obj = new T();」と記述することができる。しかしJavaで同様なコードを記述すると、コンパイル時にエラーとなってしまう。これはJavaの言語仕様からくる違いだ。なお、Javaの言語仕様については「プロの言語仕様の読み方」を参照していただきたい。

これはJDK 5.0からGenericsをJavaに実装した際に、コンパイラの中で実装できる手段で後方互換性を保つように拡張した結果、このような制約が生まれてしまったようだ。このような言語仕様の制約のため、今回の移植にあたり、筆者は別の記述方法を選択せざるを得なかった。

このことは次のページで紹介するライブラリの挙動の違いを吸収する際に大きな問題となった。次ページではC++とJavaでのライブラリの挙動の違いについて簡単な例を用いながら紹介する。

次ページでは、単純にJavaへ移植したもの、そして実際に実装した部分からの抜粋を紹介する。 次のページ




株式会社NTTデータ 渡辺 出
著者プロフィール
株式会社NTTデータ 渡辺 出
技術開発本部 SIアーキテクチャ開発センタ所属。入社以来cell computing®の研究開発に従事。これまでにcell computing®クライアントやCGプロジェクトで利用するレンダラをリリースした。アジャイル開発手法を取り入れ、主にJavaを使用した開発を行っている。


INDEX
第4回:C++からJavaへ分散コンピューティング環境を移植した
  移植時に問題となる言語・ライブラリの違い
サンプルコードで見るC++とJavaの違い
  実装したコードとライブラリの問題