[ruby-list:531] Re: meta-level features(Re: bug? and question)

From:
Date: 1996-09-18 04:59:02 UTC
List: ruby-list #531
けいじゅ@SHLジャパンです. 

長いし, 良く分からない記述もいっぱいあります. 許してやって下さい(__;;;

In [ruby-list :00516 ] the message: "[ruby-list:516] Re: meta-level
features(Re: bug? and question) ", on Sep/12 15:32(JST)
matz@caelum.co.jp (Yukihiro Matsumoto) writes:


>アプレットみたいなものを想定しています.外から持って来たプロ
>グラムが悪さをしないことを保証できる仕組みがあると良いじゃな
>いですか.

ああ. そういう意味でしたか.

>いや,ソースコードがあってもチェックしなければおんなじですよ.
>普通に使う範囲内なら考えなくても良いんですけどね.それにjava
>にもperlにもpythonにもsafeモードがあるのにrubyにないのは悔し
>いじゃないですか.

で, safeモードの検討は終ったのですか? 結構色々難しい問題がありそうです
が??

>元から特異クラスには触ることはできません.あくまでも実装上の
>都合で言語が提供するモデルには無いものですから.言語上のモデ
>ルではあくまでも「そのオブジェクトがメソッドを知っている」と
>いうものです.

確かにそうですね. 分かりました.

>あるオブジェクトがどのモジュールをインクルードしているかは分
>かるんですけど,それは内部で共有しているハッシュテーブルのア
>ドレスが同じかどうかで判定していて,もとのモジュールへのポイ
>ンタを持っていないんです.

そうすると, モジュールをインクルードした時にモジュールのメソッドは... 
下に解説がありますね.

>まあ,これはどうしても必要であれば変えられますけどね.それに
>全部のオブジェクトをスキャンするという荒技もあり得ますね.

まあ, それでもいいかも知れません. そんなにオブジェクト数は多くないです
からね.  

ところで, [ruby: 511]で:

>です.最後に駆け込みで追加した全てのオブジェクトを返すメソッ
>ド Module#each_object, Object.each_live_objectは(前者はその
>クラスのサブクラスだけ)は動作が怪しいです.

となっていますが, モジュールからオブジェクトへのポインタは持っているの
ですか? それとも, 全オブジェクトをアクセスしているのかな?

>あるオブジェクトがあって,それに対して扱うことができるメソッ
>ドの一覧が欲しいというモデルですよね.あるオブジェクトにこの
>メソッドを実行できるかと聞くことならできるんですけどね.

メソッド名からですか?

>そういうモデルじゃダメですか

そういうメソッドもあってもいいですけどね.

MLFについてはもう一度後で整理して考えましょう.

>こうなっています.かなり変則的.
>       super class -> hash table
>            ^
>     intermidiate class  -> hash table <- module
>            ^
>      singleton class  -> hash table
>            ^
>Object -> class -> hash table

>オブジェクトとクラスは良いですよね.で,クラスとスーパークラ
>スの間には特異クラスと中間クラスがはさまっています.これは実
>装上の都合で導入されたものでrubyからは見えません.

中間クラスは, (複数の)モジュールのメソッドのハッシュテーブルのために持っ
ているんですね. すると, intermidiate class から moduleへのポインタがあ
れば問題は解決するわけですね. 今のところ, 引用しているmoduleを調べる必
要がないからこういう仕様になっているわけですね.

>さっきも書いたようにkind_of?はこのハッシュテーブルが同じもの
>が先祖にあるかどうかで判定しています.

つまり, クラスは直接わかるんだけど, モジュールは間接的に調べているわけ
ですね... 

でも, 複数のモジュールをインクルードするとどうなっているのかな? 以下の
ようになっているのかしら??

     super class -> hash table
           ^
     intermidiate class2  -> hash table <- module2
           ^
     intermidiate class1  -> hash table <- module1
           ^
     singleton class  -> hash table
           ^
Object -> class -> hash table

それとも,

     super class -> hash table
           ^
     intermidiate class  -> hash table <- module1, module2
           ^
     singleton class  -> hash table
           ^
Object -> class -> hash table

ですか? どうも, 前者のようになっているようですね. 

あと, モジュールが他のモジュールをインクルードしている時はどうなるんです
か? 

やはり,

     super class -> hash table
           ^
     intermidiate class2  -> hash table <- module2
           ^                                 ^
     intermidiate class1  -> hash table <- module1
           ^
     singleton class  -> hash table
           ^
Object -> class -> hash table

となっているんですかね??

モジュールのアンロードとかを実現しようとしたらモジュールへの参照が必要
になりますね.

>まだ伝わっていないようですが,アクセスメソッド(と呼ばれるこ
>とがある)ものは普通のrubyのメソッドです.メンバと関連がある
>かどうかはインタプリタも知りません.たまたま @memberに対して 
>memberとmember=というメソッドが定義されているだけです.

