Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Компиляция JVM языков в JavaScript

Компиляция JVM языков в JavaScript

Как современные языки для JVM компилируются в JavaScript

Yuriy Artamonov

June 05, 2015
Tweet

More Decks by Yuriy Artamonov

Other Decks in Programming

Transcript

  1. Мотивация • Один язык для серверной и клиентской части •

    Общий код для объектов взаимодействия • Статическая типизация • Глобальные оптимизации кода • Кроссбраузерность * • Знакомые инструменты разработки Java
  2. GWT Google Web Toolkit Последняя версия 2.7 Исходный код: Java

    + JavaScript native interface Компиляция из исходного кода Наиболее полная эмуляция JRE 7 Инкрементальный компилятор
  3. Scala.js Последняя версия 0.6.0 Исходный код: Scala Компиляция на уровне

    AST, плагин для компилятора Поддержка всей стандартной библиотеки Scala * Использует Google Closure Compiler
  4. JSNI vs @JsInterop public static native void alert(String msg) /*-{

    $wnd.alert(msg); }-*/; @JsInterface interface MyJsInterface { void alert(String msg); }
  5. Этапы компиляции • Оптимизация Java кода • Нормализация • Генерация

    AST для JavaScript • Оптимизация JavaScript (Google Closure Compiler)
  6. Оптимизация Java • Удаляем недостижимые методы, поля и классы •

    Помечаем как final поля, методы и классы • Заменяем мономорфные вызовы методов на статический вызов • Вычисляем наиболее точный тип выражений, значений, параметров • Удаляем блоки кода, если точно известно значение условия if • Вычисляем выражения с константами • Встраиваем тело метода на место его вызова, для коротких методов • Заменяем использование перечислений на их Ordinal значения • Если все вызовы метода передают в параметр одно и тоже значение, то создаём версию метода без этого параметра
  7. Нормализация • Заменяем вызовы к строкам, примитивам и массивам •

    Заменяем множественные выражения catch для одного try блока • Вставляем явное приведение к типу Long соответствующие • Вставляем вызовы методов для арифметики с типом Long • Заменяем приведения типов и проверки instanceOf на соответствующие вызовы библиотеки GWT • Заменяем операции с массивами на вызовы времени исполнения • Заменяем сравнения через == • Заменяем вызовы getClass() • Заменяет ссылки на типы, используемые в instanceOf
  8. Генерация AST JavaScript и оптимизация • Исправляем имена переменных по

    областям видимости • Обфусцируем идентификаторы • Встраиваем короткие функции • Удаляем неиспользуемые функции • Удаляем дубликаты функций • Добавляем информацию для понятных трассировок стека