2 part forth (909レス)
1-

405
(1): 2008/08/27(水)09:31 AAS
ドット打つのがひたすらめんどくさそう
ifだと.:ifになるの?
406
(1): 2008/08/27(水)21:05 AAS
こういう風にしたらどう?

・引数可変のワードは # で始まることとする
・ワード [ は現在のパラメータスタックポインタの値を
 リターンスタックに積む
・ワード ] は現在のパラメータスタックポインタの値と
 リターンスタックポインタのトップの値の差から
 パラメータ数を計算しパラメータスタックに積む
省5
407
(1): 404 2008/08/27(水)22:38 AAS
>405
そこは構文糖使った方がよろしいかと (a ? b ! cの三項演算子とか)

>406
それも考えたけど、そうするとConcatenativeのメリットが死ぬんだよね。

できるだけ前の計算結果に依存しないように考えると、セパレータのようなものを
スタックに積むのは良くないので、ワード単体で引数までを意味するようにしたい、
ということですな。
408: 2008/08/28(木)02:39 AAS
prologみたいにsum/3みたいにするとか。
よく判ってないが。
409: 2008/09/19(金)17:01 AAS
引数管理しなきゃいけないようなコードの構成だと崩壊しそう
410: 2008/09/25(木)03:11 AAS
しばらくforthやってたら他の言語がいじれなくなってて驚いた。
のめり込むのは危険だなw
411
(1): 2008/09/25(木)03:16 AAS
>>407
そのセパレータってリスト終端のnullに相当するから
あながち間違ってないと思う。
412
(1): 2008/09/25(木)21:54 AAS
concatenativeの論理を詰めて行くと、
スタックの機構はコード設計のための因子から外されるのかも。
413: 2008/09/25(木)22:34 AAS
>411
Wordの中でWordを呼ぼうとすると破綻するよ。

>412
結局はトップを基点とした対称性(みたいなもの)になるからな。
対称性があれば何でもOK
414: 2008/10/01(水)00:29 AAS
スタック型プログラミング言語の最少命令セットを探して
Whitespaceに辿りついたのですが、
これよりも言語仕様的に小さいスタック型言語ってあります?
415: 2008/10/01(水)01:55 AAS
define
call
return
conditional jump
push
pop

これだけで足りるかな?
416: 2008/10/01(水)07:09 AAS
callに条件をつければjumpも省けるんじゃないか?
417
(1): 2008/10/02(木)03:17 AAS
それより、ひと目で何やってるか判るforth作ってくれないかな。
>>54-65とか何やってるのかわからん。
記号覚えればいいんだろうけど。
: は定義っぽいということは文脈で判った。許す。
>rとかr>は何かと。
;は文の終り?

LISPでいう 'a は (quote a)です、みたいに特殊記号をあまり使わずに
省1
418: 2008/10/02(木)17:56 AAS
>>417
: word
でワードの定義開始、;で定義の終端
>r,r>はリターンスタックへのプッシュとポップ
>>54の括弧内はそのワードを実行するとデータスタックの状態がどう変わるかをコメントで表している
他の言語と違って裸のスタックが丸見えなんよ
419
(1): 2008/10/03(金)02:22 AAS
リターンスタックに何をプッシュ(とポップ)するの?TOSの内容ってこと?
>rとr>って判りにくいと思う。
一瞬で見分けられないというか。
不等号ちがうんかと。
記号使わずに全部記述的にできないかな。
mindとかそんなのかな。
420: 2008/10/03(金)03:00 AAS
わかりやすい文法が欲しいのならforth系はあきらめた方がいいと思うよ
421: 2008/10/03(金)06:08 AAS
: pushTOStoReturnStack postpone >r ; immediate
: popFromReturnStackToTOS postpone r> ; immediate
422: 2008/10/03(金)12:26 AAS
自分も420に賛成する、forthは裸の2スタックマシンのアセンブラと思えばいいんだけど、それがつらいとちょっときついと思う
ただ、それがインタラクティブ環境を作るあたりと小さな核で構築できるのが非常に面白いのでがんばって覚えてみてよ。

逆に言うと簡単にぶっ壊れるとも言う
423: 2008/10/03(金)16:59 AAS
Cとかの他の言語の常識持ち込もうとしてるヤツいないか?
「Forthではこう書く」ってのに納得いかないなら
悪いことは言わんから、使うのやめとけ
424: 2008/10/03(金)17:54 AAS
スタックっつうのはあくまで機械にやさしいものであってユーザーフレンドリーなものじゃないしな
425: 2008/10/03(金)18:38 AAS
頻繁にスタックを意識しないといけないのは悪いForthコード
426
(1): 2008/10/03(金)20:05 AAS
正直アセンブラの方が楽だよ
427: 2008/10/03(金)20:24 AAS
慣れると気持ちいいよJoy。forthは知らんけど
428: 2008/10/03(金)20:29 AAS
>426
Forthは仮想スタックマシンのアセンブラだから、
(仮想)マシンの理解度によるだろな。
429: 2008/10/03(金)22:29 AAS
いや、もっと視認しやすい記号セットを使ってくれって話だろ。
ハイライトできるエディタで単語登録するか、トランスレータでもかますのがいいと思う。
430
(3): 2008/10/03(金)23:01 AAS
ところでリターンスタックって別に必要なの?
普通のCPUは1本だよね。
スタックに対して相対アドレッシングがないからってことかな?
431: 2008/10/03(金)23:57 AAS
>419
>rとr>は確かに見た目がわかりにくい。
よほどのことが無い限り使わない。
localがあれば要らない。

>430
呼出しのときにデータスタックで直接パラメターを渡すためでしょう。
432: 2008/10/04(土)00:00 AAS
>>430
普通のアーキテクチャだと関数呼び出しのスタックにパラメータも突っ込んじゃうけど
forthはデータのpushと関数呼び出しの戻りアドレスが入るスタックが別なんよ。

っていうか別だから面白いことができるので、一緒だったらループとかで涙が出そうだと思う。
433: 2008/10/04(土)00:10 AAS
SP, BPレジスタに相当するものがあれば良いのでは
434: 2008/10/04(土)17:45 AAS
リターンスタックとデータスタックが一緒だと、
リターンアドレスを壊さないようにデータをいじるのがメンドイ。
リターンアドレスが詰まれている位置を避けるようにして
スタックをアクセスしなきゃいけないから。
それはSPとBPがあってもメンドイことに変わりはない。
435: 2008/10/04(土)19:46 AAS
>>430
まあ、便利だから?
実装としてはバローズのメインフレーム見たく演算とリターン
アドレス保存を一本のスタックでこなすものもあるよ。
436: 2008/10/04(土)21:37 AAS
factorだともうひとつスタックあるよ
437
(3): 2008/10/04(土)23:25 AAS
データスタックとリターンスタックがないと
チューリングマシンと等価じゃないらしいぞ
438: 2008/10/05(日)00:17 AAS
>>437
等価じゃないとはよく聞くけど、等価じゃないとする説明ってどっかにないですかね。
それで実用で困ることありますかね。
439: 2008/10/05(日)01:12 AAS
今理解した。
リターンスタックってそのままBP相当じゃん。
ほんとはBPポインタ一個あれば十分だよね?
素直にBPを持たずにわざわざリターンスタックなんて用意してるのは、
スタックマシンと言えなくなるからかね。
なんだかなあ。
440: 2008/10/05(日)03:10 AAS
BPあってもメモリがないとな
441
(1): 2008/10/05(日)03:49 AAS
今理解した。
BPってそのままリターンスタック相当じゃん。
ほんとはリターンスタックあれば十分だよね?
素直にリターンスタックを持たずに、わざわざBPなんて用意してるのは、
レジスタマシンと言えなくなるからかね。
なんだかなあ。
442
(2): 2008/10/05(日)07:20 AAS
>>437
メモリアクセスできない純粋なスタックマシンなら、スタックが二本ないと
チューリング等価ではないかも知れないが、FORTHはメモリアクセス @ ! が
あるから、たとえスタック一本であってもチューリング等価じゃね?
考えてみればわかるが、メモリアクセスがあるとスタックの本数を自由に増やせる。

