Скидки до 20% + 2-ая профессия бесплатно и подарки на 50 000₽

Главная | Все статьи | Код

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

Время чтения статьи ~2 минуты 83
Подстановочная модель вычислений главное изображение

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

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

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

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

Подписывайтесь на канал Кирилла Мокевнина в Telegram — чтобы узнать больше о программировании и профессиональном пути разработчика

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

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

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` и вычисления мы не видим,
// потому что это встроенная функция
26;

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

Читайте также: Что такое ссылочная прозрачность и как она влияет на эффективность программиста.

Аватар пользователя Kirill Mokevnin
Kirill Mokevnin 10 сентября 2016
83
Похожие статьи
Рекомендуемые программы
профессия
Верстка на HTML5 и CSS3, Программирование на JavaScript в браузере, разработка клиентских приложений используя React
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на Ruby, Разработка веб-приложений и сервисов используя Rails, проектирование и реализация REST API
5 месяцев
c опытом
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря