- PR -

JAVAコンパイル

1
投稿者投稿内容
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-10-15 09:25
JAVAのプログラムをコンパイルするときにデバッグメッセージ的に入れたコードをコンパイル時に自動的にCLASSファイルには入れないようにできないかを考えています。(よくある、Cのコンパイラがプロダクション用のコンパイルをするときのように)今は、普通のJ2SDKのDOSのコンパイラか、netBeansのコンパイラを使用していますが、この2つともこの機能はなさそうで、自分で作るにはかなりの労力と月日を必要としてしまうので、どうにかできないものかと、考えています。

どなたか、このやり方をご存知ないですか?(初歩的な質問ですいませんが、よろしくお願いします。)
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2003-10-15 09:41
こんにちは。

私はいつも以下のようにしています。

class test{
private static final boolean DEBUG = true;



if(DEBUG)System.out.println("デバッグメッセージ");

DEBUGという定数を作って、trueのときはメッセージ出力がclassに埋め込まれますが、
falseのときはコンパイラの最適化で class にメッセージ出力のコードは入りません。
と、何かの本に書いてあったのでそのようにしています。


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-10-15 09:52
Java では C 言語でやるようにプリプロセッサでバイナリに出力されるコードを制御するようなことはあまりしません。むしろ状況に応じてコンパイルさせる必要がないよう実行時に与えるパラメータを残しておくのが習慣のようです。

Class ファイルレベルでコードが残っていても実行時には最適化されますので、JVM を信じてみてはいかがでしょうか?

例えば、Log4J のドキュメントでは JDK1.3.1 を AMD Duron 800Mhz で実行した場合にログを出力するかしないかの判別に 5 ナノ秒しかかからないとの記述があります。
http://jakarta.apache.org/log4j/docs/index.html

1ログメッセージ当たり 5ナノ秒(ログ出力しない場合)のために努力するよりは、再コンパイルなしでデバッグメッセージを出力できる柔軟性を選んだ方が良い、と判断されることが多いみたいです。Log4Jのドキュメントには他にもログ出力を最適化させるための考察がありますのでご参照されてはいかがでしょうか。

例えば、
log.debug("なんかのパラメータ:"+theValue);
と書くよりは、
if(debugEnabled){
log.debug("なんかのパラメータ:"+theValue);
}
というように、ログ出力が必要ない場合に引数部分を評価させないように工夫する余地があります。
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-10-15 09:56
引用:

begoodさんの書き込み (2003-10-15 09:25) より:

JAVAのプログラムをコンパイルするときにデバッグメッセージ的に入れたコードをコンパイル時に自動的にCLASSファイルには入れないようにできないかを考えています


コンパイルで何かをやるより、ロギングやassertを使った方が良いと思いますよ。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/logging/package-summary.html
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-10-15 11:12
unibon です。こんにちわ。

Java は言語仕様を簡単にするために、
あえて C のプリプロセッサに相当する機能を
標準化しなかったのだと思っています(憶測)。
多くの場合は、単にいわゆるデバッグフラグで制御すれば良いのですが、
でも、いくら、最適化されるとか、ないのとおんなじにできる、
と言われても、やっぱり、ほんとうに全然ないものとしたいこともあります。
#今回はそこまで要求されていないのかもしれませんが。

で、そんなときは、自分でプリプロセッサに相当するものを作ってしまえば良いと思います。
じゃあ、そのようなプリプロセッサを Java に標準で備えておけば良かったのに、
となりますが、仕様としてあるいは単に慣習としてさえも、一旦、標準にしてしまうと、
各種 Java 関連のツールもそのプリプロセッサ用の記法をパースせねばならなくなるため、
やはり、標準で備えなかったのは正解だったと思っています。
rousi
会議室デビュー日: 2003/07/23
投稿数: 2
お住まい・勤務地: とーきょう
投稿日時: 2003-10-15 13:10
はじめまして、rousiと申します。
いつも覗いて勉強させていただいてます。

最初の書き込みの意図JAVAでというものからそれるかもしれませんが、
AspectJを使えばそれほど難しくなく可能かと思います。
AspectJについてご存じない方が多いかと思いますが、
私もまだ勉強中でうまく説明できる自信がありませんので、
本家のサイトを参照してください。
http://www.eclipse.org/aspectj/
日本語ですと、以前JAVA PressのVol28で特集されていたと思います。

Aspectのコード中で、ログやデバッグを行うようにしておけば、
コンパイル時にそのAspectのコードを適用しないようにする
ことが可能ですので,目的のClassファイルに余分なものが入り込むことは
ないとおもいます。


[ メッセージ編集済み 編集者: rousi 編集日時 2003-10-15 14:53 ]
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2003-10-15 14:11
cygwin の C プリプロセッサで #define や #ifdef〜#endif などなどふつーに使用できますよ。
begood
ベテラン
会議室デビュー日: 2003/09/12
投稿数: 97
お住まい・勤務地: とうきょー
投稿日時: 2003-10-16 02:10
情報ありがとうございます。色々な方法がありますね。個人的にはif(DEBUG)が手っ取りはやくて、便利そうに感じました。確かに、JVMを信用するようにします。(というよりも、JVMで最適化されるのを、知りませんでした。あまりにも初歩的で、すいません。)
1

スキルアップ/キャリアアップ(JOB@IT)