难绷语言之 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Say hello.   














































































































https://vii5ard.github.io/whitespace/https://www.jdoodle.com/execute-whitespace-online 还有官网都提供了编译 Whitespace 的工具,第一个网站还提供了相当多的实例,以飨爱好者。



难绷语言之 Whitespace
https://blog.kisechan.space/2025/whitespace-introduce/
作者
Kisechan
发布于
2025年3月15日
更新于
2025年3月15日
许可协议