web-dev-qa-db-ja.com

非常に簡潔なForthアプリケーションの例?

この講演 では、チャック・ムーア(フォースの作成者)は、次のような非常に大胆で抜本的な主張をしています。

  1. 「私がコーディングしなかったことがわかったすべてのアプリケーションには、必要な数の10倍のコードが含まれています」
  2. 「約1000の指示は、私には何でもするのが正しいようです」
  3. 「[ローカル変数]を必要とするコードを書いている場合は、最適でないコードを書いています。ローカル変数を使用しないでください。」

私はムーア氏がa)絶対に素晴らしい天才なのかb)クラックポットなのかを理解しようとしています。しかし、それは主観的な質問であり、私はここでその質問に対する答えを探していません。私が探しているのは、Forthを使用して「1000命令以下」で解決できる複雑な実世界の問題の例と、その方法を示すソースコードです。実世界のシステムの重要な部分を1つだけ示す例で十分ですが、別の高級言語の5行または10行で複製できる「おもちゃ」のコードサンプルは使用しないでください。

少量のソースコードを使用してForthで実際のシステムを作成したが、ソースを表示する自由がない場合(プロプライエタリであるため)、それについて聞きたいと思います。

34
Alex D

Chuck Moore はあなたや私とは少し違うことを理解する必要があります。彼は、メインフレームコンピュータが16 KBまたはそれに相当するコアメモリで構成されていた時代に訓練を受け、当時のコンピュータでかなり多くのことを行うことができました。おそらく、彼のOKAD-IIチップ設計パッケージ(タイプミスではない)以外のForthの最大の成功は、データ収集機器とデータ分析/視覚化ソフトウェアを同時に制御するマルチユーザーマルチタスクForthシステムでした [〜#〜] nrao [〜#〜] かなり適度なサイズのコンピューターでは、ほとんどコンパイルできません Fortran ソースコード自体。

彼が「アプリケーション」と呼んでいるものは、アプリケーションと呼ばれる、より大きく、より曖昧なものの「コンポーネント」であると考えるかもしれません。より一般的には、1つのMoore「アプリケーション」は、今日の [〜#〜] mvc [〜#〜] トライアドの1つの「ビュー」とほぼ同等であることに注意してください。メモリ消費を小さく保つために、彼はオーバーレイとジャストインタイムコンパイル技術に大きく依存しています。あるプログラムインターフェイスから別のプログラムインターフェイスに切り替える場合、通常、アプリケーション/ビュー全体をソースから再コンパイルする必要があります。これは非常に速く発生するため、発生していることがわかりません。アプリケーションをアクティブ化すると、Androidが Dalvik コードをネイティブに再コンパイルする [〜#〜] arm [〜#〜] コードのようになります今日は毎回。

OKAD-IIでは、常に約2.5KB以下のコードがメモリに読み込まれて実行されています。ただし、OKAD-IIのディスク上のソースは2.5KBよりかなり大きくなります。ただし、最も近い競合他社よりも大幅にコンパクトです [〜#〜] spice [〜#〜]

私はチャック・ムーアの見解にしばしば興味があり、彼の終わりのないシンプルさへの努力が魅力的だと感じています。それで、 MythBusters のやり方で、私は自分のシステムをできる限り最小限に設計しようとして、彼の主張を試してみました。彼がハードウェアとソフトウェアの両方の問題について、彼の主張にほぼスポットを当てていることを報告できてうれしいです。その好例として、昨年9月の Silicon Valley Forth Interest Group (SVFIG)の会議で、Kestrel-2自体を使用してスライドデッキのビデオを生成しました。これには、スライドプレゼンテーションプログラムを作成する必要がありました。このプログラムは、コード用に4 KB、スライドデッキのデータ構造用に4KBのメモリを使用していました。 Forth Wordあたりの平均スペースは6バイトであり(ここでは説明しません)、アプリケーションの「約1000(Forth)命令」の見積もりは、ChuckMooreが自分の「アプリケーション」を見積もるのとほぼ同じです。 " することが。

現実世界のフォースコーダー(または過去にそうしているように思われる)と話すことに興味があり、たまたま ベイエリア 、シリコンにいる場合バレーフォースインタレストグループは、第3土曜日である11月と12月を除いて、毎月第4土曜日に開催されます。会議への参加に興味がある場合は、Forthのコーダーにインタビューして、「現実の」Forthがどのようなものかを味わうだけでも、meetup.comでチェックしてタグを付けてください。また、YouTubeで会議を新しいストリーミング配信していますが、あまり得意ではありません。この種のことに対する予算がゼロであるため、私たちは入札を行うために不適切なハードウェアとソフトウェアを悪用しています。 :)

33

Forthは確かに驚くほどコンパクトです!仮パラメータのない単語(およびハードウェアでのゼロオペランド命令-例: GA144 )は、多くの節約になります。そのコンパクトさの他の主な要因は、呼び出し規約と連結性が提供する冗長コードの絶対に容赦ない因数分解です。

おもちゃ以外の例として適格かどうかはわかりませんが、 Turtle Graphics の実装 Fignition (FigForth)は307バイトがコンパイルされ、単一のソースブロックに収まります!これには、固定小数点トリガーとすべての通常のタートルコマンドが含まれます。これは、読み取り可能なForthの最良の例ではありません。これは、Forthを1文字の名前などの単一のソースブロックに圧縮しようとしているためです。

\ 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

26
AshleyF

今日よく理解されていないのは、フォースが21世紀初頭に アジャイルメソッド に関連して普及したコーディングへのアプローチを予測した方法です。具体的には:

  • Forthは、小さなメソッドコーディングの概念を導入しました。つまり、小さなメソッドで小さなオブジェクトを使用することです。ここでも Smalltalk[〜#〜] lisp [〜#〜] の主張をすることができますが、1980年代後半には、SmalltalkとLISPの両方の実践がより大きくなる傾向がありました。より複雑な方法。 Forthは、スタックで多くのことを行うことを奨励したという理由だけで、常に非常に小さなメソッドを採用していました。

  • 第4に、LISPよりもさらに、インタープリターは単なる小さなソフトウェアパターンであり、論文サイズのレンガではないという概念を広めました。コーディングが難しい問題が発生しましたか? Forthのソリューション、「小さな言語を書く」必要がありました。これがForthプログラミングであったためです。

Forthは、コンピュータが信じられないほど小さく、ひどく遅い時代の、メモリと時間の制約の産物でした。マッチボックスでオペレーティングシステムとコンパイラを構築できる美しいデザインでした。

13
Mark Bernstein

ForthIncのpolyFORTH/32 VAX/VMSアセンブラ定義は、約8ブロックのソースを使用しました。 8KのソースのVAXアセンブラー。コメントしました。 30年経った今でも驚いています。

現時点では確認できませんが、これらのCODE定義を解析するための命令数は数百に満たないと推測しています。そして、私が「約8ブロックかかった」と言ったとき、それでも時間がかかります。そのニュークリアスを使用するアプリケーションは、30年後に稼働して本番環境にあります。

7
Brian Tiffin

Forthがいかにコンパクトであるかの例は、Samuel FalvoのスクリーンキャストOver the Shoulder 1-Forthでのテキスト前処理(1h 06分25秒、101 MB、MPEG-1形式-少なくとも [〜#〜] vlc [〜#〜] 再生できます)。 代替ソース (「リンクとリソース」->「ビデオ」)。

7
Peter Mortensen