5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

: Mops ( オブジェクト指向FORTH -- ) ;

1 : 1:01/09/10 19:41
ニッチ(Mac)の中のニッチ(FORTH)。
オブジェクト指向FORTH言語、Mopsについて語るスレ。
いや、語れるのか‥‥?

2 :1:01/09/10 19:56
参考URL
http://www.netaxs.com/~jayfar/mops.html

3 :デフォルトの名無しさん:01/09/10 20:32
そういや Mops 落としたことあるけど、全く使ってないな。
つか、中身も全然みてない。

FORTH がどうやったらオブジェクト指向になるんだろう。
確かに 1 2 + . がメッセージパッシングとして見えなくは
ないけど。クラスの定義とか継承とかできるんだっけ。

よかったら解説きぼん。

4 :1:01/09/10 21:43
>3
オブジェクトにメッセージを投げるのは、

 someMessage: anObject

のよーにする。最後に『:』のつくワードはメッセージと解釈される。
パラメタが必要な時には someMessage: の前にスタックに積んでおくぞ。FORTHだからね。
最後に『:』のつくワードはコンパイル時に、直後に置かれたオブジェクトを調べて
メソッドの結合を済ませてしまう。静的束縛なわけだ。

動的束縛にしたい時は、

 someMessage: [ anObject ]

という具合にオブジェクトをカギカッコでくくっておく。するとメソッドの結合は、
実行時まで遅延される。C++と違って呼び出し側が選ぶわけね。
(メソッドディスパッチのためのテーブルを常に辞書に抱えてるのね〜。メモリ食いかも〜。)

5 :1:01/09/10 21:51
4の続き。

FORTHであるが故に、メッセージ: オブジェクト の順序になるのだが、結果として、

print: GIKO

のごとく英語の語順としては自然になるため思ったより読みやすい。
(逆に「日本語でワードを登録したらMINDみたい!」、ってわけには逝かなくて残念無念。)

6 :1:01/09/10 22:03
クラス定義は

:class someClass super{ superClass1 superClass2 }

var someVariable

:m someMethod { n1 n2 -- }
n1 n2 +
put: someVariable
;m

;class

みたいな感じっス。
スーパークラスは複数許されるので多重継承可能っす。

someClass MONA

1 2 someMethod: MONA

とするとMONAオブジェクトのsomeVariableに3が入るぞな。

7 :デフォルトの名無しさん:01/09/10 22:08
>>5
逆だったらよかったのかもね。
GIKO print:
っていう語順、つまりStackTopにselfが置かれて、messageなOperatorはまずStackからselfをpopするっていう形ならば。

でもそれだと、メソッドの静的結合は、困難になるかな。
まあ動的オンリーでいいじゃんという気もするが。

8 :1:01/09/10 22:21
>7
ややっ。もしかしたら静的束縛も可能かも。
メッセージ側に静的束縛を示す修飾子みたいなのを用意して、
オブジェクトのコンパイル時に直後のメッセージが修飾子付きなら
メソッド結合を済ませたコードを生成すればいいのかも。
修飾子なしならオブジェクトのselfをスタックトップに積む。
いかが?

9 :2:01/09/10 22:37
解説どうもありがと。>>8

私も >>7 と同じで、レシーバを後に書くのは逆に FORTH的じゃないような
気がしたんだけど、message を先にスタックに積んでおいて後でオブジェクトを
作用させることで挙動がポリモーフィックになるとすれば、納得できるような
気もする。

ところでメッセージを実行した後のスタックの状態はどうなるの?
そのメッセージを受けたオブジェクトがスタックに残るわけかな。
スタックトップにあるオブジェクトにメッセージを送ることはできるの?

10 :1:01/09/10 22:58
>9
メッセージを実行した後には、呼び出されたメソッドが残したスタックの状態以外なにも
残らないです。分かりやすいのですが、メッセージを連続的にオブジェクトに流し込むSmalltalk的な
使い方ができない原因でもあります。
スタックトップにあるオブジェクトにメッセージを送る場合は、

anObject someMessage: []

という構文が使えます。スタックトップのオブジェクトの解釈は実行時までわからないハズなので、
動的束縛による呼び出しになりますが、そのオブジェクトの属するクラスをコンパイル時に指定
してイイ場合には、

anObject someMessage: class_as> someClass

という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。

11 :デフォルトの名無しさん:01/09/10 23:36
forthでOOPしたいんか?

