Самые неординарные языки программирования

Самые неординарные языки программирования

Признаться честно единственная моя связь с программированием в том, что мой брат программист, ну еще я в школе учил Pascal. Однако, я полностью осознаю всю сложность и красоту программирования. Создать программу, код которой не будет содержать «мусора», достойно похвалы. Что уж говорить о создании самого языка, на котором и пишутся программы. Проще говоря — это сложно, чертовски сложно. И, значит, это должно быть обдуманно и нести какой-то смысл. Но не всегда. Сегодня мы с вами вместе приподнимем брови в удивлении, ознакомившись с самыми нелепыми и смешными языками программирования. Поехали.

Прежде чем начать рассматривать наших участников, хотелось бы обозначить некоторые термины, имеющие непосредственное значение.

Эзотерический язык программирования — язык, который разрабатывается как предмет искусства, юмора или доказательства некой концепции. Скажем для расширения границ самого программирования и языкописания.

Тьюринг-полным называют язык программирования, с помощью которого можно реализовать любую вычислимую функцию.

Автором этого языка является Адам Линдсэй, исследователь отдела компьютерных технологий Ланкастерского университета. Сие творение увидело свет в 2007 году.

Свое необычное название язык получил в честь интернет мема Lolcat. Структура его состоит из очень небольшого словаря сленгового английского языка.

Пример кода для вывода сообщения «Hello World!»:

Разберем каждую строку по полочкам:

HAI — начало программы CAN HAS «file name»? — включает в текст программы содержимое указанного файла VISIBLE line — вывод на экран KTHXBYE — конец программы

  • PLZ command?
  • AWSUM THX code
  • O NOES code

Сайт Грегори Ричардса

Создан в 2005 году Грегором Ричардсом. Структурно язык весьма сложный, так как сочетает в себе использование постфиксов, и требует серьезных манипуляций с основным стеком в сочетании с его объектно-ориентированной структурой.

Вот как выглядит код программы «Hello, World!»:

Язык программирования для любителей крайне радикального минимализма. Был создан в 1993 году Урбаном Мюллером. Отличительной чертой данного языка является наличие лишь 8 команд, которые записываются как один символ. Мюллер хотел создать язык с самым малым компилятором. Так и вышло. Компилятор для Brainfuck весит меньше 200 байт. Данный язык является тьюринг-полным, потому может использоваться наравне с Java или Pascal, например.

«Hello, World!» на языке Brainfuck:

Разбор команд и их значения

