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