J2SE 1.5 いいじゃないか。

追記: jdk-5.0 beta2 でも試してみました。 http://d.hatena.ne.jp/shinichiro_h/20040704#p1

i@u ~/test/java> swjava                                       ~/test/java 13:15
i@u ~/test/java> java -version                                ~/test/java 13:15
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
i@u ~/test/java> swjava go                                    ~/test/java 13:15
i@u ~/test/java> java -version                                ~/test/java 13:15
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b31)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b31, mixed mode)

OK。

i@u ~/test/java> cat Generics.java                            ~/test/java 13:15
import java.util.List;
import java.util.ArrayList;

public class Generics {
    public static void main(String[] args) {
        List ints = new ArrayList();
        ints.add(1);
        System.out.println(ints.get(0));
    }
}

こんなソースをコンパイル。(ほぼパクリ)

i@u ~/test/java> time javac -classpath j15 -source 1.5 -target 1.4 Generics.java
注: * は推奨されない API を使用またはオーバーライドしています。
注: 詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてくだ さい。
注: 入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてくださ い。
javac -classpath j15 -source 1.5 -target 1.4 Generics.java  19.48s user 0.72s system 64% cpu 31.541 total

コンパイルおそい。あとオプションがヘンだけど気にしない。で、実行。

i@u ~/test/java> java -cp . Generics                          ~/test/java 13:19
1

OK。

i@u ~/test/java> swjava                                       ~/test/java 13:22
i@u ~/test/java> java -version                                ~/test/java 13:22
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
i@u ~/test/java> java -cp . Generics                          ~/test/java 13:22
Exception in thread "main" java.lang.NoSuchMethodError: java.lang.Integer.valueOf(I)Ljava/lang/Integer;
        at Generics.main(Generics.java:7)

ダメでした…どうも auto boxing が悪いね。ついでに拡張 for も試して次のソース。

i@u ~/test/java> cat Generics2.java                           ~/test/java 13:27
import java.util.List;
import java.util.ArrayList;

public class Generics2 {
        public static void main(String[] args) {
                List strs = new ArrayList();
                strs.add("abc");
                for (String s : strs) {
                        System.out.println(s);
                }
        }
}

ますますパクリ。

i@u ~/test/java> swjava go                                    ~/test/java 13:25
i@u ~/test/java> javac -classpath j15 -source 1.5 -target 1.4 Generics2.java
注: * は推奨されない API を使用またはオーバーライドしています。
注: 詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてくだ
さい。
注: 入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてくださ
い。
i@u ~/test/java> swjava                                       ~/test/java 13:26
i@u ~/test/java> java -cp . Generics2                         ~/test/java 13:26
abc

おっけー。unboxing の方は悪くないのかをチェック。

i@u ~/test/java> cat Generics3.java                           ~/test/java 13:34
import java.util.List;
import java.util.ArrayList;

public class Generics3 {
    public static void main(String[] args) {
        List ints = new ArrayList();
        ints.add(new Integer(1));
        int i = ints.get(0);     // unboxing が悪けりゃここで止まる
        System.out.println(i);

        ints.add(2);             // boxing が悪けりゃここで止まる
    }
}
i@u ~/test/java> swjava go                                    ~/test/java 13:36
i@u ~/test/java> javac -classpath j15 -source 1.5 -target 1.4 Generics3.java
注: * は推奨されない API を使用またはオーバーライドしています。
注: 詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてくだ さい。
注: 入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてくださ い。
i@u ~/test/java> swjava                                       ~/test/java 13:36
i@u ~/test/java> java -cp . Generics3                         ~/test/java 13:36
1
Exception in thread "main" java.lang.NoSuchMethodError: java.lang.Integer.valueOf(I)Ljava/lang/Integer;
        at Generics3.main(Generics3.java:11)

おっけー。boxing さえしなけりゃ大丈夫。

これだけだと意味不明なメモなので、補足。

  • とりあえず swjava というコマンドを作った。これは引数付きで呼ぶと 1.5.0 環境に、無しで呼ぶと 1.4.1 環境になる。
  • 確か VM の仕様に変更は無いと聞いた記憶があったので、Java 1.5 でコンパイルJava 1.4.1 で実行ができるかどうかを調べたくなった。
  • 結論として、 Generics, unboxing, 拡張 for は問題無い、でも boxing だけは 1.5 の Integer を必要とするみたい。
  • Java よくわかんない && ロクに調べず実験した ので以上の記述に自信は微塵も無し。
  • Enum はどうなんだろ。
  • これでロボット書く気が。

追記: ↑キーワード多すぎ。140個以上ありまっせ…

C99 and D

問題。

i@u ~/test/d> diff comment.c comment.d                           ~/test/d 21:47
i@u ~/test/d> gcc -o comment comment.c                           ~/test/d 21:48
i@u ~/test/d> ./comment                                          ~/test/d 21:48
it's c code
i@u ~/test/d> dmd comment.d                                      ~/test/d 21:48
gcc comment.o -o comment -lphobos -lpthread -lm
i@u ~/test/d> ./comment                                          ~/test/d 21:48
it's d code

答え。

int dummy = 1/+1;
int main() {
  printf("it's c code\n");
  return 0;
}
/*
 +/;
int main() {
  printf("it's d code\n");
  return 0;
}
/**/

簡単ね。もうちょっとエレガントにできると良いかも。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h