Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вопросы по нововведениям в java


Автор: Pawl 2.6.2012, 10:52
Доброго времени суток, уважаемые форумчане!
Я смотрю, java развивается семимильными шагами. Не успел толком разобраться с новшествами JDK 7, как уже на подходе восьмерка. Вот и хочу попросить Вас разъяснить, что же такое "поддержка динамически-типизированных языков" (вообще, что это за языки такие), "динамические вызовы" (InvokeDynamic), MethodHandle - в семерке и "аннотации типов" (подключаемые системы типов) в JDK 8. Если можно, с рабочими примерами, а то все, что я находил в статьях на эту тему - это просто куски в пару строчек малопонятного мне кода.
Спасибо!

Автор: Pawl 2.6.2012, 20:13
Цитата(Pawl @  2.6.2012,  10:52 Найти цитируемый пост)
что же такое "поддержка динамически-типизированных языков" (вообще, что это за языки такие)

Т. е. я имел в виду, какие именно языки поддерживаются и как эта поддержка реализована. Что-то вроде как .NET поддерживает несколько языков?

Автор: 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, и все стало понятно, как примменять, где применять и как это вообще работает. Или даже лямбда-синтаксис в восьмерке - почитал, понял для себя, что это есть хорошо, и принял в душе эту концепцию smile. А есть вещи, которые ну никак не даются мне для быстрого восприятия! И если еще при этом вся инфа по ним на английском... Вот тут для того, чтобы "въехать" мне и нужны примеры с рабочим исходным кодом. Много примеров! Тогда процесс "въезда" намного ускоряется! smile 

Автор: jk1 3.6.2012, 10:12
Тогда постараюсь показать на примере. Есть у нас такой код:
Код

interface Foo {
     String bar();
}

class Bar {
     String bar() { "A man walks into a bar..."; }
}

class FooBar {
      String bar() { "foo bar baz qux"; }
}


void method(Foo foo) {
       System.out.println(foo.bar());
}

method(new Bar());
method(new FooBar());


Все бы хорошо, только на Java это не компилируется, хотя нужный метод в наличии есть. Но! Java - не единственный язык, который может выполнятся в рамках JVM. Jython, например, позволяет писать код на Python, а выполнять его на JVM. В Python требования к типизации куда более слабые, например вот этот классический пример duck typing будет работать без проблем:
Код

class Duck:
    def quack(self):
        print("Quaaaaaack!")
    def feathers(self):
        print("The duck has white and gray feathers.")
 
class Person:
    def quack(self):
        print("The person imitates a duck.")
    def feathers(self):
        print("The person takes a feather from the ground and shows it.")
    def name(self):
        print("John Smith")
 
def in_the_forest(duck):
    duck.quack()
    duck.feathers()
 
def game():
    donald = Duck()
    john = Person()
    in_the_forest(donald)
    in_the_forest(john)
 
game()


На Java бы такое никогда не скомпилировалось.
Так вот, до недавнего времени реализовывать поддержку duck typing на JVM было сложно по причине жестких требований к типизации при вызове методов. То есть транслятор Jython может перевести код на Python, использующий Duck Typing, в байткод JVM, но она просто откажется его выполнять (JVM проводит верификацию байткода перед выполнением). Это обходилось разными хаками вроде использования reflection или динамических прокси, производительность которых оставляла желать много лучшего. InvokeDynamic позволяет осуществлять вызов методов в байткоде с гораздо меньшим количеством ограничений по типизации, что сильно облегчает задачу тем, кто реализует трансляторы других языков в байткод.

Java-программисту же от InvokeDynamic никакой пользы нет. 

Автор: Pawl 3.6.2012, 10:48
Спасибо за примеры, теперь про динамические вызовы стало гораздо понятнее!
Цитата(jk1 @  3.6.2012,  10:12 Найти цитируемый пост)
InvokeDynamic позволяет осуществлять вызов методов в байткоде с гораздо меньшим количеством ограничений по типизации, что сильно облегчает задачу тем, кто реализует трансляторы других языков в байткод.Java-программисту же от InvokeDynamic никакой пользы нет.

Правильно ли я понял, что InvokeDynamic сделан для поддержки на JVM ДРУГИХ языков? Т. е. получается, что теперь JVM, подобно .NET обладает мультиязыковой поддержкой?

Автор: Pawl 3.6.2012, 12:31
Все-таки решил напрячься и почитать http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html (однако полезная штука, жаль, что американцы не пишут по-человечески, а на какой-то тарабарщине и непонятными буквами smile ). Вроде разобрался с тем, что делают классы типа MethodHandle в пакете invoke. Я так понял, что это и есть альтернатива всем этим хакам
Цитата(jk1 @  3.6.2012,  10:12 Найти цитируемый пост)
вроде использования reflection или динамических прокси
. Так что вопросы по семерке пока снимаются. jk1 - заслуженный плюс!
Но у меня еще остались вопросы:
Цитата(Pawl @  3.6.2012,  10:48 Найти цитируемый пост)
Правильно ли я понял, что InvokeDynamic сделан для поддержки на JVM ДРУГИХ языков? Т. е. получается, что теперь JVM, подобно .NET обладает мультиязыковой поддержкой?
 ну и про подключаемые системы типов в восьмерке. Спасибо заранее за ответы!

Автор: 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
Цитата

Да, multylanguage support будет реализована, но Jython, вроде, там не заявлен. А жаль, похоже, интересный язык!


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

То есть поддержка Jython есть и мало зависит от желания менеджеров из Оракла.

Автор: Pawl 11.6.2012, 00:23
http://types.cs.washington.edu/jsr308/specification/java-annotation-design.html#getNeighbors, нашел, как будут применяться аннотации типов в java. Что же, идея понятна и где-то даже полезна (в частности, @NonNull, - много попадается в нете жалоб, что в java часто надо проверять объект на "ненулевость"). Но, блин, кроме всех ключевых слов, стандартных классов и методов, всяческих спецификаторов, суффиксов и флагов форматирования, регулярных выражений, теперь еще и ЭТО запоминать! smile smile

Автор: Karadul 13.6.2012, 10:52
Цитата(Pawl @  2.6.2012,  10:52 Найти цитируемый пост)
Я смотрю, java развивается семимильными шагами. 

Толсто.
Через год, может быть, добавят лямбды, еще через 5 - ФП. Куда там сисярпу до него.

Автор: Skipy 14.6.2012, 11:58
Цитата(Pawl @ 11.6.2012,  00:23)
много попадается в нете жалоб, что в java часто надо проверять объект на "ненулевость"

Это от неумения грамотно писать. С исключениями работать не умеем/не хотим - при ошибках возвращаем null. А потом жалуемся на NPE. Есть очень небольшое количество ситуаций, где возврат null правомерен. На практике null возвращается гораздо чаще. Отсюда проблемы.

Автор: Pawl 16.6.2012, 10:56
Цитата(Karadul @  13.6.2012,  10:52 Найти цитируемый пост)
Толсто.Через год, может быть, добавят лямбды, еще через 5 - ФП.

Тонко. smile 
http://sun.udsu.ru/mediawiki/upload/f/f5/Java7.pdf сколько планируется изменений и многие из ни уже будут в восьмерке не лет через 5 а уже скоро! Интересно, как они думают с такими темпами обеспечивать обратную совместимость?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)