FORTHとスタックマシンとConcatenative言語は、それぞれ別の概念で、
単純に等号で結べないから、何について話しているのか意識しないと混乱すると思われ。
443: 2008/10/05(日)09:51 AAS
ForthのVMとしては、
論理的には最低限二つの区別されたスタックがある。
標準的な実装での利点(v.s.スタックフレーム方式)は、
サブルーチン間でのデータのコピーが減らせること。

スタックフレーム一本でやるのはCとかでも標準的な実装だけど、
VMという同じ抽象度で比べれば、Cにはスタックは無い。

VMが実装できれば機械自体の仕組みはどうでも良い。
444: 2008/10/05(日)13:26 AAS
込み入った話は分からんけど、
とりあえずBF書けたらチューリング完全じゃなかったっけ?
445: 2008/10/05(日)14:12 AAS
なんか話が噛み合ってない気がする。
446: 2008/10/05(日)15:11 AAS
なんでそこまでチューリングマシンにこだわるのかわからん。
Forthがチューリングマシンであろうとなかろうと
Forthで実用的なプログラムは書ける。

あともう一人、やたらリターンスタックを排除したがる奴も
何をしたいのかさっぱりわからん。
447: 2008/10/05(日)17:47 AAS
まず当たり前の大前提の確認からだけど、Forthはチューリング完全だから。
仮にForthの仕様からリターンスタックだけを排除したとしても(それはForthとは呼べないだろうが)
チューリング完全だ。理由は>>442

リターンスタックがBPで代用できるとか正直意味わからん。
スタック演算自体理解してない希ガス。
448
(1): 2008/10/05(日)18:27 AAS
リターンスタックという名前がいかんのだろ。
449: 2008/10/05(日)18:35 AAS
>>437
スタックオートマトンとスタックマシンをごっちゃにしてる気がする。
450: 2008/10/05(日)18:39 AAS
>>448
むしろリターンスタック以外の名前があるなら知りたいものだが。
451
(2): 2008/10/05(日)19:02 AAS
>442
大雑把にはこんな感じかね。
・データスタック: 引数&戻り値
・リターンスタック: 実行する命令列(辞書で展開された単語含む)

リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね
452: 2008/10/05(日)19:25 AAS
リターンアドレスを積んでいるからリターンスタック
それでいいと思うが、難しく考えすぎじゃね?>>451
453
(1): 2008/10/05(日)19:28 AAS
Aスタック←→Bスタック
だったら勘違いが起きなかったと思う。
454: 2008/10/05(日)19:34 AAS
>>453
むしろ勘違いを引き起こしそうなんだが。
リターンスタックが難しいんじゃなくて、
リターンアドレスをスタックに積むという
当たり前の関数呼び出し規約を説明しなければ、
理解されない時代になったということか…
455: 2008/10/05(日)21:59 AAS
なんでリターンスタックの名前で混乱とか勘違いがあるの?
ひょっとして、リターンと聞いて戻り値を連想しちゃう人がいる、とか?
だとしたらかなりキビシい状況だな。
456: 2008/10/06(月)01:09 AAS
カールスタックの方が一般的じゃね?
457: 2008/10/06(月)01:09 AAS
あ、カールじゃなくてコールスタック
458: 2008/10/06(月)01:24 AAS
カールはスナックだな
459: 2008/10/06(月)07:35 AAS
カールと言えば薄べったいのが出てることを最近知った。
従来品に比べて口の裏に張り付きにくいのはメリットだが、
少し物足りない気がした。
460: 2008/10/06(月)11:21 AAS
Forth では昔からリターンスタックと呼んできたので、その伝統に則ればいいと
思うんだけどな。Wikipedia だと項目はコールスタックで立てられているが。
461
(1): 2008/10/06(月)12:10 AAS
コールスタック->カールスナック->コーンスターチ->張り付かないならカールじゃない

