2 part forth (909レス)
2 part forth http://mevius.5ch.net/test/read.cgi/tech/1073673931/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
400: デフォルトの名無しさん [sage] 2008/08/09(土) 16:38:27 でも、C言語で作られたプログラムとの連携したいときは、NUL文字終端がいいよね。 C言語で作られたプログラムの数の多さ、便利さから言うと、無視できないなと。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/400
401: デフォルトの名無しさん [sage] 2008/08/09(土) 18:30:35 Cは捨てるのがよろしいかと。 C++をbetter Cとして使う方がまだましだと思う。 C++を使えないようなリソースのキツい環境で使うんだったらforthを直書きした方が良いんじゃね? http://mevius.5ch.net/test/read.cgi/tech/1073673931/401
402: デフォルトの名無しさん [sage] 2008/08/10(日) 00:15:50 >C++をbetter Cとして使う それ最悪 http://mevius.5ch.net/test/read.cgi/tech/1073673931/402
403: デフォルトの名無しさん [sage] 2008/08/11(月) 00:15:21 402 と同感だが、better Cとして使うのは FORTH 実装にはない(価値が少ない)だろ。 自己学習として作るならまだしも、 FORTHに期待される動作環境だったらアセンブリレベルの設計が必要だろ。 C++使うならC++的設計をしろって。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/403
404: デフォルトの名無しさん [sage] 2008/08/27(水) 00:31:36 forthチック俺言語のプロセスが回った記念カキコ。 forthだと引数管理がけっこう面倒だと思うけど、wordの名前に 引数の数の情報を盛り込んだら楽にならんかね? 俺言語ではこんな感じでドットの数=引数の数にしているんだけど、どう思う? 1 2 ..sum 1 2 3 .:sum 名前の衝突も起こりにくくなって一石二鳥かと思うんだけど。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/404
405: デフォルトの名無しさん [sage] 2008/08/27(水) 09:31:38 ドット打つのがひたすらめんどくさそう ifだと.:ifになるの? http://mevius.5ch.net/test/read.cgi/tech/1073673931/405
406: デフォルトの名無しさん [sage] 2008/08/27(水) 21:05:33 こういう風にしたらどう? ・引数可変のワードは # で始まることとする ・ワード [ は現在のパラメータスタックポインタの値を リターンスタックに積む ・ワード ] は現在のパラメータスタックポインタの値と リターンスタックポインタのトップの値の差から パラメータ数を計算しパラメータスタックに積む たとえば [ 10 20 30 ] #sum と書くと、#sum実行直前にはパラメータスタックは 10 20 30 3 となっていて、#sumは3つの数の和を求めればいいことがわかる。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/406
407: 404 [sage] 2008/08/27(水) 22:38:18 >405 そこは構文糖使った方がよろしいかと (a ? b ! cの三項演算子とか) >406 それも考えたけど、そうするとConcatenativeのメリットが死ぬんだよね。 できるだけ前の計算結果に依存しないように考えると、セパレータのようなものを スタックに積むのは良くないので、ワード単体で引数までを意味するようにしたい、 ということですな。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/407
408: デフォルトの名無しさん [sage] 2008/08/28(木) 02:39:56 prologみたいにsum/3みたいにするとか。 よく判ってないが。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/408
409: デフォルトの名無しさん [sage] 2008/09/19(金) 17:01:15 引数管理しなきゃいけないようなコードの構成だと崩壊しそう http://mevius.5ch.net/test/read.cgi/tech/1073673931/409
410: デフォルトの名無しさん [sage] 2008/09/25(木) 03:11:26 しばらくforthやってたら他の言語がいじれなくなってて驚いた。 のめり込むのは危険だなw http://mevius.5ch.net/test/read.cgi/tech/1073673931/410
411: デフォルトの名無しさん [sage] 2008/09/25(木) 03:16:06 >>407 そのセパレータってリスト終端のnullに相当するから あながち間違ってないと思う。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/411
412: デフォルトの名無しさん [sage] 2008/09/25(木) 21:54:56 concatenativeの論理を詰めて行くと、 スタックの機構はコード設計のための因子から外されるのかも。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/412
413: デフォルトの名無しさん [sage] 2008/09/25(木) 22:34:55 >411 Wordの中でWordを呼ぼうとすると破綻するよ。 >412 結局はトップを基点とした対称性(みたいなもの)になるからな。 対称性があれば何でもOK http://mevius.5ch.net/test/read.cgi/tech/1073673931/413
414: デフォルトの名無しさん [sage] 2008/10/01(水) 00:29:26 スタック型プログラミング言語の最少命令セットを探して Whitespaceに辿りついたのですが、 これよりも言語仕様的に小さいスタック型言語ってあります? http://mevius.5ch.net/test/read.cgi/tech/1073673931/414
415: デフォルトの名無しさん [sage] 2008/10/01(水) 01:55:39 define call return conditional jump push pop これだけで足りるかな? http://mevius.5ch.net/test/read.cgi/tech/1073673931/415
416: デフォルトの名無しさん [sage] 2008/10/01(水) 07:09:50 callに条件をつければjumpも省けるんじゃないか? http://mevius.5ch.net/test/read.cgi/tech/1073673931/416
417: デフォルトの名無しさん [sage] 2008/10/02(木) 03:17:37 それより、ひと目で何やってるか判るforth作ってくれないかな。 >>54-65とか何やってるのかわからん。 記号覚えればいいんだろうけど。 : は定義っぽいということは文脈で判った。許す。 >rとかr>は何かと。 ;は文の終り? LISPでいう 'a は (quote a)です、みたいに特殊記号をあまり使わずに 誰が見ても大体判るように、平易な形にならないかな。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/417
418: デフォルトの名無しさん [sage] 2008/10/02(木) 17:56:08 >>417 : word でワードの定義開始、;で定義の終端 >r,r>はリターンスタックへのプッシュとポップ >>54の括弧内はそのワードを実行するとデータスタックの状態がどう変わるかをコメントで表している 他の言語と違って裸のスタックが丸見えなんよ http://mevius.5ch.net/test/read.cgi/tech/1073673931/418
419: デフォルトの名無しさん [sage] 2008/10/03(金) 02:22:08 リターンスタックに何をプッシュ(とポップ)するの?TOSの内容ってこと? >rとr>って判りにくいと思う。 一瞬で見分けられないというか。 不等号ちがうんかと。 記号使わずに全部記述的にできないかな。 mindとかそんなのかな。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/419
420: デフォルトの名無しさん [sage] 2008/10/03(金) 03:00:42 わかりやすい文法が欲しいのならforth系はあきらめた方がいいと思うよ http://mevius.5ch.net/test/read.cgi/tech/1073673931/420
421: デフォルトの名無しさん [sage] 2008/10/03(金) 06:08:32 : pushTOStoReturnStack postpone >r ; immediate : popFromReturnStackToTOS postpone r> ; immediate http://mevius.5ch.net/test/read.cgi/tech/1073673931/421
422: デフォルトの名無しさん [sage] 2008/10/03(金) 12:26:50 自分も420に賛成する、forthは裸の2スタックマシンのアセンブラと思えばいいんだけど、それがつらいとちょっときついと思う ただ、それがインタラクティブ環境を作るあたりと小さな核で構築できるのが非常に面白いのでがんばって覚えてみてよ。 逆に言うと簡単にぶっ壊れるとも言う http://mevius.5ch.net/test/read.cgi/tech/1073673931/422
423: デフォルトの名無しさん [sage] 2008/10/03(金) 16:59:48 Cとかの他の言語の常識持ち込もうとしてるヤツいないか? 「Forthではこう書く」ってのに納得いかないなら 悪いことは言わんから、使うのやめとけ http://mevius.5ch.net/test/read.cgi/tech/1073673931/423
424: デフォルトの名無しさん [sage] 2008/10/03(金) 17:54:20 スタックっつうのはあくまで機械にやさしいものであってユーザーフレンドリーなものじゃないしな http://mevius.5ch.net/test/read.cgi/tech/1073673931/424
425: デフォルトの名無しさん [sage] 2008/10/03(金) 18:38:23 頻繁にスタックを意識しないといけないのは悪いForthコード http://mevius.5ch.net/test/read.cgi/tech/1073673931/425
426: デフォルトの名無しさん [sage] 2008/10/03(金) 20:05:40 正直アセンブラの方が楽だよ http://mevius.5ch.net/test/read.cgi/tech/1073673931/426
427: デフォルトの名無しさん [sage] 2008/10/03(金) 20:24:33 慣れると気持ちいいよJoy。forthは知らんけど http://mevius.5ch.net/test/read.cgi/tech/1073673931/427
428: デフォルトの名無しさん [sage] 2008/10/03(金) 20:29:08 >426 Forthは仮想スタックマシンのアセンブラだから、 (仮想)マシンの理解度によるだろな。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/428
429: デフォルトの名無しさん [sage] 2008/10/03(金) 22:29:45 いや、もっと視認しやすい記号セットを使ってくれって話だろ。 ハイライトできるエディタで単語登録するか、トランスレータでもかますのがいいと思う。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/429
430: デフォルトの名無しさん [sage] 2008/10/03(金) 23:01:49 ところでリターンスタックって別に必要なの? 普通のCPUは1本だよね。 スタックに対して相対アドレッシングがないからってことかな? http://mevius.5ch.net/test/read.cgi/tech/1073673931/430
431: デフォルトの名無しさん [sage] 2008/10/03(金) 23:57:29 >419 >rとr>は確かに見た目がわかりにくい。 よほどのことが無い限り使わない。 localがあれば要らない。 >430 呼出しのときにデータスタックで直接パラメターを渡すためでしょう。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/431
432: デフォルトの名無しさん [sage] 2008/10/04(土) 00:00:27 >>430 普通のアーキテクチャだと関数呼び出しのスタックにパラメータも突っ込んじゃうけど forthはデータのpushと関数呼び出しの戻りアドレスが入るスタックが別なんよ。 っていうか別だから面白いことができるので、一緒だったらループとかで涙が出そうだと思う。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/432
433: デフォルトの名無しさん [sage] 2008/10/04(土) 00:10:21 SP, BPレジスタに相当するものがあれば良いのでは http://mevius.5ch.net/test/read.cgi/tech/1073673931/433
434: デフォルトの名無しさん [sage] 2008/10/04(土) 17:45:11 リターンスタックとデータスタックが一緒だと、 リターンアドレスを壊さないようにデータをいじるのがメンドイ。 リターンアドレスが詰まれている位置を避けるようにして スタックをアクセスしなきゃいけないから。 それはSPとBPがあってもメンドイことに変わりはない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/434
435: デフォルトの名無しさん [sage] 2008/10/04(土) 19:46:33 >>430 まあ、便利だから? 実装としてはバローズのメインフレーム見たく演算とリターン アドレス保存を一本のスタックでこなすものもあるよ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/435
436: デフォルトの名無しさん [sage] 2008/10/04(土) 21:37:24 factorだともうひとつスタックあるよ http://mevius.5ch.net/test/read.cgi/tech/1073673931/436
437: デフォルトの名無しさん [sage] 2008/10/04(土) 23:25:44 データスタックとリターンスタックがないと チューリングマシンと等価じゃないらしいぞ http://mevius.5ch.net/test/read.cgi/tech/1073673931/437
438: デフォルトの名無しさん [sage] 2008/10/05(日) 00:17:09 >>437 等価じゃないとはよく聞くけど、等価じゃないとする説明ってどっかにないですかね。 それで実用で困ることありますかね。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/438
439: デフォルトの名無しさん [sage] 2008/10/05(日) 01:12:05 今理解した。 リターンスタックってそのままBP相当じゃん。 ほんとはBPポインタ一個あれば十分だよね? 素直にBPを持たずにわざわざリターンスタックなんて用意してるのは、 スタックマシンと言えなくなるからかね。 なんだかなあ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/439
440: デフォルトの名無しさん [sage] 2008/10/05(日) 03:10:12 BPあってもメモリがないとな http://mevius.5ch.net/test/read.cgi/tech/1073673931/440
441: デフォルトの名無しさん [sage] 2008/10/05(日) 03:49:49 今理解した。 BPってそのままリターンスタック相当じゃん。 ほんとはリターンスタックあれば十分だよね? 素直にリターンスタックを持たずに、わざわざBPなんて用意してるのは、 レジスタマシンと言えなくなるからかね。 なんだかなあ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/441
442: デフォルトの名無しさん [sage] 2008/10/05(日) 07:20:41 >>437 メモリアクセスできない純粋なスタックマシンなら、スタックが二本ないと チューリング等価ではないかも知れないが、FORTHはメモリアクセス @ ! が あるから、たとえスタック一本であってもチューリング等価じゃね? 考えてみればわかるが、メモリアクセスがあるとスタックの本数を自由に増やせる。 FORTHとスタックマシンとConcatenative言語は、それぞれ別の概念で、 単純に等号で結べないから、何について話しているのか意識しないと混乱すると思われ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/442
443: デフォルトの名無しさん [sage] 2008/10/05(日) 09:51:29 ForthのVMとしては、 論理的には最低限二つの区別されたスタックがある。 標準的な実装での利点(v.s.スタックフレーム方式)は、 サブルーチン間でのデータのコピーが減らせること。 スタックフレーム一本でやるのはCとかでも標準的な実装だけど、 VMという同じ抽象度で比べれば、Cにはスタックは無い。 VMが実装できれば機械自体の仕組みはどうでも良い。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/443
444: デフォルトの名無しさん [sage] 2008/10/05(日) 13:26:57 込み入った話は分からんけど、 とりあえずBF書けたらチューリング完全じゃなかったっけ? http://mevius.5ch.net/test/read.cgi/tech/1073673931/444
445: デフォルトの名無しさん [sage] 2008/10/05(日) 14:12:31 なんか話が噛み合ってない気がする。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/445
446: デフォルトの名無しさん [sage] 2008/10/05(日) 15:11:57 なんでそこまでチューリングマシンにこだわるのかわからん。 Forthがチューリングマシンであろうとなかろうと Forthで実用的なプログラムは書ける。 あともう一人、やたらリターンスタックを排除したがる奴も 何をしたいのかさっぱりわからん。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/446
447: デフォルトの名無しさん [sage] 2008/10/05(日) 17:47:31 まず当たり前の大前提の確認からだけど、Forthはチューリング完全だから。 仮にForthの仕様からリターンスタックだけを排除したとしても(それはForthとは呼べないだろうが) チューリング完全だ。理由は>>442 リターンスタックがBPで代用できるとか正直意味わからん。 スタック演算自体理解してない希ガス。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/447
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
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 429 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.035s