2 part forth (907レス)
2 part forth http://mevius.5ch.net/test/read.cgi/tech/1073673931/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
26: デフォルトの名無しさん [sage] 04/01/22 01:41 ユーザに書かせるスクリプトじゃなくて、内部で処理するバイトコードが FORTH系ってのは結構あるんじゃないかと。 処理系の高機能化と簡素化を両立する手段のひとつとして。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/26
56: デフォルトの名無しさん [sage] 04/02/18 12:27 第3問 : foo twice ." Hello" ; でfooを実行すると HelloHello を出力するようなtwiceを定義してみれ。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/56
59: デフォルトの名無しさん [] 04/02/19 17:08 人少ないなぁ。 第4問 : AA reverse ." AA" ; : BB AA ." BB" ; : CC BB ." CC" ; でCCを実行すると CCBBAA を出力するようなreverseを定義すれ。 ‥‥‥実はコレ第3問のヒントだったりする。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/59
62: デフォルトの名無しさん [] 04/02/20 12:42 懲りずに第5問。 : foo ." 1 " resume ." 2 " resume ; : bar ['] foo call/cc ." 3 " resume ." 4 " drop ; で、barを実行すると、 1 3 2 4 と表示するような、resumeとcall/ccをがんがって定義してみれ。 ちなみに、この2つのワードは以下のスタックコメントに示すような 引数と返り値を持つものとする。 resume ( continuation -- continuation' ) call/cc ( xt -- continuation ) # ワード名とスタックコメントの名前がアレですが、 # 字面に惑わされなければ、仕様を満たすのは簡単なはず。 # 第3問〜第5問は基本的に同じカラクリ、というのがヒント。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/62
103: デフォルトの名無しさん [sage] 04/06/13 04:16 forthのソースが読みたいんですけど一番小さいのて何ですかね? http://mevius.5ch.net/test/read.cgi/tech/1073673931/103
211: デフォルトの名無しさん [sage] 2005/04/23(土) 23:02:44 >208 数字が出たら、素直にスタックに積んで、 トークンが出たら、変数領域を参照して、あったらスタックに積んで、 なかったら、命令領域を参照してあったら、命令にスタックそのものを渡して計算させる。 命令と変数は基本的にstd::mapを使ってコールバックの形などで実現する。 whileとかの解析で思考が詰まってたところだよ。 いっその事、字句解析機もコールバックに渡してしまおうとおもってた。 字句解析には、BOOST::tokenizerを使う。 スタックに積む形式はBOOST::anyあたりがいいかなーと、バリアント変数好きの自分は考えていた。 辞書作成(実質サブルーチン)はちょっとてまかかりそうだけど、evalっぽいの実装すればいけそうだとか考えてた。 とかとか、漠然と考えたことはあるんだけど、実行効率は落第点だろうね。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/211
227: 211 [sage] 2005/04/26(火) 20:43:23 ttp://www-lab.ee.uec.ac.jp/text/forth/man/man.html こういうの発見。 意外とC並みのことができそうな感じ。 でも、スクリプトとしてはあんま必要なさそうなのが結構あるなー。 一つのスタックにdoubleとintを混在させる方法が結構面倒そうだ。 やっぱ、Boost::anyかなぁ・・・。any使っとくとその後の拡張が楽そうだな。(Win方面のハンドルとか。) うーん。 トンカチを持ってる人はすべての問題が釘に見えるっていうのがあるけど、 なんかそんな感じに陥っていそうな感じだ。 どうしよ。 >>226 オブジェクト指向のforthかな?? マニュアルないから、パラメータの意味がわかりにくいな。(引数とかとか。) でも、ちゃんとアプリできてるのはすごいと思う。 適当なOS向けの拡張ってどうやってやるんだろう。 Boost::anyにハンドル類を突っ込むしか思い当たらない・・・。 スタック何本いるんだろ。3本かな・・・?? というか、キューとかにしちゃってもいいのか?? http://mevius.5ch.net/test/read.cgi/tech/1073673931/227
265: デフォルトの名無しさん [sage] 2005/12/10(土) 01:54:03 FORTHは全部が後置記法に統一されてないのがちぐはぐで嫌 http://mevius.5ch.net/test/read.cgi/tech/1073673931/265
390: デフォルトの名無しさん [sage] 2008/08/02(土) 03:04:06 Forthの実装中sage 実装法のドキュメント付きで晒すかも http://mevius.5ch.net/test/read.cgi/tech/1073673931/390
430: デフォルトの名無しさん [sage] 2008/10/03(金) 23:01:49 ところでリターンスタックって別に必要なの? 普通のCPUは1本だよね。 スタックに対して相対アドレッシングがないからってことかな? http://mevius.5ch.net/test/read.cgi/tech/1073673931/430
437: デフォルトの名無しさん [sage] 2008/10/04(土) 23:25:44 データスタックとリターンスタックがないと チューリングマシンと等価じゃないらしいぞ http://mevius.5ch.net/test/read.cgi/tech/1073673931/437
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
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
496: デフォルトの名無しさん [sage] 2008/10/10(金) 00:55:01 >>495 「barのアドレス」と書くとbazの定義の中のbarの呼び出しのあるアドレスなのか、 それともbar自身の定義のアドレスなのか混乱するから、 ( ここ ) と表現したわけで、その違いがわかってるなら問題ないですよん。 あとポインタってわかるよね? http://mevius.5ch.net/test/read.cgi/tech/1073673931/496
497: デフォルトの名無しさん [sage] 2008/10/10(金) 01:03:18 >>495 その言い方で言えば、(ここ)はbarのアドレスですね。 正確には、bazの定義の中のbarのアドレス。 >>490 での例を少し補って、 : foo dup + ; : bar ( あっち ) dup * ; : baz foo ( ここ ) bar ( そこ ) ; と書けば、「barというワード自身」というのは( あっち )のことになる。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/497
514: デフォルトの名無しさん [sage] 2008/10/11(土) 06:54:12 >>464のやり方だと実行の度にリターンスタックに命令列のコピーが発生するわけだな。 対して普通のForthはリターンアドレス一つのコピーで済む。 Forthでは関数の戻り場所を実行時に入れ替えたりできる( >>59, >>62 ) わけだけど、 >>464のやり方だと命令列自体の入れ替えになるから相当面倒。 Forthの自由度をわざわざ減らしている気がするんだけどな。 でも作るというならがんがれ。 様々な進化があってこそ発展もある。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/514
517: デフォルトの名無しさん [sage] 2008/10/11(土) 13:26:05 464のVMだが、 ハードウェアレベルではもう一般化してる インストラクションのプリフェッチとおなじだよね。 マシン語のデコーダレベルでのVMという感じか。 実装する場合の最難題は条件付きジャンプだと思う。 IFとか不定ループをどう載せるかが鍵だな。 これを考えると、VMが仕組みとして単純になるかどうかは微妙だと思う。 まあ、ベタでやればできそうな気はするが、 ハードウエアの仕組みをソフトウェアで二重にしてるだけのような気がしないでもない。 http://mevius.5ch.net/test/read.cgi/tech/1073673931/517
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.034s