iモード携帯電話用Java(iアプリ) Part9

このエントリーをはてなブックマークに追加
576デフォルトの名無しさん
>>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をマクロで定義したいとか
そういうほうが適切だよね。
577576:2005/10/05(水) 15:38:02
ごめん、575をちゃんと読んでなかった。defineの切り分けだから
まさにプリプロセッサの領分だね。
578デフォルトの名無しさん:2005/10/05(水) 15:47:36
>>577 単に定数の切り替えだけって意味ならプリプロセス便利だけど、
575の例が意図してるデバッグコードの差込なら、576が書いてる理由でプリプロセッサは不要。
579デフォルトの名無しさん:2005/10/05(水) 17:30:01
>>573
いつから浮動小数点演算が実装されたんだ?
580デフォルトの名無しさん:2005/10/05(水) 17:35:28
581デフォルトの名無しさん:2005/10/05(水) 18:02:05
>>570
DoJaのバージョン次第。505以降(DoJa3.0)の機種なら
オプションAPIながら全機種正常動作する。
ただ機種によっては同じクラス内のもので遅いとの報告があり>>433
自作した方が速度的に無難。
個人的にはsinテーブル作成時のみ使用してるけどな起動時に。

>>579
ちなみにcom.nttdocomo.opt.ui.j3d.Mathのcosとsinは
どっちも浮動小数点には関係ない。どっちもint数値。
582デフォルトの名無しさん:2005/10/05(水) 18:34:00
平方根も自作した方が無難?
583デフォルトの名無しさん:2005/10/05(水) 20:06:45
>>576
ものすごく詳しく話を聞きたい。
1についてだが、final static intを使ってもjarのサイズが増えるんだが、これは違う?
2と3だが、少なくともドコモエミュでコンパイルする際「使ってないメソッド」すら省略してくれないんだが、何か手があるの?


>>579
sin/cosのような小数点が絡むものは、1.0を4096として実装されてるんですよん。
584デフォルトの名無しさん:2005/10/05(水) 21:13:22
>>582 固定小数クラスはググレば見つかるよ。
sqrt自作は俺には無理だったんでネットで見つけた実装をパクったw
sinはテイラー展開で意外とかんたんに実装できるぞ。sin作れればcosはいらんし。

クラスサイズ的に自作が良いかオプションAPIをインポートするのが良いかは検証してないので知らん。

>>583 俺もその辺興味ある。Javaコンパイラの実装については明るくないので。。。
携帯の場合JDK1.3推奨なわけだが、それでも>>576のいうような賢いコンパイルってやってくれるのかな?
585デフォルトの名無しさん:2005/10/05(水) 21:32:31
1+1+1+1+1すら最適化しない
それがドコモクオリティー
586デフォルトの名無しさん:2005/10/05(水) 21:56:48
>>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では実装されていた。
587デフォルトの名無しさん:2005/10/05(水) 22:33:05
ほー。それ削ってくれるんですか。いいな。
でもstatic final booleanが容量食うのが嫌ね…。

プリプロセッサの効能としては、あとは#includeが使えるところがいいかな。
588デフォルトの名無しさん:2005/10/05(水) 22:51:10
>>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.はバイナリ互換性を乱すものだけど
必要なものとして規格に入っている。