Топ 10: Самые сложные и причудливые эзотерические языки программирования

Предупреждение

Важно знать, что если вы читаете этот пост, вы читаете его на свой страх и риск, потому что упомянутые здесь языки программирования растопят ваш мозг, если вы попытаетесь их понять. Существует более 1000 эзотерических языков программирования, однако мы собрали самые серьезные и причудливые из них только для вас.

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

Большинство языков в этом списке — Turing Complete, система Turing Complete означает систему, в которой может быть написана программа, которая найдет ответ (хотя и без гарантий относительно времени выполнения или памяти), что означает, что они действительно разработаны. Юзабилити редко является целью для разработчиков эзотерических языков программирования, так что не волнуйтесь, вам не нужно работать с этими языками в вашей будущей работе!

Насладитесь нашей коллекцией из 10 наиболее сложных эзотерических языков программирования, на наш взгляд.

10. Befunge

Befunge переводчик

Befunge — один из старейших и самых известных двумерных эзотерических языков программирования. Befunge был создан в 1993 году Крисом Пресси. Он попытался создать язык, который было бы настолько сложно составить, насколько это возможно. Однако в последующие годы появилось довольно много реализаций этого языка, а также несколько диалектов и модификаций, называемых фунгеоидами. Язык имеет два основных диалекта — оригинальный Befunge-93 и более поздний Befunge-98. Первоначальная спецификация языка ограничивала размер сетки, на которой должна быть написана программа, что означает, что Befunge (в отличие от других эзотерических языков) не является тьюрингово-полным. Но, как и другие эзотерические языки, это не имеет практического значения.

Следующий код напечатает Hello World:

 >25*"!dlrow ,olleH":v
v:,_@
>  ^

9. Стекло

Glass — это эзотерический язык программирования, который сочетает в себе неинтуитивную постфиксную нотацию с тяжелой объектной ориентацией, требующую обширного жонглирования основного стека в сочетании с его объектно-ориентированной структурой.

Следующий код напечатает Hello World:

{M[m(_o)O!"Hello World!"(_o)o.?]}

8. Roadrunner

Roadrunner — это язык клонов Brainfuck, основанный на популярном персонаже Looney Tunes Roadrunner, который, как известно, почти всегда говорит «Meep meep!». Язык в настоящее время имеет только одну реализацию в форме интерпретатора Python; Рассматриваемый интерпретатор также может быть легко модифицирован для создания клона Brainfuck с любым синтаксисом (в определенной степени).

Чтобы напечатать Hello World, вы можете использовать следующий код:

mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEP meeP mEEp mEEp mEEp mEEp mEEp mEEp mEEp meeP mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp meeP mEEp mEEp mEEp meeP mEEp Meep Meep Meep Meep MeeP MEEp meeP mEEp mEEp MEEP meeP mEEp MEEP mEEp mEEp mEEp mEEp mEEp mEEp mEEp MEEP MEEP mEEp mEEp mEEp MEEP meeP mEEp mEEp MEEP Meep Meep mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp mEEp MEEP meeP MEEP mEEp mEEp mEEp MEEP MeeP MeeP MeeP MeeP MeeP MeeP MEEP MeeP MeeP MeeP MeeP MeeP MeeP MeeP MeeP MEEP meeP mEEp MEEP meeP MEEP

Хотя это не так странно (теоретически?), Как все остальные элементы в этом списке, оно заслуживает того, чтобы быть в списке.

7. Рыба

Онлайн площадка

> (произносится как рыба) — основанный на стеке рефлексивный двумерный эзотерический язык программирования. Это черпает вдохновение среди других Befunge. Он имеет указатель команд, который перемещается по миру 2D-сетки и выполняет инструкции в этой сетке. Каждый символ в сетке представляет одну операцию среди 4 типов — Арифметика, Стек, Ввод / вывод или Навигация.

Следующий код напечатает NaNaNaNaNaNaNaNaNaBatman!:

8>aa*3-89*6+oo:?!!\3b*aa*a+aa*3-aa*9+bb*5-aa*3-6b*ooooooo;
^              -1/

6. Эмо

домашняя страница

Эмо в настоящее время расшифровывается как «Запутывание памяти смайликов». Оно было изобретено Дастином Лаком и Шоном Файфом в 2010 году и вдохновлено Brainfuck. Несмотря на то, что Emo является аббревиатурой, оно написано заглавными буквами, а не заглавными буквами, чтобы подчеркнуть эмоциональную природу языка.

Как и Brainfuck, Emo работает с массивом ячеек памяти, каждая из которых изначально установлена ​​на ноль. Есть указатель, изначально указывающий на первую ячейку памяти. В отличие от Brainfuck, однако, есть два регистра. Первый — это регистр хранения, второй — больше рабочей области, которая является своего рода промежуточной областью между регистром хранения и памятью. Этот регистр рабочей области не является постоянным между командами чтения, поэтому, если значение должно быть сохранено, оно должно быть где-то записано.

