我可能对探索像Forth(或Factor)这样的基于堆栈的语言感兴趣。我希望看到的是如何从头开始,一步一步地构建应用程序。我发现的教程都是初级的,并不能帮助我理解大局。一想到在处理大量零件时如何管理堆栈,就会感到困惑。
我一直认为(也许是错误的)学习一门语言的好方法是用它来写一个Roguelike游戏。我很难弄清楚一个人如何处理一堆东西:迷宫、几十种生物、宝藏、角色统计数据等。
在某种意义上,所有语言都是等价的;你通过将问题分解成更小的部分来编写程序,然后对这些部分进行编码,使它们协同工作。Forth具有不同寻常的语法特性,但它仍然是一种编程语言。
事实上,福斯将大量的力量放在你的指尖,就像Lisp一样。在Lisp中,使用"宏",您可以编写自己的控制结构,这些结构与内置的任何结构一样好;在福斯,你也可以这样做。
如果你有兴趣了解更多关于福斯的信息,我建议你读Leo Brodie的经典书籍《从福斯开始》和《从福斯思考》。
哦!谷歌刚刚告诉我,这两本书现在都可以免费在线阅读:
http://www.forth.com/starting-forth/
http://thinking-forth.sourceforge.net/
我会把你指向Factor,而不是纯粹的Forth;有很多示例应用程序、GUI、web应用程序等。如果你对web框架特别感兴趣,可以看看Furnace。
最终我不明白这个问题;基于堆栈与完成任何事情有什么关系?在过去,它是嵌入式系统选择的语言;我写了从谷物拳击机器人到计算器的所有东西…嗯,大部分都是。
我试图在这个答案的底部直接回答您的所有问题。但在此之前,以下是学习基于堆栈的Forth的7点或方面,或通常关于基于堆栈的语言,或实现目标的方法:
1:这里有一个关键的方法:堆栈不是保存数据的地方,只是将参数从一个函数(或方法)传递到另一个函数的方式。
2:有一个用福斯语写的"基础语言"翻译。这将是用Forth编写应用程序的一种方式——编写自己的Basic解释器(或键入一个您找到的解释器),然后用您刚刚创建的Basic语言编写Roguelike游戏。
3:如果你浏览旧的"Forth Dimensions"杂志,就会创建并展示几个不同的面向对象的Forth扩展(包括源代码)。在中键入其中一个,并使用它以一种面向对象的方式编写类似流氓的游戏。如果你仍然停滞不前,用你最喜欢的C语言——C++、C#或Java——写它,关键是。。。尽量写得朴实无华。然后将您自己的应用程序拆开——每个方法、枚举、常量等都构成了您为实现游戏而创建的域特定语言的一部分。写下这些部分,并找出如何在福斯中做到这一点,最好只使用福斯的习语。你可能需要在福斯工作一段时间才能到达那个阶段。
4:学习如何用汇编语言编程,这是一种存在Forth的汇编语言,它具有用于同一微控制器或CPU的嵌入式汇编程序。这就是Forth在计算机变得越来越广泛时真正击败竞争的地方——推出了一款全新的微控制器,创建了BIOS和操作系统。一旦你用纯汇编语言完成了这项工作,那么就进入具有相同汇编语言的Forth,并对相同的应用程序进行编程,但使用Forth汇编程序来构建构建块(DSL),然后在这些DSL中编写BIOS和操作系统。福斯恰好同时是低级和高级的,最好的应用程序是用多个DSL编写的,而不是用基于堆栈的原语编写的。一旦你用汇编语言写作,当你尝试学习Forth时,你会发现它很容易——基本机制很简单,但基本机制的组合简单、强大、优雅。
5:看看C#或Java,意识到它们都是基于虚拟机的,虚拟机是一种特定的DSL。但也要意识到,这两个虚拟机都是堆栈机器,为它们提供动力的语言都是基于堆栈的语言。但是,如果你用Java编程,或者用C#编程,你真的根本不会考虑运行的堆栈基础,这真的是一件非常好的事情!您希望遵循相同的模式。A.认识到你需要什么样的基本机制/工具,B.构建你需要的工具,C.用你构建的工具构建你的应用程序。您可能需要将自己的中缀伪代码转换为您创建的后缀VM。您需要对象定向吗--你可以用福斯建造它。您需要多处理吗--你可以构建它。你需要一个Erlang类型的轻多线程吗--你可以构建它。你需要Basic、Pascal、C#、Java、Lua吗--你可以构建它。用你喜欢的语言构建你的Roguelike游戏,然后可能是另一种语言,然后是汇编语言。然后在福斯建造。
6:在这个环节上,有一种方法可以制作一个本机运行CIL(通用中间语言——.NET和Mono的基于堆栈的语言,在Microsoft开源规范之前,它曾经是MSIL Microsoft中间语言)的微处理器。您购买IP逻辑块,然后将其编程到FPGA中。这是一篇论文的摘要,描述了基于面向对象堆栈的语言和CIL:的实现
嵌入式系统及其应用程序正变得无处不在透明的如今,设计者需要实现这两种硬件以及尽可能快地面对竞争的软件。因此,工具IP成为该方程的一个重要因素。在本文中,我们呈现类似于Tanenbaum(2006)的JVM处理器。核心是微软CIL(通用中间语言)的子集。我们寻求通过提供整个.NET框架(C#、Visual Basic.NET…)(及其面向对象的方法)可以执行。我们使用了Xilinx Virtex II Pro作为原型平台。
7:转到Charles Moore的当前作品,他是Forth的父亲,GreenArrays,股份有限公司,并在Features下查看"Implements the colorForth instruction set",你会发现他也拿走了自己的虚拟机,优化了Forth的一生,并将其简化为速度极快的144核微芯片,据称其功能为100 BIPS。在这里,你应该能够看到"colorForth指令集"及其描述——他已经消除了任何瑕疵和膨胀,并将其简化为一个极其简洁的指令集。我们应该向这位天才学习,否则就太晚了(他年事已高,2019冠状病毒病目前威胁着我们的许多家长)。
下面,我试图更直接地处理您问题的各个方面:
如何在Forth(或Factor)中对应用程序进行编码?
与使用任何其他应用程序一样,学习构建块,构建可能工作的最简单的东西,然后从那里扩展它。
我可能对探索像Forth(或Factor)这样的基于堆栈的语言感兴趣。
有许多基于堆栈的语言。它们似乎不仅是大多数处理器的基础,也是大多数虚拟机的基础,如Java和JVM、C#和CIL。
我想了解的是如何从头开始,一步一步地构建应用程序。
这对第四本书来说是个好主意。。。有人玩游戏吗?我知道外面有很多福斯人,因为2019冠状病毒病,你们很多人也在家。你想看什么样的应用程序?光看FPC就能学到很多东西。
我发现的教程是初级的,并不能帮助我理解大局。
还有更高级别的教程。但是扩大搜索范围——包括JVM、CIL,甚至LUA(因为我认为它也有VM)。用Lisp编写一个应用程序。然后使用您在Lisp中构建的基元,并在Forth、Factor、CIL或JVM指令中实现它们。
在处理大量零件时,想到如何管理堆栈是令人困惑的。
这就是为什么我说你应该学习汇编语言——因为大多数基于堆栈的语言都是从这一点上迈出的一小步。你必须学习基本的杠杆、弹簧、闩锁和其他原始机制,我们所有的软件最终都是由这些机制制成的。但是,你只从栈的角度来思考,以形成原始机制——一旦你制作了这些机制,通常情况下,甚至不要接触栈的东西——只从基本机制的角度来考虑,然后逐步构建更高的层,甚至向面向对象的方向发展,如CIL和JVM中所示。更好的应用程序是隐式DSL的层,每个DSL都针对上一个DSL的升级。这些层是:汇编语言、CIL或其他VM、BIOS、操作系统、库、业务语言、应用程序。大多数人只认为业务语言层是DSL,但每一层都是自己的DSL,实际上,每一个类、方法、对象、配置文件和专用语言,如HTML、CSS、JavaScript等,都是所有DSL,无论是显式(正式指定)还是隐式(由程序员在构建时创建)。)我的建议是反复阅读《代码完整性》第二版这本书。
我一直认为(也许是错误的)这是一种学习的好方法一种语言是用它来写一个Roguelike游戏。
当然。。。但选任何你喜欢的,真的。但也许可以尝试获得一个基于Arm的Arduino,对其进行编程、分解,然后编写自己的汇编语言——然后为Arm芯片获得Forth,并用它进行编程。然后在Arm Forth中执行Roguelike游戏。
我很难弄清楚一个人如何处理很多事情堆上的东西:迷宫,几十种生物,宝藏,性格统计等
构建您的"Rogue"域特定语言,将其制作成虚拟机,然后首先用高级堆栈语言(如CIL)实现虚拟机指令,然后尝试用一种低级堆栈语言来实现。在Forth中实现了许多面向对象的风格--请参阅Forth Dimensions的旧文章以及一些旧的福斯会议演示来找到它们。谷歌(Google)和"互联网档案"(Internet Archive)或"回归机器"(Way Back Machine)是你的朋友。