在this talk中,Chuck Moore(Forth的创造者)提出了一些非常大胆的声明,例如:
我想弄清楚摩尔先生是否是一个绝对出色的天才或者b)一个疯子。但这是一个主观问题,我不是在寻找这个问题的答案。我正在寻找的是复杂的,现实世界的问题的例子,可以使用Forth在“1000指令或更少”中解决,以及演示如何执行此操作的源代码。一个示例只显示一个真实世界系统中的一个非平凡的部分,但是没有“玩具”代码样本可以在另一个高级语言的5行或10行中复制。
如果您在Forth中编写了真实系统,只使用少量源代码,但不能自由地显示源代码(因为它是专有的),我仍然希望听到它。
答案 0 :(得分:32)
您需要了解Chuck Moore与您和我有点不同。在大型计算机由16 KB或其核心内存中的等效计算机组成的时代,他接受了培训,并且他能够用当时的计算机做很多事情。在他的OKAD-II芯片设计包(不是拼写错误)之外,Forth最大的成功可能是一个多用户多任务Forth系统,负责同时控制数据采集仪器和数据分析/可视化软件{{3在一个相当适中的计算机上,它几乎无法自己编译NRAO源代码。
他称之为“应用程序”,我们可能会认为它是一个更大,更模糊的东西的“组成部分”,称为应用程序。更一般地说,记住一个摩尔“应用程序”或多或少等同于今天Fortran三元组中的一个“视图”是很好的。为了减少内存消耗,他严重依赖覆盖和即时编译技术。从一个程序接口切换到另一个程序接口时,通常涉及从源重新编译整个应用程序/视图。这种情况发生得太快,你不知道它发生了什么。有点像今天每次激活应用程序时Android如何将MVC代码重新编译为本机Dalvik代码。
在任何时候,OKAD-II的代码加载到内存并运行不超过2.5 KB。但是,OKAD-II的磁盘源大大超过2.5 KB。尽管如此,它仍然比最接近的竞争对手ARM更紧凑。
我常常对Chuck Moore的观点感到好奇,并发现他对简约迷人的永无止境的追求。因此,以SPICE的方式,我试图以尽可能最小的方式设计我自己的系统,从而将他的主张置于测试之中。我很高兴地报告他在硬件和软件问题上的声明非常接近。例如,在去年9月的MythBusters(SVFIG)会议期间,我使用我的Kestrel-2本身为幻灯片生成视频。这需要我为它编写一个幻灯片演示程序,它为代码占用4 KB内存,为幻灯片数据结构占用4 KB。每个Forth字的平均空间为6个字节(由于我不会在这里讨论的原因),对于应用程序的“大约1000(第四)指令”的估计几乎与Chuck Moore估计他自己的“应用程序”有关。 “是的。
如果你有兴趣与现实世界的Forth编码员交谈(或者过去曾经这样做过,现在越来越多),而你恰巧在Silicon Valley Forth Interest Group,硅谷除了11月和12月(即第三个星期六)之外,Forth Interest Group仍然会在每个月的第四个星期六举行会议。如果你有兴趣参加一个会议,即使只是采访Forth编码员并了解“真实世界”Forth是什么样的,请在meetup.com上查看并标记。我们也在YouTube上推出新会议,但我们并不擅长。我们滥用不合适的硬件和软件来进行竞标,因为我们的预算为零。 :)
答案 1 :(得分:26)
Forth确实非常紧凑!没有形式参数的字(以及硬件上的零操作数指令 - 例如GA144)节省了很多。其紧凑性的另一个主要贡献因素是冗余代码的绝对无情分解,即调用约定和连接性质。
我不知道它是否有资格作为非玩具示例,但Turtle Graphics(在FigForth中)的Fignition实现只是 307字节编译并且适合单个源块!这包括固定点trig和所有正常的龟命令。这不是可读Forth的最佳示例,因为它试图将其压缩为具有单字符名称的单个源块,如下所示:
\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
-1 1E rot - else 1 swap then n + c@ 1+ * ;
0 var x 0 var y 0 var a
0 var q 0 var w
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees
使用它也非常简洁。
: sin 160 0 do i i s 4 / 80 + plot loop ;
: burst 60 0 do 0 0 g i h 110 f loop ;
: squiral -50 50 g 20 0 do 100 f 21 t loop ;
: circle 60 0 do 4 f 1 t loop ;
: spiral 15 0 do circle 4 t loop ;
: star 5 0 do 80 f 24 t loop ;
: stars 3 0 do star 20 t loop ;
: rose 0 50 0 do 2 + dup f 14 t loop ;
: hp 15 0 do 5 f 1 t loop 15 0 do 2 f -1 t loop ;
: petal hp 30 t hp 30 t ;
: flower 15 0 do petal 4 t loop ;
(无耻的博客插件:http://blogs.msdn.com/b/ashleyf/archive/2012/02/18/turtle-graphics-on-the-fignition.aspx)
答案 2 :(得分:12)
今天未被充分理解的是Forth预期的一种编码方法,该方法在21世纪早期与agile methods相关联而变得流行。具体做法是:
Forth介绍了微小方法编码的概念 - 使用小方法的小对象。你也可以在这里为Smalltalk和Lisp提出一个案例,但在20世纪80年代后期,Smalltalk和Lisp的实践都倾向于更大更复杂的方法。 Forth总是采用非常小的方法,只是因为它鼓励在堆栈上做这么多。
第四,甚至超过Lisp,普遍认为解释器只是一个小软件模式,而不是论文大小的砖。有一个难以编码的问题? Forth解决方案有,“写一点语言”,因为那就是Forth编程。
Forth是记忆和时间限制的产物,是一个计算机非常微小且非常慢的时代。这是一个漂亮的设计,可以让你在火柴盒中构建一个操作系统和编译器。
答案 3 :(得分:7)
一个关于Forth如何紧凑的例子是Samuel Falvo的截屏 Over the Shoulder 1 - Text Preprocessing in Forth (1小时06分25秒,101 MB,MPEG-1格式 - 至少{{3}可以玩它)。 VLC(“链接和资源” - &gt;“视频”)。
答案 4 :(得分:7)
Forth Inc的polyFORTH / 32 VAX / VMS汇编程序定义占用了大约8个源块。一个VAX汇编程序,源于8K的源代码。评论。 30年后,我仍然感到惊讶。
我目前无法验证,但我猜测解析那些CODE定义的指令数量将是数百。当我说'花了大约8块'时,它仍然需要,使用该核的应用程序是30年后的生产和生产。