怪异的编程语言
已经发明了超过一千种编程语言,并且只有大约一百种是常用的。 其中,有些怪异的标记,因为它们的语法和表示代码的方式。 在本文中,我们将研究其中一些语言和语法。
合法的
您是否曾经参与过Github项目,该项目打印“ hello world”程序,但没有任何可见的代码或任何内容。 检查此链接https://github.com/blinry/legit-hello ,您将在此存储库中看不到任何内容。 但是请相信我,该项目中有隐藏的代码。
如果您看到“ 提交”部分,则可以揭示魔术。 它将“ hello world”代码存储在git commit历史记录中。 如果克隆此项目并运行以下命令,则可以在该项目中看到隐藏的代码。
git log --graph --oneline
这是受支持的说明。
- “ [<tag>]”:跳转到指定的Git标签。 例如,[loop]将跳到标签循环。
- “退出”:停止程序。
- “ get”:从标准输入中读取一个char并将其ASCII值放在堆栈中。 在EOF上,按0。
- “ put:”弹出顶部堆栈值,并将其作为char写入标准输出。 该值始终被截断为无符号字节。
- “ <Number>”:将指定的整数压入堆栈。 例如,42将推送值42。
- “ <Letters>”:不转义的字符串,然后将各个ASCII字符压入堆栈。 例如,“ Hi \ n”将按数字72、105和10。
- “ dup”:重复的顶部堆栈值
- “ pop”:弹出顶部堆栈值并将其丢弃
- “ add”:弹出两个最高的堆栈值,将它们相加,将结果压入堆栈
- “ sub”:弹出两个最高的堆栈值,从最低的值中减去最高的一个,将结果压入堆栈
- “ cmp”:弹出两个最上面的堆栈值,如果最下面的一个较大,则按1,否则按0
- “ read”:将当前磁带单元的值放置在堆栈上
- “写入”:弹出顶部堆栈值并将其写入当前磁带单元
- “左”:弹出顶部堆栈值,将磁带头向左移动那么多位置
- “向右”:弹出顶部堆栈值,将磁带头向右移动那么多位置
Github中托管的合法编程语言源代码,您可以自己尝试一下。 了解更多有关Legit的信息 。
夹
这是另一个在其存储库中不维护任何代码的代码。 该语言将其代码保留为文件夹。 根据文件夹的顺序阅读说明。 在这些文件夹中,有三个文件夹分别代表Type,Command和Expression。 这些文件夹中的文件夹数量代表类型,命令或表达式的相关映射。
在此处阅读此语言的完整说明
Befunge
这是另一种有趣的编程语言,它在二维空间中表示其代码。 看下面的无限循环代码。
>v ^<
你明白了吗? 执行从第一行“>”字符开始。 意思是在右边执行下一条指令,右边的指令是“ v”。 这意味着执行下指令。 这继续作为无限循环。 在这里,我添加了一些说明。
- “ +”加法:弹出两个值a和b,然后推入a + b的结果
- “-”减法:弹出两个值a和b,然后推入ba的结果
- “ *”乘法:弹出两个值a和b,然后推入a的结果
- “ /”整数除法:弹出两个值a和b,然后将b / a的结果四舍五入。 根据规范,如果a为零,请询问用户他们想要什么结果。
- “%”模数:弹出两个值a和b,然后推入b / a整数除法的余数。
- “!” 逻辑非:弹出一个值。 如果值为零,则按1;否则,按1。 否则,推零。
- “大于”:弹出两个值a和b,如果b> a,则按1,否则为0。
- “>” PC方向正确
- “ <” PC向左
- PC朝上“ ^”方向
- PC向下“ v”方向
- “?” 随机PC方向
- “ _”水平IF:弹出一个值; 如果value = 0,则将方向设置为右侧,否则,将方向设置为左侧
在此处阅读完整的语言规范。 3D表示语言也基于此语言而构建,称为“ Suzy”。 下面是使用Befunge语言查找阶乘的示例
&>:1-:vv *_$.@ ^ _$>\:^
脑干
该语言于1993年发明,试图创建尽可能小的编译器。 该编译器仅允许八个命令编写程序并基于也称为磁带的存储单元进行操作。 这是Brainfuck支持的命令列表。
- “>”向右移动指针
- “ <”将指针向左移动
- “ +”增加指针下方的存储单元
- “-”减少指针下方的存储单元
- “。” 输出指针处单元格表示的字符
- “,”输入一个字符并将其存储在指针处的单元格中
- 如果指针下的单元格为0,则“ [”跳过匹配项]
- “]”跳回到匹配的[如果指针下的单元格为非零
下面是如何用Brainfuck语言实现hello world应用程序。
1 +++++ +++ Set Cell #0 to 8 2 [ 3 >++++ Add 4 to Cell #1; this will always set Cell #1 to 4 4 [ as the cell will be cleared by the loop 5 >++ Add 4*2 to Cell #2 6 >+++ Add 4*3 to Cell #3 7 >+++ Add 4*3 to Cell #4 8 >+ Add 4 to Cell #5 9 <<<<- Decrement the loop counter in Cell #1 10 ] Loop till Cell #1 is zero 11 >+ Add 1 to Cell #2 12 >+ Add 1 to Cell #3 13 >- Subtract 1 from Cell #4 14 >>+ Add 1 to Cell #6 15 [<] Move back to the first zero cell you find; this will 16 be Cell #1 which was cleared by the previous loop 17 <- Decrement the loop Counter in Cell #0 18 ] Loop till Cell #0 is zero 19 20 The result of this is: 21 Cell No : 0 1 2 3 4 5 6 22 Contents: 0 0 72 104 88 32 8 23 Pointer : ^ 24 25 >>. Cell #2 has value 72 which is 'H' 26 >---. Subtract 3 from Cell #3 to get 101 which is 'e' 27 +++++ ++..+++. Likewise for 'llo' from Cell #3 28 >>. Cell #5 is 32 for the space 29 <-. Subtract 1 from Cell #4 for 87 to give a 'W' 30 <. Cell #3 was set to 'o' from the end of 'Hello' 31 +++.----- -.----- ---. Cell #3 for 'rl' and 'd' 32 >>+. Add 1 to Cell #5 gives us an exclamation point 33 >++. And finally a newline from Cell #6
这可以用以下一行表示。
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
皮耶特
如您所见,它是一种编程语言,程序员需要为网格着色而不是对单词进行编码。 用于在位图图像周围移动并执行与每个颜色代码相关的命令的指针。 有二十种颜色用于表示命令,白色不表示任何操作。 当指针尝试进入黑色区域时,选择下一个块的规则将更改。 在示例程序下面打印“ Piet”。
马尔博格
最后但并非最不重要的是,这种语言被称为“从地狱编程”。 这个想法是编程应该很困难。 因此,进一步讨论语言语法毫无意义。 这种语言的一个有趣的事实是,即使是这种语言的发明者也无法自己编写程序。 但是,这是Malbolge语言中的hello world示例程序。
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
结论
我在下面列出了其他可供进一步阅读的编程语言。 关于大多数这些语言的一个有趣的事实是它们是Turing完整的,这意味着您可以实现其他编程语言可以执行的任何计算机程序。 尽管这些编程语言似乎没有用,但它使我们开阔了胸怀,以不同的方式看待事物。
希望您喜欢阅读本文。 如果您有任何评论,可以在Twitter上找到我 。 跟我来了解更多有趣的故事。 随意评论您的想法。 在另一篇文章中见。 干杯:)
From: https://hackernoon.com/weird-programming-languages-that-you-may-have-not-heard-8ddce12bab66