Forth
よく知りませんが,PostScriptなんかの元になった手続き型言語らしいです.
構文解析が不要なので実装が小さくて済むので,組込み用途やブートローダに使われたりする.
- Joy
Forthじゃないけど,スタック型の純粋関数型言語らしい.
- PostScript に雰囲気似てますね。
- スタック操作が案外、関数型と相性が良い
- スタック操作は普通の言語でいえばローカル変数の操作。
しかもForth系だからそれは無名。
よって、"既存の変数"を複数回書いてしまう事態には遭遇しない。
- PostScript に以下のものを足せば、似たような言語になるかな?
- 連接List型。WriteOnce というか ReadOnly? な奴。
- (個々のkey-value pairごとに) WriteOnce? な、dict型
- 関数型言語 に相応しい関数群
- スタック経由で関数が情報を流し素麺(違)するおかげで、
- 引数がごちゃごちゃしない。
UNIX PipeLine? に近いシンプルな見た目を獲得してる。
- "定義"をしなくても済む場面が多い?
- 歪?さんち→ The Log of the No22 さんち
ふ〜ん,スタック,ワード(辞書)ってのがキーワードらしい.
リテラル(オペランド)だったらオペランドスタックにpushして,オペレータ
(オペコード)だったらスタックからオペランドをpopしてきて実行,結果を
pushする.オペレータを自分で定義していけるところがForthの面白そうな
ところ.このオペレータの定義が連想記憶されているのが辞書と考えればいいと.
- あれれ?リテラルがオペランドなんでしたっけ?Stackに積まれたもの一般を
オペランド(オペレートされるもの)と呼ぶのだと理解してました。
- 普通のマシン語で言うところのオペコード,オペランドがForthでは
リテラル,オペレータに相当するかなと思って書いたんですが.
リテラル,オペレータというのは言語レベルの話なので,同列に並べるのは変
だったかも.
普通の言語だと、手続きにシグネチャ(っていうんでしたよね。
引数や返り値の数/型/名/roleとかのことを)ってものがあるんで、
それのバリエーションを醸し出す方法を言語に内包しないと
いけないわけですが、Forth系だとなんでもかんでもStackで
話が済んでしまうんで、オペレータそのものを"呼ぶ"だけで
全部オッケーという感じ。引数(??)を面倒見るのは
オペレータ側の仕事であって言語コアの仕事じゃない。
具体的に言えば、実際に工夫が必要な所は
辞書に登録されたモノが手続き実体
(PostScriptなら実行可能配列と呼ぶ)
であるか否かによって処理を分岐する、という所だけ(^^; -戯
- Lispだったら*ユーザ*がラムダ式?を使うことで
手続きとデータを区別する必要があるわけですが,
それを処理系が面倒みるわけですね.
- これはどうやって判定しているのですか?
{}で囲むと実行可能配列というか手続きになるということ?
- そです。実行可能なモノは実行可能配列とNative手続き(のポインタのラッパ)
の2種類です。Cell_eval()でやってますが、Operator経由で呼ばれたときに、
モノが上記2種のうちのどれかだと、Cell_exec()に投げてます。
あんまり綺麗じゃないなあ。もっと洗練できるはず… -戯
- 判定せずに値として参照するだけの命令(Operator)はloadです。
loadとexecと型調べるOperator(未実装)を駆使すれば
自動判定は不要ともいえるわけですが、さすがにそこまで
ミニマリストになる(shortcutを拒否する)根性は無かったようです(笑)
- “{}で囲む〜”以降の記述はForthではないですよね。PostScriptの話?
スタック型言語(?)ってJavaバイトコードしかしらないんだけど,
コード追うのが大変.レジスタマシン?のアセンブラなら(x86なんて特に
レジスタ数少ないし),記憶しておくことが少ないので楽だけど,
スタックマシンだとスタックを一々図に書きながらじゃないと追えない.
う〜ん,単に慣れの問題なのかな?
もちろんレジスタマシンでもスタックを使うから,そこは図を書きながら
追ってますが.
ある有名なプログラマがプログラマに一番必要な能力は何かと問われたとき
「記憶力」と答えたという話を聞いたことがあります.
手続き型言語だとそうなのかなという気がしますね.
必要な情報を局所にまとめようというのが,構造化,オブジェクト指向化の
流れだとしたら,いまでも有効な話なのかは疑問ですが.
ただ私の知ってるスーパプログラマな先輩は大学を卒業してもう何年にもなるのに
作っていたCコンパイラ(
gcc]]より全然小さいですが)の内部を完全に覚えていますね.
昔書いたプログラムは他人が書いたプログラムってのは,まだまだ素人プログラマ
な証拠なのかもしれない(^^;)
プログラマに必要という意味での"記憶力"って奴は、普通の意味でのソレというよりも、
なんというか印象力とでも呼ぶべきものなんじゃないかなあ。
自分が書いているコードの各部を、いかに劇的に印象深かった事柄として
じぶんの脳に焼き付けているか、という意味。勿論焼きつけることそのものは
役に立つわけじゃなくて、それだけ内容の濃いコードを書いたことの証
というか裏返しという意味で、価値があるんだと思います。
一方、
うねりコード
なんぞを書きまくっている奴は、それこそ自分のコードに持つ印象が
薄かったりするんじゃないかなと邪推します。 -戯
あと、人間様が(も)書く言語として使われるスタック言語ならば、
言語仕様に構造化を導入することで理解しやすくすると思われます。
PostScript(と、ばぶばぶ(笑))ならば{}で括ることによる構造化をします。
で、{}の中には、理解可能な範囲の十分少ない命令しか、書いちゃいけないって
ことなんだと思います。その範囲が言語ごとに違う(スタック言語系だと
かなり少ない。多分10も書いたら多いほうだと思うべきかと。Cなら100くらいまでは
許せるかな、とか)というのが、つまり言語の個性なんじゃないかなあ。
MindStorms界隈の話
Forthって組込み分野で強いそうですが.いやはや.
TRON界隈の話
ブートローダ界隈の話
- Ficl
Forth の実装系じゃなくて,インスパイアされて作った言語らしい.
FreeBSD の boot loader は Ficl で実装されているらしい.
FreeBSD は Linux を使う前にしばらく使っていたけど,
そんなこと全然知らなかったなぁ.
AgendaというかFLTK界隈の話
- guiForth
pForthベースにFLTKバインディングを作るプロジェクトです.
- rubyでもperlでもtclでもなく最初にForth関連のプロジェクトが
立ち上がるってのが,まぁ,ユーザ層を反映しているんですかね(^^;)
- ばぶばぶと併せて,一気にForthが身近な言語になった気がします.
気になっているだけでプログラムは組めませんが.
(最終更新 Tue Aug 14 09:52:00 2007)
|