Здравствуйте, Blazkowicz, Вы писали:
C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>Или я что-то не то читал?
Здравствуйте, artgonch, Вы писали:
A>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Да уж вроде обсуждалось и не раз.
Можно поискать тут
Здравствуйте, Cider, Вы писали:
C>Именно, но насчет компиляции вместо интерпретации — это не совсем так. C>Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.
Вот пока какую-нибудь лажу не запостишь, ничего интересного и не узнаешь...
Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Здравствуйте, DrZubr, Вы писали:
A>>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
DZ>Да уж вроде обсуждалось и не раз. DZ>Можно поискать тут
А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler".
Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
Здравствуйте, Blazkowicz, Вы писали:
B>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
JIT compiler — это не совсем то, он компиляет код во время исполнения.
Здравствуйте, Cider, Вы писали:
B>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
C>JIT compiler — это не совсем то, он компиляет код во время исполнения.
А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его...
Или я что-то не то читал?
Здравствуйте, m.a.g., Вы писали:
C>>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>>Или я что-то не то читал?
MAG>Ага, только этот код теряется после выполнения.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Cider, Вы писали:
B>>>А пока поисковая система RSDN занята, можно поискать на гугле по ключевым словам "Java JIT Compiler". B>>>Кроме этого очень легко сделать самому дистрибутив, включающий JRE. И exe файл к нему, который будет просто запускать ява-машину с нужными аргументами.
C>>JIT compiler — это не совсем то, он компиляет код во время исполнения.
B>А я где-то прочитал, что он компиляет байткод в нативный, вместо того чтобы интерпретировать его... B>Или я что-то не то читал?
Он компилит его, но только в тот момент, когда класс запрашивается первый раз. Как я понял человеку нужно откомпилировать класс до момента его первого использования.
Здравствуйте, Blazkowicz, Вы писали:
B>Значит это только борьба за производительность...
Именно, но насчет компиляции вместо интерпретации — это не совсем так.
Машина исполняет байт-код и при этом его анализирует (точнее перед этим), если попадается кусок кода, который можно откомпилировать с существенным выигрышем в производительности (цикл, например), она это делает... Т.е. jit компилятор является ее частью. И он не компилит весь код, только его часть.
Здравствуйте, artgonch, Вы писали:
A>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
Это делается через JNI.
Я вытащил оттуда примерчик кода на С, который в свою очередь тащит код на JAVA
Это на С:
#include <jni.h>
#ifdef _WIN32
#define PATH_SEPARATOR ';'#else/* UNIX */#define PATH_SEPARATOR ':'#endif
#define USER_CLASSPATH "."/* where Prog.class is */
main() {
JNIEnv *env;
JavaVM *jvm;
JDK1_1InitArgs vm_args;
jint res;
jclass cls;
jmethodID mid;
jstring jstr;
jobjectArray args;
char classpath[1024];
/* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the end of default system class path */
sprintf(classpath, "%s%c%s",
vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
vm_args.classpath = classpath;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
if (res < 0) {
fprintf(stderr, "Can't create Java VM\n");
exit(1);
}
cls = (*env)->FindClass(env, "Prog");
if (cls == 0) {
fprintf(stderr, "Can't find Prog class\n");
exit(1);
}
mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
if (mid == 0) {
fprintf(stderr, "Can't find Prog.main\n");
exit(1);
}
jstr = (*env)->NewStringUTF(env, " from C!");
if (jstr == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
args = (*env)->NewObjectArray(env, 1,
(*env)->FindClass(env, "java/lang/String"), jstr);
if (args == 0) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
(*env)->CallStaticVoidMethod(env, cls, mid, args);
(*jvm)->DestroyJavaVM(jvm);
}
А вот то, что он вызывает
public class Prog {
public static void main(String[] args) {
System.out.println("Hello World" + args[0]);
}
}
Гарантировать, что это работает не могу — у меня нет компилятора на машине. Но я помню, что по этому коду я разбирался и реально все работало.
Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?
Здравствуйте, AnSa, Вы писали:
AS>Здравствуйте, artgonch, Вы писали:
A>>Подскажите, пожалуйста, как можно сделать для Java-программы исполняемый файл (я знаю, что на самом деле все равно работает исполнительная среда, но хотелось бы, чтобы пользователь не искал bat-файлы, а мог запускать привычне экзешники)? Заранее спасибо.
AS>Это делается через JNI. AS>Я вытащил оттуда примерчик кода на С, который в свою очередь тащит код на JAVA
AS>Это на С:
AS>
AS>#include <jni.h>
AS>#ifdef _WIN32
AS>#define PATH_SEPARATOR ';'
AS>#else/* UNIX */
AS>#define PATH_SEPARATOR ':'
AS>#endif
AS>#define USER_CLASSPATH "."/* where Prog.class is */
AS>main() {
AS> JNIEnv *env;
AS> JavaVM *jvm;
AS> JDK1_1InitArgs vm_args;
AS> jint res;
AS> jclass cls;
AS> jmethodID mid;
AS> jstring jstr;
AS> jobjectArray args;
AS> char classpath[1024];
AS> /* IMPORTANT: specify vm_args version # if you use JDK1.1.2 and beyond */
AS> vm_args.version = 0x00010001;
AS> JNI_GetDefaultJavaVMInitArgs(&vm_args);
AS> /* Append USER_CLASSPATH to the end of default system class path */
AS> sprintf(classpath, "%s%c%s",
AS> vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
AS> vm_args.classpath = classpath;
AS> /* Create the Java VM */
AS> res = JNI_CreateJavaVM(&jvm,&env,&vm_args);
AS> if (res < 0) {
AS> fprintf(stderr, "Can't create Java VM\n");
AS> exit(1);
AS> }
AS> cls = (*env)->FindClass(env, "Prog");
AS> if (cls == 0) {
AS> fprintf(stderr, "Can't find Prog class\n");
AS> exit(1);
AS> }
AS> mid = (*env)->GetStaticMethodID(env, cls, "main", "([Ljava/lang/String;)V");
AS> if (mid == 0) {
AS> fprintf(stderr, "Can't find Prog.main\n");
AS> exit(1);
AS> }
AS> jstr = (*env)->NewStringUTF(env, " from C!");
AS> if (jstr == 0) {
AS> fprintf(stderr, "Out of memory\n");
AS> exit(1);
AS> }
AS> args = (*env)->NewObjectArray(env, 1,
AS> (*env)->FindClass(env, "java/lang/String"), jstr);
AS> if (args == 0) {
AS> fprintf(stderr, "Out of memory\n");
AS> exit(1);
AS> }
AS> (*env)->CallStaticVoidMethod(env, cls, mid, args);
AS> (*jvm)->DestroyJavaVM(jvm);
AS>}
AS>
AS>А вот то, что он вызывает
AS>
AS>public class Prog {
AS> public static void main(String[] args) {
AS> System.out.println("Hello World" + args[0]);
AS> }
AS>}
AS>
AS>Гарантировать, что это работает не могу — у меня нет компилятора на машине. Но я помню, что по этому коду я разбирался и реально все работало.
AS>Плюс сама ссылочка на документацию здесь
Интересно, кто-нибудь пробовал данный код?
Если да, то пожалуйста поделитесь впечатлениями.
У меня j2sdk1.4.2_07 и VC++6.0 и почему-то не работает, JNI_CreateJavaVM всегда возвращает -1.
Здравствуйте, artgonch, Вы писали:
A>Да вы меня не совсем правильно поняли! Мне не нужен JIT, не нужен исполняемый файл со встроенной JRE. Мне нужнен просто маленький исполняемый файл, который бы вызывал JRE и передавал ей мой главный класс. Вот и все. Ведь так и работают JDeveloper, JBuilder, NetBeans! Как это сделано?