LINUX.ORG.RU

А как обстоят дела с бэккомпилированием Java?


1

3

Вот задумался. По сути всё, что я видел в Java 7, 8 прекрасно компилируется в Java 5 на уровне исходников (ну т.е. я могу каждую конструкцию переписать в аналогичную на Java 5). Я про фичи языка - try-with-resources, lambdas, etc. Поэтому опять же теоретически можно придумать компилятор Java 7, который будет выдавать код для JVM 1.6. Или 1.4. И писать как белые люди для отходов мамонта (бывают такие сценарии, когда работает какая-нибудь старинная вебсфера и никто её обновлять по ряду причин не будет, а функционал писать надо).

Отдельный вопрос со стандартной библиотекой. Банальный StandardCharsets.UTF_8 уже не найдётся в JRE 1.6 и будет ClassNotFoundException на этапе загрузки нашего класса. Поэтому стандартная библиотека должна идти отдельным привеском в виде что-то вроде java7.XXX, не совсем понимаю как именно, но в общем если подумать, можно такое нахимичить.

Вопрос в том - нахимичил ли кто-нибудь такое и насколько оно работает?

★★★★★

Вот так

Cross-Compilation Options

By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compiling, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath and -extdirs when cross-compiling; see Cross-Compilation Example below.

-target version
    Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).

    The default for -target depends on the value of -source:

        If -source is not specified, the value of -target is 1.7
        If -source is 1.2, the value of -target is 1.4
        If -source is 1.3, the value of -target is 1.4
        If -source is 1.5, the value of -target is 1.7
        If -source is 1.6, the value of -target is 1.7
        For all other values of -source, the value of -target is the value of -source.

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html

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

Ну и? Какой вывод?

У тебя столько возможнойстей по осваиванию этой целины! Не упускай случая.

iZEN ★★★★★
()
Ответ на: Ну и? Какой вывод? от iZEN

Вывод в том, что твое сообщение бессмысленно и не позволяет добиться того, о чём я написал в сообщении. Или поясни, что ты имел в виду.

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

бывают такие сценарии, когда работает какая-нибудь старинная вебсфера и никто её обновлять по ряду причин не будет, а функционал писать надо

пишу функционал на новых сорцах и компилирую под новую jvm, под старой тестирую, если не юзать новый api, то всяки сахарок типа try(I i = new I()){} работает.

Лямбды не будут работать, ибо они используют dynamicinvoke который появился только в 1.7

Deleted
()
Ответ на: комментарий от Deleted

пишу функционал на новых сорцах и компилирую под новую jvm, под старой тестирую, если не юзать новый api, то всяки сахарок типа try(I i = new I()){} работает.

Не понял, как это? Как мне скомпилировать твой try, чтобы он запустился на JVM 1.6, покажи на пальцах. Я выше писал, что javac такой трюк проделывать отказывается.

Лямбды не будут работать, ибо они используют dynamicinvoke который появился только в 1.7

В общем то им никто не запрещает использовать обычные классы, это уже на усмотрение компилятора отдаётся, что там используется, как я понимаю.

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

Не понял, как это? Как мне скомпилировать твой try, чтобы он запустился на JVM 1.6, покажи на пальцах. Я выше писал, что javac такой трюк проделывать отказывается.

просто компилирую с target 1.7, но в некоторых случаях не http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-n...

В общем то им никто не запрещает использовать обычные классы

емнип там все сложнее,

Deleted
()
Ответ на: комментарий от note173

Это вроде была какая-то околонаколенная поделка

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

Опа!!!!

У меня есть некая программа (купленная в чуть не в прошлом веке для JAVA 1.3). Естественно, сейчас ее не запустить. Но можно классы назад в JAVA декомпилировать. Обфузером, конечно, там прошлись... Но больно прога удобная для кой-каких работ, а покупать новую версию слишком дорогое удовольствие. Тогда то мне фирма купила для работы, а теперь самому и для себя. И 15-20 тысяч зеленых в моем бюджете могут найти другое применение.

ЗЫЫ. Она даже на 1.4 уже не собиралась.

Надо будет попробовать.

ЗЫ. Знаю что закон не на моей стороне

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

А в чем проблема использовать Java 1.3?

Если программа не работает на 1.4, значит она гвоздями приколочена к внутреннему API и ни на чём больше не будет работать.

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

А в чем проблема использовать Java 1.3?

Для нее приходится создавать свою среду. На ВМ ставлю древний линукс, Ставлю 1.3 и работаю....
Неудобно :( Очень!

vada ★★★★★
()

Тоже приходилось использовать ретротранслятор, пока не перевели старые проекты на яву 1.5.

orm-i-auga ★★★★★
()
Ответ на: комментарий от Legioner

поясни, что ты имел в виду.

Я думал ты не знал, как обстоят дела в стандартном компиляторе Явы в аспекте кросс-компиляции под разные версии JVM. Вот и привёл выдержку из хэлпа javac.

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

Да, только назад. Так, вроде бы, вперед «из коробки» поддерживается.

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