> — перейти к следующей ячейке < — перейти к предыдущей ячейке + — увеличить значение в текущей ячейке на 1 - — уменьшить значение в текущей ячейке на 1 . — напечатать значение из текущей ячейки , — ввести извне значение и сохранить в текущей ячейке [ — если значение текущей ячейки 0, перейти вперёд по тексту программы на ячейку, следующую за соответствующей ] (с учётом вложенности) ] — если значение текущей ячейки не ноль, перейти назад по тексту программы на символ [ (с учётом вложенности)

Автором языка программирования Chicken стал Торбьёрн Сёдерштедт.

Составляющими языка являются «chicken», « » (пробел) и «\n». В каждой строке определенное число «chicken» разделенных пробелами, от числа «chicken» зависит какая команда будет исполнятся.

Инструкции загружаются в стек, где они и выполняются, что позволяет вводить произвольный код и выполнять его с помощью скачка. Поскольку стек программы не ограничен, то есть возможность само-модифицирования кода.

Пользователь может предоставить вводные данные перед выполнением программы. Они сохранятся в одном из двух регистров.

Стек разделен на три сегмента.

Первый сегмент состоит из 2 регистров. Один просто указывает на сам стек. Другой — содержит вводные данные пользователя, которые чаще всего представлены строкой. Эти регистры используются инструкцией LOAD.

Второй сегмент содержит загруженный код. Для каждой строки кода есть ячейка в стеке, которая содержит информацию сколько «chicken» в строке. Этот сегмент используется для исполнения программы. Он автоматически останавливается инструкцией EXIT.

Третий сегмент содержит фактический стек программы. Когда инструкции выполняются, они извлекают значения в этом месте. А поскольку сегменты не изолированы, то существует возможность изменять значения в коде.

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken

Очень необычный язык, выпущеный в 2003 году в честь Дня Смеха (1 апреля) Эдвином Брэди и Крисом Моррисом. Основной чертой этого языка является его «скрытность». Дело в том, что команды и строки кода формируются путем использования исключительно пробелов, табуляции и переходом на новую строку.

Вот как выглядит «Hello, World!» (синий — табуляция, красный — пробелы)

В далеком 1993 году Крис Пресс поставил перед собой задачу разработать самый сложный для компиляции язык программирования. Так и появился Befunge. Сложность достигается за счет команд p и g, которые модифицируют текст программы.

Версия языка 1993 года была ограничена таблицей 25х80 (стандартный размер текстового экрана), потому эта версия не может быть тьюринг-полной. Если же таблица будет бесконечной, то Befunge будет тьюринг-полным.

Подробное описание команд

Каждая из команд кодируется под видом символа из таблицы ASCII (см. рисунок выше).

Команды сгруппированы по типу действия.

> — вправо < — влево ^ — вверх v — вниз _ — вправо, если на вершине стека 0, иначе — влево | — вниз, если на вершине стека 0, иначе — вверх ? — в случайном направлении # — пропустить следующую ячейку @ — конец программы

Манипуляции со стеком:

: — Поместить в стек копию вершины (forth:DUP) \ — Поменять местами вершину и подвершину (forth:SWAP) $ — Удалить вершину (forth:DROP)

Модификация кода программы:

p «PUT» — со стека извлекаются координаты ячейки и ASCII-код символа, который помещается по этим координатам g «GET» — со стека извлекаются координаты ячейки; ASCII-код символа по этим координатам помещается в стек

0-9 — Поместить число в стек " — Начало/конец символьного режима, в котором ASCII-коды всех текущих символов программы помещаются в стек

Стековые арифметические операции:

+ — Сложение вершины и подвершины (forth:+) - — Вычитание вершины и подвершины (forth:-) * — Умножение вершины и подвершины (forth:*) / — Целочисленное деление (forth:/) % — Остаток от деления (forth:MOD)

Стековые логические операции:

! — Отрицание: нуль на вершине заменяется на 1, ненулевое значение — на 0 (forth:0=) ` — Сравнение «больше, чем»: если подвершина больше вершины, в стек помещается 1, иначе 0 (forth:>)

& — Запросить у пользователя число и поместить его в стек

— Запросить у пользователя символ и поместить в стек его ASCII-код . — Распечатать вершину стека как целое число (forth:.) , — Распечатать символ, соответствующий ASCII-коду на вершине стека (forth:EMIT)

Код программы «Hello, World!» на языке Befunge:

Последовательность Фибоначчи (первые 14 чисел):

Наверное, самый визуализированный эзотерический язык программирования. Был создан Давидом Морган-Маром и назван в честь нидерландского художника Пита Мондриана. При чем тут он, спросите Вы? Дело в том, что программы, написанные на данном языке, выглядят как разноцветные картинки, своего рода картины в стиле абстракционизма.

Основой данного языка является 20 цветов, 18 из которых связаны между собой в двух циклах:

Цикл оттенков: красный → жёлтый → зелёный → голубой → синий → фиолетовый → красный Цикл яркости: светлый → нормальный → тёмный → светлый

Последние 2 цвета (белый и черный) в циклах участия не берут.

«Hello, World!» на языке Piet:

Адский язык программирования. И не только потому, что его название это название восьмого круга ада в «Божественной комедии» Данте, а еще и потому, что на этом языке практически невозможно написать нормальную программу. Для чего, собственно, он и был создан Беном Олмстедом в 1998 году.

Структура языка

Дело в том, что Malbolge это машинный язык для интерпретаторов, работающих в троичной системе исчисления.

В интерпритаторе Malbolge имеется 3 регистра — a, c и d.

С — регистр кода, указывает на текущую программу.

D — регистр данных, управляет данными.

А — аккумулятор, также некоторые команды используют его для манипуляции с данными.

Память интерпретатора равна 59049 (3в10 степени) ячеек с числами из 10 троичных цифр. При этом ячейки с адресом от 0 до 59048 имеют соответствующие значения (от 0 до 59048). Когда программа запускается, начало памяти заполняется ASCII-кодами символов ее исходного кода. Игнорируются пустыне пространства (пробел, табуляция, перенос на новую строку). Остаток памяти заполняется, использую операцию crazy, которая является аналогом побитовых операций — она применяется к двум соответствующим цифрам.

Значение ([c] + c) % 94 Инструкция Пояснение 4 mov c, [d] Переход к ячейке с номером [d] 5 out a Вывод значения ASCII-символа с кодом a % 256 на экран 23 in a Ввод ASCII-символа в a. Разделитель строк имеет код 10. Конец файла — 59048 39 rotr [d] mov a, [d] Сдвигает значение [d] на одну троичную цифру вправо (0002111112 превращается в 2000211111). Результат сохраняется в [d] и в a 40 mov d, [d] Копирование значения из [d] в d 62 crz [d], a mov a, [d] Произвести операцию crazy со значениями [d] и a. Результат сохраняется в [d] и в a 68 nop Ничего не делает 81 end Конец программы Любые другие значения ничего не делают. Они не разрешены при загрузке программы, но разрешены после этого.

После выполнения очередной инструкции производится ее шифрование с использование таблиц перевода:

📎📎📎📎📎📎📎📎📎📎