LINUX.ORG.RU

Compile java to native code

 , , , ,


0

3

А gcj-то оказывается не жив. Что-то с ним как-то совсем печально. Чем теперь компилять-то?
Идея: собрать Java-хелловорд (со свингом или gtk) в линуксовый бинарник. Что посоветуете? Похоже, что выбор ограничен Excelsior JET, gcj и ecj. Какие есть варианты?

★★★★★

Может, попробовать mono? Там живой AOT.

note173 ★★★★★
()

Просто создай линуксовый пакет и пропиши для него зависимость от jre или jdk, поставляемого в виде пакета для конкретного дистрибутива. Правда есть один неприятный момент. Многие предпочитают ставить официальный сановский.. оракуловский jdk из простого архива и самостоятельно прописывать $JAVA_HOME. Тогда для линукса установленной вручную таким способом явы может и не быть - не тащить же ее по-новой но уже в виде линуксового пакета?

Совет «забей на яву» тебе не подойдет?

dave ★★★★★
()

Не знаю как на линуксе, но в виндовых инсталяторах и маковских образах сейчас принято тащить с собой целиком jre. Вот и весь ответ. Конечно, надо прибавить к размеру дистрибутива программы мегабайта 32, но что делать... А на линуксе может выручить зависимость от пакета jre, специально сделанного для дистрибутива. Это если по-взрослому делать.

Так что, еще раз подумай о моем совете :)

dave ★★★★★
()

Да, есть еще один вариант. На сайте Vuze, к примеру, на странице Download было раньше две ссылки (не знаю, как сейчас). Первая ссылка «Get Java» вела на сайт оракула. Вторая ссылка скачивала либо инсталятор Vuze для винды, либо образ для мака, либо что-то там для линукса. Было написано, что необходимо сначала иметь установленную яву для запуска программы, и наверняка, это проверялось в виндовом инсталяторе.

Второй вариант. Виндовый инсталятор AnyLogic включает в себе целиком jre - об этом варианте я уже писал. Для маковского образа было написано на сайте, что «вы должны самостоятельно установить яву». Примерно тоже самое для линуксового архива.

Третий вариант. Посмотри программу jEdit. Давно не смотрел, но по-моему они полагаются, что пользователи (а это должны быть продвинутые пользователи, а иначе на черта им jEdit) должны сами установить jre. Что мне понравилось, у них всегда раньше был пакет *.jar, не зависящий от системы. Были и инсталяторы/образы/дебы для основных платформ.

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

Добавлю только то, что я бы мог воспользоваться Excelsior JET (раньше игрался с ним). Все остальное забудь. Либо этот новосибирский JET, либо полноценная jre. Все остальное должно быть заметно хуже по качеству, намного.

dave ★★★★★
()
Ответ на: комментарий от r

как там у него с Java7/Java8? В Эксельсиоре емнип еще не асилили

stevejobs ★★★★☆
()
Ответ на: комментарий от anonymous

Годно, но тут всё-таки используется легковесная виртуальная машина, это нифига не native code.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от yacuken

Как собрал-то? Я просто хочу запилить свою Java DE. Начну, пожалуй, с WM на джаве и какой-нибудь панельки.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

и зачем тебе тогда компилять в натив?

r ★★★★★
()

Какую задачу решаем? Если экономия времени на начальный JIT при каждом запуске при условии что паттерны вызовов методов одинаковые, то это хотя бы отдаленно валидная задача. Они думали что-то такое сделать, но почему-то передумали.

1) Если ты думаешь что ускоришь работу приложения, то ты ее абсолютно не ускоришь. Пример: У тебя написано тело метода

if (a==null){
  throw new IllegalArgumentException();
}

return a.doCalculation();

Если Java вызовет этот метод пару тысяч раз, то она соберет его в машинный код. Причем если окажется что a никогда не null, а a.doCalculation() - side-effect free, то оно и проверку выкосит. Потом магическим образом на 1000001 раз окажется что (a==null). Нативный код смело рухнет сегфолтом, который поймает JVM. Она возьмет Java-байткод и перекомпиляет его с проверкой и перезапустит метод.

В JVM более 120 различных наркоманских методик оптимизаций, многие из которых требуют возможности взять байткоды заново и перекомпилять согласно паттернов использования на основе PGO.

2) Если ты думаешь что сохранишь память, то тоже не получится. JVM и метаинформация классов особо не жрут. Жрут зарезервированые области памяти для perm-gen, young-gen, etc. По них гуляет сборщик мусора и ему нужна область чтобы разгуляться. И чтобы сделать так, чтобы Java жрала так как hello world на Python, то прийдется ей сделать такой-же примитивный сборщик мусора, например на основе reference counting. Но тогда в мире упадут самолеты на города.

vertexua ★★★★★
()
Ответ на: комментарий от r

Ну VM да, но для DE как-то оно не круто запускать новый процесс Java для каждого сопливого приложения, например какого-то клизмоида. А приложения надо как-то отделить, хотя-бы класслоадерами. Но остается проблема, которую нужно решить - сборщик мусора. Он хорошо справляется с сотнями тысяч обьектов. А с миллионами? Десятками миллионов? Если сделать все приложения в одном JVM, то получится что только один сборщик мусора лопатит все данные всех приложений. Не уверен что это хорошая идея. Я тут деталей не знаю как себя он ведет при множественных класслоадерах.

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: комментарий от vertexua

да нормально. пусть играется.

r ★★★★★
()
Ответ на: комментарий от yacuken

Либы свинга он сам нашёл

Это для gcj уже сильное достижение

vertexua ★★★★★
()
Ответ на: комментарий от yacuken

Сейчас идёт пятый час сборки gcj 4.8.1, надеюсь, у меня тоже всё так легко заработает.

CYB3R ★★★★★
() автор топика

Какой профит от этого? Или тебе жаба просто ближе?

yacuken ★★★★
()
Ответ на: комментарий от CYB3R

Нда, не собралось. Беда.

CYB3R ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.