这个问题与此有关
在过去的几年里,我一直在思考我喜欢的东西,而不喜欢我使用的语言.我一直想写自己的语言,但从未这样做过.
我也拥有乐高RCX和NXT,但大多数时候我从来没有让我的机器人做任何事情,因为他们的视觉编程环境比较严格.
我想我会为NXT设计我的编程语言,因为已经有很多通用语言,NXT给了我一套具体的问题和目标,希望能有一个很好的沙箱.
怎么办?我从哪里开始?我需要知道什么?
如果可能的话,我会用Python或Clojure编写编译器.有一个用于NXT的SDK,但也有汇编语言.什么是最好/最简单的路线?
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) 我刚刚在Forth中学习了单词定义的局部变量.我碰巧使用GNU Forth(gforth).我正在查看问题和答案,Forth局部变量分配变量,并且正在努力解决给定答案的行为.当我尝试它时,我得到了一个下溢,除非我有四个单元格在堆栈上.
考虑这个简单的例子:
: foo { a b } a b + . ;
Run Code Online (Sandbox Code Playgroud)
这个词将采取前两名堆的电池,将它们存储在本地变量a和b,把a和b(按顺序)回栈上,添加它们,流行音乐和显示结果,并发出一个回车.它按照我的预期工作,在完成时不会在堆栈上留下任何内容:
: 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.这个词会采取前两名堆的电池,将它们存储在本地变量a和b,把a和b(按顺序)回栈上,添加它们,弹出的结果,它在存储c,推c …
我正在研究Forth,因为我有一个个人项目.它看起来是一个非常酷且简单的语言,可以在一个小型虚拟机中实现.
我对使用词汇表的可能性印象特别深刻.另一方面,我认为字典的工作方式对于总体上如此简单的语言来说过于复杂.我这样说,因为我读过一些关于它的论文,我知道存在很多争议.
有一些微处理器在其指令中实现了Forth的一些功能,我很想知道它们如何实现字典和它们上的词汇表等功能,因此我可以实现一个看起来像那些微处理器的虚拟机.
也就是说,字典不是一个长大的简单堆,并不是一个简单的线性向量,我们可以简单地索引,因此对于微处理器的微代码来说这不是一件容易的事(我猜).如果那些特殊的处理器能够像它应该的那样实现字典,那么我会非常感动,当然,没有任何额外的代码.我认为这是不可能的.
所以对于我的项目,我正在考虑用一个堆来编译解释器,用操作码来操作它,例如在6852中.并且字典的代码应该与解释器和Forth中的编辑器一起编译.我认为这应该看起来更像现实.
所有这些争议都是关于什么的?这些特殊处理器如何与字典和词汇表的使用相关联?
我正在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和内存开销.除了"忘记它"之外的所有建议都表示赞赏.
可以肯定地说Java虚拟机"最初"是为Java编程语言设计的,但是现在,其他开发人员已经能够编写编译成Java字节码的编程语言,如Scala,Jython和JRuby.
Java字节码中仍然存在"面向对象"的引用,如接口,方法,字段.例如,invokespecial是对'object'方法的调用.
它不是纯粹的语言无关指令集的纯栈虚拟机.例如,纯FORTH实现只能进行堆栈操作.
问题是JVM语言与否是无关的?
你能推荐任何免费的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
高级
Forth着名的允许用户通过为控制流定义新单词来改变语言(超出标准给出的单词:DO,LOOP,BEGIN,UNTIL,WHILE,REPEAT,LEAVE IF,THEN,ELSE,CASE,ENDCASE等)
是否有人们实际创建自己的新控制流程词的常见例子?有哪些典型和有用的例子?或者标准已经定义了人们实际需要的一切?
我希望找到一些有用的语言扩展示例,这些示例已经被接受或证明通常有助于使语言更具表现力.
我想要实现的第四字VALUE和TO(在仿真计算机一个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调换了...哎呀.它本来应该是另一种方式.
在 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)
但它似乎是一个带有两个参数a和b的函数。
另一个关于 Forth 语言的教程显示了一个像这样的变量:
variable a
3 a ! ( ! to store the value )
Run Code Online (Sandbox Code Playgroud)
那么,哪一个是正确的呢?
forth ×10
6502 ×2
gforth ×2
assembly ×1
clojure ×1
compilation ×1
compression ×1
control-flow ×1
dictionary ×1
interpreter ×1
java ×1
multicore ×1
nxt ×1
python ×1
stack ×1
video ×1