标签: forth

Java中的Forth Interpreter

在这里,我发现了一个用Java实现的Simple Forth Interpreter.
但是,如果我想使用它,我不明白它的意义吗?

Forth Interpreter的优点是什么:

  • 如果JVM要执行的最终编译代码仍然是"字节代码",那么Forth Interpreter会做什么?
  • 它有助于编写高效/紧凑的程序吗?
  • 我是否会在Forth中编写代码并且解释器会将其转换为Java?

你的意见...

java interpreter forth

6
推荐指数
2
解决办法
4362
查看次数

使用x86汇编Forth的平方根函数?

我对汇编知之甚少,但我很确定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)

assembly forth square-root

6
推荐指数
2
解决办法
3439
查看次数

如何在用C编写的类似FORTH的语言解释器中实现LOOP

我正在用C编写一个简单的基于堆栈的语言,并且想知道我应该如何实现某种循环结构和/或前瞻符号.由于这个页面的代码有点长(超过200行),我把它放在GitHub存储库中.

编辑:主程序存档stack.c.

编辑:代码只是输入words,类似于FORTH.它使用scanf和从左到右工作.然后它使用一系列ifs和strcmps来决定做什么.真的是这样的.

c interpreter loops forth lookahead

6
推荐指数
2
解决办法
3951
查看次数

如何实现字符串数组?

当我在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的字符串函数.这是一个很好的起点,虽然它仍然需要工作从那里到一个字符串数组.</更新>

那么如何实现一个从给定数组返回字符串的单词呢?

arrays string forth

6
推荐指数
1
解决办法
669
查看次数

为什么Forth使用IF语句THEN ...而不是ENDIF?

为什么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语句的理由是什么?

history language-design forth

6
推荐指数
1
解决办法
2212
查看次数

在Forth,S"......"的生命是什么时候?

我一直试图阅读这个,但我找不到任何提及它.

根据标准,创建的字符串S"无法修改,并且从Gforth的简单实验中可以明显看出字符串的空间不是来自字典或填充区域:

hex 
here . 7F48AB3B8758  ok
pad . 7F48AB3B8808  ok
s" test" .s <2> 77FDD0 4  ok
Run Code Online (Sandbox Code Playgroud)

我可以期待该地址有效多长时间?

换句话说,如果我将这个地址(和计数)存储在一个变量中,我可以稍后在程序中再参考它,还是需要将它移动到字典或堆中的单独位置?如果我不存储地址,我会泄漏内存吗?

memory-management forth

6
推荐指数
1
解决办法
589
查看次数

将整数值添加到Gforth中的浮点值

Gforth中,有没有办法将整数值添加到浮点值?

有点像1 + 2.1?如果我这样做,1 2.1e f+我得到一个错误,我猜测是因为值不在同一个堆栈上.我知道我可以这样做1.0e 2.1e f+,但那并不是我想弄清楚怎么做.

forth gforth

6
推荐指数
1
解决办法
812
查看次数

一种在Forth中减去大整数的错误算法

我有一个神秘的错误,用于减去各种长度的无符号整数的算法.它几乎适用于每对数字,但如果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)

注意:我认为错误来自于从包含零值的单元格借用...

也许有人可以纠正算法?

arrays algorithm forth biginteger gforth

6
推荐指数
1
解决办法
180
查看次数

jonesforth分段错误

系统我在:

/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会导致分段错误: …

gcc gnu-assembler forth

6
推荐指数
1
解决办法
411
查看次数

macOS v10.15 (Catalina) / x64 上的自修改代码

作为移植 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)

macos assembly x86-64 forth macos-catalina

5
推荐指数
1
解决办法
758
查看次数