Недавно я узнал о странной ошибке в V8. Все обсуждают это в Twitter, Facebook, Gitter и других социальных сетях. Итак, я немного объясню об этом.

Насколько мне известно, это происходит в последней стабильной версии Google Chrome (моя версия - 51.0.2704.103). Вы можете проверить это с помощью следующего фрагмента кода:

function foo() {
  return typeof null === 'undefined';
}
for (var i = 0; i < 1000; i++) {
  console.log(foo());
}

Это приводит к следующему результату:

Что случилось?

Что ж, я нашел фиксацию, исправляющую эту проблему. Вот ссылка, так что вы можете заглянуть в нее сами.



Согласно описанию коммита, проблема заключалась в канонизации. Это что?

В информатике канонизация (иногда стандартизация или нормализация) - это процесс преобразования данных, которые имеют более одного возможного представления, в «стандартную», «нормальную» или каноническую форму. Это может быть сделано для сравнения различных представлений на эквивалентность, для подсчета количества различных структур данных, для повышения эффективности различных алгоритмов за счет исключения повторяющихся вычислений или для обеспечения возможности наложения значимого порядка сортировки.

В нашем случае проблема заключалась в канонизации строк.

Позвольте мне привести краткий пример того, что такое канонизация с помощью логических значений. Скажем, в JavaScript логическое значение может быть записано как true, false, 1, 0, пустая строка, и т. д. Но в канонической форме это может быть только true или false. Это каноническая форма логического значения. Единственная форма представления данных, правильная.

Вот где была эта ошибка. Компилятор коленчатого вала в V8 делает это немного неправильно при оптимизации вашего кода. Вот почему первые итерации были прямо в нашем цикле, пока Crankshaft не оптимизировал его.

Поделитесь своими мыслями, буду рад обсудить.

UPD: Благодаря Вячеславу Егорову у нас есть хорошее объяснение того, что произошло: