Excel — самый массовый Тьюринг-полный язык программирования в мире

Во время недавней видеовстречи финансовый аналитик демонстрировал мне свою расчетную модель в Excel. Это было впечатляющее зрелище: двенадцать рабочих листов, формулы с трехуровневой вложенностью, именованные диапазоны вместо привычных ссылок и функция ДВССЫЛ (INDIRECT), динамически формирующая адреса ячеек из текстовых строк. Глядя на это нагромождение логики, я поймал себя на мысли: этот человек фактически спроектировал компилятор, даже не осознавая этого.

Аудитория Excel насчитывает около 750 миллионов пользователей. Для контекста: сообщество Python составляет примерно 15 миллионов человек, а JavaScript — около 17 миллионов. Популярность Excel превосходит их суммарные показатели почти в двадцать раз. Парадокс заключается в том, что подавляющее большинство этих людей убеждены, будто они «просто заполняют таблички» и готовят отчетность.

В действительности же они занимаются программированием.


Формулы как воплощение функциональной парадигмы

Рассмотрим стандартную конструкцию:

=СУММ(A1:A10) * (1 + B2)

С точки зрения информатики здесь происходит вызов функции СУММ с передачей диапазона в качестве аргумента, результат которого перемножается с выражением в скобках. Здесь нет побочных эффектов: формула не модифицирует состояние других ячеек. При идентичных входных данных результат всегда будет детерминированным. Мы видим классическую композицию функций.

Это не что иное, как чистые функции. Перед нами, по сути, функциональное программирование в чистом виде.

И это не преувеличение. Саймон Пейтон-Джонс, один из ключевых разработчиков языка Haskell, работая в Microsoft Research, открыто называл Excel самым массовым и успешным функциональным языком в истории. Он лишь с иронией добавлял слово «к сожалению», намекая на специфику использования этого инструмента.

Взгляните на это шире: каждая ячейка представляет собой привязку идентификатора к выражению. Адрес B5 — это переменная. Конструкция =A1+A2 — это декларация функции без аргументов. Лист выступает в роли пространства имен, а книга — в роли модуля.


ВПР — это поиск по хеш-таблице

=ВПР(E2; A:B; 2; ЛОЖЬ)

Если перевести это на технический язык: «найти значение E2 в первом столбце структуры A:B и вернуть соответствующий элемент из второго столбца при условии точного совпадения». Это прямой аналог метода dict.get(key) в Python или map.find(key) в C++. Типичная операция lookup в хеш-таблице.

Связка ИНДЕКС + ПОИСКПОЗ работает еще элегантнее — это поиск с раздельной адресацией: сначала определяется позиция элемента, а затем по этой позиции извлекаются данные. Мы видим двухфазный поиск, аналогичный работе с индексированными базами данных.

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


Логические конструкции и паттерн-матчинг

=ЕСЛИ(И(A1>100; B1="Москва"); "VIP"; ЕСЛИ(A1>50; "Стандарт"; "Эконом"))

Многоуровневые вложения ЕСЛИ — это реализация оператора switch/case или упрощенный паттерн-матчинг. Да, визуально это может выглядеть громоздко (автору доводилось встречать двенадцатиуровневые конструкции), но логическая суть остается неизменной.

Современный ПЕРЕКЛЮЧ (SWITCH) в Office 365 сделал этот процесс еще более прямолинейным:

=SWITCH(A1; 1;"Январь"; 2;"Февраль"; 3;"Март"; "Неизвестно")

Это полноценный switch-case с обработкой значения по умолчанию. А функции семейства IFS (СУММЕСЛИМН, СЧЁТЕСЛИМН) — это не что иное, как фильтрация коллекций на основе предикатов. Запись =СЧЁТЕСЛИ(A:A; ">100") функционально эквивалентна data.filter(x => x > 100).length.


LAMBDA: окончательное признание статуса

В 2021 году, с внедрением функции LAMBDA, Excel перестал маскироваться под простую таблицу.

=LAMBDA(x; y; x^2 + y^2)(3; 4)

