我可能对探索像 Forth(或 Factor)这样的基于堆栈的语言感兴趣。我希望看到的是如何一步一步地从头开始构建应用程序。我发现的教程很简陋,并不能帮助我理解更大的图景。想一想在处理大量部件时如何管理堆栈是令人困惑的。
我一直认为(也许是错误的)学习语言的好方法是用它来编写Roguelike游戏。我很难弄清楚如何将一堆东西放在一起:迷宫、数十种生物、宝藏、角色统计数据等。
我可能对探索像 Forth(或 Factor)这样的基于堆栈的语言感兴趣。我希望看到的是如何一步一步地从头开始构建应用程序。我发现的教程很简陋,并不能帮助我理解更大的图景。想一想在处理大量部件时如何管理堆栈是令人困惑的。
我一直认为(也许是错误的)学习语言的好方法是用它来编写Roguelike游戏。我很难弄清楚如何将一堆东西放在一起:迷宫、数十种生物、宝藏、角色统计数据等。
从某种意义上说,所有语言都是等价的;您通过将问题分解成更小的部分来编写程序,然后将这些部分编码并让它们一起工作。Forth 具有不同寻常的语法特性,但它仍然是一种编程语言。
事实上,与 Lisp 一样,Forth 让您触手可及。在 Lisp 中,使用“宏”,您可以编写自己的控制结构,这些控制结构与内置的任何东西一样好;在 Forth 中,您也可以这样做。
如果您有兴趣了解有关 Forth 的更多信息,我建议您阅读 Leo Brodie 的经典书籍《Starting Forth 》和《 Thinking Forth》。
哦!谷歌刚刚告诉我这两本书现在都可以在线免费获得:
我试图在此答案的底部直接回答您的所有问题。但在此之前,这里是学习基于堆栈的 Forth 的 7 个要点或方面,或者一般关于基于堆栈的语言,或实现目标的方法:
1:这是思考这个问题的一个关键方法:堆栈不是你保存数据的地方——只是你将参数从一个函数(或方法)传递到另一个函数(或方法)的方式。
2:有一个用Forth写的“Basic Language”解释器。这将是在 Forth 中编写应用程序的一种方法——编写您自己的 Basic 解释器(或输入您找到的解释器),然后用您刚刚创建的 Basic 语言编写 Roguelike 游戏。
3:如果您浏览旧的“Forth Dimensions”杂志,就会创建并展示几个不同的 Forth 面向对象扩展(包括源代码)。输入其中之一,并使用它以其中一种面向对象的方式编写您的 Rogue-like 游戏。如果您仍然卡住,请使用您最喜欢的 C 语言(C++、C# 或 Java)编写它,这就是关键……尽可能原始地编写它。然后将您自己的应用程序拆开——每个方法、枚举、常量等都构成了您为实现游戏而创建的领域特定语言的一部分。写下这些部分,并弄清楚如何在 Forth 中完成,最好只使用 Forth 的习语。你可能需要在 Forth 工作一段时间才能达到那个阶段。
4:学习如何用汇编语言编程,这是一种有 Forth 的汇编语言,它具有用于同一微控制器或 CPU 的嵌入式汇编程序。这正是 Forth 在计算机刚刚变得越来越普及时真正击败竞争对手的地方——推出了全新的微控制器,创建了 BIOS 和操作系统。一旦你用纯汇编语言完成了这个,然后进入具有相同汇编语言的 Forth 并编写相同的应用程序,但使用 Forth 汇编器构建构建块(DSL),然后编写 BIOS 和操作系统在那些 DSL 中。Forths 恰好同时是低级和高级的,最好的应用程序是用多个 DSL 编写的,而不是基于堆栈的原语。一旦你用汇编语言编写过,
5:看看 C# 或 Java,发现它们都基于虚拟机,这是一种特定的 DSL。但也要意识到这两个虚拟机都是堆栈机器,并且支持它们的语言是基于堆栈的语言。但是如果你用 Java 编程,或者如果你用 C# 编程,你真的根本不会考虑你正在运行的堆栈基础——这是一件非常好的事情!你想要遵循相同的模式。A. 了解您需要什么基本机制/工具, B. 构建您需要的工具, C. 使用您构建的工具构建您的应用程序。您可能必须将自己的中缀伪代码转换为您创建的后缀虚拟机。你需要面向对象吗?——你可以用 Forth 构建它。您需要多处理吗?--您可以构建它。你需要一种 Erlang 类型的轻量多线程吗?——你可以构建它。你需要一个Basic、一个Pascal、一个C#、一个Java、一个Lua吗?——你可以构建它。用你最喜欢的语言构建你的 Roguelike 游戏,然后可能是另一种语言,然后是汇编语言。然后在 Forth 中构建它。
6:在这个链接上,有一种方法可以制造一个本机运行 CIL(通用中间语言 - .NET 和 Mono 的基于堆栈的语言,在微软开源规范之前,它曾经是 MSIL 微软中间语言)的微处理器)。您购买 IP 逻辑块,然后将其编程到 FPGA 中。这是一篇论文的摘要,描述了面向对象的基于堆栈的语言和 CIL 的实现:
嵌入式系统及其应用程序正变得无处不在且透明。如今,设计人员需要尽快实现硬件和软件以应对竞争。因此,工具和 IP 成为等式的重要因素。在本文中,我们提出了一个类似于 Tanenbaum (2006) JVM 处理器的微架构的可合成内核。核心是 Microsoft 的 CIL(通用中间语言)子集的实现。我们寻求通过提供一个平台来加速嵌入式软件的开发,整个 .NET 框架(C#、Visual Basic.NET...)(连同其面向对象的方法)都可以在该平台上执行。我们使用 Xilinx Virtex II Pro 作为原型平台。
7: 前往GreenArrays, Inc.的 Forth 之父 Charles Moore 当前的工作地点,并在“实现 colorForth 指令集”的功能下查找,你会发现他也使用了他的虚拟机器,已经优化了 Forth 他的整个生活,并将其简化为一个速度极快的 144 核微芯片,声称具有 100 BIPS 的能力。在这里,您应该能够查看“colorForth 指令集”及其描述——他已经消除了任何绒毛和臃肿,并将其简化为极其简陋的指令集。我们应该在为时已晚之前向这位天才学习(他年事已高,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 的目标都是从前一个 DSL 升级。这些层是:汇编语言、CIL 或其他 VM、BIOS、操作系统、库、业务语言、应用程序。
我一直认为(也许是错误的)学习语言的好方法是用它来编写 Roguelike 游戏。
当然...但是选择任何你喜欢的东西,真的。但也许尝试获得一个基于 Arm 的 Arduino,对其进行编程、反汇编,然后编写自己的汇编语言——然后为那个 Arm 芯片获得一个 Forth,并用它进行编程。然后在 Arm-Forth 中实现你的 Roguelike 游戏。
我很难弄清楚如何将一堆东西放在一起:迷宫、数十种生物、宝藏、角色统计数据等。
构建你的“流氓”领域特定语言,将其制作成 VM,然后首先用高级堆栈语言(如 CIL)实现 VM 指令,然后尝试找出如何在其中一个低级堆栈中执行它- 语言。在 Forth 中实现了许多面向对象的风格——探索旧的 Forth 维度文章和一些旧的 Forth 会议演示以找到它们。Google 和“Internet 档案”或 Way-Back Machine是您的朋友。