Rubyの実装に疑問あり!
■ このスレッドは過去ログ倉庫に格納されています
0001「真面目な」反対派(何が真面目なのか知らないが)
NGNG構文木をeval関数(巨大なswitch文)でたどっていく方法だが。
これでは速度的に不利だ。
また、そのせいで例外処理にsetjmpとlongjmpを使う風になっていて、
余計な負担がかかっている。
GCもスタックを勝手にサーチして「保守的ごみ集め」をやっているが
これも速度的に問題がある。
開発者のまつもと氏はいったいどう考えて作っているのか、
知りたいところだ、、、。
0153デフォルトの名無しさん
NGNGるびーはサイキョーーー西京最強斎京斉京ーーーーー!!
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG0156シゲは去ね
NGNG0157156は氏ね
NGNG0158157も死ね
NGNG0159158も市ね
NGNG0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNG多言語ユーザが Ruby を陥れようとしているのもあるんじゃない?
まあ大半は白痴 Ruby ユーザがやってるんだろうが。
0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNGHSPマンセーーーーーーーーー!!!!!!!!!!!!
0165衝撃の真実
NGNG0166デフォルトの名無しさん
NGNG実務派の兄と論理派の弟ですが、HNが平仮名な所はそっくり!!
0167デフォルトの名無しさん
NGNG0168デフォルトの名無しさん
NGNG...世も末だな。よりによってHSPと比較される日が来るとは...。
0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNGえっちすぷはゆうざあがちゅう
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGで、叩くのはいいけど煽り荒らしは勘弁な。
0176デフォルトの名無しさん
NGNG同意。でもよく勉強してる叩きさんたちはどこかへ行っちゃったみたい。
0177デフォルトの名無しさん
NGNG・まつもとさんVM(IPAの産物・性能検証用)
・木山さんVM(独自実装)
・JRubyで使ってるVM(JVMを利用)
の3つ、ということでいいのかな? でもJRubyのは
別に中間言語に落としてるわけじゃないみたいだから
ちょっと違うかもしれない。前二者のはまだ公開されて
ないし。
Robert FeldtってまだVMは書いてないよね? Parrotも
Rubyでは使ってなさそうだし。AuroraはVM使ってない
よね。……こんなとこ?
0178デフォルトの名無しさん
NGNGこれがみんな、それぞれ独自にparser書いてるんですか?
Rubyでは再利用はできないということですね。
0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNGこういうのって複数実装があった方がいいような気がするが。
唯一の実装がへぼかったら目も当てられんだろう。
178はただの煽りかな
ちなみに俺もRubyユーザーじゃない。興味はあるけどね。
0182ルビ厨な入
NGNGWindowsでのRubyは複数有るんだよね、、コンパイラによって、、
mswin32、mingw、cygwinって、、、(他にもあるらしいが、、、)
まあ、mswin32とmingwはバイナリ的に全く同じらしいけど、、、
でも、どうやら、mingw版に統一することで話が進んでいるらしい。
確かに、複数有ると、初心者は迷ってしまうかも知れないけど、
まだまだ、Rubyは初期の段階なのだから、
そう言うのが複数合ってもいいと思う。
複数の中から、いいものがどれかって残っていくと思うし、、、
0183ruby知らず
NGNGMatzがPOSIX APIにこだわってWin32APIに移植する気がないってことか、
ほかにライセンスとかの理由がある?
0184デフォルトの名無しさん
NGNGmswin32版はVC++でコンパイルしたもの。
mingw版はmswin32版とほぼ同じソースをMinGWでコンパイルしたもの。
Intel C++でビルドしてる人がいないのは、誰も持ってないんだろ、きっと。
0185デフォルトの名無しさん
NGNGParserは別の話。これはVMね。
つーか、まつもとさんも木山さんもCで書いてるんじゃないの?
>>183
MatzはWindowsは使わないからWinに関することはぜんぶ他のひとにお任せ。
0186タコ
NGNGもうVMの開発は進行していたのですか。
まつもとさんと木山さんのものはまだ未公開なのですか?
JRubyのソースって手に入れられるのでしょうか?
これからRubyのHPに行ってみます。でもそれ以外のとこかにあるのでしたら、URLを教えてもらえますか、すみません。
「まつもとさんのVM」のところに記されている「IPA」って何ですか?
ひょっとして、まつもとさんが受けた「国からの助成」(奨励だったかな?)と関係ありますか?
JRubyって、JavaでC言語版の本家Rubyを書き直したものなのでしょうか?
(そうでないとすると、以下の質問は私の勘違いというか無意味に
なってしまいますが。すみません)
JRubyも構文木をたどって解釈実行する方式だとすると、
インタプリタが実行するのはC言語の標準ライブラリ(で作られたまつもとさんの関数群)ではなく、JavaAPIを実行するのでしょうか?
たとえば、Rubyの文字列構造体(RString?)と文字列ライブラリ(string.c?)の代わりに、
Javaの文字列クラスを使用するとか。
それと、JRubyはJava記述だから、GCのコードはないんでしょうか?(当然そうなりますよね?)
あと、例外処理とかはどうしているのでしょうか?
本家Rubyはsetjmpを使っているそうだけど(1の人によると)、
Javaのコードではどのように処理しているのでしょうか?
>Robert FeldtってまだVMは書いてないよね? Parrotも
>Rubyでは使ってなさそうだし。AuroraはVM使ってない
>よね。……こんなとこ?
これは海外の開発者の方たちですか?
>>181
わたしも複数実装の存在はいいのではないかと思います。
(でも、それが将来統合されると、もっといいと思います。)
0187デフォルトの名無しさん
NGNG文章が長い上に「?」だらけ。
>まつもとさんと木山さんのものはまだ未公開なのですか?
>JRubyのソースって手に入れられるのでしょうか?
>「まつもとさんのVM」のところに記されている「IPA」って何ですか?
>JRubyって、JavaでC言語版の本家Rubyを書き直したものなのでしょうか?
・・・
>これは海外の開発者の方たちですか?
本当に知りたきゃGoogleで検索してみろ。
本当にRubyのことが知りたいなら、RubyのHPに逝け。
あまりに酷いんで、ネタかと思うぞ。
0188デフォルトの名無しさん
NGNGdistributionについてくるRuby Language Referenceは互換性を保
証できるほどちゃんとしたものでは全然ないし。
「まつもと処理系のソースが仕様です」なのかな?
0189sage
NGNGそんなにへりくだるこたねぇそ。どーせネットなんだからよ。
「すみません」とかいってる奴、久々見たよ。
JRubyの例外処理。
俺は知らんけど、Javaで書かれとるんなら、
Javaの例外処理を使ってるんと違う。
最近SQLしかいじっとらんで知らんわ。
でも、JavaかましてるんならフツーのRubyより、遅いんとちゃうんか。
0190デフォルトの名無しさん
NGNGSQLシコシコやってるような坊やが、Ruby語るなっつーの。
>>187
だから、この程度の質問にも答えられない厨房が、Ruby語るなっつーの。
0191デフォルトの名無しさん
NGNGじゃ、おめー答えてみろよ。
0192デフォルトの名無しさん
NGNGお前が言えよ。
0193デフォルトの名無しさん
NGNGまつもとさんVMは試作というか、検証用で、Rite用のは別に書き始める予定
なんじゃないのかな。本当のところは本人に聞かないとわからんけど。
IPAは未踏で正解。
JRubyは http://jruby.sf.net/ にソースも含めて全部あるから見てみ。
Parrotは http://www.parrotcode.org/ にある。auroraはRAA。
>>189
確かにかなり遅いが、JavaのオブジェクトをRubyから利用できるのが
メリットか。
0194デフォルトの名無しさん
NGNG噂では、まつもとさんのVMのコードはFTPで手に入るそうだ。
木山さんのはインタプリタとは分離して開発してるようで、
まだバイトコードを手で書くような感じだった。LC2001のと
きの話だが。
どっちもまだ実験段階。
IPAというのは通産省(今はなんてんだっけ)の外郭団体。情報
処理振興なんとかかんとか。忘れた。
JRubyはRAAに登録されてなかったかな。
http://jruby.sourceforge.netがメイン。
ちらっと見た感じでは、eval.c同様構文木を自前で辿ってる
ようで、バイトコードは使っていない。
0195デフォルトの名無しさん
NGNGでは
0196デフォルトの名無しさん
NGNG>>190
じゃ、おめー答えてみろよ。
192 名前:デフォルトの名無しさん :01/11/08 15:27
>>191
お前が言えよ。
恥ずかしすぎ!
0197デフォルトの名無しさん
NGNGそんだけ
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNG0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG他の数千の言語が存在するのと同じ理由だろ。
なんで自分の好きな言語以外を排斥しようとする連中がいるのか理解に
苦しむなぁ。
誰がどんな言語を作ってどんな言語を使おうがそいつの勝手だろうに。
0202デフォルトの名無しさん
NGNGそれってRubyユーザ?
0203デフォルトの名無しさん
NGNG違います。Rubyユーザはそんなことしません。
よく、まつもと氏が書いた文章を持ち出して「そんなことない」と批判する人が
いますが、あれは、他言語と比べての優位性をアピールしているだけ。
優位であると主張することと、排斥することは全く違います。
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNGなんでRubyユーザーは優位性をアピールしたがるわけ?
どの言語にアドバンテージを感じるかなんて人それぞれなんだからさ。
うちの言語の方が優位なんて発言は新興宗教の勧誘文句と変わらないよ。
0207デフォルトの名無しさん
NGNGだって、あの文章今となっては嘘っぱちだもん。
とくにpythonのところなんて酷いもんだよ。
今でも正しいのは優位なのか優位じゃないのかわからんところだけだし。
0208デフォルトの名無しさん
NGNGどの言語を選ぼうか迷ってる人、あるいは、Rubyをやろうかどうか
迷ってる人向けだから。
Perlだって、Pythonだってやってるでしょ。というか、ありとあらゆるものが
やってる。Rubyが特別なのではありません。
「新興宗教の勧誘文句」なんて受け取るほうがおかしい。
0209Lisper
NGNG0210デフォルトの名無しさん
NGNG迷ってる人を引き込む勧誘文句なんだろ。
0211デフォルトの名無しさん
NGNGそうだよ。
で?
0212デフォルトの名無しさん
NGNGそれ以外は撲滅スレで。
ruby撲滅スレ
http://pc.2ch.net/test/read.cgi/tech/1001125342/
0213デフォルトの名無しさん
NGNGここまで煽られるんじゃないかな。
0214デフォルトの名無しさん
NGNGドキュなちゃんころにも聞こえやすいだけと思われ。
0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNGでファイナルアンサー!
0218デフォルトの名無しさん
NGNG手の込んだ単発ギャグのようなもの。
0219デフォルトの名無しさん
NGNG作者が言語ヲタを標傍してるからねぇ。
既存の言語でRuby以外にどういうプログラムを作ったのか知らないけど。
0220デフォルトの名無しさん
NGNG「メタクラス」というのがわからない。
Rubyだけじゃなく、ほかのオブジェクト指向言語、Smalltalk
とかにもあるらしいが、まず、これってなんのためにあるのだ?
(ま、知らんでも、使えるのだろうが、何となくすっきりしないのだ)
「普通のクラス」(class宣言でユーザーが作成するクラス)と
インスタンスの関係はわかるような気がするのだが、
その「普通のクラス」はメタクラスのインスタンスなのか?
作者のRuby本も立ち読みしてみたが、この部分の
継承関係を図示してあったが、よくわからん。
(まず最初にObjectがあって?それからどーなるんだ?)
この厨房に誰か教えてくれ。
ちなみに俺は普段C++を使っているが、この言語には
メタクラスという概念はないような気がするのだが。
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNGUML でのメタクラスだが考え方は同じ。
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/UMLClassDiagramMetaClass.html
class Foo
@@baz = nil
attr_accessor :foo
def Foo.baz; end
def foo; end
end
例えば上のクラス Foo には
クラス変数 baz、クラスメソッド baz、インスタンス変数 foo、メソッド foo などがある。
が、特定のあるクラスではなく、「クラス」そのものはどう表現すればいいのか。
その答えがメタクラス。
この考えではメタクラスのインスタンスがクラスとなる。
メタクラスでは、クラス変数が定義できる、
インスタンスメソッドが定義できる、などが定義される(これは概念上ね)。
0224デフォルトの名無しさん
NGNGhttp://www.st.rim.or.jp/~fuku/cmail/intro.html
0225デフォルトの名無しさん
NGNGClass.public_instance_methods #=> ["new", "superclass"]
でわかるように Class のインスタンスであるクラス(例えば上の Foo クラス)は
new や superclass といったメソッドを持つ。
これらのメソッドはクラスの視点ではクラスメソッドとなる。
例えばメタクラスがあることで動的にクラスを作成することができる。
223 の Foo クラスの作成は以下のコードでできる。
Foo = Class.new
Foo.class_eval "@@baz=nil; attr_accessor :foo; def foo; end; def Foo.baz; end"
0226デフォルトの名無しさん
NGNG220だ。ありがとよ。
でも、やっぱ、わかんねえ。
Rubyの奴らって、みんなこんな概念わかってるのか。
だとしたらすげえな。
なんかC++の方が、単純に思えてきた。Javaもメタクラスってあるのか。
Ruby Hacker's Guide
http://www9.xdsl.ne.jp/~aamine/ja/ruby/hack/class.html
も読んでみたのだが、
そこにあった下記の図が、ますます混乱に拍車をかけている。
(上手く表示されていないかもな)
+--------+
| |
Object -------> (Object)
^ ^ | ^ ^
| | | | |
+------------------+ | | | |
| +-----|------|------+ |
| | | | |
AnyClass ------> (AnyClass)| | |
| | |
Module -------> (Module)
^ ^ | ^
| | | |
AnyModule ---> (AnyModule) | | |
| | |
Class -------> (Class)
^ |
| |
+------+
ダメだ。
なんだか循環しているようで、
アタマがこんがらかってきた。逝ってしまいそうだ。
まずもって、メタクラスが何のためにあるのか、どうしても理解できない。
Classにnewがあるのはなぜなのか。また、そのおかげで
動的にクラスを作成することができる、というのもわからない。
0227デフォルトの名無しさん
NGNG0228デフォルトの名無しさん
NGNGみんながみんな、メタクラスの概念を完全に理解している訳じゃないと思うよ。
実際、クラスがClassのインスタンスだって事を意識することはあまり無いよ。
余談だけど、クラスのメタクラスClassはClassのインスタンスでもあるらしいんだけど、、、
こう言うのを考えるともっと混乱してくる思うので、気にせずに逝こう!
0229デフォルトの名無しさん
NGNGクラスってのはオブジェクトの属性と振る舞い(メソッド)を定義したものってのは
判るよな?
で、JavaとかRubyとかはクラスそのものをプログラム上でいろいろ操作
できる。
たとえばクラスに含まれる属性やメソッドの種類と数を調べたり
Rubyだとメソッドを削除したりできる。
で、そのクラスそのものを操作するメソッドとかが定義してあるのがメタクラス
メタクラスはクラスのクラスだ
0230223
NGNGhttp://www.tech-arts.co.jp/oo/uml2.html
>>226
Ruby の実装で考えると混乱するよ。
単純にクラスの意味を定義する階層が上にあるとだけ認識すればいい。
0231デフォルトの名無しさん
NGNGその時にクラスがどう表現されるかを考えると自然と分かる。
0232デフォルトの名無しさん
NGNGクラス自体もオブジェクトだと看倣した時に
その「クラス」オブジェクトのクラスは何かって考えると
わかりやすいよ。
ただし、クラスについて考える時に
例えばIntegerなら
Integerという名前のオブジェクトか
Integerクラスのオブジェクトか
をきちんと区別しないと混乱するから注意。
ちなみにSmalltalkでは
1
-> SmallInteger
-> SmallInteger class(SmallInteger classはClassのサブクラス)
-> Metaclass
-> Metaclass class(Metaclass classはClassのサブクラス
-> Metaclass
以下無限に続く
っとなっとりますです。
ついでにクラス階層は
-Object
- Behavior
- Metaclass
- Class
- Object class
- Behavior class
- Metaclass class
- Class class
- Magnitude class
- Number class
- Integer class
- SmallInteger class
- Magnitude
- Number
- Integer
- SmallInteger
0233厨房質問
NGNG>>231の言ってることは解るけど、内部の仕組みをわざわざ言語仕様として
ユーザーに扱わせるからには何か利点があるんだと思うけど。
0234デフォルトの名無しさん
NGNGまずクラスをオブジェクトとして扱うのなら、
そのクラスのクラスが必要になるってのはOK?
0235232
NGNG0236226
NGNGなるほど。だんだんわかってきたような気がする。
要するにメタクラスというのは、「動的」つまり実行時に、クラスの情報を取得したり、
クラスを操作したりするために存在するものなのだろう。
そして、クラス−インスタンス関係は
インスタンスオブジェクト --> 通常のクラス --> メタクラス
となる。
以上が俺の理解した「メタクラス」の一般だ。間違っているかもしれんが。
ここで、Rubyのクラス継承図
http://www9.xdsl.ne.jp/~aamine/ja/ruby/hack/class.html
を見ると、Objectを含む通常のクラスはそれぞれメタクラスを持っている。
メタクラス間にも通常のクラスと同様の継承関係がある。
だからメタクラスの根っこ(何て言うんだ?)は、Objectのメタクラスとなる。
ところで、この根っこのObjectのメタクラスは、通常クラスのClassから継承されている。
このClassにクラス操作のメソッドが存在するのだろう。
ということは、このClassは「メタメタクラス」ということになるのだろうか。
Classは通常のクラスなので、Objectから継承されている。
(このことによって、ClassはObjectの性質を持つ)
そして、そのObjectはメタクラスObjectのインスタンスであるから、
(スーパークラスである)Classの性質を持つ。
ということになるのだろうか。
これも間違っているだろうか。それ以前に説明が下手だったかもしれんが。
なんだか、「メビウスの輪」のように循環しているような部分があるからな。ObjectとClassの間で。
しかし、要するにそれは、全てのクラスを動的に操作可能にするための仕掛けなのだろうか。
つまり、誰かが言っていたように、全てをオブジェクトとして扱う、とか。
しかし、、、。
>>228
>余談だけど、クラスのメタクラスClassはClassのインスタンスでもあるらしいんだけど、、、
>こう言うのを考えるともっと混乱してくる思うので、気にせずに逝こう!
やっぱ、わかんなくなってきた。
もちろんメタクラスのことを考えなくとも、Rubyを使うことは可能だろうが、何か気になってすっきりしねえ。
0237デフォルトの名無しさん
NGNGメタクラスがあると、クラスも他のオブジェクトと同じように扱える。
返り値でクラスを返したり、変数にクラスを入れたりできるってこと。
0238デフォルトの名無しさん
NGNGObjectとClassの間で循環しているってのはイイ線ついてる。
ただ、
> ところで、この根っこのObjectのメタクラスは、通常クラスのClassから継承されている。
> このClassにクラス操作のメソッドが存在するのだろう。
> ということは、このClassは「メタメタクラス」ということになるのだろうか。
継承関係とメタ関係を混同しているような...
Hogeというクラスがあったとして、
(Hoge)が(Object)から継承しているということが
(Hoge)のメタが(Object)だというわけではない。
それは、
HogeがObjectから継承していても
HogeのメタがObjectじゃないのと同じ。
Hogeのメタは(Hoge)だよね。
Rubyはよく知らないけど、もし
「ClassはClassのインスタンスでもあるらしい」が本当なら
(Hoge)のメタはClassという通常クラスで、Classはメタメタクラスになる。
ただ、これは継承関係とは全く別の話。
例えばSmalltalkだと
hogeのクラスはHogeで
Hogeのクラスは(Hoge)で
(Hoge)のクラスはMetaclassで、かつ、(Hoge)はClassのサブクラスで
Metaclassのクラスは(Metaclass)で
(Metaclass)のクラスはMetaclass
ってなってる。
つまり(Hoge)をメタクラスと呼ぶのは
「(Hoge)はMetaclassのインスタンスである」という意味。
これは1は整数と呼ぶのは
「1は整数のインスタンスである」ってのと同じ。
メタクラスの話をするときは、「1」と「整数」の混同に気を付けないと
わけわからなくなるから注意。
0239238
NGNG> (Hoge)のメタが(Object)だというわけではない。
じゃなくて
> (Hoge)がClassから継承しているということが
> (Hoge)のメタがClassだという理由ではない。
ね。スマソ。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNGなんでMetametaclass、Metametametaclassがなくて、ClassとMetaclass
の2段だけなのか? 答:特に理由はない。
なんでいっそJavaみたいにClassだけにしなかったのか? 答:特に理由はない。
自分自身を(間接的に)要素に持つ集合なんて言うのを安直に考えた型システ
ムは健全でなくなるが、ちゃんと考慮されてるのか? 答:深く考えてない。
0245デフォルトの名無しさん
NGNG再帰的に考えられないの?
CLOSとかのシステムはmetaclassの生成対象がmetaclassに
なることもある。
0246デフォルトの名無しさん
NGNG0247228
NGNG僕が言った、メタクラスというのは、プログラミング上で実際、
そのオブジェクトのクラスに見えるクラスのことであって、
実装におけるklassが示すクラスの事じゃなかったんだけど、、、
と言うことで、用語が混乱しておかしかったと、、、すいません。
RubyではClassのクラスはClassだよ。
klassが示すものとしてのメタクラスの意味ではClassのメタクラスは(Class)だけど。
class Hoge; end
hoge = Hoge.new
hoge.type #=> Hoge
Hoge.type #=> Class
Class.type #=> Class
ってね。
0248デフォルトの名無しさん
NGNGMetaclassがあることによってClass操作の柔軟性が増す。
同様にMetametaclassによってMetaclassの操作も可能にしたいと考えるが、
それを認めてしまうと無限のメタを許容することにもなってしまう。
そこで、全ての基底クラスにObjectを置き
作る作られるの関係を重視してMetaclass/Classという形にした、という話では?
プロトタイプ型の言語でプロトタイプの一種としてクラスの概念を導入した
と考えれば納得のいく構成だと思う。
0249デフォルトの名無しさん
NGNGMetametaclass=Metaclassで不都合なかろう。
>>244で、”スモールトークでは”って書いてあるのがきになるんだが、本当にこのことが問題になってたんですか?
0250デフォルトの名無しさん
NGNGメタクラスの概念についてはいろいろ説明してる文章もあるけど
SmalltalkのClass,Metaclass周りのsource以上にわかりやすいものは
見たことないんだよね、正直言って。
つまり、
Metaclass自体がSmalltalkでどれだけ役に立ってるかというより、
OOにおけるメタ階層という概念の提示として
とても歴史的な意義があるんじゃないかと思う。
rubyなりpythonなりのメタ階層を設計する上で、
SmalltalkのClassやMetaclassは参照標準として
かなりの貢献をしたんじゃないかと思うよ。
0251厨房質問
NGNG>>234 >>237 等
メタクラスの概念でクラスをオブジェクトとして扱えるのは
解ったんだけど、
それが実用上どんな利点をもたらすんでしょ?
人工知能で自己書き換えでもするんなら役立ちそうだけど。
0252デフォルトの名無しさん
NGNG動的なコード生成で使える。
XML文書を読み込んでオブジェクト化する時とか。
■ このスレッドは過去ログ倉庫に格納されています