История изменений
Исправление
stevejobs,
(текущая версия)
:
Такие инлайны ещё как возможно.
Самый простой способ, как делать это с zero overhead - это сделать компиляторную интринсику, которая будет кэпчурить вызов метода и подменять его на нативный код. Если совсем упороться, то можно попарсить .java-файл, выдернуть оттуда конструкции типа __asm(«строка с кодом») и автоматически вливать их в интринсики. Года эдак два я писал про это на ЛОРе в рамках шуточного поста «java с ассемблерными вставками».
Но одновременно этот способ самый сложный, т.к. а) требует поддерживать пересобранную версию JDK (5-20 минут сборки в зависимости от железа, нужно развести девопс-активность). б) это получается статический код, а хотелось бы динамически, типа как в libjit
Возможность таких инлайнов, скорей всего, появится в рамках проекта Valhalla, и будет выглядеть так же как в C# - собираем код асмом, кладём его в бинарь в managed памяти, берём ссылку на него как метод. Но сейчас этого нет, и разбираться в Вальгалле некогда.
В принципе, не вижу проблем чтобы сделать это и без участия гур из Вальгаллы. И надеялся, что кто-то уже всё это сделал :) Мало ли на земле добрых людей...
Исправление
stevejobs,
:
Такие инлайны ещё как возможно.
Самый простой способ, как делать это с zero overhead - это сделать компиляторную интринсику, которая будет кэпчурить вызов метода и подменять его на нативный код. Если совсем упороться, то можно попарсить .java-файл, выдернуть оттуда конструкции типа __asm(«строка с кодом») и автоматически вливать их в интринсики. Года эдак два я писал про это на ЛОРе в рамках шуточного поста «java с ассемблерными вставками».
Но одновременно этот способ самый сложный, т.к. требует поддерживать пересобранную версию JDK. Тащить со своим софтом свой JDK - не проблема, проблема что любое изменение интринсик ведёт к полной переборке JDK, это долго (5-20 минут в зависимости от железа) и больно, и требует всякого девопса на эту тему (когда пересобирается проект на Дженкинсе - пересобирается и его JDK, каждая версия софта должна быть строго синхронизирована со своим JDK, и так далее)
Возможность таких инлайнов, скорей всего, появится в рамках проекта Valhalla, и будет выглядеть так же как в C# - собираем код асмом, кладём его в бинарь в managed памяти, берём ссылку на него как метод. Но сейчас этого нет, и разбираться в Вальгалле некогда.
В принципе, не вижу проблем чтобы сделать это и без участия гур из Вальгаллы. И надеялся, что кто-то уже всё это сделал :) Мало ли на земле добрых людей...
Исходная версия
stevejobs,
:
Такие инлайны ещё как возможно.
Самый простой способ, как делать это с zero overhead - это сделать компиляторную интринсику, которая будет кэпчурить вызов метода и подменять его на нативный код. Если совсем упороться, то можно попарсить .java-файл, выдернуть оттуда конструкции типа __asm(«строка с кодом») и автоматически вливать их в интринсики. Года эдак два я писал про это на ЛОРе в рамках шуточного поста «java с ассемблерными вставками».
Но одновременно этот способ самый сложный, т.к. требует поддерживать пересобранную версию JDK. Тащить со своим софтом свой JDK - не проблема, проблема что любое изменение интринсик ведёт к полной переборке JDK, это долго (5-20 минут в зависимости от железа) и больно.
Возможность таких инлайнов, скорей всего, появится в рамках проекта Valhalla, и будет выглядеть так же как в C# - собираем код асмом, кладём его в бинарь в managed памяти, берём ссылку на него как метод. Но сейчас этого нет, и разбираться в Вальгалле некогда.
В принципе, не вижу проблем чтобы сделать это и без участия гур из Вальгаллы. И надеялся, что кто-то уже всё это сделал :) Мало ли на земле добрых людей...