Следующий эмо-код напечатает Hello World:

:^) :o) :o) :o) :^) :^(						~Store 10 into the zero memory postiion
~decrement current register and store in memory then loop back
;^}								~increment ptr and copy new mem value to the register
:^) :^)	:( :@							~Increment the register by 2, sore in memory, and print 'H'
;^}								~increment ptr and copy new mem value to the register
:^) :@								~increment register by 1 and print 'e'
:^) :^) :^) :^) :^) :^) :^) :@					~increment register by 7 and print 'l'
:@								~print 'l'
:^) :^) :^) :@							~increment register by 3 and print 'o'
:(								~store register into memory
;^}								~increment ptr and copy new mem value to the register
:^) :^) :@							~increment register by 2 and print 'W'
:(								~store register into memory
;-| ;-}								~Decrement ptr twice and copy memory to register
:^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :@	~increment register by 15 and print 'o'
:(								~store register into memory
;^}								~increment ptr and copy new mem value to the register
:@								~print 'o'
:^) :^) :^) :@							~increment register by 3 and print 'r'
:-) :-) :-) :-) :-) :-) :@					~decrement register by 6 and print 'l'
:-) :-) :-) :-) :-) :-) :-) :-) :@				~decrement register by 8 and print 'd'
;^}								~increment ptr and copy new mem value to the register
:^) :@								~increment register and print '!'
;^| ;@								~decrement ptr, and print '\n'

5. чт

Thue — это эзотерический язык программирования, изобретенный в 2000 году. Это язык матрешки, основанный на недетерминированном переписывании строк, который автор описывает как версию программирования ограничения тарпинга Тьюринга. Справочное руководство Thue не очень ясно о новых строках ввода / вывода. Существующие интерпретаторы Thue имеют тенденцию выводить символ новой строки после запуска каждого правила вывода. Однако это препятствует написанию программ Thue, которые нуждаются в более точном управлении выводом (например, самовоспроизводящиеся программы, которые выводят в точности свой собственный код).

Следующий код напечатает Hello World:

a::=~Hello World!
::=
a

4. L33T (leet)

Leet (или L33t) — эзотерический язык программирования, основанный в основном на Brainfuck и названный в честь сходства его исходного кода с символическим языком «L33t 5p34k». Он завершен по Тьюрингу и имеет возможность самоизменения кода. Программное обеспечение, написанное на этом языке, может создавать сетевые подключения и, следовательно, может использоваться для написания вредоносных программ.

Следующий код напечатает Hello World в l33t:

// "Hello World" by Stephen McGreal.
// Note that the views expressed in this source code do not necessarily coincide with those of the author :o)
Gr34t l33tN3$$?
M3h...
iT 41n't s0 7rIckY.
l33t sP33k is U8er keWl 4nD eA5y wehn u 7hink 1t tHr0uGh.
1f u w4nn4be UB3R-l33t u d3f1n1t3lY w4nt in 0n a b4d4sS h4xX0r1ng s1tE!!! ;p
w4r3Z c0ll3cT10n2 r 7eh l3Et3r!
Qu4k3 cL4nS r 7eh bE5t tH1ng 1n teh 3nTIr3 w0rlD!!!
g4m3s wh3r3 u g3t to 5h00t ppl r 70tAl1_y w1cK1d!!
I'M teh fr4GM4stEr aN I'lL t0t41_1Ly wIpE teh phr34k1ng fL00r ***j3d1 5tYlE*** wItH y0uR h1dE!!!! L0L0L0L!
t3lEphR4gG1nG l4m3rs wit mY m8tes r34lLy k1kK$ A$$
l33t hAxX0r$ CrE4t3 u8er- k3wL 5tUff lIkE n34t pR0gR4mm1nG lAnguidGe$...
s0m3tIm3$ teh l4nGu4gES l00k jUst l1k3 rE41_ 0neS 7o mAkE ppl Th1nk th3y'r3 ju$t n0rMal lEE7 5pEEk but th3y're 5ecRetLy
c0dE!!!!
n080DY unDer5tAnD$ l33t SpEaK 4p4rT fr0m j3d1!!!!!
50mE kId 0n A me$$4gEb04rD m1ghT 8E a r0xX0r1nG hAxX0r wH0 w4nT2 t0 bR34k 5tuFf, 0r mAyb3 ju5t sh0w 7eh wAy5 l33t ppl cAn
8E m0re lIkE y0d4!!! hE i5 teh u8ER!!!!
1t m1ght 8E 5omE v1rus 0r a Pl4ySt4tI0n ch34t c0dE.
1t 3v3n MiTe jUs7 s4y "H3LL0 W0RLD!!!" u ju5t cAn'T gu3s5.
tH3r3's n3v3r anY p0iNt l00KiNg sC3pT1c4l c0s th4t, be1_1Ev3 iT 0r n0t, 1s whAt th1s 1s!!!!!
5uxX0r5!!!L0L0L0L0L!!!!!!!

