搞怪语言——Starry语言简介

这是我在读的一本书,[url=http://www.amazon.co.jp/dp/4839927847]《Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~》[/url]的第二章中介绍的第一个语言实例。

这是一种“看起来像星空一般”的语言。先看一段源码来感受一下:
            +        
+ * +* .
+ + * +* .
+ + + ** .

+ + * +* .
+ + + ** .

+ + * .
+ +* + * + * .
+ + + * * + + * * + * .
+ + + ** .
+ + + **
. + + + * + + * * * .
+ + * + * . + + + * + *
* +* .

(注意每行前后的空格……JavaEye的语法高亮插件把每行开头的空白都“吃”了,
最好还是参见附件压缩包里的hello_world.starry文件。就是文本文件而已。)
这段“源代码”的执行结果就是:输出"Hello, world!"。 =v=

Starry语言的词法的构成元素只有七个:
“+”(加号)
“*”(星号)
“.”(点号)
“`”(反单引号)
“'”(单引号)
“,”(逗号)
“ ”(半角空格)
不是以上7个字符的元素都会被无视,包括换行符;这种做法与[url=http://compsoc.dur.ac.uk/whitespace/]Whitespace[/url]相似。事实上书中在设计Starry语言的过程中就参考了许多Whitespace的特点,包括使用基于栈的指令集等。

只有如此少的可用字符,如何表现完整的运算逻辑呢?答案就是:这是一种基于栈的语言,它的指令集全部都涉及到求值栈的操作;Starry语言使用的求值栈中只存放整数。

指令集包括:
1、栈操作指令:
push:向栈压入一个整数
dup:将栈顶的整数弹出,并将弹出的整数压入栈两次
swap:交换栈顶的两个整数
rotate:循环交换栈顶的三个整数
pop:将栈顶的整数弹出并抛弃

2、算术指令:
+:将栈顶两个整数弹出并相加,将和压回到栈顶
-:将栈顶两个整数弹出并相减,将和压回到栈顶
*:将栈顶两个整数弹出并相乘,将和压回到栈顶
/:将栈顶两个整数弹出并相除,将和压回到栈顶
%:将栈顶两个整数弹出并相模,将和压回到栈顶

3、输入输出指令:
num_in:从标准输入流取一行,以十进制整数解释该行内容,并压入栈
num_out:从栈弹出一个整数,并输出到标准输出流
char_in:从标准输入流取一行的第一个字符并转换为对应的字符编码值
char_out:从栈弹出一个整数,转换为对应的字符,输出到标准输出流

4、控制流指令:
label: 在当前位置声明一个标签,以一个整数来标识
jump: 如果栈顶元素不为0,则跳转到整数标识所对应的标签位置

Starry语言的源码语法是:
dup      : " +"
swap : " +"
rotate : " +"
pop : " +"
push : 5个或以上个空格,后面接一个"+";空格数量减去5就是push的参数值

+ : "*"
- : " *"
* : " *"
/ : " *"
% : " *"

num_out : "."
char_out : " ."

num_in : ","
char_in : " ,"

label : 任意多个空格之后接一个"`";空格的个数是该标签的标识符
jump : 任意多个空格之后接一个"'";空格的个数是跳转目标标签的标识符


顶上的那个Hello, world!对应的指令序列我放在附件的parse_result.zip里了。实在摸不清头绪的话再看吧~
其实要看源码对应的指令序列只要看看parse方法调用后的结果就行了~

呵呵,用Starry语言来尽情欢乐一把吧~附件的压缩包里包括一个Starry语言的参考实现,是书上给出的代码稍微修改过的版本。[color=red]注意:starry.rb主要来自原书,并非我的原创。[/color]顶上的Hello, world!倒是我自己写的,有无限种方法来达到这个运行结果就是了 XD

该实现需要Ruby 1.9来运行。命令行格式是:
ruby starry.rb hello_world.starry

(最后一个参数替换为你所编写的Starry语言源码文件路径)

Have fun!

P.S. 本来在实现starry.rb的时候想把run里的while循环改成.each的,后来写到jump的实现才发觉不行 T T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值