iモード携帯電話用Java(iアプリ) Part9
>>575 プリプロセッサの有用性を否定するつもりはないけど、
>#ifdef _DEBUG
>#define debug(x) System.out.println(x)
>#else
>#define debug(x)
>#endif
このような条件付コンパイルのためにJavaの言語仕様上
次の3点がわざわざ規定されているからプリプロセッサの優位性の
例としては不適切。
1. プリミティブ定数のコンパイル時解決
2. まさに条件付コンパイルに使えるよう1.を行った際のifブロックでの
到達不能性チェックに例外を設ける。
3. 2.によってリリースコードでコードの増加がないようコードの省略を
コンパイル時の最適化に要求。
3.はmustではないけど、1+2をわざわざ条件付コンパイルのために考慮
したこともあってSunやIBMのコンパイラではまず間違いなく実装されている。
プリプロセッサの例としてはmaxやminをマクロで定義したいとか
そういうほうが適切だよね。
577 :
576:2005/10/05(水) 15:38:02
ごめん、575をちゃんと読んでなかった。defineの切り分けだから
まさにプリプロセッサの領分だね。
>>577 単に定数の切り替えだけって意味ならプリプロセス便利だけど、
575の例が意図してるデバッグコードの差込なら、576が書いてる理由でプリプロセッサは不要。
>>573 いつから浮動小数点演算が実装されたんだ?
>>570 DoJaのバージョン次第。505以降(DoJa3.0)の機種なら
オプションAPIながら全機種正常動作する。
ただ機種によっては同じクラス内のもので遅いとの報告があり
>>433 自作した方が速度的に無難。
個人的にはsinテーブル作成時のみ使用してるけどな起動時に。
>>579 ちなみにcom.nttdocomo.opt.ui.j3d.Mathのcosとsinは
どっちも浮動小数点には関係ない。どっちもint数値。
平方根も自作した方が無難?
>>576 ものすごく詳しく話を聞きたい。
1についてだが、final static intを使ってもjarのサイズが増えるんだが、これは違う?
2と3だが、少なくともドコモエミュでコンパイルする際「使ってないメソッド」すら省略してくれないんだが、何か手があるの?
>>579 sin/cosのような小数点が絡むものは、1.0を4096として実装されてるんですよん。
>>582 固定小数クラスはググレば見つかるよ。
sqrt自作は俺には無理だったんでネットで見つけた実装をパクったw
sinはテイラー展開で意外とかんたんに実装できるぞ。sin作れればcosはいらんし。
クラスサイズ的に自作が良いかオプションAPIをインポートするのが良いかは検証してないので知らん。
>>583 俺もその辺興味ある。Javaコンパイラの実装については明るくないので。。。
携帯の場合JDK1.3推奨なわけだが、それでも
>>576のいうような賢いコンパイルってやってくれるのかな?
1+1+1+1+1すら最適化しない
それがドコモクオリティー
>>583 メソッドの省略はまた別の話。
#クラスのバイナリ互換性も絡むし。IBMの製品では明示的に省略するオプションあったけど。
576でいっているのはこういう最適化のこと。
$ cat Test.java
public class Test {
private static final boolean DEBUG = false;
public static void main(String[] args){
if(DEBUG){
System.err.println("debug");
}
}
}
$ javac -g:none Test.java
$ javap -c Test
Compiled from null
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
}
>>584 該当する仕様自体はJava2が出来たときには含まれていたから1.3のコンパイラ
でも状況は変わらないんじゃないかな。少なくともIBMの1.3.1では実装されていた。
ほー。それ削ってくれるんですか。いいな。
でもstatic final booleanが容量食うのが嫌ね…。
プリプロセッサの効能としては、あとは#includeが使えるところがいいかな。
>>587 そのような心配があるときは
$ cat Const.java
class Const {
static final boolean DEBUG = false;
}
$ cat Test.java
public class Test {
public static void main(String[] args){
if(Const.DEBUG){
System.err.println("debug");
}
}
}
のように別ファイルに切り分ける。576のルール1によって定数は
コンパイル時に解決されているから、実行時にConst.classが存在
しなくても実行できる。このように1.はバイナリ互換性を乱すものだけど
必要なものとして規格に入っている。