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

Ale*_*x D 33 forth

这次演讲中,Chuck Moore(Forth的创始人)提出了一些非常大胆,全面的主张,例如:

  1. "我看到的每个我没有编码的应用程序的代码都是它需要的代码的十倍"
  2. "大约有一千条说明似乎对我做任何事都是对的"
  3. "如果您正在编写需要[局部变量]的代码,那么您正在编写非最佳代码.请勿使用局部变量."

我想弄清楚摩尔先生是否是一个绝对出色的天才或者b)一个疯子.但这是一个主观问题,我不是在寻找这个问题的答案.我正在寻找的是复杂的,现实世界的问题的例子,可以使用Forth在"1000指令或更少"中解决,以及演示如何执行此操作的源代码.一个例子只显示一个真实世界系统中的一个非平凡的部分,但是没有"玩具"代码样本可以在另一个高级语言的5或10行中复制.

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

Sam*_* II 33

你需要明白Chuck Moore和你我有点不同.他接受过大型计算机由16 KB或核心内存中的等效计算机组成的时代的训练,他能够用当时的计算机做很多事情.在他的OKAD-II芯片设计包(不是拼写错误)之外,Forth最大的成功可能是一个多用户多任务Forth系统,负责同时控制NRAO上的数据采集​​仪器和数据分析/可视化软件.相当适中的计算机几乎无法自己编译Fortran源代码.

他称之为"应用程序",我们可能会认为它是一个更大,更模糊的东西的"组成部分",称为应用程序.更一般地说,记住一个摩尔"应用程序"或多或少等同于今天MVC三元组中的一个"视图"是很好的.为了减少内存消耗,他严重依赖覆盖和即时编译技术.从一个程序接口切换到另一个程序接口时,通常涉及从源重新编译整个应用程序/视图.这种情况发生得太快,你不知道它发生了什么.有点像今天每次激活应用程序时Android如何将Dalvik代码重新编译为本机ARM代码.

在任何给定的时间,OKAD-II的代码加载到内存并运行不超过2.5 KB.但是,OKAD-II的磁盘源大大超过2.5 KB.尽管如此,它仍然比最接近的竞争对手SPICE更加紧凑.

我经常对Chuck Moore的观点感到好奇,并发现他对简约迷人的永无止境的追求.因此,在MythBusters的时尚中,我试图按照我的设计尽可能地设计自己的系统来测试他的声明.我很高兴地报告他在硬件和软件问题上的声明非常接近.例如,在去年9月的 硅谷Forth兴趣小组(SVFIG)会议期间,我使用我的Kestrel-2本身为幻灯片生成视频.这需要我为它编写一个幻灯片演示程序,它为代码占用4 KB内存,为幻灯片数据结构占用4 KB.每个Forth字的平均空间为6个字节(由于我不会在这里讨论的原因),对应用程序的"大约1000(第四)指令"的估计几乎与Chuck Moore估计他自己的"应用程序"有关. " 成为.

如果你有兴趣与现实世界的Forth编程人员交谈(或者过去曾经这样做过,现在看起来越来越多),并且你碰巧在湾区,硅谷Forth兴趣小组仍然满足每一个本月的第四个星期六,除了11月和12月,这是第三个星期六.如果你有兴趣参加一个会议,即使只是采访Forth编码员并了解"现实世界"Forth是什么样的,请在meetup.com上查看并标记.我们也在YouTube上推出新会议,但我们并不擅长.我们滥用不合适的硬件和软件来进行竞标,因为我们的预算为零.:)


Ash*_*eyF 26

Forth确实非常紧凑!没有形式参数的单词(以及硬件上的零操作数指令 - 例如GA144)可以节省很多.其紧凑性的另一个主要贡献因素是冗余代码的绝对无情因素,即调用约定和连接性质.

我不知道它是否有资格作为非玩具示例,但FignitionTurtle Graphics实现(在FigForth中)只编译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
Run Code Online (Sandbox Code Playgroud)

使用它也非常简洁.

: sin 160 0 do i i s 4 / 80 + plot loop ;
Run Code Online (Sandbox Code Playgroud)

正弦

: burst 60 0 do 0 0 g i h 110 f loop ;
Run Code Online (Sandbox Code Playgroud)

爆

: squiral -50 50 g 20 0 do 100 f 21 t loop ;
Run Code Online (Sandbox Code Playgroud)

Squiral

: circle 60 0 do 4 f 1 t loop ; 
: spiral 15 0 do circle 4 t loop ;
Run Code Online (Sandbox Code Playgroud)

螺旋

: star 5 0 do 80 f 24 t loop ; 
: stars 3 0 do star 20 t loop ;
Run Code Online (Sandbox Code Playgroud)

明星

: rose 0 50 0 do 2 + dup f 14 t loop ;
Run Code Online (Sandbox Code Playgroud)

玫瑰

: 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 ;
Run Code Online (Sandbox Code Playgroud)

花

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

  • 要真正体验疯狂简洁的Forth代码,请查看Chuck Moore自己的代码!下载GreenArrays工具(http://www.greenarraychips.com/home/support/download-02a.html),看看浏览源代码块(无论是在他们的编辑器,或在EVB001-02a.html文件). (4认同)

Mar*_*ein 12

今天尚未被充分理解的是Forth预期的一种编码方法,该方法在敏捷方法的帮助下在21世纪早期开始流行.特别:

  • Forth介绍了微小方法编码的概念 - 使用小方法的小对象.你也可以在这里为SmalltalkLisp提供一个案例,但在20世纪80年代后期,Smalltalk和Lisp的实践都倾向于更大更复杂的方法.Forth总是采用非常小的方法,只是因为它鼓励在堆栈上做这么多.

  • 第四,甚至超过Lisp,普遍认为解释器只是一个小软件模式,而不是论文大小的砖.有一个难以编码的问题?Forth解决方案必须是"写一点语言",因为那就是Forth编程.

Forth是记忆和时间限制的产物,是一个计算机非常微小且非常慢的时代.这是一个漂亮的设计,可以让你在火柴盒中构建一个操作系统和一个编译器.


Pet*_*sen 7

紧接着Forth的一个例子是塞缪尔·法尔沃的屏幕截图 "肩上1 - 文本预处理"(1小时06分25秒,101 MB,MPEG-1格式 - 至少VLC可以播放它).替代来源("链接和资源" - >"视频").

  • 我在后来的项目中重新使用了该视频中的一些代码,其中我在(仅限32位)Forth中编写了一个博客引擎.由此产生的代码实际上更紧凑,因为我能够重用博客的其他一些方面.宏扩展器可以在这里找到:https://bitbucket.org/kc5tja/unsuitable/src/8739e927fee7/share/unsuitable/response.fs?at = default这里的典型用途是:https://bitbucket.org/kc5tja/unsuitable /src/8739e927fee7102757d9ceffdb57899367481d4b/share/unsuitable/m-rss.fs?at=default (6认同)

Bri*_*fin 7

Forth Inc的polyFORTH/32 VAX/VMS汇编程序定义占用了大约8个源块.一个VAX汇编程序,源于8K的源代码.评论.30年后,我仍然感到惊讶.

我目前无法验证,但我猜测解释那些CODE定义的指令数量将是数百.当我说'花了大约8块'时,它仍然需要,使用该核的应用程序是30年后的生产和生产.