难绷语言之 Whitespace
简介
Whitespace 是一个由 Edwin Brady 和 Chris Morris 在 2002 年创造的语言[1],因为年代过于久远官网早就挂掉了,所以只能通过网站时光机访问: https://web.archive.org/web/20150523181043/http://compsoc.dur.ac.uk/whitespace/index.php 。
指令
Whitespace 的基本指令只有空格、制表符、换行符三种字符,其他的所有可见文字都会被当成注释忽略掉。
主要操作有:
栈(以
开头)++(数字):将数字压入栈(后跟二进制表示的数字,以\n结束)+\n+:复制栈顶元素+\t+:交换栈顶两个元素+\n+\t:丢弃栈顶元素
算术运算(以
\t开头)\t++:加法\t++\t:减法\t++\n:乘法\t+\t+:除法\t+\t+\t:取模
堆操作
\t+\n+:将栈顶值存储到堆中(地址由次栈顶指定)\t+\n+\t:从堆中取出值(地址由栈顶指定)并压入栈
流程控制(以
\n开头)\n++:标记一个标签(后跟二进制表示的标签编号,以\n结束)\n++\t:调用子程序(跳转到标签)\n++\n:无条件跳转(跳转到标签)\n+\t+:如果栈顶为 0,则跳转到标签\n+\t+\t:如果栈顶为负,则跳转到标签\n+\t+\n:结束子程序并返回\n+\n+\n:结束程序
I/O(以
\t\n开头)\t+\n+:输出栈顶字符\t+\n+\t:输出栈顶数字\t+\n+\n:读取字符并存储到堆中\t+\n+\n:读取数字并存储到堆中
数字
在 Whitespace 中数字和字符( ASCII )是用二进制数表示的, 表示 0 , \t 表示 1 。
如果要表示负数,那就要在最前面加上 \t 。
Label
Label 是一个 和 \t 组成的,以 \n 结尾的语句,所有的标签都需要是唯一的,用于控制流( goto )。
编译
Hello world:
1 | |
https://vii5ard.github.io/whitespace/ 和 https://www.jdoodle.com/execute-whitespace-online 还有官网都提供了编译 Whitespace 的工具,第一个网站还提供了相当多的实例,以飨爱好者。