2012-10-08 25 views
29

this talk,查克·摩爾(Forth語言的創建者)提出了一些非常大膽的,武斷的說法,如:非常簡潔的Forth應用程序的例子?

  1. 「每次,我已經看到,我沒有代碼的應用程序有十倍之多代碼因爲它需要「
  2. 」大約有一千條指令似乎對我來說可以做任何事情「
  3. 」如果您正在編寫需要[局部變量]的代碼,則您正在編寫非最優代碼。局部變量「。

我想知道摩爾先生是否是a)一位絕對出色的天才,或b)一個瘋子。但這是一個主觀問題,我不在這裏尋找這個問題的答案。我正在尋找的是複雜的現實世界問題的例子,這些問題可以在使用Forth的「1000條指令或更少」中解決,源代碼演示如何這樣做。一個示例只顯示一個真實世界系統的一個非平凡的部分可能是好的,但沒有「玩具」代碼樣本可以在5或10行另一種高級語言中複製。

如果你已經用Forth編寫了真實世界的系統,只使用少量的源代碼,但不能隨意顯示源代碼(因爲它是專有的),我仍然想聽聽它。

+3

我已經看到了一些封閉的問題,它認爲它解決了實際上問題詢問現實世界的例子或經驗的辯論。如果我在90行中提供完整的Pentium II彙編程序,主觀性,爭議性或討論性挑釁是什麼? –

+1

@AlbertvanderHorst絕對。這是關於SO的最糟糕的事情。 –

回答

29

ÿ你需要明白,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小得多。

我經常對查克·摩爾的觀點感到好奇,並發現他對於簡約的無盡追求令人着迷。所以,在MythBusters的時尚中,我試圖儘可能最小化地設計我自己的系統,以此來表達他對測試的主張。我很高興地向大家報告他在硬件和軟件方面的主張。例如,在去年9月的Silicon Valley Forth Interest Group(SVFIG)會議上,我用我的Kestrel-2本身爲幻燈片生成視頻。這需要我爲它寫了一個幻燈片演示程序,其中代碼佔用了4個  KB內存,而幻燈片數據結構佔用了4個  KB。由於每個Forth字的平均空間爲六個字節(因爲我不會在這裏進行討論),所以應用程序的「約1000(Forth)指令」的估計值僅僅是查看Chuck Moore估計他自己的「應用程序「 成爲。

如果您有興趣與真實世界的Forth編碼人員交談(或者過去曾經這麼做過的人,因爲它似乎越來越像),而您碰巧在Bay Area中,硅谷Forth興趣小組仍然會遇到每個月的第四個星期六,除了11月和12月,這是第三個星期六。如果您有興趣參加會議,即使只是採訪Forth編碼器並瞭解Forth的「真實世界」是什麼樣子,請在meetup.com上檢查我們並標記出來。我們也在YouTube上新增了我們的會議,但我們並不擅長。我們濫用不適當的硬件和軟件來做我們的出價,因爲我們對這類事情的預算是零。 :)

6

的緊湊第四可以只是如何是一個例子,是塞繆爾Falvo的截屏Over the Shoulder 1 - Text Preprocessing in Forth(1H 06分鐘25秒,101   MB,MPEG-1格式 - 至少VLC可以發揮它)。 Alternative source(「鏈接和資源」 - >「視頻」)。

+5

我在後來的項目中重新使用了該視頻中的一些代碼,其中我寫了一篇博客引擎(僅限32位)。結果代碼實際上更加緊湊,因爲我能夠重新使用博客的其他方面。宏擴展在這裏找到: https://bitbucket.org/kc5tja/unsuitable/src/8739e927fee7/share/unsuitable/response.fs?at=default 典型用途是在這裏: https://開頭到位桶.org/kc5tja/unsuitable/src/8739e927fee7102757d9ceffdb57899367481d4b/share /不適合/ m-rss.fs?at = default –

25

福斯確實非常緊湊!沒有正式參數的字(硬件上的零操作數指令 - 例如GA144)可以節省很多。其緊湊性的另一個主要貢獻因素是對調用約定和連續性提供的冗餘代碼的無情分解。

我不知道這是否有資格作爲一個非玩具例子,但Turtle Graphics實施爲Fignition(在FigForth)只是307字節編譯並在一個源塊適合!這包括定點觸發和所有正常的海龜命令。這不是可讀的第四,因爲試圖把它擠入與單字符名字和這樣的單一源塊最好的例子:

\ 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 + [email protected] 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

+4

想要體驗瘋狂簡潔的Forth代碼,可以看看Chuck Moore自己的代碼!下載GreenArrays工具(http://www.greenarraychips.com/home/support/download-02a。html),然後瀏覽源代碼塊(在他們的編輯器或EVB001-02a.html文件中)。 – AshleyF

7

福斯公司的polyFORTH/32 VAX/VMS彙編定義了源的一些8塊。 VAX彙編程序,源代碼爲8K。評論。 30年後,我仍然感到驚訝。

我不能在此刻驗證,但我猜的指令數來分析這些代碼定義將在低數百人。而當我說「花了8塊」的時候,它仍然需要,30年後,使用該核的應用程序正在生產和生產。

+1

如果您希望看到一個更爲熟悉的Pentium_I(包括16位代碼,浮點,同級字節,尋址模式,前綴)的同樣緊湊的彙編器,請查看ciforth的內置彙編器。它是有據可查的ciasdis的緊湊版本。英特爾是巴洛克式和不規則的,仍然限制在15個屏幕.http://home.hccnet.nl/a.w.m.van.der.horst/ciforth.html –

+1

@AlbertvanderHorst尼斯。而好,我的意思是真棒。 LOCATE不低於。隨着ci86.lina64.s文件(它構建了lina,乾淨,首先嚐試),我知道今天晚上我的閱讀時間將花在哪裏。幹得好,阿爾伯特。感謝您的高舉。 –

12

什麼還不是很明白今天是方式來闡述預期的方式來編碼,在21世紀開始流行在初期伴隨agile methods。具體而言:

  • Forth介紹了微小方法編碼的概念 - 使用小方法的小對象。你可以做一個案例SmalltalkLisp這裏,但在80年代後期都Smalltalk和Lisp的實踐走向更大,更復雜的方法往往。 Forth始終擁抱非常小的方法,只是因爲它鼓勵在堆棧上做太多。

  • 第四,比Lisp的還要多,普及的概念,解釋只是一個小的軟件模式,而不是論文大小的磚。有一個難以編碼的問題?第四解決方案是,「寫一個小語言」,因爲這是第四編程了。

Forth是內存和時間限制的產物,這個時代的計算機非常小,速度非常慢。這是一個漂亮的設計,可以讓你在火柴盒中構建一個操作系統和一個編譯器。

相關問題