Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > Можно программу на Java в gcc компилить?


Автор: Dray 16.2.2006, 01:44
Слышал можно Java код на gcc в Линуксе компилировать. Правда это?

Автор: tux 16.2.2006, 02:37
Сущая правда - http://gcc.gnu.org/java/.
Может компилить исходники не только в байт-код, но и непосредственно в машинный код процессора и преобразовывать байт-код в машинный код.

Автор: batigoal 16.2.2006, 09:07
А есть ли смысл? Ведь официальный компилятор бесплатен.

Автор: 3,14 16.2.2006, 10:12
Компилить в машинный код клиентские приложения ещё как имеет, побыстрее работать будут

Автор: anonymouse 23.2.2006, 11:28
Не хочется тебя огорчать но это не совсем так. Виртуальные машины уже достаточно оптимизированы и компилирование в машинный код необходимо только в конкретных случаях.

Автор: erka 23.2.2006, 17:21
вообще странное приложение получается.я по крайней мере не могу сказать, что там только машинные кода. можете попробывать потестить.
вообще берем простой класс и в нем делаем в каком-то методе Class.forName().

Предположем так...
Код

/**
 * @author <a href="mailto:[email protected]">erka</a>
 * @version 0.1
 */
public class Test {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("TestLoad");
            Object object = clazz.newInstance();
            System.out.println(object.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

Компилим с помощью gcj. (gcj --main=Start -o someName.exe Test.java ). получаем someName.exe

берем второй класс, например
Код

/**
 * @author <a href="mailto:[email protected]">erka</a>
 * @version 0.1
 */
public class TestLoad {

    public String toString() {
        return "Hello world!";
    }
}



Компилим это нашим javac, получаем TestLoad.class

в одной папке собираем TestLoad.class,someName.exe и dll, которые нужны (смотря чем компилить).

запускаем someName.exe и что получается ?

У меня на Windows + gcj 3.4.5 c mingw - "Hello world". Какой тут машинный код спрашивается?



Автор: LSD 23.2.2006, 17:48
Не знаю как GCJ, но Jet Excelsior поддерживает динамическую загрузку классов, и компиляцию их прям во время исполнения.
1. Попробуй запустить приложение на голой системе без JRE.
2. Попробуй вместо константы вставить туда скажем args[0].

Автор: Бонифаций 23.2.2006, 18:54
Цитата(erka @ 23.2.2006, 17:21 Найти цитируемый пост)
Компилим это нашим javac, получаем TestLoad.class

в одной папке собираем TestLoad.class,someName.exe и dll, которые нужны (смотря чем компилить).

запускаем someName.exe и что получается ?

У меня на Windows + gcj 3.4.5 c mingw - "Hello world". Какой тут машинный код спрашивается?


На самом деле gcj в библиотеках содержит и байт-интерпретатор тоже (написанный Kresten Krab Thorup). Так что если вы используете Class.forName(), байт-интерпретатор будет прилинкован к вашей программе. Если не используете, ваша программа будет чистый машинный код.

Кстати, при использовании Class.forName ваш .exe файл сначала ищет .dll с подходящим именем, и только если не находит, то грузит .class файл и интерпретирует байт код.

Проблема gcj в том, что по языку она примерно на уровне jdk1.3. Новый фич нет.

Автор: 3,14 26.2.2006, 13:04
Цитата(anonymouse @ 23.2.2006, 11:28 Найти цитируемый пост)
Не хочется тебя огорчать но это не совсем так. Виртуальные машины уже достаточно оптимизированы и компилирование в машинный код необходимо только в конкретных случаях.

Ну GUI в java, например, работает, мягко говоря, не очень быстро.

Автор: anonymouse 27.2.2006, 11:16
Цитата

Ну GUI в java, например, работает, мягко говоря, не очень быстро.


Тут даже не заню что сказать с одной стороны зависит от того как писать, но с другой стороны у самого осталась оссоциация java и медленного гуи. Может всетаки виноват свинг ? И неужели откомпилированная в машинный код программа начинает заметно быстрее работать с гуи ?



Автор: LSD 27.2.2006, 11:24
Цитата(anonymouse @ 27.2.2006, 11:16 Найти цитируемый пост)
И неужели откомпилированная в машинный код программа начинает заметно быстрее работать с гуи ?

По моему опыту, нет.

Автор: Бонифаций 27.2.2006, 11:26
гуй гую рознь. Тот же swt весьма шустро работает в явовских программах. По крайней мере визуально от сишных программ по скорости не отличить

Автор: LSD 27.2.2006, 11:28
Зато глючит, я например в одной SWT-шной программе регулярно наблюдаю десктоп сквозь главное окно.

Автор: sergejzr 27.2.2006, 11:33
Цитата(anonymouse @ 23.2.2006, 09:28 Найти цитируемый пост)
Не хочется тебя огорчать но это не совсем так. Виртуальные машины уже достаточно оптимизированы и компилирование в машинный код необходимо только в конкретных случаях.


Цитата(3 @ 14, 26.2.2006, 11:04 Найти цитируемый пост)
Ну GUI в java, например, работает, мягко говоря, не очень быстро.


И первое верно и второе верно. Java код работает очень шустро. Единственный недостаток - медленный ГУИ (но это только под виндой кстати). Думаю медленность ГУИ связана с кроссплатформенностью. Вон SWT например - летает. А на процессорах > 3 гигагерц и свинг летает smile

Вообще скорость ГУИ от байткод/нативный-код мало зависит. Те же самые вызовы АПИ. GCJ линкует сборщика мусора (при компиляции там тоже можно кое какие опции выставить), в остальном - тотже exe, что и с++.
По моему личному опыту по скорости что gcj скоппованная, что javac - проги не отличаются. Но на линуксе "нормальный" javac намного удобнее конечно из за кроссплатформенности.
Смысл gcj же вижу только для того, чтобы поиграть.
Добавлено @ 11:36
PS:
JAV исты зря в ГУИ полезли вообщето. ИМХО именно этим JAVA себе "славу" медленности заработала. Иначе возможно она была бы намного распространённее для консольных приложений, библиотек и что немаловажно - серверов. Потому что по всем параметрам кроме ГУЙ она перегоняет многие языки по скорости и удобству.

Автор: Бонифаций 27.2.2006, 11:41


Цитата(sergej.z @ 27.2.2006, 11:33 Найти цитируемый пост)
Смысл gcj же вижу только для того, чтобы поиграть.


1) иногда удобно 1 выполняемый файл иметь. Без необходиомсти ставить jre
2) в gcj более тесная интеграция с всеми gcc-шными языками.
3) скорость скомпилированной программы сопоставимая с jre, но все-таки выше. В тех случаях когда это критично, имеет смысл рассмотреть альтернативу.




