Езотеричні мови програмування. Як це — писати код, що не має практичного застосування
Maртін Ендер — Senior Software Developer з Німеччини, співзасновник компанії Kagenova, що займається штучним інтелектом для створення фотореалістичного метавсесвіту.
Та найбільше світовій спільноті розробників Мартін відомий завдяки розробленню езотеричних мов програмування, найпопулярніша з яких — Hexagony.
Езотеричні мови програмування — це вид мов програмування, які здебільшого не призначені для практичного застосування. Їх використовують для перевірки меж дизайну мови, як доказ концепції, як хакерський інтерфейс до іншої мови. Крім того, езотеричні мови можуть бути проявом мистецтва у розробці програмного забезпечення або ж просто «комп’ютерним жартом» чи пародією на звичайні мови програмування.
В езотеричних мов програмування є своя спільнота творців та прихильників. Найпершим прикладом езотеричної мови програмування вважають INTERCAL, розроблену ще 1972 року. Її автори Дон Вудсон і Джеймс Лайоном цілеспрямовано писали мову, не схожу на жодну з їм відомих, пародіюючи тогочасні «глиби» на кшталт Fortran, COBOL і Assembly Language.
Ознаки езотеричних мов програмування
Ймовірно, найбільш виразна характеристика езотеричних мов програмування — вони не розроблені для серйозної функціональності чи використання. З-поміж іншого їх відрізняє:
Унікальні представлення даних — якщо звичайні імперативні мови програмування зазвичай дозволяють зберігати дані у змінних, то езотеричні мови експериментують з іншими методами.
Мінімалізм — для езотеричних мов характерна якомога менша кількість лінгвістичних елементів. При цьому частина з них — повні за Тюрінгом.
Також у деяких езотеричних мов є тематичність, яка навіть може бути не пов’язаною зі світом ІТ. Наприклад, var’aq засновано на вигаданій клінгонській мові. Програми на Shakespeare моделюються як п’єси Шекспіра, тоді як програми на Chef схожі на кулінарні рецепти. Безумовно, ці мови також створені суто для розваги, а не для продукування серйозного програмного забезпечення.
А ще такі мови подекуди спеціально створюють так, аби їх було важко читати. Яскравий приклад — Unreadable.
Щоб більше дізнатись про феномен езотеричних мов програмування, їхнє призначення та користь, ми коротко поспілкувалися з розробником Hexagony Maртіном Ендером.
— Мартіне, як ви зацікавилися езотеричними мовами програмування?
Здається, на саме поняття езотеричних мов програмування я натрапив років 15 тому, коли переглядав Вікіпедію. Хоча програмувати однією з них я спробував лише за кілька років, а згодом почав і створювати. Спершу я реалізував інтерпретатор для езотеричної мови Pada, яку створив хтось інший.
Після цього ідея розробити власну езотеричну мову почала здаватися менш страшною. Вже за кілька днів я втілив свою першу мову Labyrinth. За кілька місяців до того я створив Retina, але на той час це була не мова, а просто тривіальний інструмент командного рядка.
— Чому езотеричні мови для вас цікаві?
На найпростішому рівні я люблю відкривати нові (емерджентні) властивості систем правил. Сьогодні я створюю та граю в багато ігор-головоломок, і це принципово те саме.
Використовуючи добре відомий приклад з гри: «Ви можете розмістити два портали десь у цій кімнаті, а потім ходити та переносити речі через них», що ви можете з цим зробити? Досягти раніше недоступних місць і обійти лазери, а ще ж побудувати гармату, хто б міг подумати!
З езотеричними мовами програмування схоже. Навіть якщо я створюю їх сам, можу просто визначити деякі правила для мови, а згодом витратити багато часу на те, щоб самостійно виявити її властивості.
— Чому вирішили розробити власну езотеричну мову програмування?
Езотеричні мови програмування я створюю здебільшого для розваги. Спочатку мені подобалося досліджувати інші езотеричні мови, і я волів побачити, чи зможу й сам це зробити.
Звичайно, історія походження кожної з моїх мов дещо відрізняється. За допомогою Hexagony та Wumpus я хотів вивчити нові типи сіток для двовимірних мов.
Приклад коду на Hexagony
З Alice прагнув дослідити тематичну концепцію, де мова могла б працювати у двох «паралельних всесвітах», які схожі один на одного, але в дечому принципово відрізняються.
За допомогою Stack Cats я спробував вивчити концепцію під назвою «оборотне програмування» разом з деякими суворими естетичними обмеженнями мови.
Основним винятком з цього є Retina. У той час я багато займався Code Golf (розважальне змагання з програмування, де ви намагаєтесь розв’язати проблему, використовуючи якомога меншого коду) і часто виявляв, що проблему можна вирішити за допомогою одного регулярного виразу або його заміни.
Тож я спочатку створив крихітну мову, яка могла підбирати та/або замінювати регулярний вираз майже без синтаксичних витрат. З роками мова перетворилася на потужний інструмент для маніпулювання рядками, хоча й із сумнівним синтаксисом через його коріння.
— Розкажіть детальніше про вашу мову Hexagony?
Є кілька реалізацій Hexagony і способів їх запуску:
Найпростіший спосіб «помацати» цю мову — онлайн-IDE SirBogman hexagony.net (запускає власний інтерпретатор на основі JavaScript).
Якщо віддаєте перевагу офлайновим інструментам, то Esoteric IDE від Timwi також підтримує Hexagony (запускає власний інтерпретатор на основі C#).
Якщо вам потрібен інтерпретатор командного рядка, то є швидкий інтерпретатор на основі C#, який до того ж працює на code.golf.
І є оригінальна довідкова реалізація в Ruby, яку ви можете знайти в цьому репозиторії. Примітки щодо використання містяться внизу README. Ви також можете використовувати інтерпретатор Try it online!.
Вихідний код мови складається з друкованих символів ASCII і перекладного рядка та інтерпретується як шестикутна сітка з гострою вершиною, де кожна комірка містить команду з одного символу. Вихідний код завжди має бути правильним шестикутником. Зручний спосіб представити шестикутні макети в ASCII — це вставити пробіл після кожної комірки та написати кожен інший рядок. Шестикутник зі стороною 3 можна представити так:
. . . . . . . . . . . . . . . . . . .
де кожна . може бути командою. Наступним більшим можливим вихідним кодом буде:
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Через це обмеження кількості команд у вихідному коді завжди буде шестикутне число по центру . Для довідки перші 10 центрованих шестикутних чисел:
1, 7, 19, 37, 61, 91, 127, 169, 217, 271.
Під час читання вихідного файлу Hexagony спочатку видаляє всі пробіли. Потім кожна`
(зворотна позначка) також видається, але символи після цих зворотних позначок позначаються «прапором налагодження». Цей вихідний код, що залишився, доповнюється до наступного шестикутного числа з центром без операцій і переставляється в правильний шестикутник. Це означає, що пробіли у вищенаведених прикладах було вставлено лише з косметичних міркувань, але не обов’язково додавати їх у вихідний код. Наступні три програми ідентичні:
a b c d e f g h . . . . . . . . . . .
abcdefgh...........
abcdefgh
Але зауважте, що
abcdefg
натомість буде короткою формою
a b c d e f g
Детальніше прочитати про контроль потоку, модель пам’яті, вивчити список команд та інше можете у репозиторії.
— Для чого можна використати ваші езотеричні мови?
Мої мови, як правило, повні за Тюрингом і допускають довільний, хоча інколи обмежений, вхід і вихід, тому їх можна використовувати для будь-чого, що не потребує графічного інтерфейсу, елементів реального часу чи периферійних пристроїв. Однак вони здебільшого створені як веселі головоломки, у яких ви намагаєтесь зрозуміти, як реалізувати щось просте, наприклад обчислення чисел Фібоначчі, за допомогою нетрадиційної моделі програмування.
Довідка: У математиці числа Фібоначчі, які зазвичай позначаються Fₙ, утворюють послідовність, в якій кожне число є сумою двох попередніх. Послідовність зазвичай починається з 0 і 1, хоча деякі автори опускають початкові терміни й починають послідовність з 1 і 1 або з 1 і 2.
Як я згадував раніше, основним винятком є Retina, яку я б вважав езотеричною мовою програмування лише через її дивний синтаксис. Функціонально вона схожа на деякі широко використовувані інструменти, такі як sed і awk, і я час від часу застосовую її у роботі для різних одноразових завдань з обробки тексту.
— Чи є у ваших езотеричних мов програмування власна екосистема та спільнота?
Як не дивно, так! Найпопулярнішою майже завжди була Hexagony. Її додали до чинної IDE для езотеричних мов програмування, автор якої також створив інструмент для візуалізації програм Hexagony. Хтось інший підготував для неї спеціальну онлайн-IDE. Вона підтримується на Code Golf. Мені розповідали, що мову використовували у полюванні на головоломки.
Є також кілька користувачів, які обирають Retina. Думаю, здебільшого це люди зі спільноти Code Golf, які вивчали мову для розваги, а потім, як і я, зрозуміли, що вона насправді корисна для обробки тексту. З цією метою я створив невелике розширення для VS Code, яке дає змогу запускати сценарії Retina безпосередньо у вашому редакторі.
— Яку користь і які відкриття ви винесли для себе зі створення езотеричних мов?
Я не впевнений, що були значні відкриття, але я точно дізнався багато нового про програмування загалом. Як завдяки створенню мов, так і завдяки їх використанню. Зокрема, через Retina я з’ясував багато що про реалізацію «правильних» мов програмування. Головним чином тому, що вона має найдосконаліший синтаксис з усіх моїх мов.
З усім тим, коли бавитеся з езотеричними мовами, то справді відчуваєте, що можете довідатися щось цікаве про програмування загалом. Звичайно, езотеричні мови майже ніколи не зручні у використанні, і розробники нерідко обмежені в тому, що можуть втілити ними. Втім, я вважаю, що частенько трапляються речі, де вони виявляються дієвими. І тоді починаєте ставити собі цікаві запитання: «Чому цю проблему легше вирішити цією мовою, а не іншою?» і «чи є якась функція та особливість, яку могла б мати „звичайна“ мова програмування, аби надати розробнику ті самі переваги?».
— Які проєкти ви реалізували своїми езотеричними мовами?
«Проєкти» — це дуже велике слово для тих речей, які люди зазвичай розробляють езотеричними мовами. Я дуже пишаюся своєю реалізацією текстової гри
Щодо того, що інші люди виконували за допомогою моїх мов... наразі я втратив про це уявлення. Але вважаю дуже крутим, що їх використовували, наприклад, у пошуках головоломок.
— Що б ви порадили людям, які хочуть спробувати створити власну езотеричну мову? Які спеціальні знання їм можуть знадобитися?
Моя головна теза: це простіше, ніж ви думаєте. Хоча, звичайно, це залежить від того, наскільки складною буде ваша езотерична мова. Я вважаю, корисно почати з реалізації простої мови, яка вже існує. Це надихне вас, та й вам не доведеться турбуватися про дизайн і реалізацію одночасно. Якщо ви переймаєтеся розбором складного синтаксису, просто створіть езотеричну мову з односимвольними командами.
Якщо зовсім не знаєте, з чого почати, то завжди можете надіслати нереалізований проєкт на вікі esolangs.org. Можливо, хтось із тамтешньої спільноти зголоситься допомогти втілити задумане.
3 коментарі
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.