2 part forth (907レス)
2 part forth http://mevius.5ch.net/test/read.cgi/tech/1073673931/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
463: デフォルトの名無しさん [sage] 2008/10/06(月) 21:49:04 ・リターンスタックが普通のCPUで言うとことの「スタック」。 ワード(Cで言うところの関数、実際にはサブルーチン) を呼ぶと呼び出し戻るためのアドレスを積む。 # 普通のCPUでCALL命令(68系だとBSR、JSR)を実行すると # リターンアドレスがスタックに積まれるのは理解しているよね? ・データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。 ・「辞書」が命令コードストレージ、C言語でいえばTEXTセグメント Forthの本質は上記3点をおさえて置けば理解できるんだが。 BPがリターンスタックと等価なんて言ってる人とか、 >・リターンスタック: 実行する命令列(辞書で展開された単語含む) >リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね なんて言っている人、本当に理解できてるの? http://mevius.5ch.net/test/read.cgi/tech/1073673931/463
464: デフォルトの名無しさん [sage] 2008/10/07(火) 00:25:52 >463 いや、別にWORDがサブルーチンである必要はないんじゃない?WORD毎の環境要らないんだし。 Cとの相性を考えるとサブルーチンにした方が良いと思うけど。 あと、CPUのアーキテクチャには疎いんだけど、最近のCPUでスタック持ってるのってあったっけ? http://mevius.5ch.net/test/read.cgi/tech/1073673931/464
465: デフォルトの名無しさん [sage] 2008/10/07(火) 06:15:51 x86アーキテクチャには思いっきりスタックポインタがありますが? >>464のいう「最近のCPU」が非ノイマンアーキテクチャとかを指すなら スタックがないCPUもあるかも知れないけど。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/465
466: デフォルトの名無しさん [sage] 2008/10/07(火) 06:37:45 >>464 前半は実装と仕様が混乱してそう。 後半は、たぶん、CPUの「レジスタアーキテクチャ」「スタックアーキテクチャ」と データ構造としてのスタックを混同している。 Wikipediaやblog読んで理解した気にならないで実際に自分で手を動かしてみなよ。 ちょっと恥ずかし過ぎるぞ、あんた。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/466
467: デフォルトの名無しさん [sage] 2008/10/07(火) 12:34:16 >>464 の言ってる「スタック」はハードウェアスタックのことと思われる。 >>463 の 「データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。」 ってのは、確かにハードウェアスタックを思わせる記述だが。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/467
468: デフォルトの名無しさん [sage] 2008/10/07(火) 13:28:27 post,preのincやdec付きレジスタ間接参照命令があればデータスタックと等価だよね? リターンスタックってのはサブルーチンコール時に戻りアドレスをpushする為のレジスタの事でしょう? なら今時のCPUで無い物の方が珍しいと思うんだけど http://mevius.5ch.net/test/read.cgi/tech/1073673931/468
469: デフォルトの名無しさん [sage] 2008/10/07(火) 20:49:02 x86って俺の生まれる前からあるな。 定年過ぎた方には最近なんでしょうけど。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/469
470: デフォルトの名無しさん [sage] 2008/10/07(火) 21:09:44 定年過ぎて無く立ってプロセッサ自体30年の歴史しかないじゃないか http://mevius.5ch.net/test/read.cgi/tech/1073673931/470
471: デフォルトの名無しさん [sage] 2008/10/07(火) 21:36:31 最近のCPUは古いアーキテクチャのものがほとんどだよね。 細かいところは違うんだろが。 >>468 >戻りアドレスをpushする為のレジスタ レジストリって意味? RISCだと、戻りアドレスを保存するレジスタがあること多いよね。 まあ、リターンスタックは、 リターンアドレスを積むため専用(原則)のスタック ってことがわかれば、いいじゃない。 データスタックと別にある利点もわかってるわけでしょ。 本当は「リターンスタックがあること」じゃなくて、 データスタックが複数のワードを横断して固定されていること、 の方が特徴だよね。 普通の言語の実装だと、 データスタックがサブルーチンごとに別々にリターンスタックの中にあって、 受け渡すデータはコピーする、 という感じなわけだ。比喩的に言えば。 アセンブリレベルでもリターンアドレスのpush/popが自動になってるなら、 気付かない人がいてもしょうがない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/471
472: 464 [sage] 2008/10/07(火) 23:32:13 >465 いや、スタックポインタ(レジスタ)じゃなくてスタック。>467 の通りですな。>463で『アドレスを積む』とか 書いているからHWスタックのことかと思った。 スタックを内部に持つCPUの話があった記憶があったので勘違いしたわ。すまんね。 forthあんまり詳しくないんで済まんのだけど、『リターンスタックには、ワードを呼ぶと呼び出し戻るため のアドレスを積む』んだっけ? 正規化の観点からは『まだ実行していないWORD』もリターンスタックに積めた方が便利だと思うけど。 WORDコンパイルの実装で手が抜けなくなるし…… http://mevius.5ch.net/test/read.cgi/tech/1073673931/472
473: デフォルトの名無しさん [sage] 2008/10/07(火) 23:56:37 >>472 意味が理解できん。 「まだ実行してないWord」を積む、って具体的に何を積むの? まだ実行してないワードのアドレスなら辞書に入ってると思う(関節スレッディングの場合) http://mevius.5ch.net/test/read.cgi/tech/1073673931/473
474: デフォルトの名無しさん [sage] 2008/10/08(水) 04:22:01 >>469 いまでも現役バリバリで使われていて マイクロソフトの最新OS「VISTA」がポーティングされる x86アーキテクチャが「最近のCPU」では無いとでも? あるいはCore2DUOとかがX86アーキテクチャじゃないとでも思ってる? http://mevius.5ch.net/test/read.cgi/tech/1073673931/474
475: デフォルトの名無しさん [sage] 2008/10/08(水) 06:31:12 >>472 Forthと関係なく、関数の呼び出し元に戻るためにアドレスをスタックに積む、 という動作は、アセンブリレベルでは普通の関数呼び出し規約。 Forthは言語レベルでリターンスタックを操作できる言語だけど、 普通は意識しなくてもいいから、リターンアドレスが何のために存在しているのか 理解できない人がいても不思議じゃないけど、せめてもう少し自分で勉強して欲しい。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/475
476: デフォルトの名無しさん [sage] 2008/10/08(水) 06:35:19 >forthあんまり詳しくないんで済まんのだけど、 とか、逃げをうたず自分で触ってみろよ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/476
477: デフォルトの名無しさん [sage] 2008/10/08(水) 14:37:36 441だけど盛り上がってるね。 自分なりのまとめ。 リターンスタックはBPとcall/retの役割がある。 call/retを他の命令で書くと ・関数の呼び出し push $LNEXT jmp func $LNEXT: ・関数のret pop ecx ; $LNEXTのアドレスがecxに入る jmp [ecx] ・関数のはじめ push ebp mov ebp, esp ・関数のおわり mov esp, ebp pop ebp こうなる。 つまりBPはリターンスタックのトップと同じ。 BPを基点にすればデータスタックだけでも同じ事ができる。 「ボクが考えたforth」ではリターンスタックは必要ない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/477
478: デフォルトの名無しさん [sage] 2008/10/08(水) 18:17:31 >>441=477 それを実際に作って発表したら いままで君をバカにしていた連中にギャフンと言わせられるよ。 ガンバ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/478
479: デフォルトの名無しさん [sage] 2008/10/08(水) 18:47:05 で、その「ボクが考えたforth」では、 パラメタはどうやって渡すんだ? http://mevius.5ch.net/test/read.cgi/tech/1073673931/479
480: デフォルトの名無しさん [sage] 2008/10/08(水) 19:05:03 どう考えても普通にCALL/RETした方が速そうだけど わざわざ面倒くさくしてどうするの? あと、ENTER/LEAVEとか使わないの http://mevius.5ch.net/test/read.cgi/tech/1073673931/480
481: デフォルトの名無しさん [sage] 2008/10/08(水) 21:00:40 >>477 もはやどこから突っ込んで良いものやら… 二つほど疑問が。 一つ目。 >>479も言ってるけれど、その実装だとパラメタの受け渡しが面倒そうなのだが。 たとえば、その実装方法で、 : foo drop drop 3 4 5 ; 1 2 foo としたときにスタックがどのように変化していくのか書いてみてくれ。 解決方法を考えられなくもないが、たぶん独立したリターンスタックが あるほうがシンプルだと思われ。 二つ目。 リターンスタックを操作する命令はどうやって実装するの? これも独立したリターンスタックがあるほうがシンプルだと思われ。 forthじゃない何かをつくろうとしているのだろうか? http://mevius.5ch.net/test/read.cgi/tech/1073673931/481
482: デフォルトの名無しさん [sage] 2008/10/08(水) 21:16:43 二つ目用の問題も書いておくよ。 : bar 1 2 3 >r >r 1 + r> r> ; http://mevius.5ch.net/test/read.cgi/tech/1073673931/482
483: デフォルトの名無しさん [sage] 2008/10/08(水) 23:38:28 混乱してるようだから、 まず、ネイティブの場合とスレッディングの場合を分けて考えた方がいい。 ネイティブForthで自然な実装では、 SP=リターンスタックポインタ(RSP) BP=データスタックポインタ(DSP) となってる。 UNIX/Cの普通のスタックを知ってれば、機能的な対応は明瞭なはず。 リターンスタックが伸びても、DSPは別フレームに移らないのがForthのポイント。 ちなみに、Forthでも局所変数が使えるヤツがあって、 その局所変数には、リタースタック中にフレームを作って割り当てるのが普通。 これも、標準のスタックがわかってれば意味は明瞭。 スレッディング(直接・間接)方式だと、 呼出しはCallじゃないから、 BPをRSPにしてもかまわんが、 パラメタとリターンアドレスの混合は、 Forthでは無謀。動的にチェックが必要な上に、完璧にはできそうにない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/483
484: 464 [sage] 2008/10/09(木) 01:15:39 446です。 forthは興味半分で使ったレベルでしかないですね…… concatenative俺言語の設計の参考にしているぐらいです。 >473 リターンスタックを「次に実行する命令の列」という形に抽象化すると、「現在処理中のWORD」と 「ソースコードを解釈したWORD」「Dictionaryに保持されているWORD列」…つまり呼び出されて いないWORDを対称(等価/交換可能)に扱うことができるようになるので、バーチャルマシンの 構造を簡単化することができるかと思います。 ……forthで許されているのかしらんけど。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/484
485: デフォルトの名無しさん [sage] 2008/10/09(木) 06:24:10 リターンスタックに積んであるリターンアドレスは、 「これから実行される命令列」へのポインタそのものと見なせるから、 そのアイデアが新しいとは思えないけどな。 Forthぐらいバーチャルマシンの実装が簡単な言語もないし。 ただ、リターンスタックの意味がよくわからないままに、 他の言語のように抽象構文木を再帰的に処理するような 実装にしていると、リターンスタック操作の実装で悩むの かもしれない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/485
486: 464 [sage] 2008/10/09(木) 08:54:40 >485 >463は呼び出したWORDを積むことを前提にしているし、>451 >472で言ってるのが >463 >473で 思い切り否定されてるので、forthじゃそういう考え方無いのかな、と思った。 もしforthでもそういう使い方しているんだったらおいらの不勉強だね。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/486
487: デフォルトの名無しさん [sage] 2008/10/09(木) 10:46:32 >>486 485のいってる意味は、 スレッディング方式のforthでは、 辞書は実行されるワードのポインタのリストとみなせるわけで、 リターンアドレスというのは、辞書内への戻りアドレス、 つまり、これから実行されるワードのリストへのポインタといえる ということと思われる。 ワードのポインタを直接リターンスタックに積み込むような、 インストラクションキャッシュみたいな仕様のリターンスタックの実装は、 ちょっと聞いたことが無い。 というかそれじゃリターンスタックじゃない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/487
488: デフォルトの名無しさん [sage] 2008/10/09(木) 20:52:04 487の言わんとすることを俺なりに解釈してみる… : foo dup + ; : bar foo drop ; bar の処理中に foo を実行するときに、 foo の次の drop のアドレスをリターンスタックに積む。 それで、foo の実行終了時にリターンアドレスから戻り先を取る。 これが、さっき積んだ drop のアドレスということ。 で、「drop のアドレス」っていうのを「ポインタ」と呼んでいる。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/488
489: デフォルトの名無しさん [sage] 2008/10/09(木) 21:08:57 fooが呼ばれたときのリターンアドレスは 「dropのアドレス」というより 「dropの直前のアドレス」だ。 微妙なニュアンスに聞こえるかもしれないが。 : bar foo ( ここ ) drop ; ( ここ ) と書いた部分に戻ってくる。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/489
490: デフォルトの名無しさん [sage] 2008/10/09(木) 21:12:38 : foo dup + ; : bar dup * ; : baz foo ( ここ ) bar ( そこ ) ; foo が呼ばれたときリターンスタックには( ここ )が積まれてる。 bar が呼ばれたときリターンスタックには( そこ )が積まれてる。 bar というワード自身がリターンスタックに積まれているのではない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/490
491: デフォルトの名無しさん [sage] 2008/10/09(木) 21:16:04 ついでに >>56 のリターンスタックを使ったパズルの説明でも書いておこう。 問題は、 : foo twice ." Hello" ; で、 HelloHello を出力する twice を定義しろというパズル。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/491
492: デフォルトの名無しさん [sage] 2008/10/09(木) 21:22:30 解答は、 : twice r> dup >r >r ; 何が起きているか説明すると、twice が呼ばれたとき、リターンスタックには、 : foo twice ( ここ ) ." Hello" ; 上の( ここ )が積まれている。 twice は最初に r> を実行して、( ここ ) をリターンスタックからデータスタックに移している。 次の dup で ( ここ ) がデータスタックに二つ積まれた状態になる。 最後に、 二つの >r で ( ここ ) が二つリターンスタックに戻される。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/492
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 415 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s