2 part forth (909レス)
上下前次1-新
458: デフォルトの名無しさん [sage] 2008/10/06(月) 01:24:45 AAS
カールはスナックだな
459: デフォルトの名無しさん [sage] 2008/10/06(月) 07:35:22 AAS
カールと言えば薄べったいのが出てることを最近知った。
従来品に比べて口の裏に張り付きにくいのはメリットだが、
少し物足りない気がした。
460: デフォルトの名無しさん [sage] 2008/10/06(月) 11:21:56 AAS
Forth では昔からリターンスタックと呼んできたので、その伝統に則ればいいと
思うんだけどな。Wikipedia だと項目はコールスタックで立てられているが。
461(1): デフォルトの名無しさん [sage] 2008/10/06(月) 12:10:36 AAS
コールスタック->カールスナック->コーンスターチ->張り付かないならカールじゃない
勉強し過ぎでしょう。
462: 461 [sage] 2008/10/06(月) 12:30:27 AAS
補:そもそもForthが一般的じゃない
463(4): デフォルトの名無しさん [sage] 2008/10/06(月) 21:49:04 AAS
・リターンスタックが普通のCPUで言うとことの「スタック」。
ワード(Cで言うところの関数、実際にはサブルーチン)
を呼ぶと呼び出し戻るためのアドレスを積む。
# 普通のCPUでCALL命令(68系だとBSR、JSR)を実行すると
# リターンアドレスがスタックに積まれるのは理解しているよね?
・データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。
・「辞書」が命令コードストレージ、C言語でいえばTEXTセグメント
Forthの本質は上記3点をおさえて置けば理解できるんだが。
BPがリターンスタックと等価なんて言ってる人とか、
>・リターンスタック: 実行する命令列(辞書で展開された単語含む)
>リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね
なんて言っている人、本当に理解できてるの?
464(18): デフォルトの名無しさん [sage] 2008/10/07(火) 00:25:52 AAS
>463
いや、別にWORDがサブルーチンである必要はないんじゃない?WORD毎の環境要らないんだし。
Cとの相性を考えるとサブルーチンにした方が良いと思うけど。
あと、CPUのアーキテクチャには疎いんだけど、最近のCPUでスタック持ってるのってあったっけ?
465(1): デフォルトの名無しさん [sage] 2008/10/07(火) 06:15:51 AAS
x86アーキテクチャには思いっきりスタックポインタがありますが?
>>464のいう「最近のCPU」が非ノイマンアーキテクチャとかを指すなら
スタックがないCPUもあるかも知れないけど。
466: デフォルトの名無しさん [sage] 2008/10/07(火) 06:37:45 AAS
>>464
前半は実装と仕様が混乱してそう。
後半は、たぶん、CPUの「レジスタアーキテクチャ」「スタックアーキテクチャ」と
データ構造としてのスタックを混同している。
Wikipediaやblog読んで理解した気にならないで実際に自分で手を動かしてみなよ。
ちょっと恥ずかし過ぎるぞ、あんた。
467(1): デフォルトの名無しさん [sage] 2008/10/07(火) 12:34:16 AAS
>>464 の言ってる「スタック」はハードウェアスタックのことと思われる。
>>463 の
「データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。」
ってのは、確かにハードウェアスタックを思わせる記述だが。
468(1): デフォルトの名無しさん [sage] 2008/10/07(火) 13:28:27 AAS
post,preのincやdec付きレジスタ間接参照命令があればデータスタックと等価だよね?
リターンスタックってのはサブルーチンコール時に戻りアドレスをpushする為のレジスタの事でしょう?
なら今時のCPUで無い物の方が珍しいと思うんだけど
469(1): デフォルトの名無しさん [sage] 2008/10/07(火) 20:49:02 AAS
x86って俺の生まれる前からあるな。
定年過ぎた方には最近なんでしょうけど。
470: デフォルトの名無しさん [sage] 2008/10/07(火) 21:09:44 AAS
定年過ぎて無く立ってプロセッサ自体30年の歴史しかないじゃないか
471: デフォルトの名無しさん [sage] 2008/10/07(火) 21:36:31 AAS
最近のCPUは古いアーキテクチャのものがほとんどだよね。
細かいところは違うんだろが。
>>468
>戻りアドレスをpushする為のレジスタ
レジストリって意味?
RISCだと、戻りアドレスを保存するレジスタがあること多いよね。
まあ、リターンスタックは、
リターンアドレスを積むため専用(原則)のスタック
ってことがわかれば、いいじゃない。
データスタックと別にある利点もわかってるわけでしょ。
本当は「リターンスタックがあること」じゃなくて、
データスタックが複数のワードを横断して固定されていること、
の方が特徴だよね。
普通の言語の実装だと、
データスタックがサブルーチンごとに別々にリターンスタックの中にあって、
受け渡すデータはコピーする、
という感じなわけだ。比喩的に言えば。
アセンブリレベルでもリターンアドレスのpush/popが自動になってるなら、
気付かない人がいてもしょうがない。
472(3): 464 [sage] 2008/10/07(火) 23:32:13 AAS
>465
いや、スタックポインタ(レジスタ)じゃなくてスタック。>467 の通りですな。>463で『アドレスを積む』とか
書いているからHWスタックのことかと思った。
スタックを内部に持つCPUの話があった記憶があったので勘違いしたわ。すまんね。
forthあんまり詳しくないんで済まんのだけど、『リターンスタックには、ワードを呼ぶと呼び出し戻るため
のアドレスを積む』んだっけ?
正規化の観点からは『まだ実行していないWORD』もリターンスタックに積めた方が便利だと思うけど。
WORDコンパイルの実装で手が抜けなくなるし……
473(2): デフォルトの名無しさん [sage] 2008/10/07(火) 23:56:37 AAS
>>472
意味が理解できん。
「まだ実行してないWord」を積む、って具体的に何を積むの?
まだ実行してないワードのアドレスなら辞書に入ってると思う(関節スレッディングの場合)
474: デフォルトの名無しさん [sage] 2008/10/08(水) 04:22:01 AAS
>>469
いまでも現役バリバリで使われていて
マイクロソフトの最新OS「VISTA」がポーティングされる
x86アーキテクチャが「最近のCPU」では無いとでも?
あるいはCore2DUOとかがX86アーキテクチャじゃないとでも思ってる?
475: デフォルトの名無しさん [sage] 2008/10/08(水) 06:31:12 AAS
>>472
Forthと関係なく、関数の呼び出し元に戻るためにアドレスをスタックに積む、
という動作は、アセンブリレベルでは普通の関数呼び出し規約。
Forthは言語レベルでリターンスタックを操作できる言語だけど、
普通は意識しなくてもいいから、リターンアドレスが何のために存在しているのか
理解できない人がいても不思議じゃないけど、せめてもう少し自分で勉強して欲しい。
476: デフォルトの名無しさん [sage] 2008/10/08(水) 06:35:19 AAS
>forthあんまり詳しくないんで済まんのだけど、
とか、逃げをうたず自分で触ってみろよ。
477(1): デフォルトの名無しさん [sage] 2008/10/08(水) 14:37:36 AAS
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」ではリターンスタックは必要ない。
478: デフォルトの名無しさん [sage] 2008/10/08(水) 18:17:31 AAS
>>441441(1): デフォルトの名無しさん [sage] 2008/10/05(日) 03:49:49 AAS
今理解した。
BPってそのままリターンスタック相当じゃん。
ほんとはリターンスタックあれば十分だよね?
素直にリターンスタックを持たずに、わざわざBPなんて用意してるのは、
レジスタマシンと言えなくなるからかね。
なんだかなあ。
=477
それを実際に作って発表したら
いままで君をバカにしていた連中にギャフンと言わせられるよ。
ガンバ。
479(1): デフォルトの名無しさん [sage] 2008/10/08(水) 18:47:05 AAS
で、その「ボクが考えたforth」では、
パラメタはどうやって渡すんだ?
480: デフォルトの名無しさん [sage] 2008/10/08(水) 19:05:03 AAS
どう考えても普通にCALL/RETした方が速そうだけど
わざわざ面倒くさくしてどうするの?
あと、ENTER/LEAVEとか使わないの
481: デフォルトの名無しさん [sage] 2008/10/08(水) 21:00:40 AAS
>>477
もはやどこから突っ込んで良いものやら…
二つほど疑問が。
一つ目。
>>479も言ってるけれど、その実装だとパラメタの受け渡しが面倒そうなのだが。
たとえば、その実装方法で、
: foo drop drop 3 4 5 ;
1 2 foo
としたときにスタックがどのように変化していくのか書いてみてくれ。
解決方法を考えられなくもないが、たぶん独立したリターンスタックが
あるほうがシンプルだと思われ。
二つ目。
リターンスタックを操作する命令はどうやって実装するの?
これも独立したリターンスタックがあるほうがシンプルだと思われ。
forthじゃない何かをつくろうとしているのだろうか?
482: デフォルトの名無しさん [sage] 2008/10/08(水) 21:16:43 AAS
二つ目用の問題も書いておくよ。
: bar 1 2 3 >r >r 1 + r> r> ;
上下前次1-新書関写板覧索設栞歴
あと 427 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.025s