崩溃操作系统-为什么是FORTH?

2020-06-08 05:41:14

崩溃OS';第一个化身是用Z80汇编语言编写的。在它迅速走红后,我得到的第一批反馈之一是为什么不是Forth?";。我简单地看了一下,起初它看起来并不是一个很好的选择,所以我先把它打发掉了。然后,我有了酒鬼们所说的清醒时刻。

Fourth是实现操作系统设计目标的绝佳选择。如果你不熟悉它,可能很难理解为什么。让我试着解释一下。

一些Forth爱好者喜欢这种语言本身。他们认为用这种语言表达程序的大部分逻辑更容易。许多书籍和教程都在兜售这一点。

这不是我的观点。FORTH是一种优秀而有能力的语言,但我倾向于同意那些说它倾向于生成只写程序的人的说法。大多数关于Forth的书籍都非常古老,他们将Forth的优雅与Fortran或COBOL相比,认为C更有表现力,通常能产生更优雅和可维护的代码。

福斯也不是特别快。作为一种解释型语言,它速度很快,但间接线程模型的速度税仍然需要支付,因此它通常会比C编译器生成的代码慢。

然而,作为一名Python开发人员,我非常了解这种权衡。你的程序不是百分之百需要快速的,只需要瓶颈。与Python一样,在Forth中用本机代码编写瓶颈也很容易。因此,速度不是那么大的问题。

据我所知,第四种语言是允许高级构造的最紧凑的语言。它是如此紧凑,以至于崩溃的OS';实现实现自托管时使用的资源量与其汇编器对应的资源大致相同!

这是什么魔法?从表面上看,没有什么比本机代码更紧凑了。这是不言而喻的。如果一段Forth代码以一种与本机代码一样紧凑的方式执行完全相同的逻辑,那么您在编写汇编语言方面是懒惰的!

崩溃操作系统Z80 ASM版本自托管在RC2014上,ROM上有5K shell,从SD卡加载到RAM中的5K汇编器二进制文件(但可能在ROM中,这就是为什么我在我的项目的功能重点中将其视为ROM)和8K的RAM。也就是说,它可以在这些资源内从源进行自我组装。

要组装的最大的一块软件是汇编器本身。它是一个功能相当齐全的汇编器,支持前向标签,包括许多有用的指令。实现这些功能的代码需要组装上述资源。

而且,汇编程序中包含的功能也是汇编其源代码所必需的!我可以在它的功能上删减一点,以减少资源使用,但是我需要调整汇编器的代码,以适应这种功能的缺乏,并且可能会使代码变得更加复杂。我相信有了这个汇编器,我就达到了一个很好的平衡,并取得了接近最佳的效果。

如果我想在Forth中重新实现针对特性的汇编器特性,构建它可能需要更多的资源。尽管较高级别的单词更紧凑,但到达那里的金字塔底部无法与直接汇编版本竞争。正是在这样的推理下,我首先解雇了福斯。

那么,又一次,是什么让Forth比汇编程序更紧凑呢?简单。Forth的特殊之处在于,它很早就开始了自己的行走,也就是说,从它的基本集合开始实现它自己的单词。这意味着只需要将它的一小部分组装成本机代码。本机代码的这一小部分需要的工具要少得多,因此汇编程序需要的功能也少得多。这种汇编器需要较少的RAM。

还有什么比不存在的东西更紧凑呢?即使是Z80汇编程序也无法填补空白。

这就是为什么尽管Forth并不比本机代码更紧凑(废话!),但是Forth崩溃的操作系统实现了自托管,拥有的资源和它的Z80一样多。

因此,以非常低的可管理速度约束为代价,我们得到了一种高级语言,它比以前的基本shell更强大、更具可扩展性。我称之为绝对的胜利。

因为紧凑一直是崩溃OS的主要设计目标,所以我最初选择了Z80汇编语言,而不是高级语言,这样我就可以继续满足这个设计目标。

然而,现在我既可以吃蛋糕又可以吃蛋糕了,多亏了福斯,新的机会打开了。首先,也是最重要的,多架构!虽然当我把自己绑在Z80上时,我已经准备好放弃这一点,但我现在非常高兴拥有它,并肯定会利用它。

第四,简约的文化值得一写。从表面上看,按照现代标准,传统的福斯环境受到了严格的限制。

谁愿意在64x16块文件系统的约束下工作?了解与实现文件系统相关的复杂性以及支撑它的一切的人。当简单性受到重视时,这样的约束就会被欣然接受。

我们不能说禁欲主义是我们与技术关系的主要特征。我们根本不习惯于接受我们所谓的便利方面的限制。为什么会有人不想让一款软件或硬件更容易使用,更容易为外行所接受,更有特色呢?如果有人愿意构建这种复杂性,摩尔定律允许我们采用它,我们确实这样做了。这导致了癌症般的复杂性,一层又一层地,每一代新一代开发人员都乐于接受以前的层。

(关于我们正在崩溃的文明,或许可以说一些类似的话,甚至可能雄辩地引用约瑟夫·坦特(Joseph Tainter)的话)。

Forth的基础设计完全围绕着原始的简单性而构建。更好的是,阻力最小的道路通常会引导你走向简单。当单词定义变得太大和太复杂时,它通常会提示您重新组织代码,以获得在另一种语言中可能不会想到的更简单的解决方案。

需要明确的是:FORTH没有优雅地描述复杂的算法,至少与C语言相比不是这样,这些语言在阅读时通常会让人头疼。然而,这种精神上的痛苦确实会让你质疑你对复杂性的需求,并鼓励你横向解决问题。

这是我认为很少有开发人员熟悉并且很难用语言来描述的东西。它需要亲身体验。我认为体验它的一个好方法是实现你自己的Forth。