我可能有兴趣探索像Forth(或Factor)这样的基于堆栈的语言。我想看到的是如何从头开始逐步构建应用程序。我发现的教程很简陋,并没有帮助我理解大局。想到在处理大量部件时如何管理堆栈会让人感到困惑。
我一直认为(可能是错误的)学习语言的好方法是用它来编写Roguelike游戏。我无法弄清楚如何在堆叠中玩弄很多东西:迷宫,数十种生物,宝藏,角色统计等等。
答案 0 :(得分:4)
我会指向Factor而不是纯粹的Forth;有大量的示例应用程序,GUI,Web应用程序等。如果您对Web框架特别感兴趣,请查看Furnace。
最终我不明白这个问题;什么是基于堆栈与完成任何事情有关?在过去,它是嵌入式系统的首选 语言;我写了从谷物拳击机器人到计算器的所有东西......好吧,主要是一切。
答案 1 :(得分:4)
在某种意义上,所有语言都是等同的;你通过将问题分解成更小的部分来编写程序,然后编写这些部分并使它们一起工作。 Forth具有不寻常的语法功能,但它仍然是一种编程语言。
事实上,就像Lisp一样,Forth在你的指尖提供了大量的力量。在Lisp中,使用"宏",您可以编写自己的控件结构,这些结构与内置的任何内容一样好;在福斯,你也可以这样做。
如果您有兴趣了解有关Forth的更多信息,我建议您阅读Leo Brodie的经典书籍 Starting Forth 和 Thinking Forth 。
哦!谷歌告诉我,这两本书现在都可以免费在线获取:
答案 2 :(得分:1)
我尝试在此答案的底部直接回答您的所有问题。但在此之前,这里有七个要点或方面的知识,用于学习基于堆栈的Forth,或者通常是有关基于堆栈的语言或实现目标的方法:
1:这是对此进行思考的一种关键方法:堆栈不是保存数据的地方-而是将参数从一个函数(或方法)传递给另一个函数(或方法)的方式。
2:有一个用Forth编写的“基本语言”解释器。这是在Forth中编写应用程序的一种方法-编写自己的Basic解释器(或键入您发现的解释器),然后以您刚创建的Basic语言编写Roguelike游戏。
3:如果您浏览旧的《 Forth Dimensions》杂志,则会创建并显示几个不同的面向对象的Forth扩展(包括源代码)。输入其中之一,然后使用它以那些面向对象的方式之一编写类似流氓的游戏。如果仍然遇到问题,请使用您喜欢的C语言-C ++,C#或Java编写它,这是关键...尽可能原始地编写它。然后拆开自己的应用程序-每个方法,枚举,常量等构成您为实施游戏而创建的领域特定语言的一部分。写下这些部分,并找出如何在Forth中做到这一点,最好只使用Forth的成语。您可能需要在Forth工作一段时间才能到达那个阶段。
4:了解如何使用汇编语言进行编程,该语言是Forth所具有的一种汇编语言,该语言具有用于同一微控制器或CPU的嵌入式汇编程序。当计算机变得越来越普及时,Forth真正压制了竞争-推出了全新的微控制器,创建了BIOS和OS。用纯汇编语言完成此操作后,请进入具有相同汇编语言的Forth并编写相同的应用程序,但是使用Forth汇编程序构建构件块(DSL),然后编写BIOS和OS在那些DSL的。恰好同时出现在底层和高层,并且编写最佳的应用程序是在多个DSL中编写的,而不是在基于堆栈的原语中编写的。用汇编语言编写之后,当您尝试学习Forth时,您会发现这很容易-基本机制很简单,但是基本机制的组合却简单,强大而优雅。
5:查看C#或Java,并意识到它们都基于虚拟机,这是一种特定的DSL。但是还要认识到,两个虚拟机都是堆栈计算机,并且为两个虚拟机提供支持的语言都是基于堆栈的语言。但是,如果您使用Java进行编程,或者使用C#进行编程,则您实际上根本不会考虑要在其上运行的堆栈基础,这确实很好强>的东西!您想要遵循相同的模式。 A.了解所需的基本机制/工具,B。构建所需的工具,C。使用构建的工具构建应用程序。您可能必须将自己的infix伪代码转换为您创建的postfix VM。您是否需要对象定向?-您可以使用Forth进行构建。您需要多处理吗?-您可以构建它。您是否需要Erlang的轻量级多线程?-您可以构建它。您是否需要Basic,Pascal,C#,Java,Lua?-您可以构建它。用您喜欢的语言,然后是另一种语言,然后是汇编语言来构建您的Roguelike游戏。然后在Forth中构建它。
6:在此链接上,有一种方法可以使微处理器本地运行CIL(通用中间语言,.NET和Mono的基于堆栈的语言,以前是MSIL Microsoft中间语言,在Microsoft Open之前)。来源规范)。您购买了IP逻辑块,然后将其编程到FPGA中。这是Abstract of a paper,描述了面向对象的基于堆栈的语言和CIL的实现:
嵌入式系统及其应用正变得无处不在, 透明。如今,设计人员需要同时实现两种硬件 和软件尽可能快地面对竞争。因此工具 IP成为方程式的重要因素。在本文中,我们 呈现出类似于的微体系结构的可合成内核 Tanenbaum(2006)的JVM处理器。核心是一个 Microsoft CIL(通用中间语言)的子集。我们力求 通过提供以下内容来加速嵌入式软件的开发 整个.NET框架(C#,Visual Basic.NET ...)所基于的平台 (及其面向对象方法)可以执行。我们使用了 Xilinx Virtex II Pro作为原型设计平台。
7:转到GreenArrays, Inc.,是Forth的父亲Charles Moore的当前工作地点,在“功能”下查找“实现colorForth指令集”,您会发现他也是如此,已经采用了他的虚拟机,并优化了Forth的整个生命,并将其缩减为拥有声称的100 BIPS的惊人的快速144核心微芯片。在这里,您应该能够查看"colorForth instruction set"及其说明-他已删除了所有绒毛和膨胀,并将其简化为极其简明的指令集。我们应该从这个天才那里学到一点,以免为时已晚(他已经晋升多年,而Covid19目前威胁着我们的许多族长)。
下面,我尝试更直接地处理您的问题的各个方面:
一个人如何用Forth(或Factor)编码应用程序?
以与其他任何应用程序相同的方式,学习构建模块,并构建可能可行的最简单的方法,然后从那里进行扩展。
我可能有兴趣探索像Forth(或Factor)这样的基于堆栈的语言。
周围有许多基于堆栈的语言。它们似乎不仅是大多数处理器的基础,而且是大多数虚拟机(如Java和JVM,C#和CIL)的基础。
我想看到的是如何从头开始逐步构建应用程序。
对于Forth书来说,这是个好主意……有人玩吗?我知道,那里有很多Forth人,而且由于Covid19,很多人也在家。您想看到哪种应用程序?仅仅看FPC可以教很多东西。
我发现的教程是基本的,并不能帮助我理解全局。
那里有更高层次的教程。但是扩大您的搜索范围-包括JVM,CIL甚至LUA(因为我认为它也有VM)。用Lisp编写应用程序。然后使用您在Lisp中构建的原语,并用Forth,Factor,CIL或JVM指令实现它们。
想想当处理很多零件时如何管理堆栈会令人困惑。
这就是为什么我说您应该学习一种汇编语言的原因-因为大多数基于堆栈的语言都是从那儿迈出的一步。您必须学习基本杠杆,弹簧,闩锁和其他原始机制,这些最终机制都是由我们最终制作出的所有软件。但是,您只需要考虑使用堆栈来构造原始机制-通常,一旦有了这些原始机制,就不要再接触堆栈内容了-仅考虑基本机制,然后逐步构建更高的层,甚至前进到面向对象,如CIL和JVM中所示。更好的应用是隐式DSL的层,每个DSL的目标是比上一个更高。这些层是:汇编语言,CIL或其他VM,BIOS,操作系统,库,业务语言,应用程序。大多数人只将业务语言层视为DSL,但每个单独的层都是其自己的DSL,实际上,每个类,方法,对象,配置文件和专用语言(如HTML,CSS,JavaScript等)。 -它们是所有DSL的,无论是显式的(正式指定的)还是隐式的(由程序员在构建事物时创建的。)理解是从《代码完成》第二版中获得的-我的建议是一遍又一遍。
我一直认为(也许是错误的)这是一种学习的好方法 一种语言就是用它来编写类似Rogue的游戏。
当然...,但是,请选择您喜欢的任何东西。但是也许尝试获得一个基于Arm的Arduino,对其进行编程,分解,然后编写自己的汇编语言-然后为该Arm芯片获得一个Forth并对其进行编程。然后在Arm-Forth中实现您的Roguelike游戏。
我很难弄清楚人们将如何玩弄 一堆东西:迷宫,数十种生物,宝藏,人物 统计信息等
构建您的“ Rogue”域特定语言,将其放入VM中,然后首先以高级堆栈语言(如CIL)实施VM指令,然后尝试找出其中一种低端语言级堆栈语言。在Forth中实现了许多面向对象的风格-混淆了旧的Forth Dimensions文章 以及一些旧的Forth会议演示文稿来找到它们。 Google和"Internet Archive", or Way-Back Machine是您的朋友。