12 :デフォルトの名無しさん:01/09/10 23:40
>11
したいっていうか、もうやっちゃってる人がいる。(w

13 :2:01/09/11 00:18
>>10
あそうか。メソッドの結果をスタックに残す場合、デフォルトで
レシーバもスタックに残っちゃうとかえって扱いにくいだろうな。

> anObject someMessage: []

なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
作用させることもできるわけだよね。

> anObject someMessage: class_as> someClass
> という呼び出し方をすることで、実行時のオーバーヘッドを小さくする事が出来ます。

メソッド呼び出しの束縛の仕方を動的にするか静的にするかを C++ の
ように定義側ではなく、呼び出す所で選択できるのはなかなかよい
ですねぇ。結構イケてる言語なのかも。

14 :1:01/09/11 00:36
>13
> なるほど。てことは、メソッドの中で復帰値として自分自身を明示的に
> スタックに積んで終了すれば、同じオブジェクトに連続的にメソッドを
> 作用させることもできるわけだよね。

なるほど、そういうやり方もありますね。

> 定義側ではなく、呼び出す所で選択できるのはなかなかよい
> ですねぇ。結構イケてる言語なのかも。

面白い言語だと僕は思うんですけど、あまりにマイナーなもので‥‥。
呼び出し側が束縛の仕方を選べる言語って他にあるのかな?
私は詳しくないんですが。

15 :2:01/09/11 07:04
>>14
> 呼び出し側が束縛の仕方を選べる言語って他にあるのかな?

あまり聞いたことないすね。そもそも動的なのが普通だから。
C++ みたく実行効率重視の言語だけが両方持ってるんじゃないかな。

> 面白い言語だと僕は思うんですけど、あまりにマイナーなもので‥‥。

やっと思い出したんだけど、Mops 落としたのに結局使わなかったのは、私が
Mac 持ってなかったからでした(大藁

で、Mac以外でも使えないかと捜してみたら

http://www.asahi-net.or.jp/~uw4s-wtnb/chidori-mops.html
このページにある FAQ に「Win32Forth が Mops のオブジェクトモデルを
取り入れている」とあって、下から落とせるみたいね。

http://www.taygeta.com/forthcomp.html

16 :デフォルトの名無しさん:01/09/11 07:09
MOPSって、CLOSのMOP(meta object protocol)の
ことじゃないですよね・・?

17 :2:01/09/11 09:10
Mops も CLOS も詳しくないのでアレだけど
>>16
Mops は
Michael's Object-oriented Programming System

とのことなので MOP とは関係ないみたい。
とは言え、Mops のベース言語である FORTH 自体が自己拡張性を
持った言語なので Mops でもその辺の機能がある程度使える、
…かもしれません。

18 :1:01/09/11 12:02
>>15
> C++ みたく実行効率重視の言語だけが両方持ってるんじゃないかな。

一般的なオブジェクト指向言語から見るとC++のほうが特殊というわけですね。

> このページにある FAQ に「Win32Forth が Mops のオブジェクトモデルを
> 取り入れている」とあって、下から落とせるみたいね。

そんなものがあったんですね。気がつきませんでした。
我々は孤独ではなかった!(藁
アセンブラでかかれているMopsのコア以外の部分はFORTH自身で記述されてい
るので、やろうと思えば別のFORTH処理系にも持っていけるのかも。

>>17
> Michael's Object-oriented Programming System

Michael Horeっていうオーストラリアのおぢいさん(孫がいるらしい)が一人で
開発しているらしいデス‥‥。

19 :デフォルトの名無しさん:01/09/14 02:55
forthって中間言語以外の用途ってあるんでしょうか

20 :デフォルトの名無しさん:01/09/16 21:16
Forthを中間言語に使っているシステムってどれ?

21 :元潜水艦乗り:01/10/04 20:14
保守カキコ。深度285/376。sageヨシ。
>>19-20
中間言語ってのとは少し違うがSunのOpenBootとかAppleのOpenFirmware
とかはFORTHみたい。
JavaのVMはスタックマシンみたいだけどスタックマシンならFORTHか?と
言われると少し違うような気がする。
っていうかたいていのコンパイラはスタックマシン向けのコードを生成して
からレジスタ割付けなんかをやって最適化したネイティブコードを作ってる
のでないかな?でもそれをFORTHとはよばないやうな。
あんまり知らんけど。

22 :元潜水艦乗り:01/10/13 09:29
保守カキコ。深度189/378。sageヨシ。
ぢつは、日本語化をあれから少しだけやってみた。
クラス定義だけできるようになった。


「 モナークラス 」は「 オブジェクト 」を継承し、
『 セリフ: " オマエモナ〜" 』
を実装する。

メソッドを呼び出す構文で良いのが思い付かず、途中やめにしてる。

へたれです………。

23 :デフォルトの名無しさん:01/10/20 17:51
    ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 〜' ― (,,゚Д゚) < 深度248/402。sage!!
  し― し-J  \___________

24 :デフォルトの名無しさん:01/10/23 00:34
爆雷投下

25 :デフォルトの名無しさん:01/10/23 01:19
たどり着いたらいつも雨降り

26 :第4番目の名無しさん:01/10/23 18:06
OpenFirmwareから書き込んでいますうそ
FORTHの考え方は好きだなぁ。
フェチ逝って良しですか?

27 :デフォルトの名無しさん:01/10/23 18:18
スタックトップのオブジェクトをレシーバーとする方がきれいだと
思うがなあ。anObject message とか。

数値も文字列もオブジェクト。+や.もメッセージと考えればすべて
うまくいくような。あ、引数なしのメッセージが困るか?

28 :25:01/10/23 18:28
>27
そういうのも蟻だと思う。
ANS仕様のForthならインタプリタやコンパイラいじり放題だから俺流アプローチのOOPが可能だよね。
俺は挫折したけど。

29 :22:01/10/23 18:54
>>27
たしかに、

anObject message

の形だと日本語の文脈にも合うので美しいなぁ。
‥‥‥‥コンパイラの中枢部分まで降りていって書き換えるか。

>>28
Forthはいじり放題、てのには激しく同意。
制御構造だろうがなんだろうが俺流につくれてしまう
Forthマンセー。
なんだけどおかげで方言だらけ(涙)。
Mopsも完全にはANSI互換じゃないしなぁ‥‥。

30 :デフォルトの名無しさん:01/10/23 18:57
>>26
名前がとても良いです。
このスレのデフォルトにしたいぐらいに。

31 :デフォルトの名無しさん:01/10/23 19:23
メタコンパイルage

32 :第4番目の名無しさん:01/10/23 20:45
>>30
サンクス。

33 :22:01/10/23 21:12
Mopsではmessageには

print:

のように最後に:を付けて区別しているので、
日本語化する時には、

印刷する。

みたいに最後に。が付いたモノは オブジェクトに
対するメッセージと言う事にすればヨイかな、
と思ったのですが、引数はどこに置くのがいいんでしょうね。

1)
anObject p1 p2 p3 message

2)
p1 p2 p3 anObject message

1)は引数とanObjectを区別するために少し細工が必要か。
(ブロック構文みたいになるかな?)
2)はmessageを直前にスタックに積まれたオブジェクト
に投げればイイだけなので実装は楽かと。
でも日本語化した時に楽しいのは1)のほうかな?

