标签: forth

我如何设计和实现编程语言?

这个问题与此有关

在过去的几年里,我一直在思考我喜欢的东西,而不喜欢我使用的语言.我一直想写自己的语言,但从未这样做过.

我也拥有乐高RCX和NXT,但大多数时候我从来没有让我的机器人做任何事情,因为他们的视觉编程环境比较严格.

我想我会为NXT设计我的编程语言,因为已经有很多通用语言,NXT给了我一套具体的问题和目标,希望能有一个很好的沙箱.

怎么办?我从哪里开始?我需要知道什么?

如果可能的话,我会用Python或Clojure编写编译器.有一个用于NXTSDK,但也有汇编语言.什么是最好/最简单的路线?

Lego NXT有一个小屏幕,USB和蓝牙,它有4个数字和模拟传感器端口,3个输出端口和2个ARM处理器,一个主处理器和一个协处理器.http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.html

编程NXT将涉及处理数据和事件,所以某种单声道数据流/反应式似乎是合适的.它也应该很好地处理并行任务,所以我认为功能.我目前正在考虑基于堆栈.

在我的脑海中,我已经尝试统一这些概念并考虑示例代码.我正在考虑树而不是堆栈,其中功能分支可以并行运行.一个例子:

# implicit main stack
5 5 +
# 10

# quoted branch or list
[1 -]
# 10 [1 -]

# eval list and recur until false
loop
# [9 8 7 6 5 4 3 2 1 0]

# define stack as a function
[1 = [1 8 motor] [1 0 motor] if] fn
# [9 8 7 6 5 …
Run Code Online (Sandbox Code Playgroud)

python programming-languages clojure forth nxt

12
推荐指数
4
解决办法
2444
查看次数

(GNU)Forth局部变量行为

我刚刚在Forth中学习了单词定义的局部变量.我碰巧使用GNU Forth(gforth).我正在查看问题和答案,Forth局部变量分配变量,并且正在努力解决给定答案的行为.当我尝试它时,我得到了一个下溢,除非我有四个单元格在堆栈上.

考虑这个简单的例子:

: foo { a b } a b + . ;
Run Code Online (Sandbox Code Playgroud)

这个词将采取前两名堆的电池,将它们存储在本地变量ab,把ab(按顺序)回栈上,添加它们,流行音乐和显示结果,并发出一个回车.它按照我的预期工作,在完成时不会在堆栈上留下任何内容:

: foo { a b } a b + . cr ;  ok
1 3 foo 4
 ok
.s <0>  ok
Run Code Online (Sandbox Code Playgroud)

现在我想尝试一个本地变量,它不是最初从栈中获取的:

: foo { a b | c } a b + to c c . cr ;
Run Code Online (Sandbox Code Playgroud)

我希望这个行为类似,但使用局部变量c.这个词会采取前两名堆的电池,将它们存储在本地变量ab,把ab(按顺序)回栈上,添加它们,弹出的结果,它在存储c,推c …

forth local-variables

12
推荐指数
1
解决办法
208
查看次数

Forth如何实现字典?(争议)

我正在研究Forth,因为我有一个个人项目.它看起来是一个非常酷且简单的语言,可以在一个小型虚拟机中实现.

我对使用词汇表的可能性印象特别深刻.另一方面,我认为字典的工作方式对于总体上如此简单的语言来说过于复杂.我这样说,因为我读过一些关于它的论文,我知道存在很多争议.

有一些微处理器在其指令中实现了Forth的一些功能,我很想知道它们如何实现字典和它们上的词汇表等功能,因此我可以实现一个看起来像那些微处理器的虚拟机.

也就是说,字典不是一个长大的简单堆,并不是一个简单的线性向量,我们可以简单地索引,因此对于微处理器的微代码来说这不是一件容易的事(我猜).如果那些特殊的处理器能够像它应该的那样实现字典,那么我会非常感动,当然,没有任何额外的代码.我认为这是不可能的.

所以对于我的项目,我正在考虑用一个堆来编译解释器,用操作码来操作它,例如在6852中.并且字典的代码应该与解释器和Forth中的编辑器一起编译.我认为这应该看起来更像现实.

所有这些争议都是关于什么的?这些特殊处理器如何与字典和词汇表的使用相关联?

interpreter dictionary forth

11
推荐指数
1
解决办法
1643
查看次数

6502轻量级压缩算法

我正在Commodore PET(为了好玩)的双盒式磁带录像机上实现虚拟内存,我正在写作.如果您有兴趣,我到目前为止在http://github.com/chitselb/pettil.

我打算使用PET的原生192字节盒式数据文件格式.哦,是的,一切只有32K的RAM .我已经在语言中嵌入了Woz优秀且非常节省内存的Sweet-16解释器.

