Каждый язык программирования хорош по-своему. Однако с этим утверждением согласятся не все. После прочтения следующего материала ряды несогласных могут пополниться. Более того, есть мнение, что некоторые «конструкции» вообще нельзя считать языками программирования.
По мнению «Википедии», язык программирования — формальная знаковая система, предназначенная для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель под её управлением.
Какие-то знаковые системы проще для освоения, какие-то сложнее. Однако среди них есть и весьма причудливые. А есть настолько сложные, что осваивают их только самые хардкорные разработчики.
brainfuck
Название данного языка программирования примерно соответствует русскому «вынос мозга». Это язык реально существует. Он был придуман Урбаном Мюллером в 1993 году. С одной стороны, это сделано потехи ради. С другой стороны, brainfuck был создан, чтобы затем разработать для него компилятор размером менее 200 байт — один из самых маленьких компиляторов в мире.
Однако brainfuck также называют и самым непрактичным из когда-либо созданных языков. Сам язык состоит из восьми команд, а программа представляет собой сочетание этих команд. Команды эти исполняются в большинстве своем последовательно.
Если же в программе появлялись символы, не являющиеся командой, они воспринимались как комментарии. А пресловутый «Hello World!» на brainfuck выглядит так:
++++++++++[>+++++++>++++++++++>
+++>+<<<<-]>++.>+.+++++++..+++.
>++.<<+++++++++++++++.>.+++.——.
——--.>+.>.
Чтобы понять, насколько brainfuck оправдывает свое название, можно начать с разбора приведенной выше программы.
Первый шаг – подготовка в памяти (с ячейки 1) массива значений, близких к ASCII-кодам символов, которые необходимо вывести (70, 100, 30, 10). Для этого необходимо произвести 10-кратное повторение приращения содержимого ячеек на 7, 10, 3 и 1, соответственно.
Затем выполняется вывод букв и символов.
...
Befunge
До недавнего времени программы, написанные на Befunge, практически невозможно было скомпилировать. Поэтому можно сказать, что этот язык – злейший враг компиляторов.
Первая версия языка Befunge была создана Крисом Пресси в 1993 году. Как утверждал автор, его целью было разработать язык, максимально сложный для компиляции. Все лексемы языка представляют собой одиночные символы. В Befunge версии 97-го года практически каждый символ является командой.
Befunge отличается от прочих языков программирования, поскольку программа представляет собой двухмерную таблицу, в которой программист может размещать элементы управления, перемещая их с помощью стрелок влево, вправо, вверх или вниз. А эти операции, в свою очередь, сводятся к манипуляции со стеком.
Для примера достаточно взглянуть на код программы «Hello World»:
> v
@,,,,,,,,,,,,"Hello World!"<
Однако в программе для генерации случайных чисел разобраться намного сложнее:
Такие программы на Befunge являются отличным упражнением для мозгов. Было бы странно, если бы этот язык вышел на рынок коммерческой разработки. Да и сам создатель Befunge на это не рассчитывал. Ведь разрабатывал он его для других целей. Некоторые могли бы сказать, что это чистое искусство – сложность ради сложности.
Нарочно не придумаешь
Настоящим героям предлагается вспомнить способ программирования в машинных кодах, без ассемблера. Более того, для полного счастья код нужно писать на обычной бумаге. Таким героем был автор следующих (не побоюсь этого слова) строк:
Недавно в сети появились фотографии рукописных исходников кода, которые были написаны в начале 1980-х. Их опубликовал сайт The Codeless Code. Разработчик писал этот код для программы, которую нужно было запустить на персональном компьютере Apple II, также известном как Apple ][.
Недоверчивые читатели могут подумать, что это просто «извращение». Однако в некоторых ситуациях реальные задачи, которые приходилось решать без использования ассемблера, решались в то время именно так. Исходный код писался на бумаге и затем, по мере ввода, переводился в шестнадцатиричную систему.
Поэтому если вы вдруг заподозрите себя в излишней требовательности к работе какого-то IDE, то в качестве «прививки» попробуйте решить следующую задачу, вооружившись карандашом и бумагой.Задача приведённого в примере кода — рисование текста с заглавными и строчными буквами на экране высокого разрешения. «Шрифты» создавались программистом на графической бумаге и затем вручную переводились в байты, которые хранились в области данных.
Правда, запросы к библиотеке шрифтов создавались не на бумаге, а на Applesoft BASIC (диалекте MS BASIC) при помощи специальной последовательности символов в текстовой строке. Например:
100 PRINT "&F2&B&H3&W2Hello, world!"
Такая команда позволяла выбрать шрифт #2, жирный, с тройной высотой, двойной шириной, и напечатать «Hello, world!» в месте нахождения курсора. Похожие команды позволяли менять цвет текста, и даже назначать разные цвета соседним столбикам символов, таким образом создавая иллюзию использования несуществующих в Apple ][ цветов — например, бирюзового.
Для начинающих
Если же быть немного скромнее, чем «художник», упомянутый выше, и не ловить звезд с неба, то машинный код для «Hello World» будет выглядеть так:
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
В более читабельном виде то же самое можно записать, используя мнемонические команды языка Assembler:
CODE SEGMENT
ASSUME CS:CODE, DS:CODE
ORG 100h
START:
mov ah,9
mov dx,OFFSET Msg
int 21h
int 20h
Msg DB 'Hello World',13,10,'$'
CODE ENDS
END START
К слову, Assembler по-прежнему востребован, хотя и не является модным языком программирования высокого уровня. А вот многие более современные языки канули в лету. Некоторые забылись окончательно, а у некоторых еще есть шанс оказаться полезными в современных реалиях.
Чтобы помнили
В Bloomberg решили вспомнить некогда великие, а теперь полузабытые языки программирования. Все они появились еще в 50-х годах прошлого столетия. К каждому из них, как своеобразную дань уважения, подобрали лингвистический эквивалент из числа естественных языков человеческого общения. Правда, критерии, по которым сопоставлялись языки, остаются загадкой.
1. ALGOL
Создан в 1958 году. Название происходит от сокращения словосочетания «алгоритмический язык» — Algorithmic Language. Над ним трудилась группа европейских и американских компьютерных экспертов. Годы его расцвета — 1958–1968.
Использовался для научных вычислений. Это был фактически первый эксперимент по созданию языка, который можно применять на различных платформах. Оказалось, что он больше подходит для лабораторных вычислений, чем для коммерческих приложений, поскольку в исходной форме язык не поддерживал никаких протоколов ввода-вывода.
BEGIN
FILE F (KIND=REMOTE);
EBCDIC ARRAY E [0:11];
REPLACE E BY "HELLO WORLD!";
WHILE TRUE DO
BEGIN
WRITE (F, *, E);
END;
END.
Лингвистический эквивалент: классический древнегреческий.
2. COBOL
Создан в 1959 году. Название является аббревиатурой для Common Business-Oriented Language. Над ним работала крупная группа, в которую входила и пионер компьютерных наук Грейс Хоппер, известная в том числе и как создательница термина «баг». Период расцвета COBOL — 60-80 годы. Тогда он использовался для крупных корпоративных систем (страховка, банки и т.д.).
Сегодня его до сих пор учат в некоторых школах. А в 2000 году финансовые учреждения должны были вызывать знатоков COBOL из отдыха на пенсии, чтобы пофиксить «проблему 2000 года».
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
* simple hello world program
PROCEDURE DIVISION.
DISPLAY 'Hello world!'.
STOP RUN.
Сравним с церковной латынью.
3. PL/I
Создан в 1964 («релиз» состоялся в 1969 году). Название расшифровывается как Programming Language One. Над ним работала группа экспертов IBM. Пик славы — ранние 1970-е.
Использовали для мейнфреймов IBM System/360, которые в свою очередь служили в очень разных областях — от бухгалтерии до астрофизики. Был создан, чтобы потеснить COBOL, FORTRAN и другие языки того времени. Намного шире использовался в СССР, чем на Западе. Утратил популярность в 1970-х, поскольку был признан слишком ресурсоемким и сложным. Но учитывая доминирование IBM в те времена, достаточно много всего, написанного на PL/I, существует до сих пор.
HELLO: PROCEDURE OPTIONS (MAIN);
/* A PROGRAM TO OUTPUT HELLO WORLD */
FLAG = 0;
LOOP: DO WHILE (FLAG = 0);
PUT SKIP DATA('HELLO WORLD!');
END LOOP;
END HELLO;
Сравним с церковно-славянским.
4. PASCAL
Создан в 1968 году швейцарским ученым Никлаусом Виртом, назван в честь математика Блеза Паскаля. Годы расцвета — 1980-е. Самый популярный наследник ALGOL, использовался в том числе для программирования под ранние версии компьютеров Apple.
Популярная версия от 1983 года называлась Turbo Pascal. Сейчас используется для преподавания, но намного реже, чем лет 30 назад.
program HelloWorld;
begin
WriteLn('Hello, World!');
end.
Лингвистический эквивалент: эсперанто.
5. LISP
Создан в 1958 году Джоном МакКарти, название — сокращение от List Processing. Расцвет его пришелся на 60-е годы прошлого столетия. Чаще всего использовался для разработки систем искусственного интеллекта, в системах ПВО, причем в AI-разработках используется и поныне.
(PRINT '«HELLO, WORLD!»)
Можно сравнить с санскритом.
6. APL
Созданный в 1962 году, назван сокращением от скромного «A Programming Language». Его создатель — Кен Айверсон, которому за эту разработку дали премию Тьюринга. APL был очень популярен в 60-х. Чаще всего использовался в прикладной математике. Известен предельной простотой и ясностью синтаксиса. Минусы: требует наличия греческого алфавита и других специальных символов. Читается при этом справа налево (как иврит, например).
Сегодня нечасто, но все же используется, в очень узкоспециальных нишах — к примеру, в расшифровке ДНК, и как ни странно, в теории бухучета.
@ This program is very simple in APL!
'Hello World!'
@ In APL, anything that is printed in quotes is printed to the terminal. (@ in APL signifies a comment)
@ If the "Hello World statement needed to be stored, then you could use the following :
h<-'Hello World'
h
@Typing h causes h's value to be printed to be printed.
Можно сравнить с языком Навахо.
7. FORTRAN
Разработан в год полета первого искусственного спутника Земли, называется сокращением от Formula Translator. Его создал для IBM Джон Бэкус. Пик популярности — 60-70 годы.
Использовался, да и продолжает использоваться поныне для научных вычислений.
program hello
print *, "Hello World!"
end program hello
Можно сравнить его с английским языком версии Джейн Остин.
8. LOGO
Название — от древнегреческого «логос», то есть «слово» или «мысль». Создан в 1967 году Сеймуром Пейпертом и группой под его началом в лаборатории искусственного интеллекта при MIT. Изначально использовался, чтобы обучать программированию детей, и до сих пор используется в этих целях. Одна из версий работает с платами Arduino.
PRINT [Hello world]
Сравним с системой знаков в аэропортах.
9. ADA
Назван в честь математика Ады Лавлейс, написавшей первую в мире программу. Расцвет использования этого языка пришелся на 80-е годы прошлого столетия, в основном он был полезен военным и в системах контроля воздушного сообщения. В обозримом будущем Ada будет оставаться в этих системах благодаря своей исключительной надежности.
with Text_To; use Text_To
procedure hello is
begin
put("Hello World");
end hello
Сравним с американским английским, с легким налетом аппалачского.