本文概述
- 10. Befunge
- 9. Glass
- 8. Roadrunner
- 7. Fish
- 6. Emo
- 5. Thue
- 4. L33T(leet)
- 3. Malbolge
- 2. JSFuck
- 1. Brainfuck
警告
重要的是要知道, 如果你正在阅读此文章, 则需要你自担风险, 因为如果你尝试理解它们, 此处提到的编程语言将使你的大脑困惑。那里有1000多种深奥的编程语言, 但是我们为你编译了其中最严肃, 最奇特的语言。
神秘的编程语言不是专门为高效或优雅地解决计算问题而设计的语言, 而是探索计算理论背后的基本思想或诸如食谱食谱语法之类的怪异思想的语言。你可能会认为设计语言的人与他们的时间没什么更好的关系, 而且你是对的。
此列表中的大多数语言是Turing Complete, Turing Complete系统是指可以编写程序的系统, 该程序可以找到答案(尽管不能保证运行时或内存), 这意味着它们确实是精心设计的。对于深奥的编程语言设计人员来说, 可用性很少是目标, 因此不用担心, 你在未来的工作中不需要使用这种语言!
我们认为, 我们会从最复杂的深奥编程语言中选出10种。
10. Befunge
Befunge口译员
Befunge是最古老和最著名的二维深奥编程语言之一。 Befunge由Chris Pressey于1993年创立。他试图创建一种难以编译的语言。但是, 在接下来的几年中, 出现了很多这种语言的实现, 以及几种方言和称为Fungeoids的修改。该语言有两种主要方言-原始的Befunge-93和后来的Befunge-98。语言的原始规范限制了应在其上编写程序的网格的大小, 这意味着Befunge(与其他深奥的语言不同)不是图灵完整的。但是, 就像其他深奥的语言一样, 它没有实用价值。
以下代码将打印Hello World:
>25*"!dlrow , olleH":v
v:, _@
> ^
9. Glass
Glass是一种深奥的编程语言, 它结合了直观的后缀表示法和繁重的面向对象的功能, 需要对主堆栈及其面向对象的结构进行大量修改。
以下代码将打印Hello World:
{M[m(_o)O!"Hello World!"(_o)o.?]}
8. Roadrunner
Roadrunner是一种Brainfuck克隆语言, 基于流行的Looney Tunes角色Roadrunner, 众所周知, 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. Fish
网上游乐场
> <>(发音为fish)是一种基于堆栈的反射式二维深奥编程语言。它从Befunge中汲取了灵感。它具有在2D网格世界中移动并在该网格中执行指令的指令指针。网格中的每个字符代表四种类型中的一种操作-算术, 堆栈, I / O或导航。
下面的代码将打印NaNaNaNaNaNaNaNaNaNaBatman !:
8>aa*3-89*6+oo:?!!\3b*aa*a+aa*3-aa*9+bb*5-aa*3-6b*ooooooo;
^ -1/
6. Emo
主页
Emo目前代表表情记忆混淆, 由Dustin Luck和Sean Fife于2010年发明, 并受到Brainfuck的启发。尽管Emo是首字母缩写词, 但它以标题大小写而不是全部以大写形式突出显示该语言的情感性质。
像Brainfuck一样, Emo在一组存储单元上运行, 每个存储单元最初设置为零。有一个指针, 最初指向第一个存储单元。但是, 与Brainfuck不同, 它有两个寄存器。第一个是存储寄存器, 第二个是更多的工作区域, 是存储寄存器和内存之间的一种工作区域。该工作区寄存器在读取命令之间不是持久性的, 因此, 要保存该值, 必须将其写入某个位置。
以下emo代码将打印Hello World:
:^) :o) :o) :o) :^) :^( ~Store 10 into the zero memory postiion
<;^} ~begin loop, increment pointer and copy new mem value to the register
:^) :^) :^) :^) :^) :^) :^( ~Add 7 to the current register and store in memory
;^} ~increment ptr and copy new mem value to the register
:^) :^) :^) :^) :^) :^) :^) :^) :^) :^( ~Add 10 to the current register and store in memory
;^} ~increment ptr and copy new mem value to the register
:^) :^) :^( ~add 3 to the current register and store in memory
;^} ~increment ptr and copy new mem value to the register
:^( ~add 1 to the current register and store in memory
;-| ;-| ;-| ;-} ~more the ptr down 4 and copy memory to register
:-(> ~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
Thue是一种深奥的编程语言, 于2000年发明。它是一种基于非确定性字符串重写的matrioshka语言, 作者将其描述为Turing tarpit的约束编程版本。 Thue参考手册对输入/输出中的换行符不太清楚。现有的Thue解释器倾向于在触发每个输出规则之后输出换行符。但是, 这会阻止编写需要对输出进行更好控制的Thue程序(例如, 完全输出自己的代码的自我复制程序)。
以下代码将打印Hello World:
a::=~Hello World!
::=
a
4. L33T(leet)
Leet(或L33t)是一种松散地基于Brainfuck的神秘编程语言, 其源代码与符号语言” L33t 5p34k”相似。它是图灵完备的, 并且可以自行修改代码。用该语言编写的软件可以建立网络连接, 因此可以用来编写恶意软件。[需要引用]。
以下代码将在l33t中打印Hello World:
// "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口译员| Malbolge代码生成器
Malbolge是一种难以理解的深奥编程语言。这是一种设计成难以编程或可能无法编程的语言。例如, 任何指令的效果取决于它在内存中的位置, 所有指令都是自修改的(根据排列表), 并且代码和数据每条指令后指针都会增加, 这使得重用任何代码或数据变得困难。除了8个指令字符之一之外, 无法初始化内存, 没有LOAD或STORE运算符, 并且唯一可用的内存运算符(两者均可用)是三进制的, 并且被设计为不透明的。
要以malbolge显示Hello World, 可以使用以下代码:
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Malbolge无法满足Turing完整性的正式定义, 该定义要求访问无限量的内存。
2. JSFuck
Javascript到JSFuck编译器| Github
JSFuck是基于JavaScript原子部分的深奥和教育性编程风格。它仅使用六个不同的字符来编写和执行代码。它不依赖于浏览器, 因此你甚至可以在Node.js上运行它。
JSFuck最初是作为旨在改善安全旁路技术的在线竞赛的一部分而开发的。它可用于绕过网站上提交的恶意代码的检测, 例如在跨站点脚本(XSS)攻击中。 JSFuck的另一个潜在用途在于代码混淆。 JSFuck的优化版本已被用来编码jQuery(最常用的JavaScript库), 其功能完全等效, 仅包含六个不同的字符。
JSFuck代码非常冗长。在以下示例中, JavaScript代码alert(1)将被转换为以下JSFuck代码:
很棒的笔记
JSFuck, 是完全有效的JavaScript。这意味着, 如果你在浏览器或某些JS解释器中以JavaScript的形式运行JSFuck, 则它将以纯JavaScript的形式运行(至少在示例中存在Alert函数的情况下)。
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[
]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]
])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![
]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]
+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![
]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[
]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![
]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(!
[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])
[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(
!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
1. Brainfuck
在线口译| Brainfuck粉碎机
Brainfuck(除了句子开头不大写)是一种极小的图灵完备的编程语言, 仅包含8个命令。 Brainfuck程序具有一个隐式字节指针, 称为”指针”, 它可以在30000个字节的数组中自由移动, 最初将其全部设置为零。指针本身被初始化为指向此数组的开头。
Brainfuck编程语言由八个命令组成, 每个命令都表示为一个字符。
> | 递增指针。 |
< | 减少指针。 |
+ | 在指针处增加字节。 |
– | 减少指针处的字节。 |
. | 在指针处输出字节。 |
, | 输入一个字节并将其存储在指针处的字节中。 |
] | 如果指针处的字节为零, 则跳过匹配的]。 |
] | 向后跳到匹配的[除非指针处的字节为零。 |
Brainfuck命令的语义也可以用C简洁地表示, 如下(假定p先前已定义为char *):
> | 变成 | ++ p; |
< | 变成 | –p; |
+ | 变成 | ++ * p; |
– | 变成 | -* p; |
. | 变成 | putchar(* p); |
, | 变成 | * p = getchar(); |
] | 变成 | 而(* 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
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
或缩小形式:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Brainfuck会忽略除八个命令+-<> []外的所有字符。因此, 注释不需要特殊的语法(只要注释不包含命令字符)。
如果你认为还有更深奥的编程语言, 请在评论框中与社区分享。
评论前必须登录!
注册