Программирование на эмодзи. 5 забавных языков
О скольких из них слышали вы? Зовём познакомиться и даже попрограммировать на каждом.


Полина Суворова для Skillbox

Локаджит Тикаятрай
(Lokajit Tikayatray)
об авторе
Архитектор решений в IT-компании из списка Fortune 100. Любимым занятием называет свою работу. Старается учиться чему-то полезному каждый день.

Кто бы мог подумать, что наши любимые смайлики могут сгодиться на что-то посерьёзнее оживления чатов? Однако ж нашлись таланты, которые придумали целые языки программирования на эмодзи и эмотиконах.
Большинство из них относятся к эзотерическим языкам — эсолангам (от англ. esolang), но разобраться в них проще, чем во многих других эсолангах.
Эзотерические языки плохо подходят для решения бизнес-задач. Их создают, чтобы доказать саму возможность реализации какой-то идеи («подтвердить концепцию», от англ. proof of concept), а то и вовсе шутки ради.
примечание переводчика
Эсоланг может быть даже своего рода произведением искусства. Например, программа на Piet выглядит как абстрактный рисунок. Язык этот назван в честь Пита Мондриана — одного из родоначальников абстрактной живописи.
О самых сложных эсолангах читайте в другой моей статье. В этой же речь пойдёт о пяти таких, в которых можно применять эмодзи:
1) Emoji;
2) Emojicode;
3) Emoji-gramming;
4) EmojiCoder;
5) Emotinomicon.
Emoji
Это эсоланг на основе стека. Эмодзи здесь отвечают за команды (токены), которые этим самым стеком управляют. И их не так уж много, а все остальные символы токенами не считаются.
Вот так на Emoji вывести на экран строку «Hello, World!»
💬 Hello, World! 💬➡
Команда (токен) 💬 читает все символы до следующего 💬 и помещает их в стек, а токен ➡ выводит на экран его содержимое.
Вот результат:

Описание всех токенов языка Emoji:
💬 Считывает строку до следующего символа 💬 и помещает её в стек
⛽ Считывает строку до следующего символа 🚘 и помещает её в стек (эти конструкции могут быть вложенными, в них можно хранить функции)
➡ Выводит на экран содержимое стека
🚲 Помещает в стек логическое значение True («истина»)
🚳 Помещает в стек логическое значение False («ложь»)
🚴 Инвертирует логическое значение в стеке (true преобразуется в false и наоборот)
👫 Складывает два числа из стека
👪 Перемножает два числа из стека
🌊 Вычитает из одного числа в стеке второе число из стека
🍴 Делит одно число в стеке на другое
💸 Делит одно число в стеке на другое и возвращает остаток от деления
💿 Округляет число до ближайшего большего целого
📥 Округляет число из стека до ближайшего меньшего целого
📤 Округляет число из стека до ближайшего большего целого
🐂 Переводит число в шестнадцатеричный вид
🔢 Преобразует строку в число
👬 Проверяет два числа на равенство
🐣 Проверяет, что одно число меньше другого
🐔 Проверяет, что одно число больше другого
🔚 Извлекает логическое значение из стека. Если оно равно false, пропускает код до следующего символа 🐧.
🔙 Если при предыдущей команде 🔚 код не был пропущен, пропускает код до следующего 🐧.
🔃 Берёт две строки из стека. Интерпретирует первую как команду и выполняет её. Дальше проверяет второй логический параметр, и если он равен true, выполняет как команду вторую строку из стека. Затем всё повторяется
👥 Дублирует содержимое стека
🔣 Возвращает числовой код символа
🔍 Возвращает символ по его числовому коду
📲 Принимает два параметра-объекта, создаёт новую переменную и считает второй параметр её именем, а первый — её значением
📱 Принимает один параметр-объект и возвращает значение из переменной с именем, равным этому параметру
📃 Возвращает длину строки (или массива) из стека
✂ Принимает строку и два числа. Возвращает подстроку, начиная с символа с номером, равным первому числу (включительно), и заканчивая символом с номером, равным второму числу (не включая сам этот символ)
🏃 Вычисляет выражение в строке
📚 Создаёт пустой массив
📌 Берёт массив и объект и добавляет этот объект в конец массива. Ничего не возвращает, так что если вам нужен этот изменённый массив, сохраните его в переменную до вызова команды
🔑 Принимает массив (или строку) и индекс. Возвращает значение элемента с этим индексом
🔀 Меняет местами два элемента в стеке
🔊 Преобразует все символы строки к верхнему регистру
🔉 Преобразует все символы строки к нижнему регистру
Позапускать свои программы на Emoji можно здесь.
Emojicode
Emojicode — это объектно-ориентированный язык. Программировать на нём забавно, потому что в коде можно использовать эмодзи.
Это ещё и строго типизированный язык с первоклассной поддержкой классов.
Этот авторский каламбур означает, что в Emojicode запросто можно создавать и использовать классы.
Создатель языка ненавидит ошибки типа NPE (null pointer exception) — они возникают при попытке обратиться к объекту, которому не присвоено значение. Поэтому в Emojicode каждую переменную экземпляра класса (instance variable) нужно сразу инициализировать, чтобы не словить ошибку при компиляции.
А это фрагмент кода для вывода строки «Hello, World!» на этом языке:
🏁 🍇
😀 🔤Hello, World!🔤❗️
🍉
И результат выполнения:

