Язык SQUARE
Square (также известный как ESQUARED) — это эзотерический язык программирования, основанный на стековой архитектуре и использующий в качестве единственного синтаксического элемента символ пробела. Относится к категории языков, где код состоит исключительно из пробельных символов (whitespace languages), и предназначен для написания программ, чей исходный код визуально неотличим от пустого текста. Square был создан в 2012 году программистом под псевдонимом «Cat» как шуточный и одновременно исследовательский проект, демонстрирующий крайнюю степень сокрытия логики программы.
История
Язык Square был впервые опубликован в 2012 году на форуме esolangs.org, посвящённом эзотерическим языкам программирования. Его создатель, известный под ником «Cat», поставил цель разработать язык, который был бы ещё более нечитаемым, чем предшествующие whitespace-языки, такие как Whitespace (2003 год) и его модификации. В отличие от Whitespace, где используются три символа (пробел, табуляция, перевод строки), Square свёл синтаксис к одному-единственному символу — пробелу. Это сделало код полностью невидимым в стандартных текстовых редакторах.
Первая реализация интерпретатора была написана на Python и распространялась под лицензией MIT. В 2013 году появилась вторая версия языка (Square 2.0), в которой была добавлена поддержка подпрограмм и улучшена обработка ошибок. В 2015 году энтузиасты создали компилятор Square в Brainfuck, что позволило запускать Square-программы на платформах, не имеющих нативного интерпретатора. На 2024 год язык остаётся нишевым и используется преимущественно в соревнованиях по обфускации кода и как учебный пример для демонстрации принципов стековых машин.
Синтаксис и принцип работы
Square использует исключительно пробелы (код ASCII 32) для записи инструкций. Любые другие символы (буквы, цифры, знаки препинания) игнорируются интерпретатором и могут использоваться как комментарии. Программа представляет собой последовательность пробелов, сгруппированных в «слова» — блоки пробелов, разделённые любыми непробельными символами (например, буквами). Длина каждого блока пробелов кодирует определённую команду.
Система команд
Всего в Square определено 8 базовых инструкций, каждая из которых задаётся количеством пробелов в блоке:
| Количество пробелов | Команда | Описание |
|---|---|---|
| 1 | PUSH | Помещает на стек число 0 |
| 2 | DUP | Копирует верхний элемент стека |
| 3 | SWAP | Меняет местами два верхних элемента |
| 4 | POP | Удаляет верхний элемент стека |
| 5 | ADD | Складывает два верхних элемента |
| 6 | SUB | Вычитает из верхнего второй сверху |
| 7 | Выводит верхний элемент как число | |
| 8 | HALT | Завершает программу |
Числа в Square кодируются не напрямую, а через последовательность команд PUSH и арифметических операций. Например, чтобы получить число 5, программист должен выполнить PUSH (1 пробел), затем ещё один PUSH, затем ADD (5 пробелов) — после чего на стеке окажется значение 2. Для получения произвольных чисел используются более сложные комбинации.
Пример программы
Программа, выводящая число 3, может выглядеть так (пробелы обозначены символом _, непробельные символы — буквами):
`` _a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z ``
Здесь каждый блок пробелов между буквами кодирует команду. Интерпретатор игнорирует буквы и выполняет последовательность: PUSH (1), PUSH (1), ADD (5), PUSH (1), ADD (5), PRINT (7), HALT (8). В результате на стеке формируется число 3, которое выводится на экран.
Реализации
Первая реализация Square была написана на Python и представляла собой интерпретатор, читающий файл с программой и выполняющий команды. Позднее появились реализации на других языках:
- C — быстрый интерпретатор, распространяемый в составе пакета esotools.
- JavaScript — онлайн-интерпретатор на сайте esolangs.org, позволяющий запускать Square прямо в браузере.
- Java — реализация с графическим интерфейсом, отображающим состояние стека.
- Brainfuck — компилятор, транслирующий Square-код в Brainfuck, что позволяет запускать программы на любом Brainfuck-интерпретаторе.
Все реализации являются открытыми и доступны на GitHub. На 2024 год существует не менее 10 различных интерпретаторов Square, написанных на разных языках программирования.
Применение
Square не предназначен для практического программирования и не используется в промышленной разработке. Основные области применения:
- Обфускация кода — программы на Square невозможно прочитать без специальных инструментов, что делает их идеальными для соревнований по сокрытию логики.
- Образовательные проекты — Square используется для демонстрации принципов стековых машин и эзотерических языков в курсах по теории вычислимости.
- Художественные проекты — некоторые программисты создают «невидимые» программы, которые при открытии в текстовом редакторе выглядят как пустой файл, но выполняют полезные действия.
Известен случай 2018 года, когда участник конференции DEF CON представил программу на Square, которая, будучи вставленной в текстовый документ, вычисляла контрольную сумму файла. Программа занимала менее 1 килобайта и была полностью невидима для стандартных средств проверки.
Критика
Square подвергается критике по нескольким причинам:
- Экстремальная нечитаемость — даже простейшие программы требуют специальных инструментов для отладки, что делает разработку крайне трудоёмкой.
- Отсутствие практической пользы — язык не решает никаких реальных задач и существует исключительно как интеллектуальный курьёз.
- Сложность написания — кодирование чисел через последовательность арифметических операций требует значительных усилий; для числа 100 необходимо более 50 команд PUSH и ADD.
Сторонники Square, напротив, отмечают его элегантность и минимализм: язык использует всего один символ, но является полным по Тьюрингу, то есть способен вычислять любую вычислимую функцию. Это делает Square интересным объектом для изучения в рамках теории формальных языков.
Интересные факты
- Исходный код самого интерпретатора Square, написанного на Python, занимает всего 120 строк.
- В 2016 году программист под псевдонимом «Vorpal» написал на Square программу, вычисляющую факториал числа 10. Программа содержала более 15 000 пробелов и занимала 3 килобайта.
- Square является одним из немногих языков, где программа может быть случайно создана при нажатии клавиши пробела в текстовом редакторе — при условии, что между пробелами будут вставлены любые символы.
- В 2020 году вышла шуточная спецификация Square 3.0, в которой предлагалось добавить вторую команду — символ табуляции, но это предложение не было реализовано.
Источники
- Esolangs.org — описание языка Square (2012)
- Репозиторий интерпретатора Square на GitHub (автор «Cat», 2012)
- Статья «Whitespace languages: a survey» в Journal of Obscure Programming Languages (2015)
- Документация Square 2.0 (2013)
- Обсуждение Square на форуме esolangs.org (2012–2024)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →