2 part forthat TECH
2 part forth - 暇つぶし2ch300:デフォルトの名無しさん
06/11/10 22:26:12 .net
>>298
>2年以上経つのにまだ300行ってないのか

FORTHプログラム張りなんだぜ?

301:デフォルトの名無しさん
06/11/28 05:56:22 .net
test

>>261-265
>>266,267

302:デフォルトの名無しさん
06/11/29 12:28:15 .net
: hoge foo bar ;

{ foo bar } hoge def #コードブロック
* foo bar hoge def #なし

303:デフォルトの名無しさん
06/12/09 03:15:37 .net
age
URLリンク(factorcode.org)

304:デフォルトの名無しさん
06/12/10 21:07:56 .net
虎擬の新年号付属基板に移植するプロジェクト

305:デフォルトの名無しさん
06/12/26 05:05:37 .net
>>301
おばかな流れにワロス


306:デフォルトの名無しさん
07/01/28 04:43:44 .net
a

307:デフォルトの名無しさん
07/02/27 19:51:33 .net
b

308:デフォルトの名無しさん
07/02/27 20:28:16 .net
FORTH のすごいところは 対話型の言語でありながらコンパイラだってとこじゃないのかなぁ…

309:デフォルトの名無しさん
07/02/27 20:57:50 .net
forthの凄いところは2スタックマシンと辞書による入れ子構造だと思う。



310:デフォルトの名無しさん
07/03/02 12:31:00 .net
(・∀・ )っ/凵 ⌒☆ VisualForthマダー?

311:デフォルトの名無しさん
07/03/02 12:34:49 .net
>>310
ムーアたん自ら開発済み。
URLリンク(www.colorforth.com)

312:デフォルトの名無しさん
07/03/30 06:30:41 .net
最近のCPUって、プログラムの自己書き換えができないとか聞いたけど、
そうだとするとFORTH実装するのつらいよね。

313:デフォルトの名無しさん
07/03/30 07:48:32 .net
たしかに今も昔もCPUの回路は自分で変更できないな。

314:デフォルトの名無しさん
07/03/30 23:27:06 .net
メモリ書き換えればいいじゃん >312

315:デフォルトの名無しさん
07/03/31 16:33:43 .net
>>314
最近のCPUってもコードキャッシュに先読みしたりしているから、
下手にメモリを書き換えると、先読みしたコードと、実際のメモリのコードが一致しなくなる。
ので、正常に動作しなくなったり、パイプラインにペナルティが発生して、動作がおそくなったりするらしい。

FORTHって、新しくワードを追加すると、自分自身が大きくなっていくような言語だから、
そこらへんどうすればいいのかわからない。
だれか教えてくれんかな。


316:デフォルトの名無しさん
07/04/01 05:04:00 .net
FORTH以前にコンピュータの基礎知識が混乱してるな。

317:デフォルトの名無しさん
07/04/01 12:54:31 .net
>>316
FORTHの事、知らないだろ。

318:デフォルトの名無しさん
07/04/01 13:11:17 .net
>>313
VBばっかり使ってないで、ハーバードアーキテクチャとノイマンアーキテクチャの違いに付いて勉強しろよ(w



319:デフォルトの名無しさん
07/04/01 16:33:44 .net
最近だとこの関係でJITコンパイラとXDビットでも問題になってましたな。
JIT関係にノウハウありそうだけど、良く判らん

320:デフォルトの名無しさん
07/04/02 05:03:35 .net
べつに何の困難もないと思うけどな。
パラメータスタックなんて自由度の低いポインタみたいなもんじゃん。

321:デフォルトの名無しさん
07/04/11 23:18:58 .net
なんかよくわからんけど、問題になりそうなのは、既存ワードの書き換え時だと思うので、

ワード書き換え→キャッシュをフラッシュ

でいいと思う。



322:デフォルトの名無しさん
07/04/23 23:27:41 .net
いかにForthでも、線路を作りながら電車を走らせるようなことはありません。
ワードをコンパイルした後、そのワードを実行するまでには
少なくとも実行ワード名を読み込むI/Oプロセスが介在するので、
人間にとっては一瞬でも、機械には一服する余裕があります。

あと、Forthのワードのオーバーライドは、
関数型言語によくあるようにプログラムの全体についてそのワードの定義を更新するのではなく、
再定義後に読み込まれる部分についてしか効果がありません。
後から遡って定義を変更できるようにするには、
初めから特別な方法で定義しておくようになっています。

こんな感じでどうでしょう。

323:デフォルトの名無しさん
07/04/24 06:20:31 .net
forthの人気のなさは異常

324:デフォルトの名無しさん
07/04/24 23:36:56 .net
異常だな。~ if ~ then ~ else のせいだったりするんかね?
……forthに何があったらもっと流行るかな?

325:sage
07/04/24 23:53:34 .net
て、むしろ正常ってこと?

326:デフォルトの名無しさん
07/04/28 23:24:51 .net
Forthを使いたいと思う人より、Forthの処理系を造りたいと思う人の方が多そうな予感

327:デフォルトの名無しさん
07/04/30 07:13:54 .net
自分もForthを作っているクチ
毎日、Forthでプログラム作ってるぜ!って奴はいますか?


328:デフォルトの名無しさん
07/04/30 08:55:54 .net
ど素人の趣味なので毎日はしませんが、Forth系じゃないコードはほとんど書きません。

むしろForthでForthを作れば良いのではないかと思います。

329:デフォルトの名無しさん
07/04/30 12:17:29 .net
>328
Schemeみたいに最低限のプリミティブを用意して、それからForthを組むようにしたら面白いかもね。
Lispだとこんな感じか。
URLリンク(ja.wikipedia.org)

Forthの場合、スタック関連の操作、代入、分岐、Immediate、postponeぐらいで
実装できそうな気がする


330:328
07/04/30 21:27:11 .net
>>329
古典的なForthみたいにですね。
昔はアセンブリで書いた核の部分は、今はCでいいですからね。
ただ、何を核にすれば必要十分なのかについて、あまり資料がないですね。
四則演算と論理演算(ビット操作)もあった方がいい気もしますが、どうなんでしょう
(Lispは四則演算はいらない?)。
gforthはそういうやり方らしいですけど、
実行速度のためCで書き込むプリミティブを多めに取ったと書いています。

はじめ漠然と考えていたのは、間接スレッディングのforth環境の上でネイティブ方式のforthを頭から書いてしまう
というようなことでした。Executableフォーマットのファイルを作るのが結構面倒ですけど。
そこまでしなくても、Cのダイナミックライブラリとのインターフェイスがforth上で書ければ、
ほとんど何でもforthでできるんですけどね。
逆に言えば、マシンやOSの低レベルの仕様を調べないと派手なことをするのは難しいので、
そこが難点かも知れません。

もともとforthは言語仕様自体は貧弱なので、
アプリケーション毎に自前の言語を組上げていくみたいな面白さもあります。
インプットストリームも弄れるので、シンタックスまで変更できますし。
それがあまり面白がられていないということですかね。

331:デフォルトの名無しさん
07/05/03 09:02:05 .net
昔、近所の古本屋で標準FORTHを100円で保護したのだが、捨ててしまった。漏れの馬鹿。
ところで、Beginning Forthを注文した。米国からなので2週間くらいかかりそう。

332:デフォルトの名無しさん
07/05/06 22:37:02 .net
Forthはともかく資料不足。よって今更ながら英語の入門書をもう一個:
URLリンク(www.mpeforth.com)
『Programming Forth』 - Stephen Pelc et al.

333:デフォルトの名無しさん
07/05/16 04:42:21 .net
汎用で考えるとやっぱり今どきスタックは32ビット長ですよねえ。
そこで移植にお勧めの埋め込み用32ビットプロセッサって何がありますか?
I/Oがたっぷり用意されているので遊べるかなって思いますがどうでしょう。

334:デフォルトの名無しさん
07/05/24 20:39:30 .net
パフォーマンス優先ならSHじゃね?
最近秋葉でも手に入りやすくなったし。

FORTHコンパイラをアセンブラでガリガリに書きたい人なら
アセンブラが書きやすいH8かな。

335:デフォルトの名無しさん
07/06/05 19:20:03 .net
φ(。。) めもめも

336:デフォルトの名無しさん
07/06/05 20:54:14 .net
HDLだけでFORTHは作れる?

337:デフォルトの名無しさん
07/06/11 13:07:14 .net
>>336
作れるみたいですね やってみたことないけどw
URLリンク(www.ultratechnology.com)
この中のMicroCoreって初めて知りました
URLリンク(www.microcore.org)

338:デフォルトの名無しさん
07/07/26 16:12:13 .net
joyの話しようぜ

339:デフォルトの名無しさん
07/09/15 23:22:38 .net
後で読む: i386 / Linux 向け Forth コンパイラの作り方。

URLリンク(www.annexia.org)

340:デフォルトの名無しさん
07/09/26 15:51:44 .net
CでForthの処理系を書いてみた。
GCにはBoehm GC、辞書にはJudy Arrayを使ったので
ほとんど手間がかかっていないわりに速かった。
まだ単純な処理しか出来ないけどrubyとかより速いかも。


341:デフォルトの名無しさん
07/09/29 00:15:24 .net
ささやかな期待

342:デフォルトの名無しさん
07/09/29 19:36:42 .net
rubyより遅いforhtなんてあるのか?

343:デフォルトの名無しさん
07/09/29 19:51:26 .net
>>342
rubyで書けばいいんじゃね?

344:デフォルトの名無しさん
07/09/30 17:21:13 .net
>>343
激しく楽しくない気が

345:デフォルトの名無しさん
07/09/30 19:36:18 .net
>>340
GC?

346:デフォルトの名無しさん
07/10/02 20:36:49 .net
>>345
Garbage Collector でそ。

347:デフォルトの名無しさん
07/10/02 22:29:09 .net
(forthに)GC?

てことじゃないか?

348:345
07/10/03 23:33:04 .net
>>347
フォローありがとうございます。

>>346
すみません。347さんの線でお願いします。

どう使うのかなあ?と。

349:デフォルトの名無しさん
07/10/04 15:23:24 .net
concatenative

350:デフォルトの名無しさん
07/10/07 11:41:29 .net
" hoge" は汚なく感じるな
"hoge" か " hoge " だろと

351:デフォルトの名無しさん
07/10/16 01:35:58 .net
URLリンク(www.forthfreak.net)

Programming guidelines when you start doing forth programming:
* try to keep your words to one line, two lines max
* try not to pass more than 3 items on the stack to a word, preferably only 2
* try not to juggle more than 3 items on the stack within a word if you can

352:デフォルトの名無しさん
07/10/24 17:49:19 .net
FreeBSD 6.2 では boot loder の動作を
コントロールするために ficl という forth が使われていて
るので、勉強中です。

FreeBSD のサーバーをリモートから管理しています。

以前のバージョンでは nextboot(8) で別ディスク上のカーネルを
次回のみテスト的に起動する設定ができたのですが、今のバージョン 6.2 では
nextboot(8) では同一ディスク内のカーネルのテスト的起動しかできません。

二台のディスクがついているマシンのそれぞれのディスクに別々にOSを
インストールして、交互にアップデートをかけたいのです。
リモートからのコントロールしかできないので、ssh のアクセスができなく
なると一万円払ってOS再インストールなので

そんなわけで、forth のcodeを見ているのですが、難しいです。 orz

FreeBSDのloader 改造したりしている人はいませんか?



353:デフォルトの名無しさん
07/11/03 19:38:03 .net
いまふ

354:デフォルトの名無しさん
07/12/22 11:53:19 .net
dsForthがアドエスで動くのはガイシュツ?

355:デフォルトの名無しさん
08/01/04 04:23:01 .net
notガイシュツ

356:デフォルトの名無しさん
08/01/27 13:50:29 .net
このスレの人たちが使う電卓はRPLだったりするの?


357:デフォルトの名無しさん
08/01/27 15:03:59 .net
HPの電卓?

358:356
08/01/27 17:17:11 .net
>>357
そうです。RPNの間違いでした。

359:デフォルトの名無しさん
08/01/27 18:59:27 .net
HP41CV,HP28,HP48SX,HP32S,と使ってきましたよ。
ちなみに今使っているHP35は問題大あり!



360:デフォルトの名無しさん
08/02/07 10:12:19 .net
Adobe高速JavaScript実装、バイトコードにForthを採用
URLリンク(journal.mycom.co.jp)

361:デフォルトの名無しさん
08/02/07 15:34:36 .net
LLVM涙目

362:デフォルトの名無しさん
08/02/07 21:52:21 .net
単なるスタックベースのVMなだけじゃないの?
JavaVMとか既存のVMと一緒でしょ

363:デフォルトの名無しさん
08/02/16 22:40:23 .net
急に某ゲーム機上で動くforthが作りたくなって>>339が挙げてるやつ読んでるんだが(まあこれはi386用だけど)、わかりやすいなこれ
実を言うと今までforthはあまり理解してなかったけど、モヤモヤしてたことがすっきりしてきた
しかしforthってシンプルで美しいなぁ
Lispやsmalltalkに負けないと思うのに、このマイナーさ…

364:デフォルトの名無しさん
08/02/17 00:09:41 .net
concatenative languageあたりをキーワードにWebをさまよってみると良いよ。
joy factorあたりが面白いかね。おいらも俺言語作成中。

365:デフォルトの名無しさん
08/02/17 00:24:42 .net
factor は良いねぇ。秘かに期待している。

366:デフォルトの名無しさん
08/02/18 11:50:59 .net

基本的に

1.stackの一番上と二番目の値に対して演算
2.stackの一番上だけ取り除く
3.stackのn番目と一番目を交換

の機能だけがあると思ってていい?


367:デフォルトの名無しさん
08/02/19 07:10:53 .net
concatenativeに?
それならスタックに対する関数適用だけかな

368:デフォルトの名無しさん
08/03/20 14:28:46 .net
forthのコメントってもしやforthで書かれてる?
( コメント ) ←これ

369:デフォルトの名無しさん
08/03/20 15:22:35 .net
>>368
実装にもよるけど、
ワード ( を読むと、フラグが立って、ワード ) まで無視する。
Forth で書いてある、ってこういう意味ってことでいいのかな?

370:デフォルトの名無しさん
08/03/20 15:50:12 .net
>>369
いやなんかマクロみたいな機能を使って書かれているのかなーと
forth知らないので全然分かんないんですけど

要するに↓みたいにforth言語で書かれているのか?ってことです
: ( hoge hoge ... ;

371:デフォルトの名無しさん
08/03/20 20:15:20 .net
『標準FORTH』だと pp.166 にある。

: ( 29 WORD DROP ; IMMEDIATE

29 は ')' のコード

WORD はスタックトップと同じキャラが出てくるまで入力を読んで、
その先頭のアドレスをスタックトップに置くワード。DROP は説明の
必要ないな。IMMEDIATE は直前に定義されたワードを、
イミディエイトワードにするワード。

C マガジンのきだあきらさんの連載『千言万語』の Forth の時に
紹介してたネタだったような気もする。

372:デフォルトの名無しさん
08/03/20 20:16:04 .net
千言万語単行本にならねーかな

373:デフォルトの名無しさん
08/03/20 21:37:32 .net
追加。
イミディエイトワード、というのが、プログラムの実行時ではなく
読み込み時に意味を持つワードなので、マクロのような機能と
言えるかもしれません。

374:デフォルトの名無しさん
08/03/21 07:42:46 .net
>>371-373
サンクス

URLリンク(www.geocities.jp)
これ見てるけどimmediateの意味がいまいちわからん…
何のためのものなんだ?

: ( 29 WORD DROP ; IMMEDIATE
例えば↑にimmediateがついてなかったらどういう動作になるんだろう

375:デフォルトの名無しさん
08/03/21 08:55:03 .net
仮に ( がイミディエイトワードで無かったとすると、

: hoge ほげほげ ( ほげほげ ) ;

とか書いた場合に、hoge の定義の一部として、実行される部分になって
しまいます。定義中でも直ちに実行されるワードがイミディエイトワードです。

376:デフォルトの名無しさん
08/03/22 10:18:31 .net
>>375
なるほど
理解した。サンクス

377:デフォルトの名無しさん
08/03/27 22:38:05 .net
最近、Concatenativeな言語というもの目にしたんでage



378:デフォルトの名無しさん
08/03/28 00:23:41 .net
なんか酷いのみつけてきたwwwww

ちょっと草植えときますね型言語 Grass
URLリンク(www.blue.sky.or.jp)

スタックマシン使ってるってだけみたいだが(俺には良く分からん)

379:デフォルトの名無しさん
08/03/31 10:36:35 .net
forth厨はなんでもかんでもスタックマシンにするな

380:デフォルトの名無しさん
08/04/03 02:09:52 .net
factorでHelloWorldのCGIやってみた
httpdからのfactor起動はバッチファイルで

USING: io ;
"Content-type: text/html; charset=Shift_JIS\n\n" print
"<HTML><head><title></title></head>\n<body>" print
"はろ~factor表\示可能\" print
"<br>\n</body></HTML>" print

なんか楽しいw

381:デフォルトの名無しさん
08/04/10 03:00:58 .net
あれ?factorの新しいの入れたら日本語出なくなった
エンコード関係?

382:デフォルトの名無しさん
08/05/14 14:10:30 .net
factorソースから入れるのめんどくさいな・・・
gitなんて初めて知ったよ

383:デフォルトの名無しさん
08/06/03 17:56:33 .net
何か面白い話無い?

384:デフォルトの名無しさん
08/06/05 11:05:57 .net
スタック1本で動作する処理系作れ

385:デフォルトの名無しさん
08/06/05 16:18:58 .net
バロースのメインフレームはシングルスタックなんだぜ?

386:デフォルトの名無しさん
08/06/05 18:37:49 .net
wikipediaより

> スタックを1つしか持たないスタックマシンは、
> 計算モデルとしては非常に弱い。例えば、1-スタックマシンでは、
> 0n1n(0の並びの後に同じ個数の1が並ぶ言語)のような単純な言語も認識できない。
> 1-スタックマシンの計算能力は、有限オートマトンよりも高いが、
> 決定性プッシュダウン・オートマトンよりも低い。

> 一方、複数のスタックを持つスタックマシンはチューリング機械と等価である。
> 例えば、2-スタックマシンでは、チューリング機械をエミュレートできる
> (チューリング機械のヘッド位置から左側のテープをひとつのスタックが代替し、
> 右側のテープをもうひとつのスタックが代替する)。

へぇ~

387:デフォルトの名無しさん
08/07/17 00:50:58 .net
factorのドキュメント消えてら

388:デフォルトの名無しさん
08/08/01 21:55:57 .net
V
URLリンク(en.wikipedia.org)(programming_language)

Onyx
URLリンク(www.canonware.com)

Forthもこれらも俺には使いこなせないんだけどね orz


389:388
08/08/01 21:57:15 .net
Vはこっちのページも
URLリンク(code.google.com)


390:デフォルトの名無しさん
08/08/02 03:04:06 .net
Forthの実装中sage
実装法のドキュメント付きで晒すかも

391:デフォルトの名無しさん
08/08/02 04:01:08 .net
forthって、引数の数ミスるだけで崩壊するよな

>>390
どんな俺フォースを見せてくれるんだい?
誰もいないしここ、日記帳のつもりで使ってくれよ。

392:デフォルトの名無しさん
08/08/02 06:07:26 .net
久々にレスキタワァ*・゜゚・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜゚・* !!!!!

393:デフォルトの名無しさん
08/08/02 08:44:15 .net
>>390
URLリンク(www.google.co.jp)

どんな言語使って作るかしらん
こんなの補助として使ってみるのも便利かもしらん

394:390
08/08/02 14:40:33 .net
過疎っぷりに見てる人もいないと思ったら、意外といたのね。

>>391
Forthの実装は初めてなので、古典的で教科書通りのIndirect Threaded Code、
Cで書いた仮想マシンの上で動かすってかんじで。
今はMac OS XとLinux(x86)とLinux Zaurus(arm)の上でぽちぽち書いてる。
ポータビリティーは良いのでメモリがあって速度も気にしなければ
簡単にマイコンにも移植可能だと思う。H8なら余裕かな。
今月のトラ技の78K0基板持ってるんだけど、こっちはきついかも。

>>392
あばばばばばば

>>393
おお、こんな面白いのがあったのね。
とりあえずアカウント取ってみた。
このスレに落書きしつつ、blogにまとめてけばいいかな。

ANS-ForthのCORE準拠を目指して
URLリンク(www.taygeta.com)
読んでるんだけど、けっこうめんどいなあ。
ある程度実装の目処がたったらコード晒してくつもり。
少々お待ちを。

395:デフォルトの名無しさん
08/08/04 22:59:11 .net
Forth は実装が簡単だって聞いてたんで、
自分も作ってみようとちょっと調べたんだけど、
仕組みがよく分からなかったし(ワードの定義とか)、
規格に沿った物にしようとすると意外に仕様が大きくて、
挫折しますた><

396:390
08/08/05 23:09:27 .net
>>395
辞書まわりは次の10個のワードがあればOK(たぶんね)

CREATE
COMMA(,)
[
]
IMMEDIATE
TICK(')
COLON(:)
SEMICOLON(;)
FIND
WORD

このあたりのワードの挙動は、
URLリンク(www.annexia.org)
ここのjonesforthを参考にすればいいと思う。
これをインスパイヤしたCと日本語のドキュメントを書いてるんだが・・・仕事が忙しくてね・・・
これをざーっと読んで、yforthあたりの簡単な処理系のコード眺めて
実際に動作を確かめればANS-Forthの準拠もそう難しくないかと。

たださ、ANS-Forthって処理系の内部の規定しすぎじゃね?
もっと好きなようにやらしてくれよ。一回確保したWORDが二度と解放できないとか、
文字列はヌル終端しない代わりに文字数を記憶するとか、ちょっと気持ち悪い気がする。



397:デフォルトの名無しさん
08/08/05 23:23:59 .net
>文字列はヌル終端しない代わりに文字数を記憶する
これは正当だと思う。ヌル終端がどれだけのバグを生み出しているか……

398:デフォルトの名無しさん
08/08/06 21:05:50 .net
実装としては文字列をヌル終端にしても可。
但し、文字数は必要、かつ、
ヌル終端を当てにしたコードを書いても一般には動く保証なし。
が規定の内容と思われます。他の規定も同様。

399:デフォルトの名無しさん
08/08/08 19:23:22 .net
ASCIIZはねーよマジで

400:デフォルトの名無しさん
08/08/09 16:38:27 .net
でも、C言語で作られたプログラムとの連携したいときは、NUL文字終端がいいよね。
C言語で作られたプログラムの数の多さ、便利さから言うと、無視できないなと。

401:デフォルトの名無しさん
08/08/09 18:30:35 .net
Cは捨てるのがよろしいかと。
C++をbetter Cとして使う方がまだましだと思う。

C++を使えないようなリソースのキツい環境で使うんだったらforthを直書きした方が良いんじゃね?

402:デフォルトの名無しさん
08/08/10 00:15:50 .net
>C++をbetter Cとして使う
それ最悪

403:デフォルトの名無しさん
08/08/11 00:15:21 .net
402 と同感だが、better Cとして使うのは FORTH 実装にはない(価値が少ない)だろ。
自己学習として作るならまだしも、
FORTHに期待される動作環境だったらアセンブリレベルの設計が必要だろ。
C++使うならC++的設計をしろって。

404:デフォルトの名無しさん
08/08/27 00:31:36 .net
forthチック俺言語のプロセスが回った記念カキコ。

forthだと引数管理がけっこう面倒だと思うけど、wordの名前に
引数の数の情報を盛り込んだら楽にならんかね?
俺言語ではこんな感じでドットの数=引数の数にしているんだけど、どう思う?
 1 2 ..sum
 1 2 3 .:sum
名前の衝突も起こりにくくなって一石二鳥かと思うんだけど。


405:デフォルトの名無しさん
08/08/27 09:31:38 .net
ドット打つのがひたすらめんどくさそう
ifだと.:ifになるの?

406:デフォルトの名無しさん
08/08/27 21:05:33 .net
こういう風にしたらどう?

・引数可変のワードは # で始まることとする
・ワード [ は現在のパラメータスタックポインタの値を
 リターンスタックに積む
・ワード ] は現在のパラメータスタックポインタの値と
 リターンスタックポインタのトップの値の差から
 パラメータ数を計算しパラメータスタックに積む

たとえば

[ 10 20 30 ] #sum

と書くと、#sum実行直前にはパラメータスタックは

10 20 30 3

となっていて、#sumは3つの数の和を求めればいいことがわかる。

407:404
08/08/27 22:38:18 .net
>405
そこは構文糖使った方がよろしいかと (a ? b ! cの三項演算子とか)

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

できるだけ前の計算結果に依存しないように考えると、セパレータのようなものを
スタックに積むのは良くないので、ワード単体で引数までを意味するようにしたい、
ということですな。


408:デフォルトの名無しさん
08/08/28 02:39:56 .net
prologみたいにsum/3みたいにするとか。
よく判ってないが。

409:デフォルトの名無しさん
08/09/19 17:01:15 .net
引数管理しなきゃいけないようなコードの構成だと崩壊しそう

410:デフォルトの名無しさん
08/09/25 03:11:26 .net
しばらくforthやってたら他の言語がいじれなくなってて驚いた。
のめり込むのは危険だなw

411:デフォルトの名無しさん
08/09/25 03:16:06 .net
>>407
そのセパレータってリスト終端のnullに相当するから
あながち間違ってないと思う。

412:デフォルトの名無しさん
08/09/25 21:54:56 .net
concatenativeの論理を詰めて行くと、
スタックの機構はコード設計のための因子から外されるのかも。

413:デフォルトの名無しさん
08/09/25 22:34:55 .net
>411
Wordの中でWordを呼ぼうとすると破綻するよ。

>412
結局はトップを基点とした対称性(みたいなもの)になるからな。
対称性があれば何でもOK

414:デフォルトの名無しさん
08/10/01 00:29:26 .net
スタック型プログラミング言語の最少命令セットを探して
Whitespaceに辿りついたのですが、
これよりも言語仕様的に小さいスタック型言語ってあります?

415:デフォルトの名無しさん
08/10/01 01:55:39 .net
define
call
return
conditional jump
push
pop

これだけで足りるかな?


416:デフォルトの名無しさん
08/10/01 07:09:50 .net
callに条件をつければjumpも省けるんじゃないか?

417:デフォルトの名無しさん
08/10/02 03:17:37 .net
それより、ひと目で何やってるか判るforth作ってくれないかな。
>>54-65とか何やってるのかわからん。
記号覚えればいいんだろうけど。
: は定義っぽいということは文脈で判った。許す。
>rとかr>は何かと。
;は文の終り?

LISPでいう 'a は (quote a)です、みたいに特殊記号をあまり使わずに
誰が見ても大体判るように、平易な形にならないかな。

418:デフォルトの名無しさん
08/10/02 17:56:08 .net
>>417
: word
でワードの定義開始、;で定義の終端
>r,r>はリターンスタックへのプッシュとポップ
>>54の括弧内はそのワードを実行するとデータスタックの状態がどう変わるかをコメントで表している
他の言語と違って裸のスタックが丸見えなんよ

419:デフォルトの名無しさん
08/10/03 02:22:08 .net
リターンスタックに何をプッシュ(とポップ)するの?TOSの内容ってこと?
>rとr>って判りにくいと思う。
一瞬で見分けられないというか。
不等号ちがうんかと。
記号使わずに全部記述的にできないかな。
mindとかそんなのかな。

420:デフォルトの名無しさん
08/10/03 03:00:42 .net
わかりやすい文法が欲しいのならforth系はあきらめた方がいいと思うよ

421:デフォルトの名無しさん
08/10/03 06:08:32 .net
: pushTOStoReturnStack postpone >r ; immediate
: popFromReturnStackToTOS postpone r> ; immediate

422:デフォルトの名無しさん
08/10/03 12:26:50 .net
自分も420に賛成する、forthは裸の2スタックマシンのアセンブラと思えばいいんだけど、それがつらいとちょっときついと思う
ただ、それがインタラクティブ環境を作るあたりと小さな核で構築できるのが非常に面白いのでがんばって覚えてみてよ。

逆に言うと簡単にぶっ壊れるとも言う


423:デフォルトの名無しさん
08/10/03 16:59:48 .net
Cとかの他の言語の常識持ち込もうとしてるヤツいないか?
「Forthではこう書く」ってのに納得いかないなら
悪いことは言わんから、使うのやめとけ

424:デフォルトの名無しさん
08/10/03 17:54:20 .net
スタックっつうのはあくまで機械にやさしいものであってユーザーフレンドリーなものじゃないしな

425:デフォルトの名無しさん
08/10/03 18:38:23 .net
頻繁にスタックを意識しないといけないのは悪いForthコード

426:デフォルトの名無しさん
08/10/03 20:05:40 .net
正直アセンブラの方が楽だよ


427:デフォルトの名無しさん
08/10/03 20:24:33 .net
慣れると気持ちいいよJoy。forthは知らんけど

428:デフォルトの名無しさん
08/10/03 20:29:08 .net
>426
Forthは仮想スタックマシンのアセンブラだから、
(仮想)マシンの理解度によるだろな。

429:デフォルトの名無しさん
08/10/03 22:29:45 .net
いや、もっと視認しやすい記号セットを使ってくれって話だろ。
ハイライトできるエディタで単語登録するか、トランスレータでもかますのがいいと思う。

430:デフォルトの名無しさん
08/10/03 23:01:49 .net
ところでリターンスタックって別に必要なの?
普通のCPUは1本だよね。
スタックに対して相対アドレッシングがないからってことかな?


431:デフォルトの名無しさん
08/10/03 23:57:29 .net
>419
>rとr>は確かに見た目がわかりにくい。
よほどのことが無い限り使わない。
localがあれば要らない。

>430
呼出しのときにデータスタックで直接パラメターを渡すためでしょう。

432:デフォルトの名無しさん
08/10/04 00:00:27 .net
>>430
普通のアーキテクチャだと関数呼び出しのスタックにパラメータも突っ込んじゃうけど
forthはデータのpushと関数呼び出しの戻りアドレスが入るスタックが別なんよ。

っていうか別だから面白いことができるので、一緒だったらループとかで涙が出そうだと思う。


433:デフォルトの名無しさん
08/10/04 00:10:21 .net
SP, BPレジスタに相当するものがあれば良いのでは


434:デフォルトの名無しさん
08/10/04 17:45:11 .net
リターンスタックとデータスタックが一緒だと、
リターンアドレスを壊さないようにデータをいじるのがメンドイ。
リターンアドレスが詰まれている位置を避けるようにして
スタックをアクセスしなきゃいけないから。
それはSPとBPがあってもメンドイことに変わりはない。

435:デフォルトの名無しさん
08/10/04 19:46:33 .net
>>430
まあ、便利だから?
実装としてはバローズのメインフレーム見たく演算とリターン
アドレス保存を一本のスタックでこなすものもあるよ。

436:デフォルトの名無しさん
08/10/04 21:37:24 .net
factorだともうひとつスタックあるよ

437:デフォルトの名無しさん
08/10/04 23:25:44 .net
データスタックとリターンスタックがないと
チューリングマシンと等価じゃないらしいぞ

438:デフォルトの名無しさん
08/10/05 00:17:09 .net
>>437
等価じゃないとはよく聞くけど、等価じゃないとする説明ってどっかにないですかね。
それで実用で困ることありますかね。

439:デフォルトの名無しさん
08/10/05 01:12:05 .net
今理解した。
リターンスタックってそのままBP相当じゃん。
ほんとはBPポインタ一個あれば十分だよね?
素直にBPを持たずにわざわざリターンスタックなんて用意してるのは、
スタックマシンと言えなくなるからかね。
なんだかなあ。

440:デフォルトの名無しさん
08/10/05 03:10:12 .net
BPあってもメモリがないとな

441:デフォルトの名無しさん
08/10/05 03:49:49 .net
今理解した。
BPってそのままリターンスタック相当じゃん。
ほんとはリターンスタックあれば十分だよね?
素直にリターンスタックを持たずに、わざわざBPなんて用意してるのは、
レジスタマシンと言えなくなるからかね。
なんだかなあ。


442:デフォルトの名無しさん
08/10/05 07:20:41 .net
>>437
メモリアクセスできない純粋なスタックマシンなら、スタックが二本ないと
チューリング等価ではないかも知れないが、FORTHはメモリアクセス @ ! が
あるから、たとえスタック一本であってもチューリング等価じゃね?
考えてみればわかるが、メモリアクセスがあるとスタックの本数を自由に増やせる。

FORTHとスタックマシンとConcatenative言語は、それぞれ別の概念で、
単純に等号で結べないから、何について話しているのか意識しないと混乱すると思われ。

443:デフォルトの名無しさん
08/10/05 09:51:29 .net
ForthのVMとしては、
論理的には最低限二つの区別されたスタックがある。
標準的な実装での利点(v.s.スタックフレーム方式)は、
サブルーチン間でのデータのコピーが減らせること。

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

VMが実装できれば機械自体の仕組みはどうでも良い。

444:デフォルトの名無しさん
08/10/05 13:26:57 .net
込み入った話は分からんけど、
とりあえずBF書けたらチューリング完全じゃなかったっけ?

445:デフォルトの名無しさん
08/10/05 14:12:31 .net
なんか話が噛み合ってない気がする。

446:デフォルトの名無しさん
08/10/05 15:11:57 .net
なんでそこまでチューリングマシンにこだわるのかわからん。
Forthがチューリングマシンであろうとなかろうと
Forthで実用的なプログラムは書ける。

あともう一人、やたらリターンスタックを排除したがる奴も
何をしたいのかさっぱりわからん。

447:デフォルトの名無しさん
08/10/05 17:47:31 .net
まず当たり前の大前提の確認からだけど、Forthはチューリング完全だから。
仮にForthの仕様からリターンスタックだけを排除したとしても(それはForthとは呼べないだろうが)
チューリング完全だ。理由は>>442

リターンスタックがBPで代用できるとか正直意味わからん。
スタック演算自体理解してない希ガス。

448:デフォルトの名無しさん
08/10/05 18:27:08 .net
リターンスタックという名前がいかんのだろ。


449:デフォルトの名無しさん
08/10/05 18:35:04 .net
>>437
スタックオートマトンとスタックマシンをごっちゃにしてる気がする。

450:デフォルトの名無しさん
08/10/05 18:39:13 .net
>>448
むしろリターンスタック以外の名前があるなら知りたいものだが。

451:デフォルトの名無しさん
08/10/05 19:02:41 .net
>442
大雑把にはこんな感じかね。
・データスタック: 引数&戻り値
・リターンスタック: 実行する命令列(辞書で展開された単語含む)

リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね


452:デフォルトの名無しさん
08/10/05 19:25:44 .net
リターンアドレスを積んでいるからリターンスタック
それでいいと思うが、難しく考えすぎじゃね?>>451

453:デフォルトの名無しさん
08/10/05 19:28:44 .net
Aスタック←→Bスタック
だったら勘違いが起きなかったと思う。


454:デフォルトの名無しさん
08/10/05 19:34:19 .net
>>453
むしろ勘違いを引き起こしそうなんだが。
リターンスタックが難しいんじゃなくて、
リターンアドレスをスタックに積むという
当たり前の関数呼び出し規約を説明しなければ、
理解されない時代になったということか…

455:デフォルトの名無しさん
08/10/05 21:59:43 .net
なんでリターンスタックの名前で混乱とか勘違いがあるの?
ひょっとして、リターンと聞いて戻り値を連想しちゃう人がいる、とか?
だとしたらかなりキビシい状況だな。

456:デフォルトの名無しさん
08/10/06 01:09:11 .net
カールスタックの方が一般的じゃね?

457:デフォルトの名無しさん
08/10/06 01:09:52 .net
あ、カールじゃなくてコールスタック

458:デフォルトの名無しさん
08/10/06 01:24:45 .net
カールはスナックだな

459:デフォルトの名無しさん
08/10/06 07:35:22 .net
カールと言えば薄べったいのが出てることを最近知った。
従来品に比べて口の裏に張り付きにくいのはメリットだが、
少し物足りない気がした。

460:デフォルトの名無しさん
08/10/06 11:21:56 .net
Forth では昔からリターンスタックと呼んできたので、その伝統に則ればいいと
思うんだけどな。Wikipedia だと項目はコールスタックで立てられているが。

461:デフォルトの名無しさん
08/10/06 12:10:36 .net
コールスタック->カールスナック->コーンスターチ->張り付かないならカールじゃない

勉強し過ぎでしょう。

462:461
08/10/06 12:30:27 .net
補:そもそもForthが一般的じゃない

463:デフォルトの名無しさん
08/10/06 21:49:04 .net
・リターンスタックが普通のCPUで言うとことの「スタック」。
 ワード(Cで言うところの関数、実際にはサブルーチン)
 を呼ぶと呼び出し戻るためのアドレスを積む。

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

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

・「辞書」が命令コードストレージ、C言語でいえばTEXTセグメント

Forthの本質は上記3点をおさえて置けば理解できるんだが。


BPがリターンスタックと等価なんて言ってる人とか、

>・リターンスタック: 実行する命令列(辞書で展開された単語含む)
>リターンスタックというよりもオーダースタックといった方がちょうど良い気がするけどね

なんて言っている人、本当に理解できてるの?

464:デフォルトの名無しさん
08/10/07 00:25:52 .net
>463
いや、別にWORDがサブルーチンである必要はないんじゃない?WORD毎の環境要らないんだし。
Cとの相性を考えるとサブルーチンにした方が良いと思うけど。

あと、CPUのアーキテクチャには疎いんだけど、最近のCPUでスタック持ってるのってあったっけ?


465:デフォルトの名無しさん
08/10/07 06:15:51 .net
x86アーキテクチャには思いっきりスタックポインタがありますが?

>>464のいう「最近のCPU」が非ノイマンアーキテクチャとかを指すなら
スタックがないCPUもあるかも知れないけど。

466:デフォルトの名無しさん
08/10/07 06:37:45 .net
>>464
前半は実装と仕様が混乱してそう。
後半は、たぶん、CPUの「レジスタアーキテクチャ」「スタックアーキテクチャ」と
データ構造としてのスタックを混同している。

Wikipediaやblog読んで理解した気にならないで実際に自分で手を動かしてみなよ。
ちょっと恥ずかし過ぎるぞ、あんた。

467:デフォルトの名無しさん
08/10/07 12:34:16 .net
>>464 の言ってる「スタック」はハードウェアスタックのことと思われる。

>>463
「データスタックってのは、言ってみれば「無限に増えるアキュムレータ」って感じ。」
ってのは、確かにハードウェアスタックを思わせる記述だが。

468:デフォルトの名無しさん
08/10/07 13:28:27 .net
post,preのincやdec付きレジスタ間接参照命令があればデータスタックと等価だよね?
リターンスタックってのはサブルーチンコール時に戻りアドレスをpushする為のレジスタの事でしょう?
なら今時のCPUで無い物の方が珍しいと思うんだけど


469:デフォルトの名無しさん
08/10/07 20:49:02 .net
x86って俺の生まれる前からあるな。
定年過ぎた方には最近なんでしょうけど。

470:デフォルトの名無しさん
08/10/07 21:09:44 .net
定年過ぎて無く立ってプロセッサ自体30年の歴史しかないじゃないか


471:デフォルトの名無しさん
08/10/07 21:36:31 .net
最近のCPUは古いアーキテクチャのものがほとんどだよね。
細かいところは違うんだろが。

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

まあ、リターンスタックは、
リターンアドレスを積むため専用(原則)のスタック
ってことがわかれば、いいじゃない。
データスタックと別にある利点もわかってるわけでしょ。

本当は「リターンスタックがあること」じゃなくて、
データスタックが複数のワードを横断して固定されていること、
の方が特徴だよね。
普通の言語の実装だと、
データスタックがサブルーチンごとに別々にリターンスタックの中にあって、
受け渡すデータはコピーする、
という感じなわけだ。比喩的に言えば。

アセンブリレベルでもリターンアドレスのpush/popが自動になってるなら、
気付かない人がいてもしょうがない。

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


forthあんまり詳しくないんで済まんのだけど、『リターンスタックには、ワードを呼ぶと呼び出し戻るため
のアドレスを積む』んだっけ?
正規化の観点からは『まだ実行していないWORD』もリターンスタックに積めた方が便利だと思うけど。
WORDコンパイルの実装で手が抜けなくなるし……


473:デフォルトの名無しさん
08/10/07 23:56:37 .net
>>472
意味が理解できん。
「まだ実行してないWord」を積む、って具体的に何を積むの?
まだ実行してないワードのアドレスなら辞書に入ってると思う(関節スレッディングの場合)

474:デフォルトの名無しさん
08/10/08 04:22:01 .net
>>469
いまでも現役バリバリで使われていて
マイクロソフトの最新OS「VISTA」がポーティングされる
x86アーキテクチャが「最近のCPU」では無いとでも?

あるいはCore2DUOとかがX86アーキテクチャじゃないとでも思ってる?

475:デフォルトの名無しさん
08/10/08 06:31:12 .net
>>472
Forthと関係なく、関数の呼び出し元に戻るためにアドレスをスタックに積む、
という動作は、アセンブリレベルでは普通の関数呼び出し規約。
Forthは言語レベルでリターンスタックを操作できる言語だけど、
普通は意識しなくてもいいから、リターンアドレスが何のために存在しているのか
理解できない人がいても不思議じゃないけど、せめてもう少し自分で勉強して欲しい。

476:デフォルトの名無しさん
08/10/08 06:35:19 .net
>forthあんまり詳しくないんで済まんのだけど、
とか、逃げをうたず自分で触ってみろよ。

477:デフォルトの名無しさん
08/10/08 14:37:36 .net
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:デフォルトの名無しさん
08/10/08 18:17:31 .net
>>441=477
それを実際に作って発表したら
いままで君をバカにしていた連中にギャフンと言わせられるよ。
ガンバ。

479:デフォルトの名無しさん
08/10/08 18:47:05 .net
で、その「ボクが考えたforth」では、
パラメタはどうやって渡すんだ?

480:デフォルトの名無しさん
08/10/08 19:05:03 .net
どう考えても普通にCALL/RETした方が速そうだけど
わざわざ面倒くさくしてどうするの?

あと、ENTER/LEAVEとか使わないの

481:デフォルトの名無しさん
08/10/08 21:00:40 .net
>>477
もはやどこから突っ込んで良いものやら…
二つほど疑問が。

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

: foo drop drop 3 4 5 ;
1 2 foo

としたときにスタックがどのように変化していくのか書いてみてくれ。
解決方法を考えられなくもないが、たぶん独立したリターンスタックが
あるほうがシンプルだと思われ。

二つ目。

リターンスタックを操作する命令はどうやって実装するの?
これも独立したリターンスタックがあるほうがシンプルだと思われ。

forthじゃない何かをつくろうとしているのだろうか?

482:デフォルトの名無しさん
08/10/08 21:16:43 .net
二つ目用の問題も書いておくよ。

: bar 1 2 3 >r >r 1 + r> r> ;



483:デフォルトの名無しさん
08/10/08 23:38:28 .net
混乱してるようだから、
まず、ネイティブの場合とスレッディングの場合を分けて考えた方がいい。
ネイティブForthで自然な実装では、
SP=リターンスタックポインタ(RSP)
BP=データスタックポインタ(DSP)
となってる。
UNIX/Cの普通のスタックを知ってれば、機能的な対応は明瞭なはず。
リターンスタックが伸びても、DSPは別フレームに移らないのがForthのポイント。

ちなみに、Forthでも局所変数が使えるヤツがあって、
その局所変数には、リタースタック中にフレームを作って割り当てるのが普通。
これも、標準のスタックがわかってれば意味は明瞭。

スレッディング(直接・間接)方式だと、
呼出しはCallじゃないから、
BPをRSPにしてもかまわんが、
パラメタとリターンアドレスの混合は、
Forthでは無謀。動的にチェックが必要な上に、完璧にはできそうにない。

484:464
08/10/09 01:15:39 .net
446です。
forthは興味半分で使ったレベルでしかないですね……
concatenative俺言語の設計の参考にしているぐらいです。

>473
リターンスタックを「次に実行する命令の列」という形に抽象化すると、「現在処理中のWORD」と
「ソースコードを解釈したWORD」「Dictionaryに保持されているWORD列」…つまり呼び出されて
いないWORDを対称(等価/交換可能)に扱うことができるようになるので、バーチャルマシンの
構造を簡単化することができるかと思います。
……forthで許されているのかしらんけど。



485:デフォルトの名無しさん
08/10/09 06:24:10 .net
リターンスタックに積んであるリターンアドレスは、
「これから実行される命令列」へのポインタそのものと見なせるから、
そのアイデアが新しいとは思えないけどな。
Forthぐらいバーチャルマシンの実装が簡単な言語もないし。

ただ、リターンスタックの意味がよくわからないままに、
他の言語のように抽象構文木を再帰的に処理するような
実装にしていると、リターンスタック操作の実装で悩むの
かもしれない。

486:464
08/10/09 08:54:40 .net
>485
>463は呼び出したWORDを積むことを前提にしているし、>451 >472で言ってるのが >463 >473で
思い切り否定されてるので、forthじゃそういう考え方無いのかな、と思った。
もしforthでもそういう使い方しているんだったらおいらの不勉強だね。


487:デフォルトの名無しさん
08/10/09 10:46:32 .net
>>486
485のいってる意味は、
スレッディング方式のforthでは、
辞書は実行されるワードのポインタのリストとみなせるわけで、
リターンアドレスというのは、辞書内への戻りアドレス、
つまり、これから実行されるワードのリストへのポインタといえる
ということと思われる。

ワードのポインタを直接リターンスタックに積み込むような、
インストラクションキャッシュみたいな仕様のリターンスタックの実装は、
ちょっと聞いたことが無い。
というかそれじゃリターンスタックじゃない。

488:デフォルトの名無しさん
08/10/09 20:52:04 .net
487の言わんとすることを俺なりに解釈してみる…

: foo dup + ;
: bar foo drop ;
bar の処理中に foo を実行するときに、
foo の次の drop のアドレスをリターンスタックに積む。
それで、foo の実行終了時にリターンアドレスから戻り先を取る。
これが、さっき積んだ drop のアドレスということ。

で、「drop のアドレス」っていうのを「ポインタ」と呼んでいる。


489:デフォルトの名無しさん
08/10/09 21:08:57 .net
fooが呼ばれたときのリターンアドレスは 「dropのアドレス」というより
「dropの直前のアドレス」だ。
微妙なニュアンスに聞こえるかもしれないが。

: bar foo ( ここ ) drop ;

( ここ ) と書いた部分に戻ってくる。

490:デフォルトの名無しさん
08/10/09 21:12:38 .net
: foo dup + ;
: bar dup * ;
: baz foo ( ここ ) bar ( そこ ) ;

foo が呼ばれたときリターンスタックには( ここ )が積まれてる。
bar が呼ばれたときリターンスタックには( そこ )が積まれてる。

bar というワード自身がリターンスタックに積まれているのではない。

491:デフォルトの名無しさん
08/10/09 21:16:04 .net
ついでに >>56 のリターンスタックを使ったパズルの説明でも書いておこう。

問題は、

: foo twice ." Hello" ;

で、

HelloHello

を出力する twice を定義しろというパズル。

492:デフォルトの名無しさん
08/10/09 21:22:30 .net
解答は、

: twice r> dup >r >r ;

何が起きているか説明すると、twice が呼ばれたとき、リターンスタックには、

: foo twice ( ここ ) ." Hello" ;

上の( ここ )が積まれている。
twice は最初に r> を実行して、( ここ ) をリターンスタックからデータスタックに移している。
次の dup で ( ここ ) がデータスタックに二つ積まれた状態になる。
最後に、 二つの >r で ( ここ ) が二つリターンスタックに戻される。

493:デフォルトの名無しさん
08/10/09 21:27:12 .net
さて、定義されたワードの終端に到達したので Forthは、
リターンスタックからリターンアドレスを一つ取り出してそこに戻ろうとする。

: foo twice ( ここ ) ." Hello" ;

↑これの ( ここ )に戻ってくるわけだね。
そして、Helloを出力する。

そしてまた定義されたワードの終端に到達するので、Forth は
リターンスタックからリターンアドレスを一つ取り出してそこに戻ろうとするわけだ。

つまり、もう一度 ( ここ ) に戻る。
もう一度、Helloが出力されたら、次にリターンスタックからpopされる
リターンアドレスは foo を呼び出したアドレスなので、ここでようやく、
foo の実行が終了することになる。

494:デフォルトの名無しさん
08/10/09 21:29:45 .net
リターンスタックに積まれているリターンアドレスは、
次に実行すべきワード単体ではなくて、
それ以降、実行すべきコード全体の先頭を指し示すアドレスだ、
と、理解できたかしらん?

495:488
08/10/10 00:34:56 .net
(ここ) は分かってるつもりなんですが、
メモリアドレス的に的確に伝えるには難しいような気が。。。

: baz foo ( ここ ) bar ( そこ ) ;
16bitアドレス環境として、スレデッドコードで考えると、
(ここ)は foo のアドレスと同じか、それとも +1 でしょうか?
# foo のアドレス +2 すると bar のアドレスですよね

なんかアホなこと言っているようですみません。

496:デフォルトの名無しさん
08/10/10 00:55:01 .net
>>495
「barのアドレス」と書くとbazの定義の中のbarの呼び出しのあるアドレスなのか、
それともbar自身の定義のアドレスなのか混乱するから、
( ここ ) と表現したわけで、その違いがわかってるなら問題ないですよん。
あとポインタってわかるよね?

497:デフォルトの名無しさん
08/10/10 01:03:18 .net
>>495
その言い方で言えば、(ここ)はbarのアドレスですね。
正確には、bazの定義の中のbarのアドレス。
>>490 での例を少し補って、

: foo dup + ;
: bar ( あっち ) dup * ;
: baz foo ( ここ ) bar ( そこ ) ;

と書けば、「barというワード自身」というのは( あっち )のことになる。

498:496
08/10/10 01:20:54 .net
>>497
補足ありがとう。

>>486の書き込みの問題点を考えてみると、Forthのリターンスタックは、
明らかに「WORDを積」んではいない。
WORDを積むという表現で想起されるのは、>>497の( あっち ) を積むという
ことだとForth使いは受け取るだろうから。
そして ( ここ ) や ( そこ ) は明らかに>>484の「次に実行する命令の列」を
指し示しているわけなので、何が新しいのかよくわからない、という感想に
なるのだと思う。

499:464
08/10/10 01:36:27 .net
>498
新しいかどうかなんて知らんよ。単にWORDの扱いを正規化できてVMが簡素になるっつうだけの話。
>497で言及している(ここ)(そこ)みたいな間接ポインタをVMで扱う必要も無くなるし。

まあ、その皺寄せをWORDに押し込んでるだけなんだけどね。

500:496
08/10/10 01:42:51 .net
>>499
なんていうか…
「(ここ)(そこ)みたいな間接ポインタ」というそれそのものが、
アセンブリ言語の時代からある「リターンアドレス」という概念なんですよ…。
Forthはそれをリターンスタックに分離して保存・復帰しているだけのこと。

501:デフォルトの名無しさん
08/10/10 06:35:09 .net
>>491

>そして、Helloを出力する。

. "Hello"
がなんでHelloを出力することになるの?
"Hello" .
じゃないのはなんで?
文字列リテラルは特別扱い?

502:デフォルトの名無しさん
08/10/10 08:32:35 .net
>500
今は実際のリターンアドレスの話をしとらんよ。
リターンスタックを「次に実行する命令の列」という形に抽象化するっつうとるだろうに。


503:デフォルトの名無しさん
08/10/10 08:46:05 .net
>>501
." とか、 前付きの " は、Forthではただの引用符じゃなくて、一つのワード。
だから、Helloとの間に空白が要る。
但し、終わりの " はセパレーターだから、空白なしで良い。

前にも出てたけど、
Forthでは文字列リテラルはポインタと長さの二つの数値で表す。
「.」は、トップアイテムを一つpopして値をプリントするワードだから、

" Hello" .

だと5がプリントされるだけ。文字列ポインタがスタックに残る。

「."」 が 「次の " までの文字列をプリントする」というワード。
文字列をスタックに積んだときは

" Hello" type

とやる。


504:デフォルトの名無しさん
08/10/10 08:52:55 .net
>>502
だから、「次に実行する命令列」は辞書の中に既にあるんであって、
それはスタックである必要はなくて、いってみればアレイ。
辞書の中で実行は動的に行ったり戻ったりするから、
やっぱりリターンアドレスの保存は必要。

505:デフォルトの名無しさん
08/10/10 09:06:11 .net
>>503
>「."」 が 「次の " までの文字列をプリントする」というワード。
なんじゃそら
ワロタ

506:デフォルトの名無しさん
08/10/10 17:24:55 .net
factorだと文字列リテラルはあるよ

507:488
08/10/10 22:08:31 .net
>>496,497 サンクス

スレデッドコードと書いておいて誤解がなかったようだ。
497 のレスだと、俺の中では「次のワード」という認識になる。
(あっち)という表現を使えば確かに誤解はなくなる。

なんだか、リターンスタックのデータ内容と、
(サブルーチン)リターンアドレスを混同した希ガス

508:464
08/10/11 00:37:41 .net
>504
「必要がないから積まない」じゃなくて、「VMの原理を簡単にするために積む」んだって。
VMが辞書の中を行ったり来たりしないようにするのが目的。
もちろん、VMの仕事をWORDに移管しただけの話だし、スタックが大きくなるデメリットもあるけどな。

509:504
08/10/11 01:03:24 .net
>>508
つまり、ワードを全部インラインにするということ?
それなら確かに理論的には可能だし、リターンスタック自体要らない。
普通は、大きくなるのはスタックじゃなくて辞書だな。

まあ、辞書からインラインで展開したものを
リターンスタックにコピーしてもいいけど、
ランタイムにやるなら相当動作が遅くなると思う。
それに、
なぜそのためにスタックというデータ構造を使うのかがわからない。
後ろから先に積んでいくことになるわけだが。

その発想はインストラクションキャッシュだと思う。
だから、むしろキューがいいと思う。
ソフトウェア的にやると相当遅いとは思うけど、
論理的には可能だと思うよ。

510:デフォルトの名無しさん
08/10/11 02:00:15 .net
サンクス >693

5 ソースコード
6 boost::spirit
というので激しく不安になるな。

というか、スクリプトの入門というのなら、BASICタイプ言語の作成とかCタイプ言語の作成
とか分散しないで、どっちか一つに集中すべきじゃない?

入門だったら、むしろ構文はシンプルなforthライクにして、エンジンの中身に拘るべきだと思うけど……


511:デフォルトの名無しさん
08/10/11 02:02:28 .net
誤爆スマソ

512:464
08/10/11 02:18:22 .net
>509
いや、基本はWORD呼び出し時に展開(そのWORDに定義されたWORD列をスタックに押し込む)。
WORDコンパイル時に全部インラインに展開するわけじゃないです。
#高速化を目的として、WORDコンパイル時にある程度はインライン化することになると思うけど。

WORDに定義されたWORD列を、実行時にその場で積んでその場で処理する必要があるから、
FIFOの仕組みが必要になります。

まあ、小まめにWORDの積み降ろしをやらなきゃいけないから、確かに重そうだけどね。




513:デフォルトの名無しさん
08/10/11 05:37:05 .net
464のやり方は、ありえなくはないけどForth的じゃないね。
どっちかっていうとJava VMのJITコンパイラみたいな。

Forthはシンプルな実装で軽い、ってイメージ。

514:デフォルトの名無しさん
08/10/11 06:54:12 .net
>>464のやり方だと実行の度にリターンスタックに命令列のコピーが発生するわけだな。
対して普通のForthはリターンアドレス一つのコピーで済む。
Forthでは関数の戻り場所を実行時に入れ替えたりできる( >>59, >>62 ) わけだけど、
>>464のやり方だと命令列自体の入れ替えになるから相当面倒。
Forthの自由度をわざわざ減らしている気がするんだけどな。

でも作るというならがんがれ。
様々な進化があってこそ発展もある。

515:464
08/10/11 13:07:00 .net
>513
いや、実装はこっちの方がシンプルだよ。辞書の解釈を全部WORDに押し付けることができるから。
ただ、スタック操作が増えるから重くなる方向だけどね。

>514
リターンアドレス前提だと難しいよね。作業用スタックがもう一本ありゃいいんだけど。
俺言語のVMだと自前スタックで実装しているので大した話じゃないです。

516:464
08/10/11 13:22:12 .net
>514
ちょっと補足。
複数のWORDを押し込もうとすると確かに面倒だね。
俺言語でも
 1. 無名WORDを作る
 2. 1.のWORDに実行するWORDを押し込む
 3. 1.のWORDをリターンスタックに押し込む
といったパック化が必要になります。

517:デフォルトの名無しさん
08/10/11 13:26:05 .net
464のVMだが、
ハードウェアレベルではもう一般化してる
インストラクションのプリフェッチとおなじだよね。
マシン語のデコーダレベルでのVMという感じか。

実装する場合の最難題は条件付きジャンプだと思う。
IFとか不定ループをどう載せるかが鍵だな。
これを考えると、VMが仕組みとして単純になるかどうかは微妙だと思う。
まあ、ベタでやればできそうな気はするが、
ハードウエアの仕組みをソフトウェアで二重にしてるだけのような気がしないでもない。

518:464
08/10/11 13:38:04 .net
>514
思い出した……>59を実現するにはreverse自体のパック化も必須なんだっけ。
そういや>59みたいな操作をどうしようか悩んだな。

ただ、こういったWORDを跨ぐ暗黙的なリターンスタック制御てけっこう危険じゃない?
個人的にはWORDはデータスタックの状態にのみ依存すべきだと思うけど、WORDを越えた
範囲までリターンスタックを操作できるようにすると、WORD同士の依存関係が出てしまって
連鎖性(concatenative)が崩れるような気がする。
forthの条件分岐でも、セパレーターを使った明示的な制御をしているわけだし。

519:464
08/10/11 13:49:31 .net
連投スマソ
>517
そうか、CPUだともう一般的なのか……。さすがに天才的な変態が集まる業界だな。
やっぱりCPUのアーキテクチャ勉強しないといけないなあ。

IFは構文解析で逃げました。
block := block ? WORD1 ! WORD2
という三項演算子を用意して、条件分岐用WORDに解釈するようにしました。
不定ループの構文を用意するかどうかは検討中です。


520:517
08/10/11 13:59:32 .net
もうすこし考えてみたんだが、
ワードがどこかで他のワードを呼び出し、そのワードがどこかで他のワードを呼出し...
という場合には、
ワードシーケンスに展開する段階で、
展開すべき個所をたどるためのリターンスタックが必要な気がする。

だから、464のVMは、
普通のForthでの実行と同じ動作でワード系列をコピーして、
それから順番にInterpretして実行するという感じになって、
単なる二度手間ではないかな。

521:464
08/10/11 15:30:32 .net
>520
どのみちリターンスタック(実行する命令列を保存する専用スタック)が必要なのはその通り。
 WORDの動作:普通のForthでの実行と同じ動作でワード系列をコピー
 VMの動作:  順番にInterpretして実行する
というところがポイントですな。VMは辞書のこととか考える必要がないのでシンプルになります。
その代わり「辞書からWORD列を拾ってリターンスタックに展開する」というWORDが必要になるけど。

確かにコピーする手間はムダな気もするんだけどね……
辞書のWORD列を直接トレースするのと比べてどんぐらい余計な手間がかかってるんだろう?
ポインタ操作数回&アクセス数回レベルだと思うけど。


522:514
08/10/11 18:35:01 .net
>>518
普通はリターンスタックとか継続とか触れない言語の方が多いから、
Forthではなく俺言語を作るつもりなら、言語デザイナであるお前様自身の
判断で実現可能にしてもいいし、そうでなくしてもいいと思うよ。
ただForthは言語レベルでリターンスタックを操れる結果、協調的マルチタスクやら
コルーチンやら言語実装のレベルで普通対処するものも、ライブラリレベルで実現できる柔軟さがある。
リターンスタックは他の言語にはないForthの特徴の一つだからね。
俺言語でなんとか実現する方法を悩んでみるのも楽しいんじゃない?

523:514
08/10/11 18:47:48 .net
あとForthのVMって相当シンプルだよ。
アセンブリ言語で書かれた昔のForthとかコアの部分はアセンブリ言語で数行レベルだった気がする。
どのへんが複雑だと思ったのかは興味がある…

524:517
08/10/11 21:01:10 .net
>>521
いや、そうではなくて、
「WORDの動作」の中の、「普通のForthと同じ動作で」ってところに、
リターンアドレスを保存するスタックという意味でのリターンスタックが、もう必要なのではないかということ。

あと、言葉の問題として、
大きい意味でのワードを展開する動作のところからもうInterpreter(=VM)の動作というのが普通だと思う。
つまり、VMの動作の前半をWORDの動作と呼んで違う名前にしたから、
残ったVMの動作が簡単に見えるというだけなんじゃないかな。
辞書中のワードから始めると、ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
より複雑になってると思う。

でも、自分の言語を作るのをやめろといってるんじゃないよ。
むしろ応援してる。

ちょっと話題はそれるけど、Forthというか、スタック指向言語は、
コンパイラライターフレンドリーなんだよね。
だから、Forthコード書くよりForth(風オレ言語)VMを書く人が多かったりするわけだが、
ホントはForthでアプリケーションを書くときも「オレ言語」を作るつもりで書くと良いと思ってる。

525:デフォルトの名無しさん
08/10/11 21:33:08 .net
Forthの用語って独特な言い回しがあるからな。
知らない人は結構混乱する。
スレデッドコードのForthの場合、ソースコードを解釈してスレデッドコードを
生成することをコンパイルといい、スレデッドコードを生成する部分を外部インタープリタ、
スレデッドコードを解釈実行する部分を内部インタープリタと呼ぶ。
(これで良かったよな?同志?)
このスレでVMと言った時に内部インタープリタだけなのか、外部インタープリタも含むのか?
どっちだろうか?

526:デフォルトの名無しさん
08/10/12 00:45:26 .net
>>525

テキストを読み込んで、
1) ワードを辞書内で特定
2) だめならリテラルに変換
3) ダメならエラーで終了。

という部分が外部インタープリタ

1)または2)で成功したときに
モードに応じてコンパイル(Forth的意味)するか実行する
のが内部インタープリタ

だと思ってました。

Forthはテキストインプットも弄れるという面白さもあるよね。

Forth VMというと、外部も含むのかな。
上のリターンスタック云々の話は、
内部インタープリタのことだと思うけど。

527:デフォルトの名無しさん
08/10/12 07:57:23 .net
内部インタプリタて(スレッドコードで実装してる場合は)nextルーチンのことじゃなかったっけ。

528:デフォルトの名無しさん
08/10/12 08:49:02 .net
そうNEXTルーチン。アセンブリ言語で数行、という奴。

529:464
08/10/12 15:10:26 .net
>522
その辺は「自由と責任」というやつですな。「銃で足をブッとばす自由」でもあるけど。

>どのへんが複雑だと思ったのかは興味がある…
自分でも何でだったっけな、と過去の記憶を探り出してみたけど、
・実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
  ×実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
  ×番兵などの終了処理が必須
  --> VM側のスタックに積むことにすればpop&top参照で正規化できるし、元の値を
    コピーするからWORD変更にも影響されない。
・VM側に「WORDを実行する」という手順が必要になる
  --> VM側のスタックに積むことにすればpushで正規化できる
ぐらいかもしれない。
コンパイル時にWORDの中身が確定するforthだとあんまり問題にならなそうだね。

530:464
08/10/12 15:20:28 .net
>524
「スタックに複数のデータを押し込む操作は機械語レベルだとアトミックにならない」ということ??
C++で実装しているから意識していなかったけど、そうかもしれないですね。
少なくともプリミティブで実装する必要あるね。

>ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
これは狙ってやっていることだから仕様がないですね。
まあ、俺言語ではVM自体もWORD扱いにしているのですが……

531:デフォルトの名無しさん
08/10/12 15:50:56 .net
>>529
んー、やっぱり、思い込みでForthを理解したつもりになるんじゃなくて、
本格的に触ってみたほうが良いと思うんだけどな。

>実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
通常、Forthは実行時には、スレデッドコードにコンパイルされた命令列を、
上にも出ているnextルーチンで辿るだけなので、仕組みというほどの仕組みはないよ。

>実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
間接スレッディングのForthだと定義済みのワードの変更は、一カ所ポインタを書き換える
だけで済むはず。

>番兵などの終了処理が必須
番兵というかワードの最後にnextルーチンへのジャンプかnextルーチン自身を書き込むだけ。

>VM側に「WORDを実行する」という手順が必要になる
スレデッドコードのForthの命令列は、ワードへのポインタが並んでいるだけで、
「WORDを実行する」という意味のインストラクションは必要ないよ。

532:464
08/10/12 23:25:00 .net
本格的に触るのは……あの構文は色々と嫌だ。
[条件] IF [肯定時] ELSE [否定時] THEN とか。
せめて条件算子的だったらなぁ。[条件] ? [肯定時] : [否定時] ;

>531
細かいことを言うと、nextルーチンが辞書内のスレッデッドコード構造の詳細を知らなきゃ
ならないので、VMと辞書の関連が密になりそうな気がします。スレッデッドコードをスタックに
pushしてVM内に取り込んじゃえば辞書内の構造を気にする必要無いし。
まあ、最適化のために作り込んでも良い気がするけどね。そこは将来の課題ということで。

>一カ所ポインタを書き換えるだけで済むはず。
WORD自体を置換する場合はそうですね。WORDの挿入や削除はたぶん難しいかと。
そんな特殊なことは禁止にして、新規にWORD定義させた方が良いかも知れないけど。
あるいは無名WORDとかスキップWORDを用意するとか。

>「WORDを実行する」という意味のインストラクションは必要ないよ。
あれ?VMに保存されている「現在実行中のWORD」って、間接ポインタじゃないの?
(nextの動作を考えると、間接ポインタじゃないと色々と面倒臭そうな)
実行前に間接参照からWORDを探す操作が一段余計に必要になるかと思ってた。


533:デフォルトの名無しさん
08/10/12 23:34:45 .net
>VMと辞書の関連が密

というか、それがFORTHの肝のような気がする。

534:デフォルトの名無しさん
08/10/13 00:16:22 .net
スレデッドコード自体、ワードへのポインタを並べたものでしかないから、
ジャンプとかコールとかそういう類のインストラクションをデコードする必要がない、
という意味ね。
あとForthの実装にはダイレクトスレデッドなものもあるよ。
nextルーチンからみると命令列を順に辿ってるだけであって、
「辞書からワードを毎回探している」ってわけじゃないしね。

それより、スタックに命令列を毎回pushするオーバーヘッドのほうがよほど大きいと思うし、
nextルーチンに比べてシンプルとも思えないんだな。

ま、いろいろ悩んで勉強して、これだ!と思える言語デザインに邁進してください、と。
このスレが本当に久しぶりに活性化したのは間違いないしね。

535:デフォルトの名無しさん
08/10/13 00:21:58 .net
>>533
間接スレデッドの場合、Forthコンソールの側から見ると、
逆コンパイルしやすかったり、便利な面はたしかにあるけれど、
VMつうかnextルーチンから見ると、単にポインタを辿っているだけなので、
構造として、VM実装と辞書構造が密、というわけでもないと思う。
実際VM実装テクニックとしてのスレデッドコードは、今や、Forth以外でも
当たり前の技術になってるし。

536:デフォルトの名無しさん
08/10/27 00:52:54 .net
jonesforth読んだ。
ソース付きなので理解しやすい。

OS Xで動かそうとしたが挫折した。
OSXのGASではマクロが対応してないみたいだ。

537:デフォルトの名無しさん
08/11/23 01:13:24 .net
急にスレが進んだと思ったら、止まるのも急だよなこのスレ
やっぱ誰も使ってないってこったな

538:デフォルトの名無しさん
08/11/26 17:30:54 .net
URLリンク(www.intellasys.net)

なんか並列forthマシンっぽいw

539:デフォルトの名無しさん
08/12/27 14:00:32 .net
factor使ってる奴いる?

540:デフォルトの名無しさん
08/12/27 21:13:14 .net
とりあえず入れてみたけど特に使ってないなw

541:539
08/12/28 01:26:48 .net
factorおもしろいぜ。デプロイするとスタンドアロンで動く物もできるし。

542:デフォルトの名無しさん
08/12/29 13:31:00 .net
やっぱだめだこの言語。
人間工学から著しく反してる。

543:デフォルトの名無しさん
08/12/29 19:52:22 .net
サルが人間工学語ってやがる。

544:デフォルトの名無しさん
08/12/29 21:45:56 .net
自分の思考をスタック処理に最適化させればいいんだよw

545:デフォルトの名無しさん
08/12/29 22:06:52 .net
forthに慣れるのはそんなに大変なことじゃないと思うけどなあ。

まあ、問題をごく単純な部分に細分して考えることができないと、
スタック処理が爆発しがちになるとはいえますね。
でも、問題の細分ができない人は、どの言語でプログラミングしても
たかが知れてる。

546:デフォルトの名無しさん
09/01/01 11:45:56 .net
Lispのマクロ的なことができるってほんと?

547:デフォルトの名無しさん
09/01/01 11:56:23 .net
イミディエイトなワードのことかな。
結果としては似たようなことができると言えなくもないけど、
Lispのマクロみたいな2度evalするみたいな高水準のものじゃありません。

548:デフォルトの名無しさん
09/01/07 22:44:24 .net
つまり・・・どういうことだってばよ?

549:デフォルトの名無しさん
09/01/07 23:39:44 .net
factorならlispのマクロと同じようなことができるよ

550:デフォルトの名無しさん
09/01/08 00:11:19 .net
同じ機能を達成できるとしても言語が違えばそこに至るロジックは異なる。
具体的に何がしたいのか特定しないと。
factorはおもしろい言語だが、関数型言語のフリし過ぎなのがイヤラシくもある。


551:デフォルトの名無しさん
09/01/09 12:30:14 .net
何かサンプルが欲しいな。

552:デフォルトの名無しさん
09/01/09 22:47:55 .net
URLリンク(ancient.s6.xrea.com)

553:デフォルトの名無しさん
09/02/26 00:17:58 .net
組み込み用FORTH検討中・・・

554:デフォルトの名無しさん
09/03/07 05:11:31 .net
part 1 の URL ってないの?

555:デフォルトの名無しさん
09/03/07 10:00:54 .net
URLリンク(piza.2ch.net)

556:デフォルトの名無しさん
09/03/07 10:13:20 .net
: Mops ( オブジェクト指向FORTH -- ) ;
URLリンク(pc.2ch.net)

557:デフォルトの名無しさん
09/03/07 13:25:33 .net
thanks

558:デフォルトの名無しさん
09/03/07 18:54:17 .net
このスレも長いね


559:デフォルトの名無しさん
09/03/07 21:43:31 .net
factorとかJoyとか触ってる奴いないのかよ

560:デフォルトの名無しさん
09/03/07 23:32:50 .net
普通の関数型言語に比べてどういうメリットがあるのか分からない。

561:デフォルトの名無しさん
09/03/08 10:51:09 .net
forthは関数型ちゃうし

562:デフォルトの名無しさん
09/03/08 12:22:51 .net
>>560はなんでこのスレにいるんだ?

563:デフォルトの名無しさん
09/03/08 19:52:03 .net
いや、factorがって事なんだが。

564:デフォルトの名無しさん
09/03/08 20:01:58 .net
なんで関数型言語と比較するんだ?
Factor = forth + 無名関数とオブジェクト指向だよ

565:デフォルトの名無しさん
09/03/19 13:57:45 .net
全然Forthと関係ない話だが、AMDのシニアアーキテクトが
チャック・ムーアって名前なのは結構心臓に悪いな。

566:デフォルトの名無しさん
09/06/24 08:13:56 .net
何か話題無いかな

567:デフォルトの名無しさん
09/06/25 14:24:21 .net
LLイベントでの発表者募集中とか

568:デフォルトの名無しさん
09/07/03 05:23:56 .net

    ┌─┐
    │●│
    └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!



569:デフォルトの名無しさん
09/07/03 22:57:04 .net
Pythonスレに帰れw

570:デフォルトの名無しさん
09/07/09 07:11:33 .net
今更ながら FORTH 勉強しようと思ってるんだけど、
何かいい本ある?
できれば日本語がいいけど英語も可。


571:デフォルトの名無しさん
09/07/09 10:23:23 .net
絶版多し

572:デフォルトの名無しさん
09/07/09 21:39:14 .net
触りしか読んでないけど
URLリンク(www.forth.com)

573:デフォルトの名無しさん
09/07/10 07:32:04 .net
>>570
Let over Lambda日本語版

574:デフォルトの名無しさん
09/07/10 20:52:17 .net
>>573
たしかそれってlispの本じゃないか?

575:デフォルトの名無しさん
09/07/10 20:57:56 .net
lispでforthを作る本

576:デフォルトの名無しさん
09/07/10 22:31:17 .net
URLリンク(www.amazon.co.jp)

577:デフォルトの名無しさん
09/07/11 05:33:45 .net
gforth でググるとNVIDIAのグラボしかヒットしない。
Bingだと forth だけがヒットする。愛してるよMS

578:デフォルトの名無しさん
09/07/18 23:02:30 .net
あほな質問かとは思うがよかったら教えてくれ
スタック型言語にはスタックオーバーフローってある?
それともヒープにあたるものをスタックとしてつかている?

579:デフォルトの名無しさん
09/07/18 23:10:10 .net
両方ともYESだよ。

580:デフォルトの名無しさん
09/07/18 23:17:25 .net
オーバーフローだけじゃなくスタックアンダーフローも楽しめるぞ

581:デフォルトの名無しさん
09/07/18 23:31:56 .net
さんきゅー、Jedi!

582:デフォルトの名無しさん
09/07/19 03:45:38 .net
そのネタもう飽きた
次そゆこと言った奴はダークサイドな

583:tor.rootkit.de
09/08/17 17:57:34 .net
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

名言集 その2
『お前が規制系キャップ取れるか審査してやるよ』

スレリンク(news4vip板) ID:PVAf+dux0 = 自動焼人 ★

> 36 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:31:30.02 ID:PVAf+dux0
> >>33
> キャップとコテハンの違いは何?

> 46 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:38:05.34 ID:PVAf+dux0
> >>45
> その回答では落ちるなw
> 答えは教えないがw

> 50 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:41:29.96 ID:PVAf+dux0
> Q.キャップとコテハンの違いは何?
> A.2ちゃんねるのボランティアの登録制度

> それがお前の答えかw

> 52 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:43:10.06 ID:PVAf+dux0
> まぁ、どうせ正解が出るわけもないし、次の問題。
> 君が思う面白いスレはどんなの?
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください

584:デフォルトの名無しさん
09/10/06 10:44:14 .net
. 1. HTML    で検索した結果 1~10件目 / 約5,040,000,000件
. 2. PHP      で検索した結果 1~10件目 / 約2,970,000,000件
. 3. Java......   で検索した結果 1~10件目 / 約 835,000,000件
. 4. Forth.    で検索した結果 1~10件目 / 約 323,000,000件
. 5. Ruby..    で検索した結果 1~10件目 / 約 275,000,000件
. 6. perl.....    で検索した結果 1~10件目 / 約 245,000,000件
. 7. Python...   で検索した結果 1~10件目 / 約 204,000,000件
. 8. pascal...   で検索した結果 1~10件目 / 約 170,000,000件
. 9. Delphi    で検索した結果 1~10件目 / 約 127,000,000件
10. VisualBasic...で検索した結果 1~10件目 / 約 121,000,000件
11. lisp...      で検索した結果 1~10件目 / 約.  26,700,000件
12. fortran     で検索した結果 1~10件目 / 約.  21,300,000件
13. COBOL    で検索した結果 1~10件目 / 約.  18,500,000件
14. HSP      で検索した結果 1~10件目 / 約.  12,300,000件
15. FreeBasic.. で検索した結果 1~10件目 / 約   6,320,000件
16. Tcl/Tk.     で検索した結果 1~10件目 / 約   4,940,000件
17. QBasic     で検索した結果 1~10件目 / 約   4,190,000件
18. VisualC....  で検索した結果 1~10件目 / 約   1,360,000件
19. DarkBASIC. で検索した結果 1~10件目 / 約   1,320,000件
20. BasicStudio で検索した結果 1~10件目 / 約    304,000件
21. N88basic.   で検索した結果 1~10件目 / 約    215,000件
22. f-basic     で検索した結果 1~10件目 / 約    109,000件
23. ActiveBasic で検索した結果 1~10件目 / 約.     89,800件
24. 99BASIC.... で検索した結果 1~10件目 / 約.     11,500件

3Dprogramming で検索した結果 1~10件目 / 約794,000件
2Dprogramming で検索した結果 1~10件目 / 約. 57,400件

intel で検索した結果 1~10件目 / 約729,000,000件
amd で検索した結果 1~10件目 / 約355,000,000件

585:デフォルトの名無しさん
09/10/06 11:33:58 .net
J の検索結果 約 1,650,000,000 件中 1 - 10 件目 (0.25 秒)

圧倒的だな。

URLリンク(ja.wikipedia.org)(プログラミング言語)

586:デフォルトの名無しさん
09/10/06 11:36:17 .net
すみません、嘘でした。。。

587:デフォルトの名無しさん
09/10/06 13:38:04 .net
C の検索結果 約 3,910,000,000 件中 1 - 10 件目 (0.32 秒)

588:デフォルトの名無しさん
09/10/06 13:39:59 .net
>>584 <-こいつどこで検索したんだ

HTML の検索結果 約 8,490,000,000 件中 1 - 10 件目 (0.23 秒)

古いコピペか

589:デフォルトの名無しさん
09/10/06 13:42:51 .net
D の検索結果 約 4,780,000,000 件中 1 - 10 件目 (0.24 秒)

時代はもはやDですよ。

590:デフォルトの名無しさん
09/10/06 13:44:54 .net
Brain F*ck の検索結果 約 162,000,000 件中 1 - 10 件目 (0.22 秒)
Brain Fuck の検索結果 約 5,190,000 件中 1 - 10 件目 (0.30 秒)
Brain Fsck の検索結果 約 28,500 件中 1 - 10 件目 (0.33 秒)

591:デフォルトの名無しさん
09/10/08 21:50:04 .net
Fuck の検索結果 約 156,000,000 件中 1 - 10 件目 (0.19 秒)

592:デフォルトの名無しさん
09/10/09 00:25:23 .net
A の検索結果 約 15,560,000,000 件中 1 - 10 件目 (0.06 秒)

時代は A だった。

593:デフォルトの名無しさん
09/11/23 09:27:28 .net
forth検索しにくすぎる

594:デフォルトの名無しさん
09/11/23 18:04:33 .net
URLリンク(www.forth.org)
URLリンク(wiki.forthfreak.net)

595:デフォルトの名無しさん
09/11/25 14:14:43 .net
URLリンク(lab.ee.uec.ac.jp)
このページの仕様だとNFの後にLFが来てるけど、jonesforthだとLFが最初だよね。
NFが先だとFINDの時にLFを出すのに手間がかかると思うんだけど、
NFがLFより前にあるメリットって何かあるのかな?

596:デフォルトの名無しさん
09/11/26 00:14:06 .net
padding の有無の違いかと

597:デフォルトの名無しさん
09/11/30 00:21:59 .net
URLリンク(www.h7.dion.ne.jp)
Gforth マニュアルの和訳 (現在、チュートリアルまで)

598:デフォルトの名無しさん
10/01/05 18:09:33 .net
URLリンク(ronware.org)
Reva
非標準系 Forth (ミニマリスト系)
パブリックドメイン、コアは FASM で記述
プリミティブワードは商用 Forth や GCC 並みに高速
Windows の DLL や Linux の共有ライブラリを呼び出し可
豊富なライブラリが付属

599:デフォルトの名無しさん
10/01/16 15:33:34 .net
URLリンク(www.h7.dion.ne.jp)
Retro (Forth) の和訳
URLリンク(www.h7.dion.ne.jp)
オリジナルのコンソール版仮想マシンを Windows 専用に移植したもの
TinyC のみでビルド可、TinyC の conio.h を利用
超応急措置的改変だが、文字列に日本語も使用可
ビルド済み EXE とオリジナルの retroImage も同梱

600:デフォルトの名無しさん
10/03/11 19:17:24 .net
スレがなくて似たようなスレということでやってきたんだけど
postscriptの話題もOKですか?

forthはif文は逆ポーランドじゃないんですね

601:デフォルトの名無しさん
10/03/12 19:38:03 .net
誰もいないし

カーペット敷いときますね

%!PS
/carpet {
dup 0 eq { pop 4 {dup 0 rlineto 90 rotate} repeat pop }
{
4 {
3 { 2 copy 1 sub exch 3 div dup 3 2 roll carpet 0 rmoveto } repeat
90 rotate
} repeat pop pop
}ifelse
}def
100 500 translate 0 0 moveto
300 3 carpet
stroke showpage

602:デフォルトの名無しさん
10/03/23 00:04:39 .net
URLリンク(factorcode.org)
今死んでね?

603:デフォルトの名無しさん
10/03/23 00:58:37 .net
中の小人が忙しいといってるな

604:デフォルトの名無しさん
10/04/18 17:43:19 .net
FORTHって、ちょっとずつ作れてなんだか良いね。
関数とかじゃなくて、演算子を作りながら進んでる感じ。

605:デフォルトの名無しさん
10/04/18 23:45:47 .net
のんびりのんびり(^。^)y-.。o○

606:デフォルトの名無しさん
10/04/22 05:05:43 .net
何気にコンパイル = 2パスなところがミソなんだね。
最初IF文とか巧妙にスタックで実現しているのかと思った。

607:デフォルトの名無しさん
10/04/28 19:34:13 .net
Factor 座談会
URLリンク(oss.infoscience.co.jp)

608:デフォルトの名無しさん
10/06/15 05:20:29 .net
蔵書を整理していたら
マイコンピュータ No3
特集すぐ動くFORTH

などと言うものが出てきた、1981年の本なのでZ80とかApple向けの実装の話だったりする
思わずScanSnapで取り込んでしまった


609:デフォルトの名無しさん
10/06/15 17:04:11 .net
リギー、かわいいよリギー

610:デフォルトの名無しさん
10/08/11 11:24:30 .net
age

611:デフォルトの名無しさん
10/12/28 08:18:41 .net
age



612:デフォルトの名無しさん
10/12/28 09:18:30 .net
ムーア先生がさらにあさっての方向に。

URLリンク(www.greenarrays.com)

144コアのforthマシンとか誰得

613:デフォルトの名無しさん
10/12/28 09:43:38 .net
いつものことじゃん
いちいち驚くなよ

614:デフォルトの名無しさん
10/12/31 23:45:15 .net
Ubuntu GNU/LINUX10.04を使ってます。

先日、倉庫を整理していたら「パソコン・ユーザのためのFORTH入門」(近代科学社)が
出てきました。懐かしいので、”Ubuntu FORTH”で検索してみてgFORTHの存在を知り
さっそくインストールしてみました。FORTHとの出会いはOh!MZの連載記事「掟やぶりの
magiFORTH」ですが、当時はSーOSを入力していなかったので実際にFORTHに触れる
のは今回が初めてです。

よろしくお願いします。



615: 【大吉】
11/01/01 00:04:06 .net
!omikuji
あけおめ

616:デフォルトの名無しさん
11/01/01 23:57:48 .net
>>614
清水和人だったな、懐かしい

617:デフォルトの名無しさん
11/01/04 08:09:35 .net
>>616
「掟破りのmagiFORTH」は山田伸一郎さんの書いた記事でした。
1985年か1986年のOh!MZ 3月号に掲載されています。

618:デフォルトの名無しさん
11/01/04 20:00:48 .net
>>617
おっとゴメン、もう記憶があやふやだわ
俺はLispの方にハマったな
こうもとやすひこの記事とか楽しく読んでいた

619:デフォルトの名無しさん
11/02/11 21:03:43 .net
>>13>>43
ForthとLISPの両方の特徴を生かした言語Laplasの論文
汎用簡易言語としてみたインタプリタ言語Laplas
URLリンク(ci.nii.ac.jp)
L a p 1 a s 一マイクロ・コンピュータに適した新らしい言語一
URLリンク(eprints.lib.hokudai.ac.jp)


620:デフォルトの名無しさん
11/02/11 21:15:45 .net
日本語プログラミング言語Mind
URLリンク(mimizun.com)

24 名前:名無しさん@お腹いっぱい。 :2000/12/21(木) 06:19
Forthやった後でLISP学ぶとすんげえわかりやすい。
簡易LISPってかんじ。

25 名前:名無しさん@お腹いっぱい。 :2000/12/21(木) 11:22
そういえば、 forth lisp + 2 / な言語が昔ASCIIに載ってた。ラプラスとかいう奴。
トンボグラフィックス(タートルグラフィックスの3D版)とか搭載してて面白かった。

26 名前:名前ついてますか? :2000/12/21(木) 22:51
あれは面白かった... lambdaとか使わなくても関数抽象できたし。
#原田さんはその後も変なものを作るので要注目

27 名前:奥さん、名無しです :2000/12/22(金) 04:24
>>26
え、それなにどうやってやるの。

621:デフォルトの名無しさん
11/02/11 21:20:48 .net
28 名前:名前ついてますか? :2000/12/22(金) 09:10
stackが前提だから (1 +) で (lambda (x) (+ x 1)) 相当。

うーん、closureつければ今でもいけないかしらん..

30 名前:名前ついてますか? :2000/12/25(月) 14:11
そうそう。といいつつ age

29 名前:名無しさん@お腹いっぱい。 :2000/12/22(金) 11:14
xを先にstackに置いといてからそのリスト置いてapplyってこと?

32 名前:29 :2000/12/26(火) 10:35
>>30
そうなのか。それだと関数抽象っていうより
アセンブラのウルテクみたいだな、って思った。

34 名前:名前ついてますか? :2000/12/27(水) 14:10
>>32 関数抽象なんて高尚な概念も stack levelに落として考えれば、
禁断の秘技程度なのです。って落ちじゃだめ?
# ちなみに同じ stack machine でも JavaVMじゃできない
>>26-27
原田 康徳さんの論文s
URLリンク(ci.nii.ac.jp)

622:デフォルトの名無しさん
11/02/11 21:28:52 .net
これか
URLリンク(ci.nii.ac.jp)

「機関リポジトリ本文(無料)」ってリンクからたどってくとPDFで本文読めるな

623:デフォルトの名無しさん
11/02/11 23:23:10 .net
>>622
>>619の上のほうで示したリンク先「汎用簡易言語として見たインタプリタ言語Laplas」は
URLリンク(ci.nii.ac.jp)
こっちで見れるね

624:デフォルトの名無しさん
11/02/12 00:27:43 .net
SECD Machineみたいな、LispやMLを実装するすためのスタックマシンに自然なForthって感じか。
ざっとみたけど、lambdaはあっても、Closureはないみたいだな。

625:デフォルトの名無しさん
11/03/07 10:54:59.82 .net
だなw

626:デフォルトの名無しさん
11/05/28 09:22:21.04 .net
保守

627:デフォルトの名無しさん
11/05/29 07:57:22.03 .net
いつのまにかWikipediaのMindの記事が大幅に書き換わってるな

628:デフォルトの名無しさん
11/06/06 07:09:36.69 .net
おムーア様の過去の著作公開
URLリンク(www.colorforth.com)

629:天使 ◆uL5esZLBSE
11/07/02 23:26:16.04 .net
>>620
---------------------------
(((((((( 日本語プログラミング言語Mind ))))))))(キリ!!ッッ!!!!
------------------
((((((((((( え、それなにどうやってやるの。 )))))))))))(キリキリッッ!!!キリッキリッッッッ!!!!キリッッ!!!!ッッ!!!!
------(きリッ!


お前らってどうみてもゴミだよな

630:デフォルトの名無しさん
11/07/30 14:34:39.15 .net
保守

631:デフォルトの名無しさん
11/09/10 06:58:08.33 .net
時代はFORTH

632:デフォルトの名無しさん
11/09/10 23:29:07.15 .net
forth出ても200超えられないorz

633:デフォルトの名無しさん
11/10/12 20:56:54.15 .net
URLリンク(builds.factorcode.org)
factorの新しいのきてるぅ

634:デフォルトの名無しさん
12/01/16 22:00:32.22 .net
保守

635:営利利用に関するLR審議中@詳細は自治スレへ
12/03/30 23:52:09.58 .net
factor(等のforth系)は頭がトコロテンになるな。
でもプログラミング自体をパズルとして楽しめるような気がする。

636:デフォルトの名無しさん
12/06/26 23:53:01.65 .net
URLリンク(builds.factorcode.org)
新しいのキター

637:デフォルトの名無しさん
12/06/27 01:49:33.00 .net
スタックコンピュータって言う書籍買ってみた
古い本だけどFORTHとスタックマシンへの愛がすげー


638:デフォルトの名無しさん
12/06/27 07:17:19.22 .net
おお、あれは名著だ。

639:デフォルトの名無しさん
12/06/27 10:13:02.11 .net
>>636
初めてさわった
なにこれ、楽しい


640:デフォルトの名無しさん
12/06/28 11:00:23.05 .net
>638
原書はまだPDFで全公開してるのかな?


641:デフォルトの名無しさん
12/06/28 11:06:29.92 .net
URLリンク(builds.factorcode.org)
64bit版キター

642:デフォルトの名無しさん
12/06/28 11:09:24.65 .net
>>640
URLリンク(www.ece.cmu.edu)

643:デフォルトの名無しさん
12/06/30 00:15:59.63 .net
>>639
forth系ってパズル的な楽しさがあるよな

644:デフォルトの名無しさん
12/06/30 22:46:42.75 .net
URLリンク(builds.factorcode.org)
また新しいのキター

645:デフォルトの名無しさん
12/07/03 20:28:16.05 .net
また来ましたな
バージョンアップ祭りの季節?

646:デフォルトの名無しさん
12/07/10 22:11:13.67 .net
FORTHを学ぶサイトを作った - 西尾泰和のはてなダイアリー
URLリンク(d.hatena.ne.jp)

647:デフォルトの名無しさん
12/07/11 23:13:14.19 .net
またニューバージョンきたで

648:デフォルトの名無しさん
12/07/12 22:57:24.59 .net
URLリンク(builds.factorcode.org)
今日の更新

649:デフォルトの名無しさん
12/07/14 19:15:25.30 .net
本当によくバージョンアップくるな

650:デフォルトの名無しさん
12/07/15 18:51:42.95 .net
あ、きてる

651:デフォルトの名無しさん
12/07/18 15:12:10.06 .net
毎度!

652:デフォルトの名無しさん
12/07/19 20:54:07.43 .net
2012-07-17

653:デフォルトの名無しさん
12/07/20 14:00:53.36 .net
2012-07-19

654:デフォルトの名無しさん
12/07/20 17:48:26.40 .net
何だ何だ?

655:デフォルトの名無しさん
12/07/20 22:56:25.07 .net
URLリンク(builds.factorcode.org)
ニューバージョンが来たってことでしょ

656:デフォルトの名無しさん
12/07/20 23:55:48.43 .net
うーん、それニューバージョンって言うものか?
一見するとリリースノートもないし、開発者向けにビルドし直したもので、
一般のユーザー向けに作られたものじゃないと推察するのだが。
本スレに書いてる人、何が変わったか把握してる?

657:デフォルトの名無しさん
12/07/21 09:31:12.80 .net
ステマのにおい

658:デフォルトの名無しさん
12/10/08 20:25:47.38 .net
.

659:デフォルトの名無しさん
12/10/11 20:10:49.89 .net
shuffle shuffle

660:デフォルトの名無しさん
12/10/18 19:40:10.82 .net
test

661:デフォルトの名無しさん
12/11/12 06:30:53.31 .net
&amp;nbsp;test

662:デフォルトの名無しさん
12/11/12 07:13:40.73 .net
 &amp;#160;test

663:デフォルトの名無しさん
12/11/15 22:25:43.78 .net
a
a
a
a

664:デフォルトの名無しさん
12/11/15 22:28:35.87 .net
&nbsp;&nbsp;&nbsp;a
   a
&#xA0;&#xA0;&#xA0;a

665:デフォルトの名無しさん
12/11/22 22:57:21.32 .net


666:デフォルトの名無しさん
13/03/06 01:21:39.12 .net
保守
何か面白い話題無いのかな

667:デフォルトの名無しさん
13/03/06 09:59:04.64 .net
I think so.

668:デフォルトの名無しさん
13/03/08 11:11:43.39 .net
Laplasの人自身による解説があった
URLリンク(blog.goo.ne.jp)

669:デフォルトの名無しさん
13/03/08 11:46:01.28 .net
URLリンク(www.viscuit.com)
URLリンク(twitter.com)

670:デフォルトの名無しさん
13/03/18 01:17:00.32 .net
>>117のコントロールフロースタックについてもうちょっと詳しく聞きたい
ジャンプ先って何へのジャンプ先?

671:デフォルトの名無しさん
13/03/18 01:23:17.50 .net
あああちゃんと調べてなかった、ここの説明でわかったよ
URLリンク(www18.atwiki.jp)

672:デフォルトの名無しさん
13/03/18 19:30:42.45 .net
forthの最大の欠点ってfactorみたいなオブジェクト指向にしたときにスタックに積んだ引数と関数の期待する型が違ったときに困る事だとおもうんだけど
コンパイラのレベルでこれってなんとかならんの?

673:デフォルトの名無しさん
13/03/18 22:45:55.67 .net
普通の関数型言語と一緒じゃね?
全てのトークンに引数型と戻り値型を対応付けて、コンパイル時に
型解決すれば良いと思うけど。

674:デフォルトの名無しさん
13/03/28 01:26:47.80 .net
Windows上のFactorで日本語表示させる方法がわからん

675:デフォルトの名無しさん
13/03/28 01:53:15.83 .net
"日本語" H{ { font-name "メイリオ" } } format nl
で表示できた。
あとはlistenerのfont-nameを書き換えられたらいいのかな。

676:デフォルトの名無しさん
14/01/05 03:24:36.20 .net
保守

677:デフォルトの名無しさん
14/01/05 21:15:32.75 .net
保守!!!

Forth は実用に耐えるのですか?特に可読性的に

678:デフォルトの名無しさん
14/01/05 22:21:30.32 .net
>>677
Forth の達人 (= プロの Forth 屋) なら、数十万行でも苦にならないそうな。
ライフゲーム
URLリンク(wiki.forthfreak.net)
BASIC インタプリタ
URLリンク(home.iae.nl)
FALSE インタプリタとコンパイラ
URLリンク(github.com)
その他
URLリンク(wiki.forthfreak.net)
URLリンク(wiki.forthfreak.net)

みんな目的に特化したプログラミングをするので、汎用ライブラリやフレームワークは無いに等しいけれどね
(個々の実装に特化したものならそれなりにあるけど)。

679:デフォルトの名無しさん
14/01/05 23:08:26.86 .net
thx

まさかこんなに早く返事がくるとは思わなかった!

680:デフォルトの名無しさん
14/01/06 05:54:37.02 .net
常に人はいるんだわ

単に新しい話題がなんにもないだけで

681:デフォルトの名無しさん
14/01/06 15:05:08.84 .net
>>678
Forthの力ってすげー。

>>680
なる


おもしろそうだな。
RPNで文法が統一されているところが超COOLだ!
俺が作ってみようじゃないか?!

ちなみに慣例や伝統はしらぬから、
皆が想像しているものと大きく違うと思うがな!!

682:デフォルトの名無しさん
14/01/06 17:56:02.28 .net
>>681 期待してます!

683:デフォルトの名無しさん
14/01/06 20:20:59.69 .net
文字列はどういう風に扱えばよいのですか?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch