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) { Listints = 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) { Liststrs = 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) { Listints = 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; } /**/
簡単ね。もうちょっとエレガントにできると良いかも。