08/10/11 15:30:32
>520
どのみちリターンスタック(実行する命令列を保存する専用スタック)が必要なのはその通り。
WORDの動作:普通のForthでの実行と同じ動作でワード系列をコピー
VMの動作: 順番にInterpretして実行する
というところがポイントですな。VMは辞書のこととか考える必要がないのでシンプルになります。
その代わり「辞書からWORD列を拾ってリターンスタックに展開する」というWORDが必要になるけど。
確かにコピーする手間はムダな気もするんだけどね……
辞書のWORD列を直接トレースするのと比べてどんぐらい余計な手間がかかってるんだろう?
ポインタ操作数回&アクセス数回レベルだと思うけど。
522:514
08/10/11 18:35:01
>>518
普通はリターンスタックとか継続とか触れない言語の方が多いから、
Forthではなく俺言語を作るつもりなら、言語デザイナであるお前様自身の
判断で実現可能にしてもいいし、そうでなくしてもいいと思うよ。
ただForthは言語レベルでリターンスタックを操れる結果、協調的マルチタスクやら
コルーチンやら言語実装のレベルで普通対処するものも、ライブラリレベルで実現できる柔軟さがある。
リターンスタックは他の言語にはないForthの特徴の一つだからね。
俺言語でなんとか実現する方法を悩んでみるのも楽しいんじゃない?
523:514
08/10/11 18:47:48
あとForthのVMって相当シンプルだよ。
アセンブリ言語で書かれた昔のForthとかコアの部分はアセンブリ言語で数行レベルだった気がする。
どのへんが複雑だと思ったのかは興味がある…
524:517
08/10/11 21:01:10
>>521
いや、そうではなくて、
「WORDの動作」の中の、「普通のForthと同じ動作で」ってところに、
リターンアドレスを保存するスタックという意味でのリターンスタックが、もう必要なのではないかということ。
あと、言葉の問題として、
大きい意味でのワードを展開する動作のところからもうInterpreter(=VM)の動作というのが普通だと思う。
つまり、VMの動作の前半をWORDの動作と呼んで違う名前にしたから、
残ったVMの動作が簡単に見えるというだけなんじゃないかな。
辞書中のワードから始めると、ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
より複雑になってると思う。
でも、自分の言語を作るのをやめろといってるんじゃないよ。
むしろ応援してる。
ちょっと話題はそれるけど、Forthというか、スタック指向言語は、
コンパイラライターフレンドリーなんだよね。
だから、Forthコード書くよりForth(風オレ言語)VMを書く人が多かったりするわけだが、
ホントはForthでアプリケーションを書くときも「オレ言語」を作るつもりで書くと良いと思ってる。
525:デフォルトの名無しさん
08/10/11 21:33:08
Forthの用語って独特な言い回しがあるからな。
知らない人は結構混乱する。
スレデッドコードのForthの場合、ソースコードを解釈してスレデッドコードを
生成することをコンパイルといい、スレデッドコードを生成する部分を外部インタープリタ、
スレデッドコードを解釈実行する部分を内部インタープリタと呼ぶ。
(これで良かったよな?同志?)
このスレでVMと言った時に内部インタープリタだけなのか、外部インタープリタも含むのか?
どっちだろうか?
526:デフォルトの名無しさん
08/10/12 00:45:26
>>525
テキストを読み込んで、
1) ワードを辞書内で特定
2) だめならリテラルに変換
3) ダメならエラーで終了。
という部分が外部インタープリタ
1)または2)で成功したときに
モードに応じてコンパイル(Forth的意味)するか実行する
のが内部インタープリタ
だと思ってました。
Forthはテキストインプットも弄れるという面白さもあるよね。
Forth VMというと、外部も含むのかな。
上のリターンスタック云々の話は、
内部インタープリタのことだと思うけど。
527:デフォルトの名無しさん
08/10/12 07:57:23
内部インタプリタて(スレッドコードで実装してる場合は)nextルーチンのことじゃなかったっけ。
528:デフォルトの名無しさん
08/10/12 08:49:02
そうNEXTルーチン。アセンブリ言語で数行、という奴。
529:464
08/10/12 15:10:26
>522
その辺は「自由と責任」というやつですな。「銃で足をブッとばす自由」でもあるけど。
>どのへんが複雑だと思ったのかは興味がある…
自分でも何でだったっけな、と過去の記憶を探り出してみたけど、
・実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
×実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
×番兵などの終了処理が必須
--> VM側のスタックに積むことにすればpop&top参照で正規化できるし、元の値を
コピーするからWORD変更にも影響されない。
・VM側に「WORDを実行する」という手順が必要になる
--> VM側のスタックに積むことにすればpushで正規化できる
ぐらいかもしれない。
コンパイル時にWORDの中身が確定するforthだとあんまり問題にならなそうだね。
530:464
08/10/12 15:20:28
>524
「スタックに複数のデータを押し込む操作は機械語レベルだとアトミックにならない」ということ??
C++で実装しているから意識していなかったけど、そうかもしれないですね。
少なくともプリミティブで実装する必要あるね。
>ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
これは狙ってやっていることだから仕様がないですね。
まあ、俺言語ではVM自体もWORD扱いにしているのですが……
531:デフォルトの名無しさん
08/10/12 15:50:56
>>529
んー、やっぱり、思い込みでForthを理解したつもりになるんじゃなくて、
本格的に触ってみたほうが良いと思うんだけどな。
>実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
通常、Forthは実行時には、スレデッドコードにコンパイルされた命令列を、
上にも出ているnextルーチンで辿るだけなので、仕組みというほどの仕組みはないよ。
>実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
間接スレッディングのForthだと定義済みのワードの変更は、一カ所ポインタを書き換える
だけで済むはず。
>番兵などの終了処理が必須
番兵というかワードの最後にnextルーチンへのジャンプかnextルーチン自身を書き込むだけ。
>VM側に「WORDを実行する」という手順が必要になる
スレデッドコードのForthの命令列は、ワードへのポインタが並んでいるだけで、
「WORDを実行する」という意味のインストラクションは必要ないよ。
532:464
08/10/12 23:25:00
本格的に触るのは……あの構文は色々と嫌だ。
[条件] IF [肯定時] ELSE [否定時] THEN とか。
せめて条件算子的だったらなぁ。[条件] ? [肯定時] : [否定時] ;
>531
細かいことを言うと、nextルーチンが辞書内のスレッデッドコード構造の詳細を知らなきゃ
ならないので、VMと辞書の関連が密になりそうな気がします。スレッデッドコードをスタックに
pushしてVM内に取り込んじゃえば辞書内の構造を気にする必要無いし。
まあ、最適化のために作り込んでも良い気がするけどね。そこは将来の課題ということで。
>一カ所ポインタを書き換えるだけで済むはず。
WORD自体を置換する場合はそうですね。WORDの挿入や削除はたぶん難しいかと。
そんな特殊なことは禁止にして、新規にWORD定義させた方が良いかも知れないけど。
あるいは無名WORDとかスキップWORDを用意するとか。
>「WORDを実行する」という意味のインストラクションは必要ないよ。
あれ?VMに保存されている「現在実行中のWORD」って、間接ポインタじゃないの?
(nextの動作を考えると、間接ポインタじゃないと色々と面倒臭そうな)
実行前に間接参照からWORDを探す操作が一段余計に必要になるかと思ってた。
533:デフォルトの名無しさん
08/10/12 23:34:45
>VMと辞書の関連が密
というか、それがFORTHの肝のような気がする。
534:デフォルトの名無しさん
08/10/13 00:16:22
スレデッドコード自体、ワードへのポインタを並べたものでしかないから、
ジャンプとかコールとかそういう類のインストラクションをデコードする必要がない、
という意味ね。
あとForthの実装にはダイレクトスレデッドなものもあるよ。
nextルーチンからみると命令列を順に辿ってるだけであって、
「辞書からワードを毎回探している」ってわけじゃないしね。
それより、スタックに命令列を毎回pushするオーバーヘッドのほうがよほど大きいと思うし、
nextルーチンに比べてシンプルとも思えないんだな。
ま、いろいろ悩んで勉強して、これだ!と思える言語デザインに邁進してください、と。
このスレが本当に久しぶりに活性化したのは間違いないしね。
535:デフォルトの名無しさん
08/10/13 00:21:58
>>533
間接スレデッドの場合、Forthコンソールの側から見ると、
逆コンパイルしやすかったり、便利な面はたしかにあるけれど、
VMつうかnextルーチンから見ると、単にポインタを辿っているだけなので、
構造として、VM実装と辞書構造が密、というわけでもないと思う。
実際VM実装テクニックとしてのスレデッドコードは、今や、Forth以外でも
当たり前の技術になってるし。
536:デフォルトの名無しさん
08/10/27 00:52:54
jonesforth読んだ。
ソース付きなので理解しやすい。
OS Xで動かそうとしたが挫折した。
OSXのGASではマクロが対応してないみたいだ。
537:デフォルトの名無しさん
08/11/23 01:13:24
急にスレが進んだと思ったら、止まるのも急だよなこのスレ
やっぱ誰も使ってないってこったな
538:デフォルトの名無しさん
08/11/26 17:30:54
URLリンク(www.intellasys.net)
なんか並列forthマシンっぽいw
539:デフォルトの名無しさん
08/12/27 14:00:32
factor使ってる奴いる?
540:デフォルトの名無しさん
08/12/27 21:13:14
とりあえず入れてみたけど特に使ってないなw
541:539
08/12/28 01:26:48
factorおもしろいぜ。デプロイするとスタンドアロンで動く物もできるし。
542:デフォルトの名無しさん
08/12/29 13:31:00
やっぱだめだこの言語。
人間工学から著しく反してる。
543:デフォルトの名無しさん
08/12/29 19:52:22
サルが人間工学語ってやがる。
544:デフォルトの名無しさん
08/12/29 21:45:56
自分の思考をスタック処理に最適化させればいいんだよw
545:デフォルトの名無しさん
08/12/29 22:06:52
forthに慣れるのはそんなに大変なことじゃないと思うけどなあ。
まあ、問題をごく単純な部分に細分して考えることができないと、
スタック処理が爆発しがちになるとはいえますね。
でも、問題の細分ができない人は、どの言語でプログラミングしても
たかが知れてる。
546:デフォルトの名無しさん
09/01/01 11:45:56
Lispのマクロ的なことができるってほんと?
547:デフォルトの名無しさん
09/01/01 11:56:23
イミディエイトなワードのことかな。
結果としては似たようなことができると言えなくもないけど、
Lispのマクロみたいな2度evalするみたいな高水準のものじゃありません。
548:デフォルトの名無しさん
09/01/07 22:44:24
つまり・・・どういうことだってばよ?
549:デフォルトの名無しさん
09/01/07 23:39:44
factorならlispのマクロと同じようなことができるよ
550:デフォルトの名無しさん
09/01/08 00:11:19
同じ機能を達成できるとしても言語が違えばそこに至るロジックは異なる。
具体的に何がしたいのか特定しないと。
factorはおもしろい言語だが、関数型言語のフリし過ぎなのがイヤラシくもある。
551:デフォルトの名無しさん
09/01/09 12:30:14
何かサンプルが欲しいな。
552:デフォルトの名無しさん
09/01/09 22:47:55
URLリンク(ancient.s6.xrea.com)
553:デフォルトの名無しさん
09/02/26 00:17:58
組み込み用FORTH検討中・・・
554:デフォルトの名無しさん
09/03/07 05:11:31
part 1 の URL ってないの?
555:デフォルトの名無しさん
09/03/07 10:00:54
URLリンク(piza.2ch.net)
556:デフォルトの名無しさん
09/03/07 10:13:20
: Mops ( オブジェクト指向FORTH -- ) ;
URLリンク(pc.2ch.net)
557:デフォルトの名無しさん
09/03/07 13:25:33
thanks
558:デフォルトの名無しさん
09/03/07 18:54:17
このスレも長いね
559:デフォルトの名無しさん
09/03/07 21:43:31
factorとかJoyとか触ってる奴いないのかよ
560:デフォルトの名無しさん
09/03/07 23:32:50
普通の関数型言語に比べてどういうメリットがあるのか分からない。
561:デフォルトの名無しさん
09/03/08 10:51:09
forthは関数型ちゃうし
562:デフォルトの名無しさん
09/03/08 12:22:51
>>560はなんでこのスレにいるんだ?
563:デフォルトの名無しさん
09/03/08 19:52:03
いや、factorがって事なんだが。
564:デフォルトの名無しさん
09/03/08 20:01:58
なんで関数型言語と比較するんだ?
Factor = forth + 無名関数とオブジェクト指向だよ
565:デフォルトの名無しさん
09/03/19 13:57:45
全然Forthと関係ない話だが、AMDのシニアアーキテクトが
チャック・ムーアって名前なのは結構心臓に悪いな。