Страницы

пятница, 15 января 2021 г.

Проверка арифметического переполнения и инициализированности в JavaScript

Поправил до уровня работоспособности генерацию кода JavaScript для проверки арифметических ошибок и состояния инициализированности переменных. Генерация проверок включается и выключается отдельно для каждого вида, но они не являются полностью независимыми, так как проверка арифметики может быть выполнена заодно с инициализированностью.

Например:

r = a * b;
if (-0x80000000 < r && r < 0x80000000) {
...
Проверяемое условие не будет выполнено как в случае выхода за границы, так и в случае, если переменные будут заданы как NaN в качестве неиницилизированности, что позже может быть дополнительно проверено.

пятница, 8 января 2021 г.

Проверка границ массива в JavaScript

Добавил проверку индекса на выход за границы массива для кода, сгенерированного в JavaScript, что было анонсировано почти 2-а года назад. Применённая модель проверки, естественно, замедляет выполнение, но всё же не приводит к взрывной деградации скорости в современных браузерах и в node.js, как это бывает с исполнителями JavaScript.

Был применён такой подход:

array = new Array(len);
this.at = function(index) {
  if (0 <= index && index < len) {
    return array[index];
  } else {
    throw new RangeError();
  }
};

..

a = arr.at(i);
len находится в контексте объемлющей функции и не меняется после установления, что позволяет jit-компилятору оптимизировать проверки вплоть до сравнения с константами, что может быть очень эффективным. Впрочем, накладные расходы на методы никуда не деваются, а Object.freeze для обеспечения гарантии отсутствия подмены методов и гипотетической возможности их встраивания не помог для оптимизации.

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...