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

|