Самые неординарные языки программирования
Признаться честно единственная моя связь с программированием в том, что мой брат программист, ну еще я в школе учил Pascal. Однако, я полностью осознаю всю сложность и красоту программирования. Создать программу, код которой не будет содержать «мусора», достойно похвалы. Что уж говорить о создании самого языка, на котором и пишутся программы. Проще говоря — это сложно, чертовски сложно. И, значит, это должно быть обдуманно и нести какой-то смысл. Но не всегда. Сегодня мы с вами вместе приподнимем брови в удивлении, ознакомившись с самыми нелепыми и смешными языками программирования. Поехали.
Прежде чем начать рассматривать наших участников, хотелось бы обозначить некоторые термины, имеющие непосредственное значение.
Эзотерический язык программирования — язык, который разрабатывается как предмет искусства, юмора или доказательства некой концепции. Скажем для расширения границ самого программирования и языкописания.
Тьюринг-полным называют язык программирования, с помощью которого можно реализовать любую вычислимую функцию.
Автором этого языка является Адам Линдсэй, исследователь отдела компьютерных технологий Ланкастерского университета. Сие творение увидело свет в 2007 году.
Свое необычное название язык получил в честь интернет мема Lolcat. Структура его состоит из очень небольшого словаря сленгового английского языка.
Пример кода для вывода сообщения «Hello World!»:
HAI
CAN HAS STDIO?
PLZ OPEN FILE «LOLCATS.TXT»?
AWSUM THX
VISIBLE FILE
O NOES
VISIBLE «ERROR!»
KTHXBYE
Разберем каждую строку по полочкам:
HAI — начало программы
CAN HAS «file name»? — включает в текст программы содержимое указанного файла
VISIBLE line — вывод на экран
KTHXBYE — конец программы
Сайт Грегори Ричардса
Создан в 2005 году Грегором Ричардсом. Структурно язык весьма сложный, так как сочетает в себе использование постфиксов, и требует серьезных манипуляций с основным стеком в сочетании с его объектно-ориентированной структурой.
Вот как выглядит код программы «Hello, World!»:
Язык программирования для любителей крайне радикального минимализма. Был создан в 1993 году Урбаном Мюллером. Отличительной чертой данного языка является наличие лишь 8 команд, которые записываются как один символ. Мюллер хотел создать язык с самым малым компилятором. Так и вышло. Компилятор для Brainfuck весит меньше 200 байт. Данный язык является тьюринг-полным, потому может использоваться наравне с Java или Pascal, например.
«Hello, World!» на языке Brainfuck:
Разбор команд и их значения
> — перейти к следующей ячейке
И как обычно, «Hello, world!» на языке Chicken:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken
chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken
chicken 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 (см. рисунок выше).
Команды сгруппированы по типу действия.
& — Запросить у пользователя число и поместить его в стек
— Запросить у пользователя символ и поместить в стек его ASCII-код
. — Распечатать вершину стека как целое число (forth:.)
, — Распечатать символ, соответствующий ASCII-коду на вершине стека (forth:EMIT)
Код программы «Hello, World!» на языке Befunge:
Наверное, самый визуализированный эзотерический язык программирования. Был создан Давидом Морган-Маром и назван в честь нидерландского художника Пита Мондриана. При чем тут он, спросите Вы? Дело в том, что программы, написанные на данном языке, выглядят как разноцветные картинки, своего рода картины в стиле абстракционизма.
Основой данного языка является 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 | Конец программы |
Любые другие значения ничего не делают. Они не разрешены при загрузке программы, но разрешены после этого.
После выполнения очередной инструкции производится ее шифрование с использование таблиц перевода:
Источник
2.1. Начало работы в Python 3 и Wing IDE 101¶
2.1.1. О версиях Python¶
Сейчас существуют две основных ветки (версии) развития языка Python (питон): Python 2 и Python 3. Версия 2 официально считается устаревшей (поддержка версии 2 заканчивается в 2020 году), версия 3 — более новой и современной. Мы будем изучать именно версию 3. Версия 2 существенно отличается от версии 3, мы не будем обсуждать эти отличия.
В пределах как версии 2, так и версии 3 есть «подверсии», например, последняя версия из третьей ветки сейчас (2020 г.) — версия 3.8.2 (не считая тех версий, которые находятся еще в разработке). В принципе, для наших занятий можно использовать более-менее любую версию питона из третьей ветки, лучше как минимум 3.3, но если нет особенных причин, то устанавливайте последнюю доступную вам версию.
2.1.2. Установка Python¶
Python — это свободное кросс-платформенное программное обеспечение, поэтому его можно легко скачать с официального сайта, можно свободно распространять, и можно установить на все современные операционные системы.
Если вы работаете в другой операционной системе, то разберитесь, как установить питон, самостоятельно. В Linux, например, питон есть в репозиториях всех ведущих дистрибутивов, пакет обычно называется python3 (а просто python — это питон второй версии).
2.1.3. Установка Wing IDE¶
Сам по себе питон — это только интерпретатор кода. Он запускает ваши программы, но не содержит удобного редактора. Поэтому для написания программ я советую вам использовать среду разработки (по сути, продвинутый редактор) Wing IDE.
Wing IDE — это, к сожалению, не свободное ПО, но у него существует официально бесплатная версия для образовательных целей, называется Wing IDE 101. Она доступна как для Windows, так и для Linux и macOS.
Все программы для установки можно скачать с официального сайта Wing IDE (http://wingware.com/, через пункт Download — Wing IDE 101); установщик под Windows также можно скачать со странички курса. Обратите внимание, что вам нужна именно версия 101, а не какая-нибудь другая! Установите Wing IDE с помощью этого установщика, ничего сложного в нем нет.
Wing IDE — это просто среда разработки (IDE) для Python, т.е. удобный редактор программ, позволяющий легко запускать программы с помощью питона (именно поэтому надо отдельно устанавливать сам Python — Wing IDE его не включает в себя). В принципе, вы можете использовать и какую-нибудь другую среду разработки, но тогда разбирайтесь с ней сами. В частности, сам Python включает простенькую среду разработки Python IDLE, ее описание вы можете встретить во многих книжках по Python, но она слишком простая и потому не очень удобная. Так же есть популярная среда PyCharm, но на мой вкус она слишком сложная.
2.1.4. Проверка установки¶
Запустите Wing IDE. Появится следующее окошко:
Если у вас не получается, напишите мне [1], указав, куда вы установили питон, и прислав скриншоты основного окна Wing IDE и диалога Edit — Configure Python.
2.1.5. Первая программа¶
В основном меню Wing IDE выберите пункт File — New. Появится окно для редактирования текста программы. В этом окне наберите следующий текст:
(Здесь » — это символ кавычек.)
Должно получиться так:
Убедитесь, что опечаток нет. Сохраните программу: нажмите Ctrl-S или выберите пункт меню File — Save As. Wing IDE предложит выбрать имя файла для сохранения, для первой программы можно выбрать любое имя.
Обратите внимание, что Wing IDE раскрашивает вашу программу. Это делается для того, чтобы ее было удобнее читать; на самом деле для питона цвет не важен, он сделан только для того, чтобы вам было удобнее читать. Аналогично, в этом тексте код тоже раскрашен, причем раскраска может быть немного другой (это просто обусловлено системой, которую я использую для написания текста). Но еще раз: цвета только для удобства чтения, никакой больше нагрузки они не несут, в частности, Wing может раскрашивать не так, как вы видите в этом тексте, это не страшно.
После этого запустите программу, нажав на кнопку с зеленым треугольничком—стрелочкой на панели инструментов над текстом программы. Результат выполнения программы появляется в правой нижней части экрана, в панели «Python Shell» А именно, там вы можете увидеть один из двух возможных результатов, показанных на двух рисунках ниже.
Если там появилась надпись «Test 4»:
значит, все хорошо, программа успешно выполнилась.
Если же там появился длинный текст со словами «Traceback» (в начале) и «Error» (в конце):
значит, в вашей программе есть ошибки. Подробнее про ошибки ниже (раздел Ошибки в программе ), а пока, если вы увидели ошибку, то просто внимательно проверьте, не ошиблись ли вы где-нибудь в наборе программы.
Позапускайте программу (зеленой стрелочкой) ещё несколько раз и посмотрите на результаты. Вы увидите что, Wing IDE каждый раз печатает строку evaluate. перед запуском программы, потом программа печатает свою строку. Вывод программы перемешивается с выводом Wing IDE — ничего страшного, это нормально.
Можно также запускать программу нажатием на кнопку с картинкой типа красного жучка. Это немного другой режим запуска, более удобный для поиска ошибок. Попробуйте позапускать и так, и так, посмотрите на отличия (основное отличие пока — при запуске через «красного жучка» вывод предыдущих программ затирается).
2.1.6. Ошибки в программе¶
В вашей программе могут быть серьёзные ошибки — такие, что питон «не понимает», что вы от него хотите (а могут быть и не столь серьёзные — программа отработает как бы нормально, но выдаст неверный результат). В случае таких серьезных ошибок питон выдаст сообщение, похожее на сообщение, показанное на рисунке выше. Оно обычно начинается со слова Traceback, а ближе к концу в нем есть слово Error.
С ошибками удобнее разбираться, запуская программу в режиме «красного жучка». В таком случае Wing IDE подсвечивает строку около ошибки красным, а подробную информацию пишет в особом окошке справа.
А пока посмотрите внимательно на строчку с ошибкой (при запуске через жучка питон подсвечивает ее красным, при запуске через стрелочку — только пишет номер строки), и на строчки рядом — и попробуйте понять, что там не так. В примере на рисунке я забыл вторую цифру 2 (в результате чего питону стало непонятно, на что надо умножать). (В примере на рисунке я запускал программу через зеленую стрелочку, а не через «красного жучка», поэтому там нет подсвеченной красным строки.)
Имейте в виду, что питон не телепат и не может точно определить, где вы допустили ошибку. Он подсвечивает красным ту строку, где текст программы впервые разошёлся с правилами языка. Поэтому бывает, что на самом деле ваша ошибка чуть выше, чем подсвеченная строка (а иногда — и намного выше). Но тем не менее место, которое выделил питон, обычно бывает полезно при поиске ошибки.
Попробуйте в своей программе поделать разные ошибки и посмотрите, как на них отреагирует питон.
2.1.7. Как работает эта программа¶
Давайте разберём, как эта программа работает. Напомню её текст:
Вообще, любая программа — это, в первую очередь, последовательность команд, которые программист даёт компьютеру, а компьютер будет последовательно их выполнять.
Команда print разделяет выводимые элементы пробелами, поэтому между Test и 4 выведен пробел.
2.1.8. Использование питона как калькулятора¶
В выражениях можно использовать следующие операторы:
Кроме того, есть так называемые функции:
В одной программе можно вычислять несколько выражений. Например, программа
вычисляет три выражения. Первая команда print выводит на экран две четвёрки, разделённых пробелом. Вторая команда просто выводит одно число 9. Оно будет выведено на отдельной строке, т.к. каждая команда print выводит одну строку. Обратите еще раз внимание, что аргументы команды разделяются запятыми.
Можно также, как мы видели раньше, смешивать текст (в кавычках) и выражения:
2.1.9. Простейший ввод и вывод. Переменные¶
Но не очень интересно писать программы, которые всегда выводят одно и то же. Хочется, чтобы программа что-нибудь запрашивала у пользователя, и работала с учётом того, что пользователь ввёл. Давайте, например, напишем программу, которая будет спрашивать у пользователя два числа и выводить на экран их сумму.
Но для этого нам придётся научиться ещё одной важной вещи. Когда пользователь вводит два числа, программе надо их как-то запомнить, чтобы потом сложить между собой и результат вывести на экран. Для этого у компьютера есть память (оперативная память). Программа может использовать эту память и положить туда числа, введённые пользователем. А потом посмотреть, что там лежит, сложить эти два числа, и вывести на экран.
Во многих языках, чтобы использовать память, надо особо попросить компьютер об этом. В питоне другой подход: питон достаточно умен, чтобы самому догадаться, что вам нужна память. Давайте напишем следующую программу:
Если вы запустите программу «красным жучком», то все будет аналогично, только текст вам надо будет вводить в пустом окошке «Debug I/O», которое появится на месте окошка «Python Shell».
Теперь разберем, как эта программа работает.
В программе можно заводить несколько переменных. Простейший вариант может выглядеть так:
Эта программа считывает две строки, которые вводит пользователь, и выводит их, причем сначала вторую, а потом первую.
Но мы хотели написать программу, которая выводит сумму двух чисел. Простой подход тут не сработает:
сделает вовсе не то, что вы могли ожидать: питон пока считает, что в a и b могут лежать какие угодно строки, и не понимает, что вы имели в виду числа.
Чтобы объяснить, что вы имеете в виду числа, надо написать так:
Запустите эту программу. В окошке ввода наберите какое-нибудь число, нажмите Enter, наберите второе число и еще раз нажмите Enter. Вы увидете, что программа вывела их сумму.
Чтобы вводить числа через пробел, надо использовать другую конструкцию:
Это пока магия, ее придется запомнить наизусть. Потом вы поймете, что здесь что значит. Обратите внимание, что после слова int тут нет скобок, а вот после input и split есть.
Так можно вводить сколько угодно чисел; например, чтобы считать четыре числа, вводимые в одной строке, надо написать
2.1.10. Присваивания¶
Пока мы умеем записывать в переменные только то, что пользователь ввел с клавиатуры. На самом деле, намного чаще приходится записывать в переменные значения, которые программа сама вычисляет. Для этого есть специальная команда, которая называется присваивание (и на самом деле мы ее уже видели):
обозначает «в переменную a записать 10».
Если в переменной уже было что-то записано, то после присваивания старое значение затирается:
в результате в a лежит 30, а про 20 все забыли.
Особый интересный вариант — справа можно упоминать ту же переменную, которая стоит слева — тогда будет использоваться ее предыдущее значение:
обозначает «в a записать 10, а в b — 20».
Запись a = 10 читается «переменной a присвоить 10», или кратко « a присвоить 10». Не надо говорить « a равно 10», т.к. «равно» — это не глагол, и не понятно, какое действие совершается. Более того, если запись a = a + 1 прочитать с «равно», то получается « a равно a плюс один», что никак не похоже на команду, а скорее на уравнение, которое не имеет решений. Поэтому говорите «присвоить», а не «равно».
2.1.11. Комментарии¶
(Эта информация вам прямо сейчас не нужна, но будет полезна при чтении дальнейших разделов.)
В программе можно оставлять так называемые комментарии. А именно, если где-то в программе встречается символ «решетка» ( # ), то этот символ и все, что идет за ним до конца строки, полностью игнорируется питоном. Таким образом можно в программе оставлять пометки для себя, или для других программистов, которые будут читать вашу программу. Например
Здесь запись # считали число полностью игнорируется питоном, как будто этих символов нет вообще, а запись a = int(input()) работает как и должна.
В частности, решетка может стоять в начале строки, тогда вся эта строка будет игнорироваться:
Питону совершенно не важно, где и как вы оставляете комментарии, вы их оставляете только для себя, или для других людей, которые будут читать вашу программу. В простейших программах комментарии не нужны, и вам поначалу они не понадобятся, но я буду их использовать в дальнейших разделах этого курса, чтобы пояснять фрагменты кода.
2.1.12. Язык программирования как конструктор¶
Выше я рассказал ряд самых основных конструкций языка питон. Теперь ваша задача будет из этих конструкций, как из конструктора, собирать программы. Относитесь к этому именно как к конструктору: все программирование — это сборка больших программ из таких отдельных команд.
2.1.13. Что дальше?¶
(Естественно, это раздел только для учеников моего курса.)
Во-первых, если вы еще этого не сделали, прочитайте на страничке курса все тексты в «шапке» курса, особенно раздел «Работа с сайтом…», после чего начинайте решать «Задачи на арифметические операторы». И двигайтесь дальше.
Источник