34

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

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

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

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

4

5 に答える 5

33

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

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

OKAD-IIは常に、約2.5KB以下のコードをメモリにロードして実行しています。ただし、OKAD-IIのディスク上のソースは2.5KBよりかなり大きくなります。ただし、最も近い競合他社であるSPICEよりも大幅にコンパクトです。

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

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

于 2012-10-11T18:21:17.740 に答える
26

Forthは確かに驚くほどコンパクトです!仮パラメータのないワード(およびハードウェアでのゼロオペランド命令-たとえばGA144)は、多くの節約になります。そのコンパクトさのもう1つの主な要因は、呼び出し規約と連結性によって提供される冗長コードの絶対的に容赦ないファクタリングです。

おもちゃ以外の例として適格かどうかはわかりませんが、 Fignition(FigForth内)のタートルグラフィックスの実装は、コンパイルされた307バイトであり、単一のソースブロックに収まります。これには、固定小数点トリガーとすべての通常のタートルコマンドが含まれます。これは、読み取り可能な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 ;

正弦

: 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

于 2012-10-09T00:32:36.760 に答える
13

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

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

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

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

于 2013-03-22T22:45:24.377 に答える
7

Forthがいかにコンパクトであるかの例は、SamuelFalvoのスクリーンキャストOverthe Shoulder 1-Forthでのテキスト前処理(1時間06分25秒、101 MB、MPEG-1形式-少なくともVLCで再生可能)です。代替ソース(「リンクとリソース」->「ビデオ」)。

于 2012-10-08T22:36:12.193 に答える
7

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

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

于 2013-02-01T09:07:53.210 に答える