じゃあ. そのメンバがアクセスメソッドを持つかどうか? なら意味があるでしょ
う(^^;;

>|MLF(Meta-Level-Featuer)の目的を考えなくてはなりませんね. 2つ例を考えて
>|みました.
>feature

しつれい.

>|1. デバッガ. 

>うーん.それってrubyの仕事じゃないような.もともとのrubyの目
>的は難しいことはCで書いてあとはお手軽にというものですから.

難しいことをCで書くのでは... rubyで実行するには重い処理はCで書いて, あ
とはrubyでお手軽にではないですか?

rubyの環境を作る人からみたら, 全部Cで作るのでも構わないのでしょうけど
も, Cの世界はできるだけ少なくしてrubyの世界で記述できた方が嬉しいし楽
じゃないですか? そうすると環境整備を手伝ってくれる人もでてきやすいよう
な?

>ただ,デバッガを作るのに必要な機能くらいはrubyからアクセスで
>きないといけないと思いますので,その辺は検討が必要でしょう.

>今は caller くらいしかないなあ.

もいっこ trace_var というわけの分からんコマンドがありますよ. 

話しは戻りますが, デバッガから, 自分がインクルードしているモジュールが
分からなかったり, 定義されているメソッドが分からないのも困りものだと思
いますが??

それがあれば, 例えば, (emacsと連動している)デバッガから, その情報から
モジュール定義やメソッド定義がブラウズされたりできるようにできますよね.

話しは変わりますが, こういうメソッドはDebugモジュールとかに移動しませ
んか? それに, Mainモジュールのメソッドであまり使わない関数は他のモジュー
ルに移動した方が良いのでは?

例:
  select--> IO(?)
  rand ---> Numeric or Integer
  srand --> Numeric or Integer
  syscall-> これってOS依存ですよね... こういうOS依存の機能は, OS とか
            いうクラスにまとめた方が良くないですかね?
  
あまりないですが...

>|2. 動的クラス生成. 

>Smalltalkではそういう時に DoesNotRecognize を使うんじゃない
>ですか? 僕はそう習ったように思いますけど.それならrubyにもあ
>ります.

DoesNotRecognizeって何ですか? もしかして, subclassResponsibilty(?)のこ
と? それとも doesNotUnderstand(?)のことかしら?

どちらにしてもそういうレベルのことをいっているのではありません. elisp
のedebug-defunは, 関数を定義するS式に手を加えてデバック用のS式を生成し
ていますよね. それと同じような感じをイメージしていました, あるクラスと 
そのメソッドに手を加えて新たなクラスを作るような処理を考えていました.
どういう方法でデバッガを実現しようとしているかわかりませんが...

>クラスを生成するAPIというのは面白そうですが,でもperlみたい
>に文字列で組み立ててevalで作っちゃうのがruby流なのかも知れま
>せん.

evalだとコンテキストの問題はないんでしたっけ? 例えば, あるクラス/モジュー
ルの中でeval("defun foo () ...")するとそのクラスのメソッドになるとか?
どれどれ... そういう問題はないみたいですね. 

でも, rubyは構文が複雑ですのでそういう(クラス生成や下記の構文木レベル
の)APIがある方が楽になりますよね.

>|でも, そういった意味でのMLFも面白いですね. 論理的なプログラム構造がオ
>|ブジェクトとして取り扱えるというのも. 
>構文木とかに触れちゃったりするんですか? うーむ.

こういう構造が使えると, ブラウザとか実現しやすくなります. ただ, ソース
コードとのリンケージをどうとるかも問題になりますが...

Smalltalk何かは, ソースコードレベルでのサポートとオブジェクトレベルの
サポートに分かれるような気がしてきました. ソースコードレベルのサポート
とは, 実行時に生成されるオブジェクトではなく, プログラムから直接生成さ
れるオブジェクトのこととしましょう. Smalltalkでは, それらのオブジェク
トから色々な情報がとれるようになっています.

rubyは, オブジェクトの構造に関しては超動的な言語ですから, ソースコード
レベルのサポートでは無理で, 実際のオブジェクトレベルでサポートする必要
があります.

class Foo < $Bar
  :
end

とかできちゃいますからね(^^;;; 

だから, 静的なソースコードレベルでなくて実行時のイメージで色々な情報を
取り出したりできる機能が必要になります. 

結論:

* rubyのデバッガ(ブラウザも)は, 実行時のイメージが必要.
* そのサポートは, MLFで行う.
* MFLでは, オブジェクトやクラスから色々な情報(メソッド名, モジュール名
  など)を取り出せる必要がある.

あと, rubyのデバッガ上でクラス定義を行えるようにしたいなら. クラスを再
定義できる機能も必要になりますね. 将来的にブラウザ(rubyプログラミング
環境)まで考えているなら, こういう機能も必要になりますし, こういう機能
があれば, デバッガから進化させるのも容易だという気がします. あと, 動的
にスーパークラスを変更する機能とかもひつようかな??

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----



__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----

In This Thread

Prev Next