Основные возможности платформы Hexlet не доступны в вашем браузере. Пожалуйста, обновитесь.
,

ОбучениеПодстановочная модель вычислений

Нам часто пишут о том, что сложно понять, в каком порядке выполняется код и как, в целом, происходит процесс вычисления. Например:

Здравствуйте! Сначала прошел задание, а затем у меня появился вопрос. Проверка strings.toUpperCase(char) === char сначала переводит символ в верхний регистр, а потом сравнивает с ним же? Или происходит просто проверка без перевода? По логике кода происходит второй вариант, но все же хочу уточнить, т.к. согласно учебника .toUpperCase() именно переводит в верхний регистр.

Этот вопрос глубже, чем кажется на первый взгляд. Существуют теоретические модели, описывающие то, как происходят вычисления. Необходимо сразу оговориться, слово "модель", означает то, что мы моделируем поведение системы, таким образом, чтобы акцентировать внимание на тех свойства системы, которые изучаются, но сама модель не отражает того, как на самом деле реализован предмет моделирования.

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

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

Рассмотрим следующий код:

const pi = () => {
  return 3.14;
}

const multi = (a, b) => {
  return Math.round(a * a + b * b);
}

multi(pi(), 4);

Попробуем вычислить результат выражения multi(pi(), 4) используя подстановочную модель вычислений.

multi(pi(), 4);

// Подстановка `pi`
multi(3.14, 4)

// Подстановка `multi`
Math.round(3.14 * 3.14 + 4 * 4);

// Редукции
Math.round(9.8596 + 4 * 4);
Math.round(9.8596 + 16);
Math.round(25.8596);

// Подстановки внутри `round` и вычисления мы не видим,
// потому что это встроенная функция
25;

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

Поделиться Вконтакте
Отправить в Телеграм
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP и Java. Хекслет

Подробнее о том, почему наше обучение работает →