非常简洁的Forth应用程序的例子?

时间:2012-10-08 08:47:15

标签: forth

this talk中,Chuck Moore(Forth的创造者)提出了一些非常大胆的声明,例如:

  1. “我看到的每个我没有编码的应用程序的代码都是它需要的代码的十倍”
  2. “大约有一千条说明似乎对我做任何事情都是对的”
  3. “如果您正在编写需要[局部变量]的代码,那么您正在编写非最佳代码。请勿使用局部变量。”
  4. 我想弄清楚摩尔先生是否是一个绝对出色的天才或者b)一个疯子。但这是一个主观问题,我不是在寻找这个问题的答案。我正在寻找的是复杂的,现实世界的问题的例子,可以使用Forth在“1000指令或更少”中解决,以及演示如何执行此操作的源代码。一个示例只显示一个真实世界系统中的一个非平凡的部分,但是没有“玩具”代码样本可以在另一个高级语言的5行或10行中复制。

    如果您在Forth中编写了真实系统,只使用少量源代码,但不能自由地显示源代码(因为它是专有的),我仍然希望听到它。

5 个答案:

答案 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 ;

Sine

: burst 60 0 do 0 0 g i h 110 f loop ;

Burst

: squiral -50 50 g 20 0 do 100 f 21 t loop ;

Squiral

: circle 60 0 do 4 f 1 t loop ; 
: spiral 15 0 do circle 4 t loop ;

Spiral

: star 5 0 do 80 f 24 t loop ; 
: stars 3 0 do star 20 t loop ;

Stars

: rose 0 50 0 do 2 + dup f 14 t loop ;

Rose

: 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 ;

Flower

(无耻的博客插件:http://blogs.msdn.com/b/ashleyf/archive/2012/02/18/turtle-graphics-on-the-fignition.aspx

答案 2 :(得分:12)

今天未被充分理解的是Forth预期的一种编码方法,该方法在21世纪早期与agile methods相关联而变得流行。具体做法是:

  • Forth介绍了微小方法编码的概念 - 使用小方法的小对象。你也可以在这里为SmalltalkLisp提出一个案例,但在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年后的生产和生产。