Официальная документация по Emojicode здесь, а попрограммировать на нём можно тут.
Emoji-gramming
Emoji-gramming — ещё один эсоланг с эмодзи. В нём всего 25 переменных и четыре команды — те и другие представлены эмодзи.
Константы в Emoji-gramming задаются символами-сердечками:
💔 — это 0
💜 — это 1
💕 — это 2
💞 — это 4
💖 — это 8
Символ микрофона (🎤) отвечает за поток входных данных, а громкоговоритель (📢) обозначает вывод на экран. Выглядит логично, правда? 😃
Ниже — код на Emoji-gramming, который выводит на экран «Hello, World!»:
😊🕐💖
😇🕐🕐
😊🕑🕐
😇🕑🕑
😊🕒🕑
😇🕒🕒
😊♈💖
😇♈🕒
😊📢♈
😊♈💜
😇♈💞
😇♈🕑
😇♈🕒
😊📢♈
😊♉💞
😇♉💖
😇♉🕑
😇♉🕒
😊📢♉
😊📢♉
😊♊💜
😇♊💕
😇♊💞
😇♊💖
😇♊🕑
😇♊🕒
😊📢♊
😊♈💞
😇♈💖
😇♈🕑
😊📢♈
😊📢🕑
😊♈💜
😇♈💕
😇♈💞
😇♈🕐
😇♈🕒
😊📢♈
😊📢♊
😊♈💕
😇♈🕐
😇♈🕑
😇♈🕒
😊📢♈
😊📢♉
😊♈💞
😇♈🕑
😇♈🕒
😊📢♈
😊♈💜
😇♈🕑
😊📢♈
😊♈💖
😇♈💕
😊📢♈
А вот и результат:
EmojiCoder
EmojiCoder создали Джереми и Сара Натансон (Jeremy Nathanson, Sarah Nathanson). Это эзотерический язык, в котором и команды, и их аргументы записываются в виде эмодзи.
В языке есть эмодзи-обозначения для нуля и единицы. Остальные символы кодируются их комбинациями.
🌚=0
🌝=1
Чтобы понять, как интерпретировать комбинацию (символ это из набора ASCII или же число), перед ней добавляют модификатор — тоже в виде эмодзи:
🔡: Символ ASCII с кодом от 0 до 255
🔢: Целое число от 0 до 255
Возьмём, например, такую последовательность: 🌚🌝🌚🌚🌝🌚🌚🌚, или 01001000 в двоичном виде.
Если поставить перед ней 🔢, то это будет просто целое число 72. А если указать 🔡, то уже символ с кодом 72 (по таблице ASCII), то есть латинская заглавная буква H.
Примечание переводчика
Как из нулей и единиц вдруг получилось 72?
В обычной жизни мы имеем дело с числами в десятичной системе счисления: они получаются из комбинаций десяти цифр от нуля до девяти. Каждое число можно представить в виде суммы произведений его цифр с десяткой в степени, которая зависит от разряда, где стоит цифра (первый разряд справа считается нулевым).
Например: 72 = 7*101 + 2*100, а 372 = 3*102 +7*101+2*100.
Если ограничиться только двумя цифрами (0 и 1), получим двоичную систему счисления. В ней число представляется точно так же, только вместо степеней десятки — степени двойки.
Вот так: 01001000 = 0*27 + 1*26 + 0*25 + 0*24 + 1*23 + 0*22 + 0*21 + 0*20 = 0 + 64 + 0 + 0 + 8 + 0 + 0 + 0 = 72.
Для вывода на экран в EmojiCoder применяется эмодзи «Машущая рука» (👋). Каждую команду нужно писать на новой строке.
Теперь мы знаем всё, чтобы вывести на экран строку «Hello, World!»:
👋🔡🌚🌝🌚🌚🌝🌚🌚🌚 //Печатает символ H
👋🔡🌚🌝🌝🌚🌚🌝🌚🌝 //Печатает символ e
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌝🌝🌝🌝 //Печатает символ o
👋🔡🌚🌚🌝🌚🌝🌝🌚🌚 //Печатает символ запятой (,)
👋🔡🌚🌚🌝🌚🌚🌚🌚🌚 //Печатает пробел
👋🔡🌚🌝🌝🌝🌚🌝🌝🌝 //Печатает символ w
👋🔡🌚🌝🌝🌚🌝🌝🌝🌝 //Печатает символ o
👋🔡🌚🌝🌝🌝🌚🌚🌝🌚 //Печатает символ r
👋🔡🌚🌝🌝🌚🌝🌝🌚🌚 //Печатает символ l
👋🔡🌚🌝🌝🌚🌚🌝🌚🌚 //Печатает символ d
👋🔡🌚🌚🌝🌚🌚🌚🌚🌝 //Печатает символ !
Вот результат:

