# GraalVM

ES4X использует GraalVM, однако тот же код будет работать и в режиме интерпретации в Java 8, 9, 10 и OpenJ9.

Для JDK >= 11 (с поддержкой JVMCI support) или GraalVM ES4X работает в режиме компиляции.

TIP

Другими словами, используйте Java >= 11 или GraalVM, пожалуйста.

Использование GraalJS дает такие преимущества, как поддержка языка >=ES6, поддержка "из коробки" генераторов, Promise и т.д.

# Отличия от Nashorn

В отличие от Nashorn, функциональная совместимость GraalJS с Java требует точного имени класса/метода из Java. Например, если для свойства name заданы геттеры и сеттеры, необходимо использовать геттеры и сеттеры:

class Hello {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Следующий подход не сработает при использовании Java объекта из Graal:

var hello = new Hello();
// получаем имя
var name = hello.name; // FAIL
// задаем имя
hello.name = 'Paulo';  // FAIL

Правильным будет следующий подход:

var hello = new Hello();
// получаем имя
var name = hello.getName();
// задаем имя
hello.setName('Paulo');

# Работа с потоками

GraalJS строго требует, чтобы с JS контекстом работал только один поток. В случае работы только с Asynchronous Vert.x API никаких проблем быть не должно, но они могут быть при работе с иными библиотеками. Чтобы избежать этих ограничений, рекомендуется использовать Worker API или EventBus.

WARNING

GraalJS не позволяет нескольким потокам получить доступ к одному и тому же контексту скрипта. Если перед вами возникла необходимость работы с несколькими потоками, рекомендуется ознакомиться с Worker API.

# Нативные исполняемые файлы

В данный момент вы не можете создавать нативные исполняемые файлы с ES4X, так как статический анализ AOT-компилятора не будет учитывать Java-код, вызванный из скрипта (а потому эти классы не будут доступны), а также потому что компилятор в данный момент не поддерживает функциональную совместимость с JVM во время выполнения.

В процессе дальнейшей разработки возможны какие-либо изменения в этой области в будущем.