原始的なForth演算子とは何ですか?
-
03-07-2019 - |
質問
Forthシステムの実装に興味があります。単純なVMとランタイムを構築する経験を積むためです。
Forthで開始する場合、通常、最初にスタックとその演算子(DROP、DUP、SWAPなど)について最初に学習するため、これらをプリミティブ演算子の中にあると考えるのは自然です。しかし、そうではありません。それらはそれぞれ、メモリとスタックポインタを直接操作する演算子に分割できます。後で、DUP、SWAPなどの実装に使用できるストア(!)とフェッチ(@)について学習します(ha!)。
では、プリミティブ演算子とは何ですか?他のすべてを構築できるランタイム環境に直接実装する必要があるのはどれですか?高性能には興味がありません。私(および他の人)から学ぶことができるものが欲しい。オペレーターの最適化は後から行うことができます。
(はい、私はチューリングマシンから始めてそこから行くことができることを知っています。それは少し極端です。)
編集: 私が目指しているのは、オペレーティングシステムまたは新しいコンパイラのブートストラップに似ています。これらのプリミティブなビルディングブロックからシステムの残りの部分を構築できるように、少なくとも何を実装する必要がありますか?これをベアハードウェアに実装しません。教育的な演習として、私は独自の最小限のVMを作成します。
解決
このスレッドは、正確な質問。 soup-to-nutsの実装 a>完全なドキュメント付き。
大学にいたときに 68K を対象としたForthスレッドサブルーチンを作成しました。ランタイム環境とディクショナリ形式を定義してから、デフォルトのディクショナリをロードするMacintoshアプリケーションを起動するCコードを作成し、I / Oベクトルを設定して、コードを実行しました。次に、Leo Brodieの本 Starting Forth を取り、68Kで基本辞書の実装を開始しましたアセンブリ言語。私は算数/論理語から始め、次に構造を制御し、次に単語定義/操作語を行いました。私の理解では、少なくとも、@、!、+、-、*、および/が必要です。残りはそれらの観点から実装することができますが、それはSetPixel
とGetPixel
に基づいてグラフィックスライブラリ全体を書き込もうとするようなものです。それは機能しますが、なぜですか?
DOES>
を正確に作成するなど、いくつかの本当に面白いパズルがあったので、プロセスを楽しんだ(そして、しっかりと<=>の実装ができたら、小さなコードに変わるクロージャーを作成していた)
他のヒント
ずっと前に、私はByteが発行した<!> quot; Threaded Interpretive Languages <!> quot;という本を持っていました。 Z80アセンブリではForthと呼ばれていました。
Z80を手元に持っていない、または欲しいと思うかもしれませんが、この本は参考になるかもしれません。
comp.lang.forthのこの投稿には、いくつかの<!> quot; minimal Forths <!> quot;がリストされています。
http://groups.google.com/group/comp .lang.forth / msg / 10872cb68edcb526
なぜこれを知っているのですか?弟のミカエルは3番を書き、論文を書いて<!> quot; minimal Forth <!> quot; (ただし、スウェーデン語)。私の記憶が正しければ、彼はシリコンで構築できる最小限の演算子セットを取得したかったのです。
質問が正しい形式であるとはまだ確信していません。たとえば、Plinthの指示を減らすことができます。結局、*
と/
は+
と-
の観点から実装できますが、「+」は後継関数の観点から実装できます( Peanoの公理。)これにより、チューリングマシンの近くに移動できます。停止する場所をどのように知るのですか?
Hans Bezemerの 4tHコンパイラもご覧ください。
ドキュメントでこの情報を提供していないForth実装はどれですか? Forthの性質を考えると、実装に依存する可能性があります。辞書には単語の標準セットがありますが、アセンブリ/ C / whateverで到達したか、Forthで到達したかは問題ではありません。Forthは定義により自己拡張可能な言語です。
あなたの言うことに反して、一般的にDROP SWAPなどは基本的なForth操作と見なされます。理由は、提案したようなメモリ操作を使用してそれらを実装すると、システム全体がより複雑になり、より複雑にならないためです。 また、Forthには、基本的なものとそうでないものとの明確な区別はありません。 80年代の辞書検索は基本的なものであり、速度を上げるためにアセンブラーでコーディングされていましたが、ホストされている最新のLinuxでは、いわゆる高レベルでコーディングする余裕があります。 また、Forthersは、アセンブラーの単語を高レベルで、高レベルの単語をアセンブラーで定期的に再コーディングする傾向があります。私はciforthとyourforthの著者です。 <!> lt; =を<!> quot; <!> gt;として定義することができます。 not <!> quot;私がciforthでしたように。しかし、あなたは、<!> lt; <!> lt; = <!> gt; <!> gt; =同様に、均一に見える、小さなアセンブラールーチンが効果的にシンプルになりました。それは判断の呼び出しであり、好みの問題であり、原則の問題ではありません。
この文脈では、質問を次のように解釈します:<! 明らかに、このテーマについて議論しているスレッドのいくつかで見られるように、途方もないオーバーヘッドを犠牲にして、1つのアセンブラーワードを取り除く巧妙なトリックに興味はありません。
これでjforsforth forforeforthのような多数の小さなForthを見て、ほとんどが50〜100個のプリミティブに到達すると結論付けることができます。 これらのForthはアセンブラーで定義されています。プリミティブをc、python、またはJavaで定義する場合、状況は再び異なります。今、例えば上記の辞書検索では、cとForthから選択できます。言語設計とは関係のない考慮事項が関係しています。あなたは多才なcプログラマーかもしれませんし、Forthでコーディングすることを主張するかもしれません。それは学習プロジェクトだからです。