Полный список команд EmojiCoder смотрите здесь.
Emotinomicon
Это стековый язык программирования (как и Emoji, о котором мы говорили выше). В нём можно использовать как эмодзи, так и эмотиконы. Придумал и создал его Конор О’Брайен (Conor O’Brien).
Вот как вывести строку «Hello, World!» на Emotinomicon:
😭!dlroW ,olleH😲⏪⏬⏩
Объясним назначение токенов:
😭 — начало строки
!dlroW ,olleH — строка с обратным порядком символов
😲 — конец строки
⏪ — начало цикла
⏬ — извлекает из стека и выводит на экран очередной символ строки
⏩ — конец цикла
Примечание переводчика
Почему строка набрана задом наперёд?
Потому что для стека действует правило «последним пришёл — первым ушёл». Последним в стек добавили символ H, так что он будет выведен первым, затем e и так далее до символа !.
И, наконец, результат:

Поиграйтесь с выводом своих строк. Вот вам удобная среда для выполнения программ на Emotinomicone (нужные эмодзи там всегда под рукой, не приходится копипастить их откуда-то ещё).
Emotifuck
Это эмодзи-диалект эсоланга Brainfuck (в переводе «Вынос мозга»).
Emotifuck написан на языке Rust двумя энтузиастами под никами Romulus10 и Insipx. По словам разработчиков, их язык обладает безопасным доступом к памяти.
Ниже список команд Emotifuck и соответствующие им символы языка Brainfuck:
🔥 — Сдвинуть вправо (>)
💯 — Сдвинуть влево (<)
💩 — Уменьшить на 1 (-) [ну почему они не сделали ЭТО командой вывода ;)]
😂 — Увеличить на 1 (+)
💞 — Вывести (.)
🙏 — Ввести (,)
🌚 — Прыгнуть вперёд ([)
🐸 — Прыгнуть назад (])
примечание переводчика
Под программу на этом языке вначале выделяется 30 000 ячеек, в которых лежат нули. Вдоль множества ячеек перемещается указатель. Команды «сдвинуть вправо» и «сдвинуть влево» двигают этот указатель на одну ячейку вправо или влево, соответственно.
С прыжками вперёд и назад чуть хитрее: они перемещают указатель вперёд (вправо) или назад (влево) до следующего парного символа: для [ парным будет символ ] и наоборот. Причём команда сработает, только если в текущей ячейке будет лежать не ноль.
Код для вывода «Hello, World!» на Brainfuck выглядит так:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
С помощью словарика выше переведём это на Emotifuck и получим:
😂😂😂😂😂😂😂😂🌚🔥😂😂😂😂🌚🔥😂😂🔥😂😂😂🔥😂😂😂🔥😂💯💯💯💯💩🐸🔥😂🔥😂🔥💩🔥🔥😂🌚💯🐸💯💩🐸🔥🔥💞🔥💩💩💩💞😂😂😂😂😂😂😂💞💞😂😂😂💞🔥🔥💞💯💩💞💯💞😂😂😂💞💩💩💩💩💩💩💞💩💩💩💩💩💩💩💩💞🔥🔥😂💞🔥😂😂💞
Вот и всё, ребята! 🤗
Если заинтересовались темой
Документацию и дополнительные материалы ищите тут:
Что дальше?
Например, почитайте про другие эсоланги и о том, какие бывают языки программирования и сколько их вообще в мире.