3. Мальболге

Мальболге переводчик | Генератор кода Malbolge

Malbolge — это эзотерический язык программирования, который трудно понять. Это язык, разработанный для того, чтобы его было трудно или, возможно, невозможно программировать. Например, эффект от какой-либо инструкции зависит от того, где она находится в памяти, все инструкции являются самоизменяющимися (согласно таблице перестановок), а также код и данные. указатели увеличиваются после каждой инструкции, что затрудняет повторное использование любого кода или данных. Нет способа инициализировать память, кроме одного из 8 символов инструкции, нет оператора LOAD или STORE, и единственные доступные операторы памяти (оба) работают в трине и предназначены для непрозрачности.

Чтобы отобразить Hello World в malbolge, вы можете использовать следующий код:

 (=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

Malbolge не может соответствовать формальному определению полноты по Тьюрингу, которое требует доступа к неограниченному объему памяти.

2. JSFuck

Javascript для JSFuck транспортер | Github

JSFuck - это эзотерический и образовательный стиль программирования, основанный на атомарных частях JavaScript. Он использует только шесть разных символов для написания и выполнения кода. Он не зависит от браузера, поэтому вы даже можете запустить его на Node.js.

JSFuck изначально разрабатывался в рамках онлайн-конкурса, направленного на улучшение методов обхода безопасности. Он может использоваться для обхода обнаружения вредоносного кода, представленного на веб-сайтах, например, в атаках межсайтового скриптинга (XSS). Другое потенциальное использование JSFuck заключается в запутывании кода. Оптимизированная версия JSFuck была использована для кодирования jQuery, наиболее используемой библиотеки JavaScript, в полностью функциональную эквивалентную версию, состоящую только из шести различных символов.

Код JSFuck чрезвычайно многословен. В следующем примере код JavaScript alert(1) будет перенесен на следующий код JSFuck:

Замечательная записка

JSFuck, это полностью допустимый JavaScript. Это означает, что если вы запустите JSFuck как JavaScript в браузере или в каком-либо JS-интерпретаторе, он будет работать как обычный JavaScript (по крайней мере с примером, если alert функция существует).

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

1. Brainfuck

Онлайн переводчик | Brainfuck Minifier

Brainfuck (без заглавной буквы, кроме как в начале предложения) - чрезвычайно минимальный язык программирования, полный по Тьюрингу, всего 8 команд. Программа Brainfuck имеет неявный байтовый указатель, называемый «указатель», который может свободно перемещаться в массиве из 30000 байтов, изначально все установлено в ноль. Сам указатель инициализируется так, чтобы указывать на начало этого массива.

Язык программирования Brainfuck состоит из восьми команд, каждая из которых представлена ​​в виде одного символа.

>Увеличить указатель.
<Уменьшить указатель.
+Увеличьте байт у указателя.
-Уменьшить байт у указателя.
.Выведите байт по указателю.
,Введите байт и сохраните его в байте по указателю.
[Перейти вперед после совпадения], если байт в указателе равен нулю.
]Перейти назад к соответствию [если байт в указателе не равен нулю.

Семантика команд Brainfuck также может быть кратко выражена в терминах C следующим образом (при условии, что p ранее было определено как char *):

>становится++п;
<становится--п;
+становится++*п;
-становится--*п;
.становитсяputchar (* р);
,становится* p = getchar ();
[становитсяwhile (* p) {
]становится}
+++++ +++++             initialize counter (cell #0) to 10
[                       use loop to set the next four cells to 70/100/30/10
> +++++ ++              add  7 to cell #1
> +++++ +++++           add 10 to cell #2
> +++                   add  3 to cell #3
> +                     add  1 to cell #4
<<< ++ .                  print 'H'
> + .                   print 'e'
+++++ ++ .              print 'l'
.                       print 'l'
+++ .                   print 'o'
> ++ .                  print ' '
< .                     print 'o'
+++ .                   print 'r'
----- - .               print 'l'
----- --- .             print 'd'
> + .                   print '!'
> .                     print '\n'

Или в минимизированном виде:

++++++++++[>+++++++>++++++++++>+++>+<<<++.>+.+++++++..+++.>++.<.+++.------.--------.>+.>.

Brainfuck игнорирует всех персонажей, кроме восьми команд +-[],. поэтому специальный синтаксис для комментариев не требуется (если комментарии не содержат символов команды).

Если вы считаете, что есть еще худшие эзотерические языки программирования, пожалуйста, поделитесь ими с сообществом в поле для комментариев.

Ссылка на основную публикацию
Adblock
detector