Чтобы понять эту статью, вам необходимы базовые знания компилятора.
Постоянное складывание
Свертывание констант применимо к каждому языку, где есть «константы», они имеют одинаковое значение при статическом анализе и во время выполнения, что позволяет выполнять некоторую работу заблаговременно.
В 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)
В этой статье вы найдете больше оптимизаций.