WedX - журнал о программировании и компьютерных науках

Улучшение JVM для Scala

Какие изменения в JVM принесут наибольшую пользу компилятору и среде выполнения Scala?

Динамические языки значительно выиграют в производительности от введения InvokeDynamic байтового кода, который должен появиться в JVM 7, а Scala, вероятно, выиграет от хвостовой рекурсии (не уверен, появится ли она в JVM 8 или более поздних версиях).

Какие еще изменения может принести Scala с ее нынешним набором функций в JVM? Эти изменения не за горами?

В частности, есть ли изменения в JVM, которые повысят производительность за счет замыканий и функций-как-объектов?

18.04.2011

Ответы:


1

По сути, все, за что агитировал Джон Роуз :)

  • Fixnums – для устранения затрат на упаковку/распаковку примитивов.

  • Дескрипторы методов. Ускорят функции более высокого порядка и позволят JVM более эффективно их оптимизировать. Типы SAM иногда могут потребовать неудобного переключения между мономорфными и мегаморфными сайтами вызовов, что предотвращает встраивание.

  • Continuations — для поддержки асинхронного/параллельного проектирования в соответствии с node.js.

  • Внедрение в интерфейс – упрощает создание миксинов и реализацию ролей, а также устраняет необходимость создание некоторых промежуточных классов и создание структурных типов без отражения во многих случаях.

  • Оптимизация хвостового вызова — это не проблема :)

Реификацию часто называют чем-то, что принесет пользу сопоставлению с образцом Scala, но это будет стоить дорого с точки зрения взаимодействия, учитывая разные схемы дисперсии, которые используют два языка. На данный момент я считаю, что овеществление может на самом деле причинить больше вреда, чем пользы.

Я также считаю неразумным ожидать чего-либо, что нарушило бы обратную совместимость в Java. Этого просто не будет.

18.04.2011
  • В самом деле: добавление овеществленных дженериков в виртуальную машину только поможет Java. Период. Это точно неправильно. Правильным будет противоположный путь: отделить JVM от Java, сделав байт-код нетипизированным и позволив каждому языку реализовать свою собственную систему типов вместо того, чтобы навязывать систему типов Java на всех языках JVM. Если вы чувствуете себя смелым, реализуйте подключаемую систему типов для байт-кода JVM. (Обратите внимание, что наличие дешевого способа представления типов в байт-коде было бы неплохо.) 19.04.2011

  • 2

    Есть несколько функций Scala, которые лучше реализовать в JVM, например:

    • Универсальные шаблоны, доступные во время выполнения. На данный момент scalac сохраняет типы дженериков как скрытые поля (если рассматриваемый класс является классом case). Однако это делает дженерики в классах случаев излишне дорогими.

    • Декларация-сайт отклонение. Scala указывает вариантность параметров типа на сайте определения, а Java делает это на сайте вызова. Однако это вряд ли будет исправлено, поскольку это нарушит весь существующий универсальный код Java.

    • Оптимизация хвостового вызова. Scalac может выполнить некоторую оптимизацию хвостового вызова самостоятельно, но только в простейшем (саморекурсивном) случае. Любые другие хвостовые вызовы будут использовать пространство стека, как в JVM.

    • Удаление нулевых указателей. Scala уже может обрабатывать нулевые ссылки с помощью Option[A], но из-за того, что он находится в JVM, ссылка на сам параметр может быть нулевым или его параметр может быть нулевым. Таким образом, вы не получаете гарантии ненулевого значения, как, например, в Haskell.

    РЕДАКТИРОВАТЬ: добавлено отклонение от места объявления в список.

    18.04.2011
  • овеществление было бы плохой вещью, если бы оно не было реализовано с точки зрения дисперсии места объявления. Это крайне маловероятно, учитывая, что Java работает с вариациями использования сайта. овеществление, реализованное в соответствии с вариацией Java, сильно повредило бы взаимодействию. 19.04.2011
  • @Кевин: Хороший вопрос! Забыл об этом на мгновение. 19.04.2011
  • Кроме того, удачи в удалении нулей... Вам это понадобится :) 19.04.2011

  • 3

    Типы значений немного помогут с точки зрения производительности для кортежей и классов case. Escape-анализ помогает немного уменьшить выделение кучи для таких объектов, но на данный момент JVM не может достаточно агрессивно встроить вызовы некоторых методов, поэтому не может исключить выделение кучи для этих небольших неизменяемых объектов. Это приводит к засорению кучи и увеличению времени выполнения в 3-4 раза.

    Типы значений также помогают повысить локальность данных и сократить использование памяти. Например, в простом Array[(Int, Int)] каждая запись массива будет иметь накладные расходы в виде одного указателя + заголовка объекта. С помощью типов значений эти накладные расходы могут быть полностью устранены.

    20.04.2011
  • Я слышал слухи, что они тоже придут. Oracle слишком заинтересована в том, чтобы Java зарабатывала $$$ на высокопроизводительных вычислениях, которым нужны комплексные числа и матрицы, размещенные в стеке. 20.04.2011
  • @Kevin Wright: я слышал, что Mono на самом деле довольно популярен в кругах HPC. Он более популярен, чем JVM, поскольку CLI имеет типы значений, и он более популярен, чем реализация CLI от Microsoft, потому что CLI позволяет индексам массива быть либо 32-битными, либо 64-битными, а Mono выбрал 64, а MS выбрала 32. Эти ребята из HPC просто обожают массивы с миллиардами дешевых значений в них. Учитывая это (а также существование Fortress), для Oracle это просто имеет смысл, даже если просто поссать от IBM :-) 21.04.2011

  • 4

    Люди часто сосредотачиваются на InvokeDynamic, не понимая, что инфраструктура MethodHandles имеет множество других преимуществ, даже если ссылки на методы, которые предоставляет MH, никогда не вызываются динамически.

    MethodHandles почти как эффективная форма "правильного отражения".

    Любой язык, активно использующий отражение, вполне может извлечь выгоду из использования дескрипторов методов внутри среды выполнения языка.

    19.04.2011
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]