Как стать автором
Обновить

Комментарии 32

Ох ничего себе. Надо прочитать, прежде чем забуряться в хаки на .NET :) Меня почему-то очень сильно захватила идея забуриться в код и что-нибудь там динамически поперезаписывать. Даже не знаю, зачем это может быть нужно, но звучит захватывающе.
Да, очень интересно. Но большого смысла не имеет. Много сложной работы, шансы ошибиться и закрашить приложение, процессорозависимый нативный код из платформонезависимого C#/Java и т.д…
Ну вы упоротый целеустремленный!
забавно выглядит хаб .net по постом
Программирование сопроцессора на C#? Да!
.NET

Странно, что здесь не упоминается ни JNR, ни тем более JNR-x86asm, а ведь это неплохое решение, которое уже работает. А ещё стоит покопать в проект Panama, Володю Иванова потыкать. Они там тоже ассемблер прямо в джаве пишут, причём почти без накладных расходов на переход туда и обратно.

Спасибо что напомнил, как осилю JNR — напишу продолжение. Хотя в общем, сейчас мозг занят Граалем, и в первую очередь будет про него.
Эх, люблю я этих парней.
Panama, Amber, Valhalla — тысяча и одно очевидное название эксперементальных проектов. Смотришь такой на названия, и всё сразу понятно становится.
Тут на Хабре есть люди для каждого из проектов. lany вроде бы рассказывает об Amber. Если @iwan0www будет заглядывать в комментарии, он вытащит за Panama. Я буду топить за Graal. Ад пуст, все демоны собрались здесь. Как там ютуберы говорят, «ставь лайки и подписывайся» :-)
Ага, Тагир читал отличный доклад на Джокере-17, там тоже чувствовалось общее непонимание именованиями :)
За JNR спасибо! Искал как то чем натив дергать, JNA как мне показалось подох, а для JNI надо готовить либу (исходников нет), так что JNR я запомню… тот проект был для себя поковырять и уже не актуален, но мало ли что еще предстоит :)
Тут грааль, там рослин, ну вот не могут же друг без друга.
И кто на этот раз первый придумал? :)
В первом коммите Graal можно найти упоминание даты — 2010. Именно тогда состоялось переименование в graal. Однако, разработка была начата ещё раньше, т.к. имел место быть экспорт hg -> git.
С Roslyn сложнее, в исходниках дат не нашёл, но первый релиз был в конце 2011.

Выводы делайте сами, но я таки склоняюсь, что graal был первее.
имел место быть экспорт hg -> git
А что мешало им перенести в git даты коммитов?
Мешать то может и не мешало, но экспорт был одним большим новым коммитом.
Ощущение, когда облажался дважды: я же мог посмотреть и какой у тебя доклад на JPoint, и вообще прошарить эту тему… Очень ждём твоего доклада! Всего месяц остался, месяц можно и подождать
в смысле, два месяца, конечно. JPoint будет 6-7 апреля
ну ты мастер нативной рекламы :)
Как-то мы имплементировали инлайнер нативных функций в Android ART — вот это было действительно безумие. Но прогресс был и ощутимый.
А можно подробней, как это работало и какое имело юзабилити? Может быть, отдельной статьёй, если не NDA?
Дизассемблировалось тело функции и проводился анализ, что там делается. Мы заимплементили несколько юзкейсов, в основном геттеры и сеттеры, но до продукта не довели, так что в опенсорсе этого нет.

Вот тут можно посмотреть некоторые другие оптимизации:
github.com/android-art-intel/Nougat/tree/master/art-extension/compiler/optimizing/extensions

А здесь github.com/android-art-intel/Fuzzer — мощный тул от нашего QA, который на раз валит любой java компилятор, путем генерации рандомного кода :)

Круто!


Кстати. Наверное, я становлюсь как дедушка Столлман ("не Linux, а GNU/Linux!"), но… На Android нет Java, совсем нет. Есть нечто с джаваподобным синтаксисом. Можете спросить у Гугла, они обязаны подтвердить :-)

