- 浏览: 3049284 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
这是我在读的一本书,《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语言的源码语法是:
顶上的那个Hello, world!对应的指令序列我放在附件的parse_result.zip里了。实在摸不清头绪的话再看吧~
其实要看源码对应的指令序列只要看看parse方法调用后的结果就行了~
呵呵,用Starry语言来尽情欢乐一把吧~附件的压缩包里包括一个Starry语言的参考实现,是书上给出的代码稍微修改过的版本。注意:starry.rb主要来自原书,并非我的原创。顶上的Hello, world!倒是我自己写的,有无限种方法来达到这个运行结果就是了 XD
该实现需要Ruby 1.9来运行。命令行格式是:
(最后一个参数替换为你所编写的Starry语言源码文件路径)
Have fun!
P.S. 本来在实现starry.rb的时候想把run里的while循环改成.each的,后来写到jump的实现才发觉不行 T T
勉强算是学过日语……虽然不咋灵光,呜
那本书是本比较浅的书,实现语言用的技巧也没多复杂:
语法方面,从一开始只用单字符的语法构造的语言,到后面有一个用到了递归下降解析器的语言;
执行方面,主要就是用很简单的中间语言+一个基于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
乐趣撒。这类搞怪语言主要是用来玩的,不是真为了实用而设计的。
有时候你要想隐秘的跟朋友交换程序的话,这类也会很管用 XD
嗯……那本书在Starry之前的一个例子是Whitespace,再前一个就是Brainf*ck
嗯有道理,把解释放附件藏起来,免得破坏了大家的乐趣~ XD
这本书绝对是解闷的好书啊 TvT
这是一种“看起来像星空一般”的语言。先看一段源码来感受一下:
+ + * +* . + + * +* . + + + ** . + + * +* . + + + ** . + + * . + +* + * + * . + + + * * + + * * + * . + + + ** . + + + ** . + + + * + + * * * . + + * + * . + + + * + * * +* .
(注意每行前后的空格……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
- parse_result.zip (244 Bytes)
- 下载次数: 19
- starry.zip (4.8 KB)
- 下载次数: 14
评论
16 楼
RednaxelaFX
2009-05-28
偷地雷么……嗯用来雷人正合适
回复要回答问题到底是什么时候开始的?……=v=|||||
我貌似4月份还是什么时候做过一次测试后就再没遇到了,都忘了这回事 OTL
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!
发表评论
-
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22396(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21495(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
Function.prototype.bind
2013-09-24 18:07 0polyfill http://stackoverflow. ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
struct做参数不能从寄存器传?
2013-08-28 23:33 0test test test struct Foo { i ... -
也谈类型: 数据, 类型, 标签
2013-08-18 01:59 0numeric tower http://en.wikiped ... -
SDCC 2012上做的JVM分享
2012-10-17 16:35 32649刚把在SDCC 2012做的JVM分享的演示稿上传了。 演示 ... -
运行时支持系统的“重量”
2012-10-12 16:08 0运行时支持系统的“重量” 好久没写博客了,可写的话题已经堆积 ... -
class?metaclass?meta-what?
2011-04-05 19:43 0http://en.wikipedia.org/wiki/Me ... -
“代码模式”与抽象
2010-10-28 15:21 0嗯,我是说“代码模式”,不是“设计模式”;这里指的是在给定的场 ... -
lvalue与rvalue
2010-09-03 00:40 0http://en.wikipedia.org/wiki/Va ... -
动态链接的“依据”
2010-02-09 09:54 0动态链接,意味着在生成的“东西”里留有符号信息,等到运行时再r ...
相关推荐
Starry+Starry+Night+-+Lianne+La+Havas.mp3
starry sky 動態圖檔,可作動態背景或gif使用……合成圖片,并無侵權
OpenCV图像风格迁移所用模板文件之starry_night.t7 使用代码: import cv2 image_file = xxx.jpg' #目标文件 model = 'starry_night.t7' #模板文件 net = cv2.dnn.readNetFromTorch('models/' + model) ...
标签“python 开发语言 后端 Python库”表明starry库是用于Python开发的,可能用于后端服务,即服务器端的编程。这意味着它可能被用于构建Web应用、数据分析服务或者任何需要在服务器上运行的Python程序。 在Python...
标签中的"python 开发语言 后端 Python库"揭示了这个库主要应用于Python编程,可能涉及后端开发任务,是Python生态系统中的一个库,可以用于扩展Python的功能。 现在,让我们深入探讨一下Python库、`.whl`文件以及...
语言:English CrunchBase,AngelList,Alexa和Linkedin集成在一起。 一键启动信息。 通常,当某人想知道一家初创公司的资金/流量信息时,他/她将不得不访问三个不同的网站:CrunchBase,AngelList和Alexa,如果您...
starry.so 用时间线的形式来写一个故事,可以是简历,旅游,活动或招聘,比如 http://starry.so/@yangxiaojie。 标签:starry
starry_evening
Starry Night是由美国Simulation Curriculum公司出品的天文软件,是世界上最真实、最豪华、最震撼的天文软件。
《后院星空:最强天文模拟软件Starry Night Pro Plus 6.1深度解析》 在探索宇宙奥秘的道路上,一款强大的天文模拟软件是必不可少的工具。Starry Night Pro Plus 6.1就是这样一款专为天文爱好者和专业天文学家设计的...
抽象精品ppt模板starry_evening198
Ajax-Starry.zip,基于ajax的javascript星级评定系统,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下...
6. **项目结构**:Vue-starry-sky-market-master可能包含了项目的基本目录结构,如src(源码目录)、public(静态资源)、components(组件)、views(视图)、router(路由)、store(Vuex存储)、mock(模拟数据)...
starry.github.io 我的机器人的网站没什么花哨的,只是html和一些CSS
刷听歌时长[by:Tloml-Starry].js
ltp模型:3.4 模型链接https://download.csdn.net/download/llm765800916/12509692 https://download.csdn.net/download/llm765800916/12509682 https://download.csdn.net/download/llm765800916/12509681 ...
Starry-Notes Preface 一个记录学习一点一滴的仓库诞生了,但我仍旧感到彷徨。我又发现这迷惘的未来正缓缓在身边打圈,一哒一咔的键盘声里, 渐渐舒展开学习记录的五味,就从这一次Git提交开始,就从这,一次灯光...