|
|
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
читаю про invokeDynamic инструкцию и появляются вопросы. https://habrahabr.ru/company/nixsolutions/blog/281513/ Начиная с версии 7 в Java появился на удивление полезный инструмент: байткод invokedynamic, призванный выполнять роль основного механизма вызова. Это позволяет исполнять динамические языки поверх JVM, а также расширять систему типов в Java путём добавления встроенных методов и изменения интерфейса, в то время как раньше это было невозможно. Расплачиваться за это приходится несколько возросшей сложностью. Но при умелом обращении invokedynamic является мощным инструменто. До седьмой java не было динамических языков? Как система типов java связана с invokeDynamic? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 18:25 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
questionerДо седьмой java не было динамических языков? Были. Но они работали через рефелексию в ряде ситуаций. questionerКак система типов java связана с invokeDynamic? В Java нужно знать конкретный тип и метод для того чтобы его вызвать уже на этапе компиляции. Это обходится только через рефлексию. Динамические языки имеют кучу всяких фишек таких как duck typing. Которые в JVM можно было реализовать только через рефлексию. В то же время этим языкам никакой отдельный API для "рефлексии" не нужен. Теперь же возможноть вызвать метод "динамически" доступная и на уровне байт-кода. Её могут использовать компиляторы "динамических" языков. А подержка на уровне JVM позволяет оптимизировать эту операцию, например на уровне JIT, что через рефлексию было не возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 19:02 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
Я вот активно пользуюсь ScriptEngine... И там есть опция типа скомпилировать...И тогда этот код уже предподготовлен(не знаю байт это код или нет) Но дальше я уже пользуюсь предподготовленным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 19:19 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
irbis_alЯ вот активно пользуюсь ScriptEngine... И там есть опция типа скомпилировать... Тут? https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html irbis_alНо дальше я уже пользуюсь предподготовленным. Отлично объяснил invokeDynamic. Стало сразу понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 19:22 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ Java нужно знать конкретный тип и метод для того чтобы его вызвать уже на этапе компиляции. Это обходится только через рефлексию. Динамические языки имеют кучу всяких фишек таких как duck typing. Которые в JVM можно было реализовать только через рефлексию. В то же время этим языкам никакой отдельный API для "рефлексии" не нужен. Теперь же возможноть вызвать метод "динамически" доступная и на уровне байт-кода. Её могут использовать компиляторы "динамических" языков. А подержка на уровне JVM позволяет оптимизировать эту операцию, например на уровне JIT, что через рефлексию было не возможно. Я немножко не понимаю. А если у нас @Override, то на этапе компиляции мы ведь не знаем какой именно метод вызывать и это решается на этапе выполнения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 11:14 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
questionerЯ немножко не понимаю. А если у нас @Override, то на этапе компиляции мы ведь не знаем какой именно метод вызывать и это решается на этапе выполнения? Это немного не то. Это виртуальный вызов. Мы всё равно строго привязаны к типу базового метода. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.invokevirtual ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 11:38 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, http://www.truehackers.ru/articles/programming/3662-java-7-hello-dynamics Как вы знаете, байт-код Java не поддерживает динамического вызова методов. Первым позывом к поддержке динамики в языке стал JSR 223 (Scripting for the Java Platform). Данная спецификация определяла API для вызова Java кода из кода, написанного на динамическом скриптовом языке. Собственно, JSR 223 был реализован в JDK 6, и включен в состав Java SE 6. Однако, разработчикам подобных скриптовых конструкций пришлось испытать немало головной боли, так как байт-код сам по себе был разработан только для статических языков. Он включает в себя три возможных способа для вызова метода: invokestatic invokespecial invokeinterface или invokevirtual а как до 6 джавы виртуальные методы работали? не было же инструкции invokevirtual ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 11:51 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
questionerа как до 6 джавы виртуальные методы работали? не было же инструкции invokevirtual Ну, как-то работали. Других инструкций что ли не было? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 12:08 |
|
||
|
invokeDynamic
|
|||
|---|---|---|---|
|
#18+
Blazkowiczquestionerа как до 6 джавы виртуальные методы работали? не было же инструкции invokevirtual Ну, как-то работали. Других инструкций что ли не было? То есть появление invokeVirtual инструкции также как и invokeDynamic это тоже некий способ оптимизации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 12:43 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39502411&tid=2122679]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 377ms |

| 0 / 0 |