勉強し過ぎでしょう。
462: 461 2008/10/06(月)12:30 AAS
補:そもそもForthが一般的じゃない
463
(4): 2008/10/06(月)21:49 AAS
・リターンスタックが普通のCPUで言うとことの「スタック」。
 ワード(Cで言うところの関数、実際にはサブルーチン)
 を呼ぶと呼び出し戻るためのアドレスを積む。

# 普通のCPUでCALL命令(68系だとBSR、JSR)を実行すると
# リターンアドレスがスタックに積まれるのは理解しているよね?

・データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。

・「辞書」が命令コードストレージ、C言語でいえばTEXTセグメント
省5
464
(18): 2008/10/07(火)00:25 AAS
>463
いや、別にWORDがサブルーチンである必要はないんじゃない?WORD毎の環境要らないんだし。
Cとの相性を考えるとサブルーチンにした方が良いと思うけど。

あと、CPUのアーキテクチャには疎いんだけど、最近のCPUでスタック持ってるのってあったっけ?
465
(1): 2008/10/07(火)06:15 AAS
x86アーキテクチャには思いっきりスタックポインタがありますが?

>>464のいう「最近のCPU」が非ノイマンアーキテクチャとかを指すなら
スタックがないCPUもあるかも知れないけど。
466: 2008/10/07(火)06:37 AAS
>>464
前半は実装と仕様が混乱してそう。
後半は、たぶん、CPUの「レジスタアーキテクチャ」「スタックアーキテクチャ」と
データ構造としてのスタックを混同している。

Wikipediaやblog読んで理解した気にならないで実際に自分で手を動かしてみなよ。
ちょっと恥ずかし過ぎるぞ、あんた。
467
(1): 2008/10/07(火)12:34 AAS
>>464 の言ってる「スタック」はハードウェアスタックのことと思われる。

>>463
「データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。」
ってのは、確かにハードウェアスタックを思わせる記述だが。
468
(1): 2008/10/07(火)13:28 AAS
post,preのincやdec付きレジスタ間接参照命令があればデータスタックと等価だよね?
リターンスタックってのはサブルーチンコール時に戻りアドレスをpushする為のレジスタの事でしょう?
なら今時のCPUで無い物の方が珍しいと思うんだけど
469
(1): 2008/10/07(火)20:49 AAS
x86って俺の生まれる前からあるな。
定年過ぎた方には最近なんでしょうけど。
470: 2008/10/07(火)21:09 AAS
定年過ぎて無く立ってプロセッサ自体30年の歴史しかないじゃないか
471: 2008/10/07(火)21:36 AAS
最近のCPUは古いアーキテクチャのものがほとんどだよね。
細かいところは違うんだろが。

>>468
>戻りアドレスをpushする為のレジスタ
レジストリって意味?
RISCだと、戻りアドレスを保存するレジスタがあること多いよね。

まあ、リターンスタックは、
省12
472
(3): 464 2008/10/07(火)23:32 AAS
>465
いや、スタックポインタ(レジスタ)じゃなくてスタック。>467 の通りですな。>463で『アドレスを積む』とか
書いているからHWスタックのことかと思った。
スタックを内部に持つCPUの話があった記憶があったので勘違いしたわ。すまんね。