Forth块(通常)为1024字节.为块ID添加两个字节会使可用的虚拟地址空间达到64 meg,这比磁带上的容量更大.将存在"播放"牌组(设备1)和"记录"牌组(设备2),并且FLUSH将涉及将整个虚拟存储器从一个驱动器复制到另一个驱动器.为什么要在风车上倾斜?因为当天早些时候,盒式磁带是大多数PET用户所拥有的,包括在内.

大多数数据将是Forth代码的屏幕,在此实现中将是1000字节的文本和24字节的换行表,因为我也在利用PET ROM屏幕编辑器.我正在寻找的是任何可能(可能)为此目的击败简单的运行长度编码的建议,但没有像Lempel-Ziv这样复杂的东西的CPU和内存开销.除了"忘记它"之外的所有建议都表示赞赏.

compression assembly 6502 forth

11
推荐指数
1
解决办法
1196
查看次数

Java虚拟机语言是否不可知?

可以肯定地说Java虚拟机"最初"是为Java编程语言设计的,但是现在,其他开发人员已经能够编写编译成Java字节码的编程语言,如Scala,Jython和JRuby.

Java字节码中仍然存在"面向对象"的引用,如接口,方法,字段.例如,invokespecial是对'object'方法的调用.

它不是纯粹的语言无关指令集的纯栈虚拟机.例如,纯FORTH实现只能进行堆栈操作.

问题是JVM语言与否是无关的?

java language-agnostic stack forth

10
推荐指数
2
解决办法
872
查看次数

Forth:免费视频教程?

你能推荐任何免费的Forth视频教程(以下除外)吗?

我所知道的唯一一个是Samuel A. Falvo的优秀作品" Over The Shoulder Episode 1:Text Preprocessing in Forth ".MPEG.102 MB

还有年度Forth Day的视频,但我不认为这些是教程.

(不幸的是,Forth就像R,C,C++,Java,C#,D,COM​​,.NET,F#和Frontier,一个非特定的搜索词.搜索提示Forth:用"ans"限定它 - 如在ANS Forth中,ANSI Forth标准.)


根据答案和其他信息累积:

介绍给Forth

  • 第四.由本斯蒂格利茨.在RubyConf 2008奥兰多佛罗里达,美国13分35秒.32 MB.MP4.

高级

video forth

9
推荐指数
1
解决办法
1540
查看次数

Multicore Forth,有吗?

是否存在允许您充分利用多核处理器的Forth实现?

multicore forth

9
推荐指数
2
解决办法
3275
查看次数

自定义控制流编译字的示例

Forth着名的允许用户通过为控制流定义新单词来改变语言(超出标准给出的单词:DO,LOOP,BEGIN,UNTIL,WHILE,REPEAT,LEAVE IF,THEN,ELSE,CASE,ENDCASE等)

是否有人们实际创建自己的新控制流程词的常见例子?有哪些典型和有用的例子?或者标准已经定义了人们实际需要的一切?

我希望找到一些有用的语言扩展示例,这些示例已经被接受或证明通常有助于使语言更具表现力.

compilation forth control-flow gforth immediate-mode

9
推荐指数
2
解决办法
271
查看次数

如何定义VALUE和TO

我想要实现的第四字VALUETO(在仿真计算机一个RPC/8 的Minecraft MOD).只要我在编译时不使用它,我最好的尝试就会给我一组工作正常的单词.更具体的VALUE工作,但TO没有.

: VALUE CREATE , DOES> @ ;
: TO ' 3 + ! ;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一切我能想到的工作,我的最佳尝试让我得到了这个:

['] NameOfAValue 3 + !
Run Code Online (Sandbox Code Playgroud)

需要注意的是该处理器是不是一个纯粹的6502,但一个65EL02的自定义变种65816.

编辑#1:不知怎的,我忘了调用CREATE的价值.应该一直都在那里.编辑#2:我也有3+在TO调换了...哎呀.它本来应该是另一种方式.

6502 forth

8
推荐指数
1
解决办法
226
查看次数

Forth 编程语言中的“局部变量”是什么意思?

在 C 中,局部变量存在于函数内部并包含如下值:

void main(){
    int a = 5;
    int b = 9;
}
Run Code Online (Sandbox Code Playgroud)

在 Gforth 手册中,他们这样描述局部变量:

: swap { a b -- b a }
  b a ;
1 2 swap .s 2drop
Run Code Online (Sandbox Code Playgroud)

但它似乎是一个带有两个参数ab的函数。

另一个关于 Forth 语言的教程显示了一个像这样的变量:

variable a
3 a !    ( ! to store the value )
Run Code Online (Sandbox Code Playgroud)

那么,哪一个是正确的呢?

forth gforth

8
推荐指数
1
解决办法
867
查看次数