Какая полезная (для производительности или иначе) конструкция является действительным байтовым кодом, но не выражаемым в Java?
Какие задачи низкого уровня могут выполняться на JVM, но не выраженные в java?
Ответ 1
- Вы можете выбросить любой объект, а не только исключение.
- Вы можете перегружать возвращаемый тип.
- Вы можете выбросить любое исключение без объявления его в бросках.
Ответ 2
Байт-код JVM представляет собой язык стекового программирования, поэтому большинство команд управления стеком не имеют смысла в Java, например. dup
, swap
и т.д. Произвольное goto
, конечно, также не выражается в Java.
Что-то вроде JSR 292 предлагает поддержку динамически типизированных языков, которые я не думаю, что Java планирует стать.
Я думаю, что кое-что нужно решить здесь, хотя: ваш вопрос, по-видимому, по крайней мере частично мотивирован проблемой производительности. На практике байт-коды скомпилированы JIT для сборки. Независимо от того, действительно ли супер-магическая инструкция по байт-коду действительно довольно спорна.
Ответ 3
Я прочитал, что сигнатуры метода байт-кода поддерживают множественную диспетчеризацию по типам возврата, тогда как Java допускает только методы с тем же именем для отправки по типам параметров.
Ответ 4
Иногда также верно и обратное.
Например, видимость внутренних классов Java не может быть представлена в байт-коде. JVM знает только защищенную от пакетов, защищенную, открытую и закрытую видимость. Поэтому компилятор Java должен использовать хак: он генерирует синтетические методы-обертки (которые видны в пакете), чтобы подвергать частные поля и методы внутренних классов внешнему классу.