探検
2 part forth
1デフォルトの名無しさん
NGNG 第四世代
497デフォルトの名無しさん
2008/10/10(金) 01:03:18498496
2008/10/10(金) 01:20:54499464
2008/10/10(金) 01:36:27 >498
新しいかどうかなんて知らんよ。単にWORDの扱いを正規化できてVMが簡素になるっつうだけの話。
>497で言及している(ここ)(そこ)みたいな間接ポインタをVMで扱う必要も無くなるし。
まあ、その皺寄せをWORDに押し込んでるだけなんだけどね。
新しいかどうかなんて知らんよ。単にWORDの扱いを正規化できてVMが簡素になるっつうだけの話。
>497で言及している(ここ)(そこ)みたいな間接ポインタをVMで扱う必要も無くなるし。
まあ、その皺寄せをWORDに押し込んでるだけなんだけどね。
500496
2008/10/10(金) 01:42:51 >>499
なんていうか…
「(ここ)(そこ)みたいな間接ポインタ」というそれそのものが、
アセンブリ言語の時代からある「リターンアドレス」という概念なんですよ…。
Forthはそれをリターンスタックに分離して保存・復帰しているだけのこと。
なんていうか…
「(ここ)(そこ)みたいな間接ポインタ」というそれそのものが、
アセンブリ言語の時代からある「リターンアドレス」という概念なんですよ…。
Forthはそれをリターンスタックに分離して保存・復帰しているだけのこと。
501デフォルトの名無しさん
2008/10/10(金) 06:35:09502デフォルトの名無しさん
2008/10/10(金) 08:32:35 >500
今は実際のリターンアドレスの話をしとらんよ。
リターンスタックを「次に実行する命令の列」という形に抽象化するっつうとるだろうに。
今は実際のリターンアドレスの話をしとらんよ。
リターンスタックを「次に実行する命令の列」という形に抽象化するっつうとるだろうに。
503デフォルトの名無しさん
2008/10/10(金) 08:46:05 >>501
." とか、 前付きの " は、Forthではただの引用符じゃなくて、一つのワード。
だから、Helloとの間に空白が要る。
但し、終わりの " はセパレーターだから、空白なしで良い。
前にも出てたけど、
Forthでは文字列リテラルはポインタと長さの二つの数値で表す。
「.」は、トップアイテムを一つpopして値をプリントするワードだから、
" Hello" .
だと5がプリントされるだけ。文字列ポインタがスタックに残る。
「."」 が 「次の " までの文字列をプリントする」というワード。
文字列をスタックに積んだときは
" Hello" type
とやる。
." とか、 前付きの " は、Forthではただの引用符じゃなくて、一つのワード。
だから、Helloとの間に空白が要る。
但し、終わりの " はセパレーターだから、空白なしで良い。
前にも出てたけど、
Forthでは文字列リテラルはポインタと長さの二つの数値で表す。
「.」は、トップアイテムを一つpopして値をプリントするワードだから、
" Hello" .
だと5がプリントされるだけ。文字列ポインタがスタックに残る。
「."」 が 「次の " までの文字列をプリントする」というワード。
文字列をスタックに積んだときは
" Hello" type
とやる。
504デフォルトの名無しさん
2008/10/10(金) 08:52:55 >>502
だから、「次に実行する命令列」は辞書の中に既にあるんであって、
それはスタックである必要はなくて、いってみればアレイ。
辞書の中で実行は動的に行ったり戻ったりするから、
やっぱりリターンアドレスの保存は必要。
だから、「次に実行する命令列」は辞書の中に既にあるんであって、
それはスタックである必要はなくて、いってみればアレイ。
辞書の中で実行は動的に行ったり戻ったりするから、
やっぱりリターンアドレスの保存は必要。
505デフォルトの名無しさん
2008/10/10(金) 09:06:11506デフォルトの名無しさん
2008/10/10(金) 17:24:55 factorだと文字列リテラルはあるよ
507488
2008/10/10(金) 22:08:31 >>496,497 サンクス
スレデッドコードと書いておいて誤解がなかったようだ。
497 のレスだと、俺の中では「次のワード」という認識になる。
(あっち)という表現を使えば確かに誤解はなくなる。
なんだか、リターンスタックのデータ内容と、
(サブルーチン)リターンアドレスを混同した希ガス
スレデッドコードと書いておいて誤解がなかったようだ。
497 のレスだと、俺の中では「次のワード」という認識になる。
(あっち)という表現を使えば確かに誤解はなくなる。
なんだか、リターンスタックのデータ内容と、
(サブルーチン)リターンアドレスを混同した希ガス
508464
2008/10/11(土) 00:37:41 >504
「必要がないから積まない」じゃなくて、「VMの原理を簡単にするために積む」んだって。
VMが辞書の中を行ったり来たりしないようにするのが目的。
もちろん、VMの仕事をWORDに移管しただけの話だし、スタックが大きくなるデメリットもあるけどな。
「必要がないから積まない」じゃなくて、「VMの原理を簡単にするために積む」んだって。
VMが辞書の中を行ったり来たりしないようにするのが目的。
もちろん、VMの仕事をWORDに移管しただけの話だし、スタックが大きくなるデメリットもあるけどな。
509504
2008/10/11(土) 01:03:24 >>508
つまり、ワードを全部インラインにするということ?
それなら確かに理論的には可能だし、リターンスタック自体要らない。
普通は、大きくなるのはスタックじゃなくて辞書だな。
まあ、辞書からインラインで展開したものを
リターンスタックにコピーしてもいいけど、
ランタイムにやるなら相当動作が遅くなると思う。
それに、
なぜそのためにスタックというデータ構造を使うのかがわからない。
後ろから先に積んでいくことになるわけだが。
その発想はインストラクションキャッシュだと思う。
だから、むしろキューがいいと思う。
ソフトウェア的にやると相当遅いとは思うけど、
論理的には可能だと思うよ。
つまり、ワードを全部インラインにするということ?
それなら確かに理論的には可能だし、リターンスタック自体要らない。
普通は、大きくなるのはスタックじゃなくて辞書だな。
まあ、辞書からインラインで展開したものを
リターンスタックにコピーしてもいいけど、
ランタイムにやるなら相当動作が遅くなると思う。
それに、
なぜそのためにスタックというデータ構造を使うのかがわからない。
後ろから先に積んでいくことになるわけだが。
その発想はインストラクションキャッシュだと思う。
だから、むしろキューがいいと思う。
ソフトウェア的にやると相当遅いとは思うけど、
論理的には可能だと思うよ。
510デフォルトの名無しさん
2008/10/11(土) 02:00:15 サンクス >693
5 ソースコード
6 boost::spirit
というので激しく不安になるな。
というか、スクリプトの入門というのなら、BASICタイプ言語の作成とかCタイプ言語の作成
とか分散しないで、どっちか一つに集中すべきじゃない?
入門だったら、むしろ構文はシンプルなforthライクにして、エンジンの中身に拘るべきだと思うけど……
5 ソースコード
6 boost::spirit
というので激しく不安になるな。
というか、スクリプトの入門というのなら、BASICタイプ言語の作成とかCタイプ言語の作成
とか分散しないで、どっちか一つに集中すべきじゃない?
入門だったら、むしろ構文はシンプルなforthライクにして、エンジンの中身に拘るべきだと思うけど……
511デフォルトの名無しさん
2008/10/11(土) 02:02:28 誤爆スマソ
512464
2008/10/11(土) 02:18:22 >509
いや、基本はWORD呼び出し時に展開(そのWORDに定義されたWORD列をスタックに押し込む)。
WORDコンパイル時に全部インラインに展開するわけじゃないです。
#高速化を目的として、WORDコンパイル時にある程度はインライン化することになると思うけど。
WORDに定義されたWORD列を、実行時にその場で積んでその場で処理する必要があるから、
FIFOの仕組みが必要になります。
まあ、小まめにWORDの積み降ろしをやらなきゃいけないから、確かに重そうだけどね。
いや、基本はWORD呼び出し時に展開(そのWORDに定義されたWORD列をスタックに押し込む)。
WORDコンパイル時に全部インラインに展開するわけじゃないです。
#高速化を目的として、WORDコンパイル時にある程度はインライン化することになると思うけど。
WORDに定義されたWORD列を、実行時にその場で積んでその場で処理する必要があるから、
FIFOの仕組みが必要になります。
まあ、小まめにWORDの積み降ろしをやらなきゃいけないから、確かに重そうだけどね。
513デフォルトの名無しさん
2008/10/11(土) 05:37:05 464のやり方は、ありえなくはないけどForth的じゃないね。
どっちかっていうとJava VMのJITコンパイラみたいな。
Forthはシンプルな実装で軽い、ってイメージ。
どっちかっていうとJava VMのJITコンパイラみたいな。
Forthはシンプルな実装で軽い、ってイメージ。
514デフォルトの名無しさん
2008/10/11(土) 06:54:12515464
2008/10/11(土) 13:07:00 >513
いや、実装はこっちの方がシンプルだよ。辞書の解釈を全部WORDに押し付けることができるから。
ただ、スタック操作が増えるから重くなる方向だけどね。
>514
リターンアドレス前提だと難しいよね。作業用スタックがもう一本ありゃいいんだけど。
俺言語のVMだと自前スタックで実装しているので大した話じゃないです。
いや、実装はこっちの方がシンプルだよ。辞書の解釈を全部WORDに押し付けることができるから。
ただ、スタック操作が増えるから重くなる方向だけどね。
>514
リターンアドレス前提だと難しいよね。作業用スタックがもう一本ありゃいいんだけど。
俺言語のVMだと自前スタックで実装しているので大した話じゃないです。
516464
2008/10/11(土) 13:22:12 >514
ちょっと補足。
複数のWORDを押し込もうとすると確かに面倒だね。
俺言語でも
1. 無名WORDを作る
2. 1.のWORDに実行するWORDを押し込む
3. 1.のWORDをリターンスタックに押し込む
といったパック化が必要になります。
ちょっと補足。
複数のWORDを押し込もうとすると確かに面倒だね。
俺言語でも
1. 無名WORDを作る
2. 1.のWORDに実行するWORDを押し込む
3. 1.のWORDをリターンスタックに押し込む
といったパック化が必要になります。
517デフォルトの名無しさん
2008/10/11(土) 13:26:05 464のVMだが、
ハードウェアレベルではもう一般化してる
インストラクションのプリフェッチとおなじだよね。
マシン語のデコーダレベルでのVMという感じか。
実装する場合の最難題は条件付きジャンプだと思う。
IFとか不定ループをどう載せるかが鍵だな。
これを考えると、VMが仕組みとして単純になるかどうかは微妙だと思う。
まあ、ベタでやればできそうな気はするが、
ハードウエアの仕組みをソフトウェアで二重にしてるだけのような気がしないでもない。
ハードウェアレベルではもう一般化してる
インストラクションのプリフェッチとおなじだよね。
マシン語のデコーダレベルでのVMという感じか。
実装する場合の最難題は条件付きジャンプだと思う。
IFとか不定ループをどう載せるかが鍵だな。
これを考えると、VMが仕組みとして単純になるかどうかは微妙だと思う。
まあ、ベタでやればできそうな気はするが、
ハードウエアの仕組みをソフトウェアで二重にしてるだけのような気がしないでもない。
518464
2008/10/11(土) 13:38:04 >514
思い出した……>59を実現するにはreverse自体のパック化も必須なんだっけ。
そういや>59みたいな操作をどうしようか悩んだな。
ただ、こういったWORDを跨ぐ暗黙的なリターンスタック制御てけっこう危険じゃない?
個人的にはWORDはデータスタックの状態にのみ依存すべきだと思うけど、WORDを越えた
範囲までリターンスタックを操作できるようにすると、WORD同士の依存関係が出てしまって
連鎖性(concatenative)が崩れるような気がする。
forthの条件分岐でも、セパレーターを使った明示的な制御をしているわけだし。
思い出した……>59を実現するにはreverse自体のパック化も必須なんだっけ。
そういや>59みたいな操作をどうしようか悩んだな。
ただ、こういったWORDを跨ぐ暗黙的なリターンスタック制御てけっこう危険じゃない?
個人的にはWORDはデータスタックの状態にのみ依存すべきだと思うけど、WORDを越えた
範囲までリターンスタックを操作できるようにすると、WORD同士の依存関係が出てしまって
連鎖性(concatenative)が崩れるような気がする。
forthの条件分岐でも、セパレーターを使った明示的な制御をしているわけだし。
519464
2008/10/11(土) 13:49:31 連投スマソ
>517
そうか、CPUだともう一般的なのか……。さすがに天才的な変態が集まる業界だな。
やっぱりCPUのアーキテクチャ勉強しないといけないなあ。
IFは構文解析で逃げました。
block := block ? WORD1 ! WORD2
という三項演算子を用意して、条件分岐用WORDに解釈するようにしました。
不定ループの構文を用意するかどうかは検討中です。
>517
そうか、CPUだともう一般的なのか……。さすがに天才的な変態が集まる業界だな。
やっぱりCPUのアーキテクチャ勉強しないといけないなあ。
IFは構文解析で逃げました。
block := block ? WORD1 ! WORD2
という三項演算子を用意して、条件分岐用WORDに解釈するようにしました。
不定ループの構文を用意するかどうかは検討中です。
520517
2008/10/11(土) 13:59:32 もうすこし考えてみたんだが、
ワードがどこかで他のワードを呼び出し、そのワードがどこかで他のワードを呼出し...
という場合には、
ワードシーケンスに展開する段階で、
展開すべき個所をたどるためのリターンスタックが必要な気がする。
だから、464のVMは、
普通のForthでの実行と同じ動作でワード系列をコピーして、
それから順番にInterpretして実行するという感じになって、
単なる二度手間ではないかな。
ワードがどこかで他のワードを呼び出し、そのワードがどこかで他のワードを呼出し...
という場合には、
ワードシーケンスに展開する段階で、
展開すべき個所をたどるためのリターンスタックが必要な気がする。
だから、464のVMは、
普通のForthでの実行と同じ動作でワード系列をコピーして、
それから順番にInterpretして実行するという感じになって、
単なる二度手間ではないかな。
521464
2008/10/11(土) 15:30:32 >520
どのみちリターンスタック(実行する命令列を保存する専用スタック)が必要なのはその通り。
WORDの動作:普通のForthでの実行と同じ動作でワード系列をコピー
VMの動作: 順番にInterpretして実行する
というところがポイントですな。VMは辞書のこととか考える必要がないのでシンプルになります。
その代わり「辞書からWORD列を拾ってリターンスタックに展開する」というWORDが必要になるけど。
確かにコピーする手間はムダな気もするんだけどね……
辞書のWORD列を直接トレースするのと比べてどんぐらい余計な手間がかかってるんだろう?
ポインタ操作数回&アクセス数回レベルだと思うけど。
どのみちリターンスタック(実行する命令列を保存する専用スタック)が必要なのはその通り。
WORDの動作:普通のForthでの実行と同じ動作でワード系列をコピー
VMの動作: 順番にInterpretして実行する
というところがポイントですな。VMは辞書のこととか考える必要がないのでシンプルになります。
その代わり「辞書からWORD列を拾ってリターンスタックに展開する」というWORDが必要になるけど。
確かにコピーする手間はムダな気もするんだけどね……
辞書のWORD列を直接トレースするのと比べてどんぐらい余計な手間がかかってるんだろう?
ポインタ操作数回&アクセス数回レベルだと思うけど。
522514
2008/10/11(土) 18:35:01 >>518
普通はリターンスタックとか継続とか触れない言語の方が多いから、
Forthではなく俺言語を作るつもりなら、言語デザイナであるお前様自身の
判断で実現可能にしてもいいし、そうでなくしてもいいと思うよ。
ただForthは言語レベルでリターンスタックを操れる結果、協調的マルチタスクやら
コルーチンやら言語実装のレベルで普通対処するものも、ライブラリレベルで実現できる柔軟さがある。
リターンスタックは他の言語にはないForthの特徴の一つだからね。
俺言語でなんとか実現する方法を悩んでみるのも楽しいんじゃない?
普通はリターンスタックとか継続とか触れない言語の方が多いから、
Forthではなく俺言語を作るつもりなら、言語デザイナであるお前様自身の
判断で実現可能にしてもいいし、そうでなくしてもいいと思うよ。
ただForthは言語レベルでリターンスタックを操れる結果、協調的マルチタスクやら
コルーチンやら言語実装のレベルで普通対処するものも、ライブラリレベルで実現できる柔軟さがある。
リターンスタックは他の言語にはないForthの特徴の一つだからね。
俺言語でなんとか実現する方法を悩んでみるのも楽しいんじゃない?
523514
2008/10/11(土) 18:47:48 あとForthのVMって相当シンプルだよ。
アセンブリ言語で書かれた昔のForthとかコアの部分はアセンブリ言語で数行レベルだった気がする。
どのへんが複雑だと思ったのかは興味がある…
アセンブリ言語で書かれた昔のForthとかコアの部分はアセンブリ言語で数行レベルだった気がする。
どのへんが複雑だと思ったのかは興味がある…
524517
2008/10/11(土) 21:01:10 >>521
いや、そうではなくて、
「WORDの動作」の中の、「普通のForthと同じ動作で」ってところに、
リターンアドレスを保存するスタックという意味でのリターンスタックが、もう必要なのではないかということ。
あと、言葉の問題として、
大きい意味でのワードを展開する動作のところからもうInterpreter(=VM)の動作というのが普通だと思う。
つまり、VMの動作の前半をWORDの動作と呼んで違う名前にしたから、
残ったVMの動作が簡単に見えるというだけなんじゃないかな。
辞書中のワードから始めると、ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
より複雑になってると思う。
でも、自分の言語を作るのをやめろといってるんじゃないよ。
むしろ応援してる。
ちょっと話題はそれるけど、Forthというか、スタック指向言語は、
コンパイラライターフレンドリーなんだよね。
だから、Forthコード書くよりForth(風オレ言語)VMを書く人が多かったりするわけだが、
ホントはForthでアプリケーションを書くときも「オレ言語」を作るつもりで書くと良いと思ってる。
いや、そうではなくて、
「WORDの動作」の中の、「普通のForthと同じ動作で」ってところに、
リターンアドレスを保存するスタックという意味でのリターンスタックが、もう必要なのではないかということ。
あと、言葉の問題として、
大きい意味でのワードを展開する動作のところからもうInterpreter(=VM)の動作というのが普通だと思う。
つまり、VMの動作の前半をWORDの動作と呼んで違う名前にしたから、
残ったVMの動作が簡単に見えるというだけなんじゃないかな。
辞書中のワードから始めると、ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
より複雑になってると思う。
でも、自分の言語を作るのをやめろといってるんじゃないよ。
むしろ応援してる。
ちょっと話題はそれるけど、Forthというか、スタック指向言語は、
コンパイラライターフレンドリーなんだよね。
だから、Forthコード書くよりForth(風オレ言語)VMを書く人が多かったりするわけだが、
ホントはForthでアプリケーションを書くときも「オレ言語」を作るつもりで書くと良いと思ってる。
525デフォルトの名無しさん
2008/10/11(土) 21:33:08 Forthの用語って独特な言い回しがあるからな。
知らない人は結構混乱する。
スレデッドコードのForthの場合、ソースコードを解釈してスレデッドコードを
生成することをコンパイルといい、スレデッドコードを生成する部分を外部インタープリタ、
スレデッドコードを解釈実行する部分を内部インタープリタと呼ぶ。
(これで良かったよな?同志?)
このスレでVMと言った時に内部インタープリタだけなのか、外部インタープリタも含むのか?
どっちだろうか?
知らない人は結構混乱する。
スレデッドコードのForthの場合、ソースコードを解釈してスレデッドコードを
生成することをコンパイルといい、スレデッドコードを生成する部分を外部インタープリタ、
スレデッドコードを解釈実行する部分を内部インタープリタと呼ぶ。
(これで良かったよな?同志?)
このスレでVMと言った時に内部インタープリタだけなのか、外部インタープリタも含むのか?
どっちだろうか?
526デフォルトの名無しさん
2008/10/12(日) 00:45:26 >>525
テキストを読み込んで、
1) ワードを辞書内で特定
2) だめならリテラルに変換
3) ダメならエラーで終了。
という部分が外部インタープリタ
1)または2)で成功したときに
モードに応じてコンパイル(Forth的意味)するか実行する
のが内部インタープリタ
だと思ってました。
Forthはテキストインプットも弄れるという面白さもあるよね。
Forth VMというと、外部も含むのかな。
上のリターンスタック云々の話は、
内部インタープリタのことだと思うけど。
テキストを読み込んで、
1) ワードを辞書内で特定
2) だめならリテラルに変換
3) ダメならエラーで終了。
という部分が外部インタープリタ
1)または2)で成功したときに
モードに応じてコンパイル(Forth的意味)するか実行する
のが内部インタープリタ
だと思ってました。
Forthはテキストインプットも弄れるという面白さもあるよね。
Forth VMというと、外部も含むのかな。
上のリターンスタック云々の話は、
内部インタープリタのことだと思うけど。
527デフォルトの名無しさん
2008/10/12(日) 07:57:23 内部インタプリタて(スレッドコードで実装してる場合は)nextルーチンのことじゃなかったっけ。
528デフォルトの名無しさん
2008/10/12(日) 08:49:02 そうNEXTルーチン。アセンブリ言語で数行、という奴。
529464
2008/10/12(日) 15:10:26 >522
その辺は「自由と責任」というやつですな。「銃で足をブッとばす自由」でもあるけど。
>どのへんが複雑だと思ったのかは興味がある…
自分でも何でだったっけな、と過去の記憶を探り出してみたけど、
・実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
×実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
×番兵などの終了処理が必須
--> VM側のスタックに積むことにすればpop&top参照で正規化できるし、元の値を
コピーするからWORD変更にも影響されない。
・VM側に「WORDを実行する」という手順が必要になる
--> VM側のスタックに積むことにすればpushで正規化できる
ぐらいかもしれない。
コンパイル時にWORDの中身が確定するforthだとあんまり問題にならなそうだね。
その辺は「自由と責任」というやつですな。「銃で足をブッとばす自由」でもあるけど。
>どのへんが複雑だと思ったのかは興味がある…
自分でも何でだったっけな、と過去の記憶を探り出してみたけど、
・実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
×実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
×番兵などの終了処理が必須
--> VM側のスタックに積むことにすればpop&top参照で正規化できるし、元の値を
コピーするからWORD変更にも影響されない。
・VM側に「WORDを実行する」という手順が必要になる
--> VM側のスタックに積むことにすればpushで正規化できる
ぐらいかもしれない。
コンパイル時にWORDの中身が確定するforthだとあんまり問題にならなそうだね。
530464
2008/10/12(日) 15:20:28 >524
「スタックに複数のデータを押し込む操作は機械語レベルだとアトミックにならない」ということ??
C++で実装しているから意識していなかったけど、そうかもしれないですね。
少なくともプリミティブで実装する必要あるね。
>ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
これは狙ってやっていることだから仕様がないですね。
まあ、俺言語ではVM自体もWORD扱いにしているのですが……
「スタックに複数のデータを押し込む操作は機械語レベルだとアトミックにならない」ということ??
C++で実装しているから意識していなかったけど、そうかもしれないですね。
少なくともプリミティブで実装する必要あるね。
>ForthのVMよりも(多分プリミティブ)WORDの系列を作る部分が余分で、
これは狙ってやっていることだから仕様がないですね。
まあ、俺言語ではVM自体もWORD扱いにしているのですが……
531デフォルトの名無しさん
2008/10/12(日) 15:50:56 >>529
んー、やっぱり、思い込みでForthを理解したつもりになるんじゃなくて、
本格的に触ってみたほうが良いと思うんだけどな。
>実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
通常、Forthは実行時には、スレデッドコードにコンパイルされた命令列を、
上にも出ているnextルーチンで辿るだけなので、仕組みというほどの仕組みはないよ。
>実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
間接スレッディングのForthだと定義済みのワードの変更は、一カ所ポインタを書き換える
だけで済むはず。
>番兵などの終了処理が必須
番兵というかワードの最後にnextルーチンへのジャンプかnextルーチン自身を書き込むだけ。
>VM側に「WORDを実行する」という手順が必要になる
スレデッドコードのForthの命令列は、ワードへのポインタが並んでいるだけで、
「WORDを実行する」という意味のインストラクションは必要ないよ。
んー、やっぱり、思い込みでForthを理解したつもりになるんじゃなくて、
本格的に触ってみたほうが良いと思うんだけどな。
>実行中のWORDの次のWORDを辞書の中から探せるようにする仕組みが必要
通常、Forthは実行時には、スレデッドコードにコンパイルされた命令列を、
上にも出ているnextルーチンで辿るだけなので、仕組みというほどの仕組みはないよ。
>実行中のWORDの中身を変更するのが大変(VMのスタックに積んでいるWORD含む)
間接スレッディングのForthだと定義済みのワードの変更は、一カ所ポインタを書き換える
だけで済むはず。
>番兵などの終了処理が必須
番兵というかワードの最後にnextルーチンへのジャンプかnextルーチン自身を書き込むだけ。
>VM側に「WORDを実行する」という手順が必要になる
スレデッドコードのForthの命令列は、ワードへのポインタが並んでいるだけで、
「WORDを実行する」という意味のインストラクションは必要ないよ。
532464
2008/10/12(日) 23:25:00 本格的に触るのは……あの構文は色々と嫌だ。
[条件] IF [肯定時] ELSE [否定時] THEN とか。
せめて条件算子的だったらなぁ。[条件] ? [肯定時] : [否定時] ;
>531
細かいことを言うと、nextルーチンが辞書内のスレッデッドコード構造の詳細を知らなきゃ
ならないので、VMと辞書の関連が密になりそうな気がします。スレッデッドコードをスタックに
pushしてVM内に取り込んじゃえば辞書内の構造を気にする必要無いし。
まあ、最適化のために作り込んでも良い気がするけどね。そこは将来の課題ということで。
>一カ所ポインタを書き換えるだけで済むはず。
WORD自体を置換する場合はそうですね。WORDの挿入や削除はたぶん難しいかと。
そんな特殊なことは禁止にして、新規にWORD定義させた方が良いかも知れないけど。
あるいは無名WORDとかスキップWORDを用意するとか。
>「WORDを実行する」という意味のインストラクションは必要ないよ。
あれ?VMに保存されている「現在実行中のWORD」って、間接ポインタじゃないの?
(nextの動作を考えると、間接ポインタじゃないと色々と面倒臭そうな)
実行前に間接参照からWORDを探す操作が一段余計に必要になるかと思ってた。
[条件] IF [肯定時] ELSE [否定時] THEN とか。
せめて条件算子的だったらなぁ。[条件] ? [肯定時] : [否定時] ;
>531
細かいことを言うと、nextルーチンが辞書内のスレッデッドコード構造の詳細を知らなきゃ
ならないので、VMと辞書の関連が密になりそうな気がします。スレッデッドコードをスタックに
pushしてVM内に取り込んじゃえば辞書内の構造を気にする必要無いし。
まあ、最適化のために作り込んでも良い気がするけどね。そこは将来の課題ということで。
>一カ所ポインタを書き換えるだけで済むはず。
WORD自体を置換する場合はそうですね。WORDの挿入や削除はたぶん難しいかと。
そんな特殊なことは禁止にして、新規にWORD定義させた方が良いかも知れないけど。
あるいは無名WORDとかスキップWORDを用意するとか。
>「WORDを実行する」という意味のインストラクションは必要ないよ。
あれ?VMに保存されている「現在実行中のWORD」って、間接ポインタじゃないの?
(nextの動作を考えると、間接ポインタじゃないと色々と面倒臭そうな)
実行前に間接参照からWORDを探す操作が一段余計に必要になるかと思ってた。
533デフォルトの名無しさん
2008/10/12(日) 23:34:45 >VMと辞書の関連が密
というか、それがFORTHの肝のような気がする。
というか、それがFORTHの肝のような気がする。
534デフォルトの名無しさん
2008/10/13(月) 00:16:22 スレデッドコード自体、ワードへのポインタを並べたものでしかないから、
ジャンプとかコールとかそういう類のインストラクションをデコードする必要がない、
という意味ね。
あとForthの実装にはダイレクトスレデッドなものもあるよ。
nextルーチンからみると命令列を順に辿ってるだけであって、
「辞書からワードを毎回探している」ってわけじゃないしね。
それより、スタックに命令列を毎回pushするオーバーヘッドのほうがよほど大きいと思うし、
nextルーチンに比べてシンプルとも思えないんだな。
ま、いろいろ悩んで勉強して、これだ!と思える言語デザインに邁進してください、と。
このスレが本当に久しぶりに活性化したのは間違いないしね。
ジャンプとかコールとかそういう類のインストラクションをデコードする必要がない、
という意味ね。
あとForthの実装にはダイレクトスレデッドなものもあるよ。
nextルーチンからみると命令列を順に辿ってるだけであって、
「辞書からワードを毎回探している」ってわけじゃないしね。
それより、スタックに命令列を毎回pushするオーバーヘッドのほうがよほど大きいと思うし、
nextルーチンに比べてシンプルとも思えないんだな。
ま、いろいろ悩んで勉強して、これだ!と思える言語デザインに邁進してください、と。
このスレが本当に久しぶりに活性化したのは間違いないしね。
535デフォルトの名無しさん
2008/10/13(月) 00:21:58 >>533
間接スレデッドの場合、Forthコンソールの側から見ると、
逆コンパイルしやすかったり、便利な面はたしかにあるけれど、
VMつうかnextルーチンから見ると、単にポインタを辿っているだけなので、
構造として、VM実装と辞書構造が密、というわけでもないと思う。
実際VM実装テクニックとしてのスレデッドコードは、今や、Forth以外でも
当たり前の技術になってるし。
間接スレデッドの場合、Forthコンソールの側から見ると、
逆コンパイルしやすかったり、便利な面はたしかにあるけれど、
VMつうかnextルーチンから見ると、単にポインタを辿っているだけなので、
構造として、VM実装と辞書構造が密、というわけでもないと思う。
実際VM実装テクニックとしてのスレデッドコードは、今や、Forth以外でも
当たり前の技術になってるし。
536デフォルトの名無しさん
2008/10/27(月) 00:52:54 jonesforth読んだ。
ソース付きなので理解しやすい。
OS Xで動かそうとしたが挫折した。
OSXのGASではマクロが対応してないみたいだ。
ソース付きなので理解しやすい。
OS Xで動かそうとしたが挫折した。
OSXのGASではマクロが対応してないみたいだ。
537デフォルトの名無しさん
2008/11/23(日) 01:13:24 急にスレが進んだと思ったら、止まるのも急だよなこのスレ
やっぱ誰も使ってないってこったな
やっぱ誰も使ってないってこったな
538デフォルトの名無しさん
2008/11/26(水) 17:30:54 ttp://www.intellasys.net/index.php?option=com_frontpage&Itemid=64
なんか並列forthマシンっぽいw
なんか並列forthマシンっぽいw
539デフォルトの名無しさん
2008/12/27(土) 14:00:32 factor使ってる奴いる?
540デフォルトの名無しさん
2008/12/27(土) 21:13:14 とりあえず入れてみたけど特に使ってないなw
541539
2008/12/28(日) 01:26:48 factorおもしろいぜ。デプロイするとスタンドアロンで動く物もできるし。
542デフォルトの名無しさん
2008/12/29(月) 13:31:00 やっぱだめだこの言語。
人間工学から著しく反してる。
人間工学から著しく反してる。
543デフォルトの名無しさん
2008/12/29(月) 19:52:22 サルが人間工学語ってやがる。
544デフォルトの名無しさん
2008/12/29(月) 21:45:56 自分の思考をスタック処理に最適化させればいいんだよw
545デフォルトの名無しさん
2008/12/29(月) 22:06:52 forthに慣れるのはそんなに大変なことじゃないと思うけどなあ。
まあ、問題をごく単純な部分に細分して考えることができないと、
スタック処理が爆発しがちになるとはいえますね。
でも、問題の細分ができない人は、どの言語でプログラミングしても
たかが知れてる。
まあ、問題をごく単純な部分に細分して考えることができないと、
スタック処理が爆発しがちになるとはいえますね。
でも、問題の細分ができない人は、どの言語でプログラミングしても
たかが知れてる。
546デフォルトの名無しさん
2009/01/01(木) 11:45:56 Lispのマクロ的なことができるってほんと?
547デフォルトの名無しさん
2009/01/01(木) 11:56:23 イミディエイトなワードのことかな。
結果としては似たようなことができると言えなくもないけど、
Lispのマクロみたいな2度evalするみたいな高水準のものじゃありません。
結果としては似たようなことができると言えなくもないけど、
Lispのマクロみたいな2度evalするみたいな高水準のものじゃありません。
548デフォルトの名無しさん
2009/01/07(水) 22:44:24 つまり・・・どういうことだってばよ?
549デフォルトの名無しさん
2009/01/07(水) 23:39:44 factorならlispのマクロと同じようなことができるよ
550デフォルトの名無しさん
2009/01/08(木) 00:11:19 同じ機能を達成できるとしても言語が違えばそこに至るロジックは異なる。
具体的に何がしたいのか特定しないと。
factorはおもしろい言語だが、関数型言語のフリし過ぎなのがイヤラシくもある。
具体的に何がしたいのか特定しないと。
factorはおもしろい言語だが、関数型言語のフリし過ぎなのがイヤラシくもある。
551デフォルトの名無しさん
2009/01/09(金) 12:30:14 何かサンプルが欲しいな。
552デフォルトの名無しさん
2009/01/09(金) 22:47:55553デフォルトの名無しさん
2009/02/26(木) 00:17:58 組み込み用FORTH検討中・・・
554デフォルトの名無しさん
2009/03/07(土) 05:11:31 part 1 の URL ってないの?
555デフォルトの名無しさん
2009/03/07(土) 10:00:54556デフォルトの名無しさん
2009/03/07(土) 10:13:20 : Mops ( オブジェクト指向FORTH -- ) ;
http://pc.2ch.net/tech/kako/1000/10001/1000118518.html
http://pc.2ch.net/tech/kako/1000/10001/1000118518.html
557デフォルトの名無しさん
2009/03/07(土) 13:25:33 thanks
558デフォルトの名無しさん
2009/03/07(土) 18:54:17 このスレも長いね
559デフォルトの名無しさん
2009/03/07(土) 21:43:31 factorとかJoyとか触ってる奴いないのかよ
560デフォルトの名無しさん
2009/03/07(土) 23:32:50 普通の関数型言語に比べてどういうメリットがあるのか分からない。
561デフォルトの名無しさん
2009/03/08(日) 10:51:09 forthは関数型ちゃうし
562デフォルトの名無しさん
2009/03/08(日) 12:22:51 >>560はなんでこのスレにいるんだ?
563デフォルトの名無しさん
2009/03/08(日) 19:52:03 いや、factorがって事なんだが。
564デフォルトの名無しさん
2009/03/08(日) 20:01:58 なんで関数型言語と比較するんだ?
Factor = forth + 無名関数とオブジェクト指向だよ
Factor = forth + 無名関数とオブジェクト指向だよ
565デフォルトの名無しさん
2009/03/19(木) 13:57:45 全然Forthと関係ない話だが、AMDのシニアアーキテクトが
チャック・ムーアって名前なのは結構心臓に悪いな。
チャック・ムーアって名前なのは結構心臓に悪いな。
566デフォルトの名無しさん
2009/06/24(水) 08:13:56 何か話題無いかな
567デフォルトの名無しさん
2009/06/25(木) 14:24:21 LLイベントでの発表者募集中とか
568デフォルトの名無しさん
2009/07/03(金) 05:23:56┌─┐
│●│
└─┤
_ ∩
( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘ おっぱい!おっぱい!
569デフォルトの名無しさん
2009/07/03(金) 22:57:04 Pythonスレに帰れw
570デフォルトの名無しさん
2009/07/09(木) 07:11:33 今更ながら FORTH 勉強しようと思ってるんだけど、
何かいい本ある?
できれば日本語がいいけど英語も可。
何かいい本ある?
できれば日本語がいいけど英語も可。
571デフォルトの名無しさん
2009/07/09(木) 10:23:23 絶版多し
572デフォルトの名無しさん
2009/07/09(木) 21:39:14 触りしか読んでないけど
ttp://www.forth.com/starting-forth/
ttp://www.forth.com/starting-forth/
573デフォルトの名無しさん
2009/07/10(金) 07:32:04 >>570
Let over Lambda日本語版
Let over Lambda日本語版
574デフォルトの名無しさん
2009/07/10(金) 20:52:17 >>573
たしかそれってlispの本じゃないか?
たしかそれってlispの本じゃないか?
575デフォルトの名無しさん
2009/07/10(金) 20:57:56 lispでforthを作る本
576デフォルトの名無しさん
2009/07/10(金) 22:31:17577デフォルトの名無しさん
2009/07/11(土) 05:33:45 gforth でググるとNVIDIAのグラボしかヒットしない。
Bingだと forth だけがヒットする。愛してるよMS
Bingだと forth だけがヒットする。愛してるよMS
578デフォルトの名無しさん
2009/07/18(土) 23:02:30 あほな質問かとは思うがよかったら教えてくれ
スタック型言語にはスタックオーバーフローってある?
それともヒープにあたるものをスタックとしてつかている?
スタック型言語にはスタックオーバーフローってある?
それともヒープにあたるものをスタックとしてつかている?
579デフォルトの名無しさん
2009/07/18(土) 23:10:10 両方ともYESだよ。
580デフォルトの名無しさん
2009/07/18(土) 23:17:25 オーバーフローだけじゃなくスタックアンダーフローも楽しめるぞ
581デフォルトの名無しさん
2009/07/18(土) 23:31:56 さんきゅー、Jedi!
582デフォルトの名無しさん
2009/07/19(日) 03:45:38 そのネタもう飽きた
次そゆこと言った奴はダークサイドな
次そゆこと言った奴はダークサイドな
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L
名言集 その2
『お前が規制系キャップ取れるか審査してやるよ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ 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
> まぁ、どうせ正解が出るわけもないし、次の問題。
> 君が思う面白いスレはどんなの?
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
名言集 その2
『お前が規制系キャップ取れるか審査してやるよ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ 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
> まぁ、どうせ正解が出るわけもないし、次の問題。
> 君が思う面白いスレはどんなの?
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
584デフォルトの名無しさん
2009/10/06(火) 10:44:14 . 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件
. 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デフォルトの名無しさん
2009/10/06(火) 11:33:58586デフォルトの名無しさん
2009/10/06(火) 11:36:17 すみません、嘘でした。。。
587デフォルトの名無しさん
2009/10/06(火) 13:38:04 C の検索結果 約 3,910,000,000 件中 1 - 10 件目 (0.32 秒)
588デフォルトの名無しさん
2009/10/06(火) 13:39:59589デフォルトの名無しさん
2009/10/06(火) 13:42:51 D の検索結果 約 4,780,000,000 件中 1 - 10 件目 (0.24 秒)
時代はもはやDですよ。
時代はもはやDですよ。
590デフォルトの名無しさん
2009/10/06(火) 13:44:54 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 秒)
Brain Fuck の検索結果 約 5,190,000 件中 1 - 10 件目 (0.30 秒)
Brain Fsck の検索結果 約 28,500 件中 1 - 10 件目 (0.33 秒)
591デフォルトの名無しさん
2009/10/08(木) 21:50:04 Fuck の検索結果 約 156,000,000 件中 1 - 10 件目 (0.19 秒)
592デフォルトの名無しさん
2009/10/09(金) 00:25:23 A の検索結果 約 15,560,000,000 件中 1 - 10 件目 (0.06 秒)
時代は A だった。
時代は A だった。
593デフォルトの名無しさん
2009/11/23(月) 09:27:28 forth検索しにくすぎる
594デフォルトの名無しさん
2009/11/23(月) 18:04:33595デフォルトの名無しさん
2009/11/25(水) 14:14:43 http://lab.ee.uec.ac.jp/text/forth/doc/WordName.html
このページの仕様だとNFの後にLFが来てるけど、jonesforthだとLFが最初だよね。
NFが先だとFINDの時にLFを出すのに手間がかかると思うんだけど、
NFがLFより前にあるメリットって何かあるのかな?
このページの仕様だとNFの後にLFが来てるけど、jonesforthだとLFが最初だよね。
NFが先だとFINDの時にLFを出すのに手間がかかると思うんだけど、
NFがLFより前にあるメリットって何かあるのかな?
596デフォルトの名無しさん
2009/11/26(木) 00:14:06 padding の有無の違いかと
レスを投稿する
ニュース
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 【日本大使館】中国在留邦人は安全確保を ★2 [ぐれ★]
- 【実況】博衣こよりのえちえち朝こよ🧪
- 【高市刺客】 自民党「公明党の斉藤代表と闘う! 衆議院広島3区に公認候補を立てるぞ😤」 [485983549]
- 安倍晋三の遺産、日銀ETF売却終了予定は2138年 [115996789]
- 「これが完成された醜い姿である>>1」←これなに?
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
- 🏡