Автор: sergejzr 27.2.2006, 11:53
Цитата(Бонифаций @ 27.2.2006, 09:41 Найти цитируемый пост)
1) иногда удобно 1 выполняемый файл иметь. Без необходиомсти ставить jre
2) в gcj более тесная интеграция с всеми gcc-шными языками.
3) скорость скомпилированной программы сопоставимая с jre, но все-таки выше. В тех случаях когда это критично, имеет смысл рассмотреть альтернативу.

1) Да, но например на линях везде и так стоит JAVA, а на винде gcj скомпиленная прога тоже не пойдёт без cygwin'a и соотв. библиотек (GTK например). Также один jar по удобству ничуть не хуже exe.
2) А что это даёт JAVA - программисту? Какие нибудь особенные преимущества?
3) Вот это можно было бы проверить. Как там консольные приложения против графических себя ведут итд. У нас даже раздел есть "наши тесты".

Вообще при современном железе разница в скорости байт/натив должна быть совсем незначительной. Настолько, что практического применения этому мизерному преимуществу в скорости не должно быть. Но это конечно надо проверить..

Автор: erka 27.2.2006, 11:58
Кстати, раз уж вспомнили о Swing. Кто-то тестил Java 6 + Swing?

Автор: Бонифаций 27.2.2006, 12:09
на лиунксах мягко скажем такой зоопарк, что надеяться на поставленную java не приходится. Это может быть линк на kaffe (который совместим лишь частично) или на ту же gcj, Кроме того не все java программы работают на любых (даже сановских) jre. К примеру geronimo не переваривает 1.5, зато все шоколадно с 1.4.2, так что все равно приходится ставит jre которая нужна.

gcj на windows обычно на основе mingw, и соотвественно не нужны ему никакие cygwin dll для работы. Один .exe файл. Все остальное линкуется статически


Автор: batigoal 27.2.2006, 12:59
Цитата(sergej.z @ 27.2.2006, 12:53 Найти цитируемый пост)
Вообще при современном железе разница в скорости байт/натив должна быть совсем незначительной.

К слову, в JVM встроен JIT-компилятор, преобразующий программу при первом обращении в нативный код, и по умолчанию он включен (это не значит, конечно, что преобразование будет сделано обязательно).

Автор: sergejzr 4.3.2006, 03:45
Цитата(Бонифаций @ 27.2.2006, 10:09 Найти цитируемый пост)
gcj на windows обычно на основе mingw, и соотвественно не нужны ему никакие cygwin dll для работы. Один .exe файл. Все остальное линкуется статически

Это верно для консольного приложения. Для графики потребуются доп. библиотеки. Во всяком случае мне не удалось создать независимое приложение. Если у Вас получится, поделитесь пожалуйста опытом и ексешкой smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)