在这里,我发现了一个用Java实现的Simple Forth Interpreter.
但是,如果我想使用它,我不明白它的意义吗?
Forth Interpreter的优点是什么:
你的意见...
我对汇编知之甚少,但我很确定x86上有平方根说明吗?我试图让一个平方根函数在泡沫中运行良好,而且当我运行多次时,我发现的那个函数陷入了困境.
: sqrt-closer ( square guess -- square guess adjustment)
2dup / over - 2 /
;
: sqrt ( square -- root )
1 begin
sqrt-closer dup
while + repeat
drop nip ;
Run Code Online (Sandbox Code Playgroud) 我正在用C编写一个简单的基于堆栈的语言,并且想知道我应该如何实现某种循环结构和/或前瞻符号.由于这个页面的代码有点长(超过200行),我把它放在GitHub存储库中.
编辑:主程序存档stack.c.
编辑:代码只是输入words,类似于FORTH.它使用scanf和从左到右工作.然后它使用一系列ifs和strcmps来决定做什么.真的是这样的.
当我在Forth的堆栈上给出一个数字时,我试图实现一个从数组中生成字符串的单词.
我的第一次天真尝试是:
create myarray s" Alpha" , s" Beta" , s" Charlie" ,
Run Code Online (Sandbox Code Playgroud)
这被接受,但它没有按预期工作 - myarray @ type产生不一致的输出(而不是我天真的期望它可能打印"Alpha").
在网上搜索时,我在Gforth文档中发现创建的字符串s"具有有限的生命周期,这意味着我的ansatz必然会从一开始就失败.另一方面,根据Len的Forth Tutorial 中的Fours部分中的数组,即使是常规对象的数组似乎也没有标准化.
<Update>显然,这对Forth来说不是一个小问题.Web上有一些库实现了缺少的字符串功能:FFL(str模块)和Bernd Paysan的字符串函数.这是一个很好的起点,虽然它仍然需要工作从那里到一个字符串数组.</更新>
那么如何实现一个从给定数组返回字符串的单词呢?
为什么Forth使用IF语句THEN ...而不是ENDIF?
我正在实现一个(不符合的)Forth编译器的东西.基本上,对于IF语句,Forth的语法对我来说非常直观.
IF ."Statement is true"
ELSE ."Statement is not true"
THEN ."Printed no matter what;
Run Code Online (Sandbox Code Playgroud)
为什么结尾语句是THEN?这使得语言对我来说非常奇怪.对于我的编译器,我正在考虑将其更改ENDIF为更自然的内容.但是,首先归还IF-THEN语句的理由是什么?
我一直试图阅读这个,但我找不到任何提及它.
根据标准,创建的字符串S"无法修改,并且从Gforth的简单实验中可以明显看出字符串的空间不是来自字典或填充区域:
hex
here . 7F48AB3B8758 ok
pad . 7F48AB3B8808 ok
s" test" .s <2> 77FDD0 4 ok
Run Code Online (Sandbox Code Playgroud)
我可以期待该地址有效多长时间?
换句话说,如果我将这个地址(和计数)存储在一个变量中,我可以稍后在程序中再参考它,还是需要将它移动到字典或堆中的单独位置?如果我不存储地址,我会泄漏内存吗?
在Gforth中,有没有办法将整数值添加到浮点值?
有点像1 + 2.1?如果我这样做,1 2.1e f+我得到一个错误,我猜测是因为值不在同一个堆栈上.我知道我可以这样做1.0e 2.1e f+,但那并不是我想弄清楚怎么做.
我有一个神秘的错误,用于减去各种长度的无符号整数的算法.它几乎适用于每对数字,但如果n不小于单元格中的位数(2^n +1)-(2^n - 1) <> 2.我无法理解为什么算法不起作用.
数字存储在"cellimal"系统中的数组中(base = 2 ^ bits),最低有效单元格为lowmem.ad1处的数组将从ad2处的数组中减去,两者都是相同的维度len,结果应存储在ad2:
false borrow ! len 0
do i ad2 + @ borrow @ +
i ad1 + @ 2dup u< dup borrow !
if 1 swap 0 d- drop \ subtraction with borrow
else - \ subtraction without borrow
then i ad2 + ! cell
+loop
Run Code Online (Sandbox Code Playgroud)
注意:我认为错误来自于从包含零值的单元格借用...
也许有人可以纠正算法?
系统我在:
/tmp/jonesforth $ cat /etc/issue
Ubuntu 16.04.1 LTS \n \l
Run Code Online (Sandbox Code Playgroud)
这是一个32位系统.
从annexia存储库中克隆:
git clone git://git.annexia.org/git/jonesforth.git
Run Code Online (Sandbox Code Playgroud)
构建顺利:
cd jonesforth
/tmp/jonesforth $ make
gcc -m32 -nostdlib -static -Wl,-Ttext,0 -o jonesforth jonesforth.S
Run Code Online (Sandbox Code Playgroud)
然而,测试没有通过:
/tmp/jonesforth $ make test
test_stack_trace.f ... --- .test_stack_trace.test 2016-09-17 17:44:59.488492834 -0500
+++ test_stack_trace.f.out 2016-09-17 17:33:11.171189490 -0500
@@ -0,0 +1,6 @@
+TEST4+0 TEST3+0 TEST2+0 TEST+0
+3
+TEST4+0 TEST3+32 TEST2+0 TEST+0
+TEST4+0 TEST3+0 TEST2+4 TEST+0
+3
+TEST4+0 TEST3+32 TEST2+4 TEST+0
Makefile:34: recipe for target 'test_stack_trace.test' failed
make: *** [test_stack_trace.test] Error 1
Run Code Online (Sandbox Code Playgroud)
启动jonesforth会导致分段错误: …
作为移植 Forth 编译器的一部分,我正在尝试创建一个允许自修改代码的二进制文件。血淋淋的细节位于https://github.com/klapauciusisgreat/jonesforth-MacOS-x64
理想情况下,我为用户定义创建一堆页面并调用 mprotect,如下所示:
#define __NR_exit 0x2000001
#define __NR_open 0x2000005
#define __NR_close 0x2000006
#define __NR_read 0x2000003
#define __NR_write 0x2000004
#define __NR_mprotect 0x200004a
#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)
#define PAGE_SIZE 4096
// https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/errno.h
#define EACCES 13 /* Permission denied */
#define EINVAL 22 /* Invalid argument */
#define ENOTSUP 45 /* Operation not supported */
/* Assembler entry point. */
.text
.globl start
start:
// Use mprotect to …Run Code Online (Sandbox Code Playgroud)