2 part forth (907レス)
2 part forth http://mevius.5ch.net/test/read.cgi/tech/1073673931/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
448: デフォルトの名無しさん [sage] 2008/10/05(日) 18:27:08 リターンスタックという名前がいかんのだろ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/448
449: デフォルトの名無しさん [sage] 2008/10/05(日) 18:35:04 >>437 スタックオートマトンとスタックマシンをごっちゃにしてる気がする。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/449
450: デフォルトの名無しさん [sage] 2008/10/05(日) 18:39:13 >>448 むしろリターンスタック以外の名前があるなら知りたいものだが。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/450
451: デフォルトの名無しさん [sage] 2008/10/05(日) 19:02:41 >442 大雑把にはこんな感じかね。 ・データスタック: 引数&戻り値 ・リターンスタック: 実行する命令列(辞書で展開された単語含む) リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね http://mevius.5ch.net/test/read.cgi/tech/1073673931/451
452: デフォルトの名無しさん [sage] 2008/10/05(日) 19:25:44 リターンアドレスを積んでいるからリターンスタック それでいいと思うが、難しく考えすぎじゃね?>>451 http://mevius.5ch.net/test/read.cgi/tech/1073673931/452
453: デフォルトの名無しさん [sage] 2008/10/05(日) 19:28:44 Aスタック←→Bスタック だったら勘違いが起きなかったと思う。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/453
454: デフォルトの名無しさん [sage] 2008/10/05(日) 19:34:19 >>453 むしろ勘違いを引き起こしそうなんだが。 リターンスタックが難しいんじゃなくて、 リターンアドレスをスタックに積むという 当たり前の関数呼び出し規約を説明しなければ、 理解されない時代になったということか… http://mevius.5ch.net/test/read.cgi/tech/1073673931/454
455: デフォルトの名無しさん [sage] 2008/10/05(日) 21:59:43 なんでリターンスタックの名前で混乱とか勘違いがあるの? ひょっとして、リターンと聞いて戻り値を連想しちゃう人がいる、とか? だとしたらかなりキビシい状況だな。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/455
456: デフォルトの名無しさん [sage] 2008/10/06(月) 01:09:11 カールスタックの方が一般的じゃね? http://mevius.5ch.net/test/read.cgi/tech/1073673931/456
457: デフォルトの名無しさん [sage] 2008/10/06(月) 01:09:52 あ、カールじゃなくてコールスタック http://mevius.5ch.net/test/read.cgi/tech/1073673931/457
458: デフォルトの名無しさん [sage] 2008/10/06(月) 01:24:45 カールはスナックだな http://mevius.5ch.net/test/read.cgi/tech/1073673931/458
459: デフォルトの名無しさん [sage] 2008/10/06(月) 07:35:22 カールと言えば薄べったいのが出てることを最近知った。 従来品に比べて口の裏に張り付きにくいのはメリットだが、 少し物足りない気がした。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/459
460: デフォルトの名無しさん [sage] 2008/10/06(月) 11:21:56 Forth では昔からリターンスタックと呼んできたので、その伝統に則ればいいと 思うんだけどな。Wikipedia だと項目はコールスタックで立てられているが。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/460
461: デフォルトの名無しさん [sage] 2008/10/06(月) 12:10:36 コールスタック->カールスナック->コーンスターチ->張り付かないならカールじゃない 勉強し過ぎでしょう。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/461
462: 461 [sage] 2008/10/06(月) 12:30:27 補:そもそもForthが一般的じゃない http://mevius.5ch.net/test/read.cgi/tech/1073673931/462
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 430 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.029s