Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Вопросы по нововведениям в java |
Автор: Pawl 2.6.2012, 10:52 |
Доброго времени суток, уважаемые форумчане! Я смотрю, java развивается семимильными шагами. Не успел толком разобраться с новшествами JDK 7, как уже на подходе восьмерка. Вот и хочу попросить Вас разъяснить, что же такое "поддержка динамически-типизированных языков" (вообще, что это за языки такие), "динамические вызовы" (InvokeDynamic), MethodHandle - в семерке и "аннотации типов" (подключаемые системы типов) в JDK 8. Если можно, с рабочими примерами, а то все, что я находил в статьях на эту тему - это просто куски в пару строчек малопонятного мне кода. Спасибо! |
Автор: jk1 2.6.2012, 21:40 |
InvokeDynamic в байткоде позволяет осуществлять динамический вызов метода с меньшими ограничениями. Раньше требовалось, чтобы тип нашего объекта явно содержал объявление вызываемого метода. С введением InvokeDynamic достаточно будет его фактического наличия. Другими словами, InvokeDynamic позволяет делать http://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BD%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F Понятное дело, что в Java компилятор не позволяет такое делать, типизация в языке строго статическая. Но для других языков, выполняющихся на платформе JVM, поддержка подобной инструкции сильно облегчает реализацию динамической типизации. http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html |
Автор: Pawl 3.6.2012, 09:28 |
Спасибо, jk1, за ссылки... Про "утиную типизацию", в теории, понятно, еще бы примерчик на эту тему... Что касается английской статьи, то в нее мне надо хорошенько вникнуть. Вот, бывает так, посмотрел, к примеру, пару строчек кода с try-with-resource, и все стало понятно, как примменять, где применять и как это вообще работает. Или даже лямбда-синтаксис в восьмерке - почитал, понял для себя, что это есть хорошо, и принял в душе эту концепцию ![]() ![]() |
Автор: jk1 3.6.2012, 10:12 | ||||
Тогда постараюсь показать на примере. Есть у нас такой код:
Все бы хорошо, только на Java это не компилируется, хотя нужный метод в наличии есть. Но! Java - не единственный язык, который может выполнятся в рамках JVM. Jython, например, позволяет писать код на Python, а выполнять его на JVM. В Python требования к типизации куда более слабые, например вот этот классический пример duck typing будет работать без проблем:
На Java бы такое никогда не скомпилировалось. Так вот, до недавнего времени реализовывать поддержку duck typing на JVM было сложно по причине жестких требований к типизации при вызове методов. То есть транслятор Jython может перевести код на Python, использующий Duck Typing, в байткод JVM, но она просто откажется его выполнять (JVM проводит верификацию байткода перед выполнением). Это обходилось разными хаками вроде использования reflection или динамических прокси, производительность которых оставляла желать много лучшего. InvokeDynamic позволяет осуществлять вызов методов в байткоде с гораздо меньшим количеством ограничений по типизации, что сильно облегчает задачу тем, кто реализует трансляторы других языков в байткод. Java-программисту же от InvokeDynamic никакой пользы нет. |
Автор: Pawl 3.6.2012, 10:48 | ||
Спасибо за примеры, теперь про динамические вызовы стало гораздо понятнее!
Правильно ли я понял, что InvokeDynamic сделан для поддержки на JVM ДРУГИХ языков? Т. е. получается, что теперь JVM, подобно .NET обладает мультиязыковой поддержкой? |
Автор: Pawl 3.6.2012, 12:31 |
Все-таки решил напрячься и почитать http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html (однако полезная штука, жаль, что американцы не пишут по-человечески, а на какой-то тарабарщине и непонятными буквами ![]() . Так что вопросы по семерке пока снимаются. jk1 - заслуженный плюс! Но у меня еще остались вопросы: ну и про подключаемые системы типов в восьмерке. Спасибо заранее за ответы! |
Автор: Pawl 3.6.2012, 20:51 |
Нашел http://www.osp.ru/news/articles/2012/12/13013910/ о дальнейших перспективах java. Да, multylanguage support будет реализована, но Jython, вроде, там не заявлен. А жаль, похоже, интересный язык! Пока тему закрываю, а на мой последний вопрос, думаю, скоро в нете инфы будет гораздо больше. |
Автор: jk1 3.6.2012, 22:56 | ||
Это все рекламные обещания и ничего больше. За каждым из этих языков стоит свое community, которое развивает язык и средства трансляции в байткод. В силу того, что Java поддерживала и будет поддерживать обратную совместимость ситуация с поддержкой этих языков как минимум не ухудшится в обозримом будущем. То есть поддержка Jython есть и мало зависит от желания менеджеров из Оракла. |
Автор: Pawl 11.6.2012, 00:23 |
http://types.cs.washington.edu/jsr308/specification/java-annotation-design.html#getNeighbors, нашел, как будут применяться аннотации типов в java. Что же, идея понятна и где-то даже полезна (в частности, @NonNull, - много попадается в нете жалоб, что в java часто надо проверять объект на "ненулевость"). Но, блин, кроме всех ключевых слов, стандартных классов и методов, всяческих спецификаторов, суффиксов и флагов форматирования, регулярных выражений, теперь еще и ЭТО запоминать! ![]() ![]() |
Автор: Karadul 13.6.2012, 10:52 |
Толсто. Через год, может быть, добавят лямбды, еще через 5 - ФП. Куда там сисярпу до него. |
Автор: Skipy 14.6.2012, 11:58 | ||
Это от неумения грамотно писать. С исключениями работать не умеем/не хотим - при ошибках возвращаем null. А потом жалуемся на NPE. Есть очень небольшое количество ситуаций, где возврат null правомерен. На практике null возвращается гораздо чаще. Отсюда проблемы. |
Автор: Pawl 16.6.2012, 10:56 |
Тонко. ![]() http://sun.udsu.ru/mediawiki/upload/f/f5/Java7.pdf сколько планируется изменений и многие из ни уже будут в восьмерке не лет через 5 а уже скоро! Интересно, как они думают с такими темпами обеспечивать обратную совместимость? |