forthあんまり詳しくないんで済まんのだけど、『リターンスタックには、ワードを呼ぶと呼び出し戻るため
のアドレスを積む』んだっけ?
正規化の観点からは『まだ実行していないWORD』もリターンスタックに積めた方が便利だと思うけど。
省1
473
(2): 2008/10/07(火)23:56 AAS
>>472
意味が理解できん。
「まだ実行してないWord」を積む、って具体的に何を積むの?
まだ実行してないワードのアドレスなら辞書に入ってると思う(関節スレッディングの場合)
474: 2008/10/08(水)04:22 AAS
>>469
いまでも現役バリバリで使われていて
マイクロソフトの最新OS「VISTA」がポーティングされる
x86アーキテクチャが「最近のCPU」では無いとでも?

あるいはCore2DUOとかがX86アーキテクチャじゃないとでも思ってる?
475: 2008/10/08(水)06:31 AAS
>>472
Forthと関係なく、関数の呼び出し元に戻るためにアドレスをスタックに積む、
という動作は、アセンブリレベルでは普通の関数呼び出し規約。
Forthは言語レベルでリターンスタックを操作できる言語だけど、
普通は意識しなくてもいいから、リターンアドレスが何のために存在しているのか
理解できない人がいても不思議じゃないけど、せめてもう少し自分で勉強して欲しい。
476: 2008/10/08(水)06:35 AAS
>forthあんまり詳しくないんで済まんのだけど、
とか、逃げをうたず自分で触ってみろよ。
477
(1): 2008/10/08(水)14:37 AAS
441だけど盛り上がってるね。

自分なりのまとめ。
リターンスタックはBPとcall/retの役割がある。

call/retを他の命令で書くと

・関数の呼び出し
push $LNEXT
jmp func
省14
478: 2008/10/08(水)18:17 AAS
>>441=477
それを実際に作って発表したら
いままで君をバカにしていた連中にギャフンと言わせられるよ。
ガンバ。
479
(1): 2008/10/08(水)18:47 AAS
で、その「ボクが考えたforth」では、
パラメタはどうやって渡すんだ?
480: 2008/10/08(水)19:05 AAS
どう考えても普通にCALL/RETした方が速そうだけど
わざわざ面倒くさくしてどうするの?

あと、ENTER/LEAVEとか使わないの
481: 2008/10/08(水)21:00 AAS
>>477
もはやどこから突っ込んで良いものやら…
二つほど疑問が。

一つ目。
>>479も言ってるけれど、その実装だとパラメタの受け渡しが面倒そうなのだが。
たとえば、その実装方法で、

: foo drop drop 3 4 5 ;
省8
482: 2008/10/08(水)21:16 AAS
二つ目用の問題も書いておくよ。

: bar 1 2 3 >r >r 1 + r> r> ;
483: 2008/10/08(水)23:38 AAS
混乱してるようだから、
まず、ネイティブの場合とスレッディングの場合を分けて考えた方がいい。
ネイティブForthで自然な実装では、
SP=リターンスタックポインタ(RSP)
BP=データスタックポインタ(DSP)
となってる。
UNIX/Cの普通のスタックを知ってれば、機能的な対応は明瞭なはず。
省9
484
(1): 464 2008/10/09(木)01:15 AAS
446です。
forthは興味半分で使ったレベルでしかないですね……
concatenative俺言語の設計の参考にしているぐらいです。

>473
リターンスタックを「次に実行する命令の列」という形に抽象化すると、「現在処理中のWORD」と
「ソースコードを解釈したWORD」「Dictionaryに保持されているWORD列」…つまり呼び出されて
いないWORDを対称(等価/交換可能)に扱うことができるようになるので、バーチャルマシンの
省2
485
(1): 2008/10/09(木)06:24 AAS
リターンスタックに積んであるリターンアドレスは、
「これから実行される命令列」へのポインタそのものと見なせるから、
そのアイデアが新しいとは思えないけどな。
Forthぐらいバーチャルマシンの実装が簡単な言語もないし。

ただ、リターンスタックの意味がよくわからないままに、
他の言語のように抽象構文木を再帰的に処理するような
実装にしていると、リターンスタック操作の実装で悩むの
省1
1-
あと 424 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.016s