Оптимизация строится на предположениях
Что меняется, когда в числовой код приходит строка.
Если add(a, b) часто получает числа, оптимизирующий компилятор может подготовить специализированный путь с проверками предположений. Это способ ускорить динамический язык без изменения его правил.
function add(a, b) { return a + b; }
add(2, 3); // 5
add('2', 3); // '23'
Когда предположение не выполняется, возможны другой путь выполнения или deoptimization: восстановление состояния для менее специализированного кода. Программа должна по-прежнему вернуть '23', а не выполнить неверное числовое сложение.
В нём проверяется предположение: a и b — числа.
add(2, 3)
✓ Проверка пройдена
Оба аргумента — числа.
Выполняется подготовленный машинный код.
5add('2', 3)
× Проверка не пройдена
Первый аргумент — строка.
V8 восстанавливает состояние и продолжает выполнение через Ignition.
'23'Формы объектов и inline caches тоже дают обратную связь — подробно разберём их в разделе об оптимизации.
Прежде чем менять работу с динамическими объектами ради JIT, нужно записать профиль, найти участок с высокими затратами и определить причину этих затрат.