Обновить
30
Григорий Наследов@dougrinch

Пользователь

5
Подписчики
Отправить сообщение
Сразу вспомнилось:

Интервью, взятое у Лукаса в процессе съёмок «Мести ситов»:

«Так откуда у Энакина этот шрам, Джордж?», — спрашивает Джон Нолл.
«Почём мне знать? Спросите Говарда,» — отвечает Лукас, имея ввиду президента компании «Lucas Licensing» Говарда Роффмана. — «Это одна из тех вещей, произошедших в романах между фильмами. Я просто вставил их в сценарий. Пусть он [Говард] объясняет откуда шрам. Мне думается, что Энакин поскользнулся в ванной, но, естественно, он никому в этом не признается.»
Если уж на то пошло, то все эти энциклопедии выпускаются не под его руководством. Он просто получает процент и радуется.
В этой серии постов будет рассказано о многих технологиях «Звёздного пути», таких, как варп, досветовые двигатели и тому подобные научно-фантастические и имеющие аналоги сегодня достижения техники.

Рассчитывал на статью в духе «какие штуки из научной фантастики в настоящий момент фантастикой уже не являются». И тут такой облом.
Какие результаты?
Прошу заметить, первую часть я не отрицал.
Если верить вики, то это как раз таки аббревиатура: Low Level Virtual Machine (LLVM)
Изначально меня возмутило название метода «putIfAbsent», который используется для получения значения.

Так он так и не используется, где Вы это нашли? Спец. поискал его использование в посте, нашел единственное место, где результат вообще игнорируется. Основное назначение метода — именно put.
Очень плохой пример. Даже если заменить x на this::x, то javac Вам радостно скажет
Error:(11, 25) java: method reference not expected here


Но основная мысль, конечно же, верная. Вот это уже сломалось бы.
Runnable x;

void x() {
}

test() {
    Runnable r = x;
}
Что сильнее бросается в глаза, так это что MethodHandle сильно проигрывает обычному reflection. Хотя неоднократно слышал что он должен быть быстрее.
Ой. Этому что, уже не учат?
Учат, просто не понял сразу о чем Вы.

А по теме, спасибо, больше вопросов нет.
Я Вам задаю один вопрос, Вы мне отвечаете на другой.

Вам важен сам факт генерации класса?
Нет. Мне важен факт понимания реализации.

ну это уж точно не сахар
А где я это говорил?

реализации совсем без класса.
Вот об этом я и спросил. Нам в любом случае нужен объект, реализующий интерфейс Predicate. Как в текущей реализации jvm может быть объект, реализующий интерфейс, но при этом «совсем без класса» я не понимаю. Т.е. мне видится, что это фундаментальное ограничение платформы. Как вы «Даже не думая» можете его обойти?

Метод выливания чайника
Что за метод?
Про invokedynamic я в курсе, выше написано об этом.
Может я что-то не понимаю, прошу пояснить если так.

Как это сделать через MethodHandle? У нас функция filter принимает Predicate. И тут хочешь не хочешь, но этот Predicate надо иметь. Или имеется ввиду что будет не класс на каждое создание лябды, а единственный класс с полем final MethodHandle? Но, опять же, одним классом не обойтись. Как минимум класс на интерфейс.
Спасибо за развернутый ответ. С такой формулировкой полностью согласен. Я, действительно, все свои выводы про сахар сделал относительно текущей реализации.
оффтоп
Если честно, то сомневаюсь, что она когда-нибудь поменяется.


Мне просто очень не нравятся заявления в духе «чушь, там invokedynamic», без добавления, что в текущей реализации класс все же создается.

Не нужно всё сводить к сахару, а то у нас сводилка слипнется. ;)

Прошу заметить, я нигде не сказал что сахар — это плохо.
Это я смотрел в случае filter, map и пр. Т.е. когда нам обязательно нужен именно экземпляр интерфейса. Если вызывать метод сразу на месте, то, возможно, класс не создается. Не смотрел еще.

Хотя думаю, что все равно будет. В любом случае надо ведь записать что-то в переменную.
1. ответ на Ваш пред. коммент: а я и не говорил, что функции высших порядков нельзя реализовать элегантно, я лишь сказал что в этом месте за исключением очень удобного сахара, не изменилось ничего. А вот сам сахар и добавляет элегантности.

2. Тем не менее, если верить исходникам, то после вызова invokedynamic, внутри бутстрап метода, как раз явно создается класс через asm и загружается через unsafe. Да, это не «старый добрый аноним», а некая более оптимизированная его версия. Но по сути, неявное создание класса все же есть.
В этом плане ничего не изменилось. Лямбда, по сути — просто синтаксический сахар для создания анонимного класса с единственным абстрактным методом.

Т.е. higher-order функция объявляется вполне стандартно:
filter(Predicate<? super T> predicate)


Но вот при использовании можно вместо
filter(new Predicate<Object>() {
    public boolean test(Object o) {
        return true;
    }
});

писать
filter(o -> true)


Внутри, на самом деле, неявно создается аноним.
Как именно «собирает про него знания»? Какая-то интеграция с гуглом и его статистикой запросов (если честно, есть ли вообще api для этого я не знаю) или же какое-то свое решение?
0. Спасибо за статью и саму разработку. Очень радует, что постепенно подобные «фантастические» штуки начинают появляться.

1. Субъективно, дороговат кубик. Хотя и вполне приемлемо. Интересует, в первую очередь, вот какой вопрос: «первая партия» — это бета (по качеству/готовому функционалу), или же все готово, просто хочется проверить спрос на маленьком объеме?
И в каком месте здесь Scala?

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность