`
RednaxelaFX
  • 浏览: 3016423 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

搞怪语言——Starry语言简介

阅读更多
这是我在读的一本书,《Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~》的第二章中介绍的第一个语言实例。

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

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

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

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

Starry语言的词法的构成元素只有七个:
“+”(加号)
“*”(星号)
“.”(点号)
“`”(反单引号)
“'”(单引号)
“,”(逗号)
“ ”(半角空格)
不是以上7个字符的元素都会被无视,包括换行符;这种做法与Whitespace相似。事实上书中在设计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语言的参考实现,是书上给出的代码稍微修改过的版本。注意:starry.rb主要来自原书,并非我的原创。顶上的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
9
2
分享到:
评论
16 楼 RednaxelaFX 2009-05-28  
偷地雷么……嗯用来雷人正合适
keakon 写道
这里发评论真囧,还要回答问题

回复要回答问题到底是什么时候开始的?……=v=|||||
我貌似4月份还是什么时候做过一次测试后就再没遇到了,都忘了这回事 OTL
15 楼 keakon 2009-05-28  
看上去像偷地雷的…

这里发评论真囧,还要回答问题
14 楼 RednaxelaFX 2009-04-12  
oCameLo 写道
你学过的那么一大堆语言,还包括日语?话说,这书里还有其他好玩的东西没。。

勉强算是学过日语……虽然不咋灵光,呜

那本书是本比较浅的书,实现语言用的技巧也没多复杂:
语法方面,从一开始只用单字符的语法构造的语言,到后面有一个用到了递归下降解析器的语言;
执行方面,主要就是用很简单的中间语言+一个基于switch的主循环的解释器(Ruby里就是基于case咯)。

介绍了设计思路与实现的语言包括:
1、只能用于演示的语言,HQ9+
2、只有8个命令的语言,Brainf*ck
3、无法印刷的语言,Whitespace
4、星空般闪烁的语言,Starry(就是这帖里的这个)
5、滥用Unicode的语言,Bolic

后面就是节选了些有名的搞怪语言介绍了一下,有:
1、Befunge
2、Wierd
3、Shakespeare
4、Chef
5、Unlambda(这个我喜欢……)
6、Grass
7、False8
8、NULL
9、AAAAAAAAAAAAAA!!!!
10、INTERCAL
11、Malbolge
12、KEMURI
13、Taxi4
13 楼 oCameLo 2009-04-09  
你学过的那么一大堆语言,还包括日语?

话说,这书里还有其他好玩的东西没。。
12 楼 RednaxelaFX 2009-03-23  
yangzhanchun 写道
为什么有这样的语言啊?干吗用的?

乐趣撒。这类搞怪语言主要是用来玩的,不是真为了实用而设计的。
有时候你要想隐秘的跟朋友交换程序的话,这类也会很管用 XD
11 楼 yangzhanchun 2009-03-22  
为什么有这样的语言啊?干吗用的?
10 楼 zhangcong170 2009-03-22  
这样的代码读起来要崩溃
9 楼 caryl 2009-03-20  
写个反编译器,送给中情局
8 楼 天机老人 2009-03-19  
这个语言有点牛B了,呵呵,我们可是玩不起!
7 楼 monlyu 2009-03-19  
感觉读代码的时候有点晕!
6 楼 RednaxelaFX 2009-03-19  
crackcell 写道
有点像brainf*ck

嗯……那本书在Starry之前的一个例子是Whitespace,再前一个就是Brainf*ck
5 楼 crackcell 2009-03-19  
有点像brainf*ck
4 楼 RednaxelaFX 2009-03-19  
night_stalker 写道
我还想写个starry反编译器呢,你把解释贴出来了..

嗯有道理,把解释放附件藏起来,免得破坏了大家的乐趣~ XD
3 楼 night_stalker 2009-03-19  
我还想写个starry反编译器呢,你把解释贴出来了..
2 楼 RednaxelaFX 2009-03-19  
night_stalker 写道
非常pp!

这本书绝对是解闷的好书啊 TvT
1 楼 night_stalker 2009-03-19  
非常pp!

相关推荐

Global site tag (gtag.js) - Google Analytics