Это классическая анонимная функция. Она принимает аргументы и мгновенно вычисляет результат. Но истинная мощь раскрывается при использовании Диспетчера имен, когда лямбда-выражению присваивается имя, создавая пользовательскую функцию (UDF) без капли VBA-кода:

ГИПОТЕНУЗА = LAMBDA(a; b; КОРЕНЬ(a^2 + b^2))

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

Добавьте к этому функции высшего порядка — MAP, REDUCE, SCAN. Это инструменты, которые позволяют обрабатывать массивы данных так же изящно, как в Haskell или Scala. Сегодня грань между «табличным процессором» и средой функционального программирования практически стерта.


Полнота по Тьюрингу: доказательство на практике

Вопрос о том, является ли Excel Тьюринг-полным, давно перешел из разряда гипотез в область доказанных фактов. В 2004 году было доказано, что одномерный клеточный автомат Rule 110 является универсальным вычислителем. Реализовать его в сетке ячеек Excel — задача тривиальная.

Достаточно задать начальное состояние в первой строке и прописать логику переходов для последующих строк, используя комбинации ЕСЛИ и И. Применив условное форматирование, вы увидите характерные фрактальные паттерны Rule 110. Раз Excel способен реализовать Rule 110, значит, он способен вычислить все, что в принципе вычислимо.

Существуют и другие подтверждения: от построения машины Тьюринга, где лентой служит строка, а логика переходов реализована через ВПР, до полноценных имплементаций лямбда-исчисления. Ограничением выступает лишь объем оперативной памяти и вычислительные ресурсы процессора.


Риски «теневой» разработки

Проблема не в том, что Excel — это язык программирования. Проблема в том, что на этом языке без надлежащего контроля зиждется вся мировая финансовая архитектура. Огромный процент инвестиционных моделей, бюджетов государств и расчетов хедж-фондов существует в виде .xlsx файлов, лишенных систем контроля версий, юнит-тестов и процедур код-ревью.

История знает немало драматических примеров:

  • JPMorgan (2012): Ошибка в формуле (деление на сумму вместо среднего) в модели оценки рисков привела к убыткам в 6,2 миллиарда долларов. Сложная система связей между файлами поддерживалась ручным копированием данных.
  • MI5 (2011): Из-за автоматического форматирования телефонных номеров в Excel британская контрразведка ошибочно прослушивала не тех подозреваемых — лишние цифры просто обрезались программой.
  • Научная среда: В 2020 году генетикам пришлось официально переименовать почти три десятка генов (например, MARCH1 в MARCHF1), потому что Excel упорно конвертировал их названия в даты. Исправить названия генов оказалось проще, чем изменить логику работы табличного процессора.

Когнитивный диссонанс пользователей

Мы не воспринимаем работу в Excel как программирование из-за отсутствия привычных атрибутов: черного экрана терминала, подсветки синтаксиса в IDE или коммитов в репозиторий. Пользователи идентифицируют свою деятельность как «построение моделей» или «обновление отчетов».

Однако, если мы обратимся к формальным признакам языка программирования, Excel обладает всеми ключевыми компонентами: переменными (ячейки), функциями (формулы и LAMBDA), условной логикой, итерациями (через рекурсию или протягивание формул), структурами данных и вводом-выводом. Это среда разработки с уникально коротким циклом обратной связи — изменения видны мгновенно.


Наследие в виде «спагетти-ячеек»

Каждый профессионал рано или поздно сталкивается с «legacy-кодом» в Excel: файлом на 50 листов с битыми внешними ссылками, циклическими зависимостями и скрытыми строками, от которых зависит критически важный отчет. Это те же самые проблемы, что и в традиционной разработке: отсутствие документации, уход автора и страх что-то сломать.

Исследования показывают, что до 88% корпоративных таблиц содержат ошибки. В мире традиционного ПО такой уровень дефектов в продакшене был бы недопустим, но в Excel-мире это суровая реальность.

Microsoft пытается исправить ситуацию, внедряя такие инструменты, как Power Query (ETL-процессы) и типы данных. Возможно, будущее не в том, чтобы заставлять всех учить Python, а в том, чтобы внедрить лучшие практики разработки (тестирование, модульность) непосредственно в среду таблиц.

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

 

Источник

Читайте также