Java хоть куда: И даже в native! (Игры с GNU Compiler for Java)
Java 29.07.2008Здравствуйте, уважаемые.
Давно меня искушала мысль компилировать Java в native код. Выдалось свободное время для баловства. Долго ходил вокруг да около, не знал с какой стороны подступить. Домашняя страница http://gcc.gnu.org/java/ очень скудна на информацию.
С нее была ссылка на MinGW Уже лучше, оформление красивей, даты обновления более поздние, уже радует глаз.
Рыскал по сайту в поисках дистрибутива, отослали к http://sourceforge.net/projects/mingw/
Там наткнулся на автоматический инсталятор MinGW, здорово!
Мини детектив на этом закончился. Остальное - дело техники. В выборе инструментов добавляем галочку на установку Java Compiler.
GCJ нужна еще 1 библиотека, не поставляемая с MinGW - libiconv архив Binaries и Developer Files, потом просто распаковать в папку с установленным пакетом инструментов MinGW
Теперь у нас есть инструмент для компиляции программ!!!
Дальше идет всё описанное на этой странице
маленький класс
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String args[]) {
HashMap os = new HashMap();
os.put("Platon", "hello man!");
Iterator iterator = os.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry es = (Map.Entry)iterator.next();
System.out.println(es.getKey() + " => " + es.getValue());
}
}
}
И компилируем его
gcj --main=Test Test.java
Вуоля! 3.5 Мб exe файл без упаковки + 1Мб нагрузка libiconv2 Заметьте, стандарт Java 1.4. Конструкция foreach не работает
exe файл готов, только к нему нужно еще подогнать libiconv2.dll из архива libiconv-XXX-bin.zip
Попробовал сделать структурку посложнее:
import pack.PackagedClass;
public class Test {
public static void main(String args[]) {
System.out.println("This is a test.");
PackagedClass clazz = new PackagedClass();
System.out.println(clazz.getGreeting("Platon"));
System.out.println(clazz.getGreeting("GNU Compiler"));
}
}
package pack;
public class PackagedClass {
public String getGreeting(String name) {
return "Hello " + name + "!";
}
}
Увы, уже проблемы. Буду разбираться. Плюс нужно не забывать о jar библиотеках, которые уже готовы, как с ними работать и так далее. Был бы благодарен, если кто-нибудь поспособствовал.
Итак проведем некоторый ликбез по GCJ
1. При компиляции с помощью GCJ JVM не нужна (предположительно, потому что часть функционала, которая используется в программе встраивается в исполняемый файл, также туда сливается механизм сборки мусора)
2. GCJ бесплатен и распространяется по GPL. Для коммерческих целей используют Excelsior JET (Standard Edition которого стоит $1200)
3. Исполняемый файл GCJ в общей сложности получается 4.5Mb, Исполняемый файл Excelsior JET SE 5.2Mb
30.07.2008 в 09:53
Конечно, вепчатляет размер файла, компилируя текст в байткод получаем файлик в 1.4кб, а компилируя в exe получаем 4.5Мб - диссонанс.
30.07.2008 в 14:36
Platon: Про размер JRE не забывайте, сравнивать надо размер всех файлов, которые нужны для запуска приложения на другой машине.
http://www.excelsi
31.07.2008 в 09:29
Dmitry, к примеру мы копания, у которых есть постоянный клиент, закащывающий Desktop Applications. 1 раз мы ему продали ПО весом 16Мб - другой еще 16, и т.д. В то время, как сам байткод программы занимает 1.2Мб, другой - 1.3, итого 15Мб (JRE) + 2.5Мб (программки) vs 32Мб exe
Проще уж будет, действительно, установить 1 раз JRE и продавать ПО весом в 10+ раз меньше.
04.08.2008 в 11:49
Когда я интересовался этим вопросом, мне многие говорили, что суть Java как раз в установке JRE на машину заказчика. Ибо переносимость.
А натив штука тонкая. На одной машине заработает, а на другой нет.
Как бы там ни было, спасибо за науку
04.08.2008 в 13:45
Меня смущало в байткоде то, что в начале файлов идет импорт всех используемых классов + некоторые неиспользуемы участки довольно легко вычислить и не включать в конечный файл. Я нашел то, что мне нужно было в обфускаторах, это тот инструмент, который поможет и ужать размер приложения, если это не библиотека, и даже, если это продвинутый обфускатор, вырезать всю неиспользуемую часть кода.
12.08.2008 в 13:22
Не вижу спора в Компилить/Не компилить. Можно сделать две версии. А пользователь уже сам выберет, что ему по душе. Правда я не совсем понял, компиляция возможна только под Линух?
13.08.2008 в 08:28
GNU Compiler доступен для нескольких ОС В том числе и Linux. А спор тут есть. Целесообразно ли вообще? Программка Hello World 4.5Мб и при этом только для одной ОС, качественного ускорения мы не почувствуем, ибо GCJ просто консервирует все используемые классы в свой исполняемый файл.
13.08.2008 в 23:19
Целесообразно. Потому как ВМ Java ещё не является стандартом на ПК. И программа в native-коде просто уменьшит количество барьеров для того чтобы начать ею пользоваться (здесь я используюю термин Спольского, если интересно могу бросить ссылку). Даже если прога в native -коде будет хуже по производительности/ресурсоемкости и т.д., то ее можно держать хотя бы как демку.
И все таки под какие ОС можно скомпилить? Под ЛИнух, я и не сомневался. А под Винду можно?
14.08.2008 в 07:53
http://www.mingw.org/ для винды как раз
28.08.2008 в 14:28
Я начал изучение Java с GCJ. Сильно не понравилось. Особенно то, что gcj ругался на комменты, написанные кириллицей + полное отсутствие GUI (классы из пакетов Swing и AWT попросту отсутствуют). Может, для GCJ и есть GUI под винду, но я его не видел

Потом уж скачал JDK от Sun, и все стало OK.