Открыть сервисСервис

Язык 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 базовых инструкций, каждая из которых задаётся количеством пробелов в блоке:

Количество пробеловКомандаОписание
1PUSHПомещает на стек число 0
2DUPКопирует верхний элемент стека
3SWAPМеняет местами два верхних элемента
4POPУдаляет верхний элемент стека
5ADDСкладывает два верхних элемента
6SUBВычитает из верхнего второй сверху
7PRINTВыводит верхний элемент как число
8HALTЗавершает программу

Числа в 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)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru