Декомпиляция языков JVM - PullRequest
3 голосов
/ 20 апреля 2011

Можно ли декомпилировать языки JVM, такие как Groovy, Scala, до их начальной формы?

Если я пытаюсь декомпилировать 4-строчный класс Groovy, я получаю около 20 строк декомпилированного кода Java.

Это скорее теоретический вопрос, чем практический, потому что на рынке нет таких декомпиляторов (не то, что я знаю).

Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2011

Да, возможна схожая верность, которой может управлять декомпилятор Java (имеется в виду: код будет выглядеть похожим, но не обязательно идентичным).

Однако для каждого языка вам потребуется выделенный декомпилятор.

Редактировать: думаю, мне нужно уточнить, какой уровень точности я бы ожидал:

  • Имена локальных переменных могут воспроизводиться или не воспроизводиться
  • Типы циклов могут быть неверно истолкованы (for заменено на while, ...)
  • Более общее: то, что можно сделать двумя подобными способами, может быть неправильно истолковано
  • ...

Все это ошибки, которые также возникают при декомпиляции кода Java, просто потому, что связь между байтовым кодом и исходным кодом Java не равна 1: 1.

Однако, если у вас есть выделенный декомпилятор Groovy, то я сильно подозреваю, что он произведет на намного больше читаемого кода из декомпилируемого кода Groovy, чем когда-либо мог декомпилятор Java. *

1 голос
/ 20 апреля 2011

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

Однако, что наиболее важно, язык Java (по сравнению с байт-кодом JVM) не мог быть достаточно мощным, чтобы кодировать определенные концепции или конструкции исходного языка таким образом, чтобы их можно было реализовать. Это уже имеет место в Java и байт-коде JVM, где последний не способен выражать дженерики.

0 голосов
/ 20 апреля 2011

Ну, единственное, о чем я могу думать, это проблемы оптимизации компилятора и комментарии. Комментарии не сохраняются в байт-коде (к счастью), и компилятор может изменить исходный код для повышения производительности, кроме того, что это кажется возможным.

...