В свободное время я люблю читать. Один из моих любимых писателей – Терри Пратчетт, автор цикла фентезийных романов «Плоский мир». С него-то все и началось.
У Пратчетта тексты очень многослойные, в них множество отсылок к разнообразным темам. Поэтому любопытно бывает почитать статьи с анализом этих текстов – чтобы понять, насколько плохо их понял самостоятельно.
Блуждая таким образом по интернету и выискивая отсылки к теме программирования, я наткнулась на упоминание эзотерического языка программирования «Уук!». Слово «эзотерический» пришлось перечитать дважды, ибо для меня «эзотерика» – это что-то из сферы ретроградного Меркурия в третьем доме и прочих Козерогов.
В общем, полезла я на Вики – смотреть, что такое эзотерические языки программирования. И понеслось…
Ook!
Из-за утечки магии в Незримом университете (где обучаются волшебники Плоского мира) библиотекарь превратился в орангутана. Он сохранил за собой свое рабочее место: в новом обличьи ему стало еще легче перемещаться по шкафам и полкам. Библиотекарь любит бананы, не любит, когда его называют обезьяной, и общается с окружающими с помощью одного слова – «Уук» (англ. Ook), произносимого с разными интонациями.
Этой историей вдохновлялся создатель язык программирования Ook! – Дэвид Морган-Мар. По сути этот язык является диалектом другого эзотерического языка, Brainfuck. В нем есть восемь команд, составленных исключительно из «Ook» и знаков препинания (точка, вопросительный и восклицательный знак). При этом Ook! является тьюринг-полным языком.
Далее информация с сайта dangermouse.net (сайт Дэвида Моргана-Мара).
В основу языка заложены следующие принципы:
- Язык должен быть таким, чтобы на нем могли читать и писать орангутаны.
- Следовательно, синтаксис должен быть простым, легко запоминающимся и не содержать слово «обезьяна».
- Бананы это хорошо.
Поскольку слово Ook! способно передавать идеи, эмоции и абстрактные мысли, язык Ook! не нуждается в комментариях. Код и сам прекрасно описывает, что и как он делает.
Hello World на Ook!:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook.
Также для Ook! были написаны интерпретаторы на разных языках (Ruby, Python, Perl), но приведенные в статье ссылки на них не работали.
COW
Этот эзотерический язык похож на Ook! и тоже является диалектом Brainfack. Исходя из того, что словарь коров довольно ограничен, для записи команд используется только слово «Moo».
Инструкции чувствительны к регистру и это позволяет обходиться одним словом в разных вариантах написания (moo, mOo, MOo и т.д.). Страница разработчика с информацией об этом языке – http://bigzaphod.github.io/COW/.
Мне не попалось информации о том, связана ли эта корова с командами cowsay и aptitude moo в Linux, но такое внимание к коровам с разных сторон просто удивительно.
Пример Hello World на Cow:
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO Moo Moo MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo MOo MOo MOo MOo MOo Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
Brainfuck
Логично обратить внимание и на основной язык, раз уж упомянули его производные. Brainfuck это довольно известный эзотерический язык, на основе которого создано еще с десяток «диалектов». В нем 8 команд, которые записываются символами. Одна команда – один символ.
Этот язык создал Урбан Мюллер в 1993 году, вдохновляясь при этом другим эзотерическим языком – FALSE. Среди целей Мюллера было достижение наименьшего размера компилятора.
Hello World на Brainfuck:
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]<+ +.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++>- ]<+.
Chef
Еще один язык Дэвида Моргана-Мара. Программы на этом языке выглядят похожими на рецепты.
Информация с сайта dangermouse.net.
Принципы языка:
- Программы-рецепты должны не только генерировать валидный output, но также быть простыми в приготовлении и вкусными.
- Рецепты должны быть привлекательными для поваров с различным бюджетом.
- Могут использоваться традиционные кухонные единицы измерения вроде ложек и чашек.
Ингредиенты
Обязательная часть рецептов. Ингредиенты (переменные) содержат отдельные значения данных. Все ингредиенты исчисляемы, так что для целей ввода/вывода их можно интерпретировать в Unicode. Жидкие ингредиенты будут выводиться в виде символов Unicode, а сухие (или неопределенные) – в виде цифр.
Миски для смешивания и формы для выпечки
Шеф имеет доступ к неограниченному количеству мисок и форм. Они могут содержать значения ингредиентов.
Ингредиенты в мисках или формах располагаются по порядку, вроде стопки блинов (стеки). Новые ингредиенты помещаются наверх, а если значения удаляются, то тоже сверху.
К мискам можно обращаться по порядковым номерам, например, «вторая миска для смешивания». Порядковые номера должны быть в цифровой форме, с окончаниями «st», «nd», «rd» или «th» (1st, 2nd и т.д.), они не могут писаться словами.
Методы
Метод содержит инструкции по приготовлению. Пишутся методы полными предложениями. Например:
«Достаньте ингредиент из холодильника».
– Считывается числовое значение из STDIN, предыдущее значение ингредиента перезаписывается.
Комментарии могут писаться в свободной форме в параграфе после названия рецепта.
Пример написания Hello World на Chef:
Hello World Cake with Chocolate sauce. This prints hello world, while being tastier than Hello World Souffle. The main chef makes a " world!" cake, which he puts in the baking dish. When he gets the sous chef to make the "Hello" chocolate sauce, it gets put into the baking dish and then the whole thing is printed when he refrigerates the sauce. When actually cooking, I'm interpreting the chocolate sauce baking dish to be separate from the cake one and Liquify to mean either melt or blend depending on context. Ingredients. 33 g chocolate chips 100 g butter 54 ml double cream 2 pinches baking powder 114 g sugar 111 ml beaten eggs 119 g flour 32 g cocoa powder 0 g cake mixture Cooking time: 25 minutes. Pre-heat oven to 180 degrees Celsius. Method. Put chocolate chips into the mixing bowl. Put butter into the mixing bowl. Put sugar into the mixing bowl. Put beaten eggs into the mixing bowl. Put flour into the mixing bowl. Put baking powder into the mixing bowl. Put cocoa powder into the mixing bowl. Stir the mixing bowl for 1 minute. Combine double cream into the mixing bowl. Stir the mixing bowl for 4 minutes. Liquefy the contents of the mixing bowl. Pour contents of the mixing bowl into the baking dish. bake the cake mixture. Wait until baked. Serve with chocolate sauce. chocolate sauce. Ingredients. 111 g sugar 108 ml hot water 108 ml heated double cream 101 g dark chocolate 72 g milk chocolate Method. Clean the mixing bowl. Put sugar into the mixing bowl. Put hot water into the mixing bowl. Put heated double cream into the mixing bowl. dissolve the sugar. agitate the sugar until dissolved. Liquefy the dark chocolate. Put dark chocolate into the mixing bowl. Liquefy the milk chocolate. Put milk chocolate into the mixing bowl. Liquefy contents of the mixing bowl. Pour contents of the mixing bowl into the baking dish. Refrigerate for 1 hour.
Petrovich
Petrovich, как я поняла, не совсем язык программирования, но вполне эзотеричен. Он меня покорил и я не могла не вставить его в статью.
Информация с dangermouse.net.
Petrovich это больше, чем язык программирования, это целая компьютерная операционная система и среда для разработки программ, – пишет его создатель, Дэвид Морган-Мар. Названа система в честь Ивана Петровича Павлова (физиолога, изучавшего условные рефлексы). Автор хотел назвать язык «Павлов», но название было уже занято.
Принципы дизайна
- Операционная система и язык должны быть способны обучаться и улучшать свою производительность естественным образом.
- Они должны интеллектуально адаптироваться в соответствии с фидбэком пользователя.
Концепции языка
Petrovich предоставляет два метода, которые воздействуют на его поведение: поощрение и наказание. Если Petrovich делает нечто, неодобряемое пользователем, пользователь может его наказать. И наоборот, если Petrovich делает что-то полезное, пользователь может его поощрить. Затем Petrovich может изменить свое поведение, чтобы избежать наказаний и получить больше поощрений.
Команды
В языке Petrovich есть только четыре команды:
do something (что-нибудь сделать)
Petrovich делает что-нибудь.
do something with <file> (сделать что-нибудь с файлом...)
Petrovich делает что-нибудь с указанным файлом.
Reward (поощрение)
Поощряет Petrovich-а.
Punish (наказание)
Наказывает Petrovich-а.
Примеры
Чтобы понять, как Petrovich работает, запустим пару примеров.
Petrovich> do something 11:15:23 11 June 2005 Petrovich> reward Petrovich>
Пользователь просит Petrovich-а что-то сделать, Petrovich отвечает выводом текущей даты. Поскольку для пользователя это полезно, он поощряет Petrovich-а.
Petrovich> do something with data_run_20050711.txt plotting data to printer Petrovich> punish Petrovich> do something with data_run_20050711.txt performing Fast Fourier Transform... saving result to data_FFT_20050711.txt Petrovich> reward Petrovich>
Пользователь просит Petrovich-а сделать что-нибудь с некоторыми научными данными. Petrovich выводит данные на печать. Поскольку это не то, чего хотел пользователь, он наказывает Petrovich-а и пытается еще раз. Желая избежать наказания, Petrovich пробует сделать что-нибудь другое, и на этот раз его действие пользователю полезно. Чтобы поощрить подобное поведение, пользователь вознаграждает Petrovich-а.
Petrovich> do something with HalleBerry001.jpg file deleted Petrovich> punish Petrovich> do something with HalleBerry002.jpg searching web for similar images... downloading... Petrovich> reward Petrovich>
Пользователь просит Petrovich-а сделать что-то с файлом, содержащим мягкое порно, и Petrovich удаляет файл. Юзер этого не хотел, поэтому наказывает Petrovich-а. Затем пользователь предлагает Petrovich-у сделать что-нибудь с другим файлом. Petrovich осуществляет поиск в интернете, чтобы найти сходные изображения и добавить их в порно-коллекцию пользователя. Пользователь поощряет Petrovich-а.
«И если вы думаете, что это лишь шутка, то только представьте, что можно наложить слой Petrovich-а поверх другой операционной системы, например, Windows. И каждый раз, когда Windows сделает что-то, что вам не понравится, вы сможете наказать систему, и она никогда не сделает этого снова«, — пишет создатель языка.
Нэт Янг реализовал версию Петровича на Java и назвал ее Фредериком в честь Берреса Фредерика Скиннера (психолога, занимавшегося бихевиоризмом).
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]
> — проснулся; < — уснул; + — поел; — — выпил; [ — пописал; ] — покакал; . — хомячок.
Проснулся поел поел поел поел поел поел поел поел пописал уснул поел поел поел поел поел поел поел поел поел проснулся попил покакал уснул хомячок проснулся поел поел поел поел пописал уснул поел поел поел поел поел поел поел проснулся попил покакал уснул поел хомячок поел поел поел поел поел поел поел хомячок хомячок поел поел поел хомячок проснулся проснулся поел поел поел поел поел поел пописал уснул поел поел поел поел поел поел поел проснулся попил покакал уснул поел поел хомячок попил попил попил попил попил попил попил попил попил попил попил попил хомячок проснулся