家政婦 は、

 (‥‥この間100行。)

見た。

あ、助詞をうまく使えば両方の構文を実装できるやうな
気もしてきた‥‥‥。

34 :デフォルトの名無しさん:01/10/23 23:42
たった一つだけ スタック制御だけ

なんでもないですage

35 :デフォルトの名無しさん:01/10/26 00:42
>助詞をうまく使えば

それはForthよりもSmalltalkに近い、という説が。
tp://isweb21.infoseek.co.jp/computer/h_yanai/html/B8E5C3D6A5ADA1BCA5EFA1BCA5C9A5E1A5C3A5BBA1BCA5B8.html

36 :22:01/10/26 02:14
リンク先を読みました。
似たような(たのしそうな)議論をしてますね。(^^
1)の構文のように複文かましてオブジェクトに流し込むという感覚は、
Smalltalkぽいわけですね。むー。
「スタックから何個オブジェクトもらうかはウチで決めさせてもらいますわ。」
の2)の構文のほうが確かにForthらしいか。
助詞によるパラメタのコントロールは魅力的だけど、スタック操作の実装を考えると、
オレみたいなへたれには荷が重いかも‥‥。
のんびり考えてみます‥‥。

37 :デフォルトの名無しさん:01/10/26 18:30
salvage

13 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)