Android SDK написан на Java и никто этого не скрывает en.wikipedia.org/wiki/Android_software_development. Суть спора с Ораклом была в копировании кода, насколько я помню, ибо сам язык запатентовать и залецензировать нельзя, как в процессе выяснилось.

Сам компилятор, конечно, работает с байткодом и ему не важно — из Java он получен или из C++.

Проблема в том, что сам dalvik/art — очень плохи по сравнению с HotSpot и Graal :( Помню как на Google IO лид дальвика рассказывал, что типа вы с ООП не перебарщивайте, а то классов наплодите и приложуха будет тормозить Т_Т


И проходят ли они все соответствия на гордое звание Java?


Вот сейчас вышла Java 9, а скоро будет 10, 11, 12, и как Google собираются поддерживать совместимость? Непонятно. Будут люди продолжать жить в каменном веке.


Короче, на основании всего этого проще говорить, что на Андроиде — не Java. Как сделают по-нормальному, тогда и поговорим :)


Жду, когда на Android выкатят полноценный OpenJDK. Они же вроде обещали. Вот тогда можно будет разгуляться!

Не очень люблю холиварить на эту тему (и не могу, по понятным причинам :). Мне довелось работать и над JDK и над Dalvik и ART. Я думаю, что ART гораздо лучше подходит для мобильных устройств — он легче, гибче и покрывает большую часть необходимых оптимизаций. Для мобильных устройств не так важен 1% производительности, а вот минимальная скорость компиляции и минимальный размер кода — критичены.
Мой бывший коллега-компиляторщик — Максим Казанцев будет на JBreak докладывать про Fuzzer 2018.jbreak.ru/talks/5k5z74tftoey2kkecywcee
.NET реализация сможет это делать только на win-платформе с запуском от администратора?

Код хака из статьи администратора не требует. Это обычная схема, так все JIT работают.


Штуки типа GrayStorm и GrayFrost тоже не требуют админа, но работают поверх DLL-инжектора, и это уже платформоспецифично.


Про кроссплатформенность в смысле операционной системы — без тестирования я бы не загадывал. Попробуйте! Говорят, сейчас Ubuntu можно прямо из винды запустить. Расскажите о результатах здесь в комментариях!


Аппаратно код, конечно, не кроссплатформенный. Я запускал это на x86-64 (i7 6700k, skylake). На ARM будет другой машкод. Нужно рисовать матрицу совместимости, и поддерживать все программно-аппаратные платформы по отдельности.

только на win-платформ

Если на той платформе, что Вы имеете ввиду, есть возможность обеспечить доступ к куску памяти на выполнение, помимо записи и чтения, то можно и на ней. В статье пример с виндовым VirtualAlloc(Ex), в который можно передать MemoryProtection.Execute*. Если будете работать под .NET Core в Linux/macOS, то выделить кусок памяти можете через Marshal, а потом запротектить этот кусок самописной на С простой либой, которая просто вызывает mprotect, ну а вызвать этот метод либы можно стандартным для .NET DllImport.
Статья очень понравилась, спасибо. Даже не подозревал, что в java есть тренд на развитие совместимости с нативом. Это радует. Вообще, хорошо, что развитие продолжается… а то я как то загрустил когда они jee слили в опенсорс.

У Java очень большое будущее. Сейчас есть тренд на развитие по всем направлениям, которые позволяют утилизировать современные облака и хитрые архитектуры. Постараюсь про это писать больше.


А JEE… Точнее, Jakarta… Может быть и хорошо, что они JEE слили в опенсорц. Вот гляди — Spring в опенсорце, и там творятся реальные вещии. А лиды JEE как-то так всё повернули, что сами же себя сделали ненужными в современном мире, имхо. Может быть, сейчас туда придут молодые люди с горящими глазами, и сделают всё как надо?

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.