我很难理解人物阅读在空白中是如何运作的.我能够运行Hello World程序.但现在我尝试从用户只读一个字符,然后在标准输出上打印它.我没有错误,一切编译得很好,但字符不会出现在输出上.我试图稍微调试它,但它在空白中真的很难,我相信它不会打印任何东西,因为我从用户读取的值是0(或null).
这是我如何阅读角色(我相信它是正确的方式)
start
end
Run Code Online (Sandbox Code Playgroud)
在这里打印的SSCCE(这应该工作,因为它几乎与Hello World项目中的相同.
start
end
Run Code Online (Sandbox Code Playgroud)
我使用的是Whitespace 0.3和Haskell Compiler 5.02版
[TL; DR:以下JVM字节码指令似乎不起作用:
iconst_0
istore 6
...sequential
iinc 6 1
jsr L42
...
; L42
iload 6
ifeq L53 ; Always branches!!!
astore 8
iinc 6 -1
; L53
LDC 100
ISUB ; ERROR, returnAddress is at the top of the stack
Run Code Online (Sandbox Code Playgroud)
可以在此处找到测试.class (具有稍微复杂的逻辑)。如果您想进一步了解为什么我会看到这些说明,请继续阅读。]
我正在编写针对JVM字节码的Whitespace编译器。尽管是一种深奥的语言,但是Whitespace向堆栈计算机描述了一组有趣的汇编指令,该堆栈计算机很好地映射到了JVM。
空格具有标签,它们都是跳转(goto / jump-if-zero / jump-if-negative)和函数调用的目标。相关说明(由我给定的名称,在规范中以空格,制表符和换行符的组合形式给出)为:
mark <label>
:为以下说明设置标签jump[-if-neg|-if-zero] <label>
:无条件或有条件地跳转到给定标签call <label>
:调用标签所指向的函数end <label>
:结束功能,返回到调用方。我的编译器以类的main方法输出整个Whitespace程序。实现call
和的最简单方法end
是使用JSR
和RET
操作码,用于实现子例程。JSR
操作完成后,堆栈将包含一个returnAddress
引用,该引用应存储在变量中,以供以后在中使用end
。
但是,mark …
我正在尝试实现Whitespace解释器以获得乐趣,目前我正在学习本教程以学习它的语法.
语法看起来很简单,但我不明白"复制堆栈顶部项目"是什么意思.那是什么意思?是否意味着获得堆栈顶部的值并将其保存到特殊寄存器中?
所以,我最近进入了Whitespace编程,其中一个字符被列为[LF]
.不知道这是什么(是的,是的,对我说你想成为一个白痴的人都大喊大叫),我查了一下,在维基百科上发现它可以用CTRL+M
(aka ^M
)打字.所以,我用了一段时间,但是当我回去看看这篇文章时,它说LF
的也CRLF
就是"Carriage Return Line Feed",如果我没记错的话.这是否意味着Enter
,从技术上讲,"回车"对于换行也同样有效?对不起,如果这是一个愚蠢的问题:T