Чтобы понять эту статью, вам необходимы базовые знания компилятора.

Постоянное складывание

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

В JavaScript числа и логические значения являются константами. Обратите внимание, что в языках, где это не так, оптимизация считается небезопасной, поскольку предполагает, что разработчик не переопределил эти значения в своей программе.

Я буду использовать JavaScript и Babel, чтобы продемонстрировать концепцию, он использует шаблон посетителя для мутации и обхода в AST.

1 + 1

Давайте рассмотрим простой пример:

1 + 1

Как было сказано ранее, эту операцию не нужно выполнять во время выполнения, потому что результат может быть известен заранее.

Его соответствующий AST (упрощенный):

Мы хотим оценить: `оператор NumericLiteral1 NumericLiteral2` и заменить BinaryExpression результатом.

В приведенном выше коде:

  • слева: левая часть BinaryExpression, NumericLiteral1 в AST.
  • справа: правая часть BinaryExpression, NumericLiteral2 в AST.
  • оператор: математический знак

Теперь мы преобразовали:

const a = 1 + 1

в:

const a = 2

a + b

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

const a = 1
const b = 2
console.log(a + b)

Мы попытаемся суммировать «a» и «b» вместе, что даст значение «NaN».

АСТ (упрощенный):

Переменные ссылаются на постоянное значение в области видимости, мы должны оптимизировать этот код. Давайте посмотрим на более продвинутый код преобразования:

Полученный код:

console.log(3)

В этой статье вы найдете больше оптимизаций.