Ruby 10周年 36
ストーリー by yourCat
ここまで育てたことに感謝 部門より
ここまで育てたことに感謝 部門より
Silphire 曰く、 "まつもと ゆきひろ氏のMLへの投稿[ruby-list:37162] 『Rubyの10年』によると、1993年2月24日にRubyが誕生してから昨日で10年を迎えたとの事です。
『オブジェクト指向スクリプト言語Ruby』の「著者まえがき」に、Rubyの誕生から今日に至るまでの歴史が綴られています。いくつか要約して抜粋しますと、1993年の2月に石塚圭樹氏と雑談をしている時に、オブジェクト指向のスクリプト言語について話題になったのが最初のようです。それからPerlの機能を基にして使い物になったのが94年の夏頃。94年11月にNetNewsを通じて協力者を募集し、fj.sourcesにてRubyが日の目を見たのがその翌年の事だそうです。その後もRubyは発展を続け、現在はバージョン1.6.8まで進化を遂げました。また近い内に1.8がリリースされる予定です。"
かじってみたいが (スコア:1)
# Rubyをかじると歯が欠けるからではないので、あしからず
# PerlとRubyが同意語でないのは知っているよ
# せっかく無料で搭載されているのだから触ってみようかな
-- ラテール部参加者募集中
Re:かじってみたいが (スコア:1)
オフトピ (スコア:1)
#ごめんなさいごめんなさいごめんなさい
おめでとう (スコア:0)
Re:おめでとう (スコア:3, おもしろおかしい)
Re:おめでとう (スコア:1, おもしろおかしい)
Re:こんな感じですか (スコア:1)
Re:こんな感じですか (スコア:0)
Re:おめでとう (スコア:1)
#オフトピだけどID
Re:おめでとう (スコア:0)
# オフトピだからAC
次の10年で (スコア:0)
Re:次の10年で (スコア:3, 興味深い)
OSのスレッドと相性良くなるといいなぁ・・・
本体じゃないけどApolloのKylix版が安定するといいなぁ・・・
RubyがCGIに使えるプロバイダが増えるといいなぁ・・・
# どれも10年もかからない・・・ですよね?
Rubyには感謝してもしきれず。
Re:次の10年で (スコア:2, 興味深い)
1.4 系で開発が止っているようですが、
たしか 4倍程速くなる、とかいう話だったような。
ごみ(オフトピ-1) (スコア:2, おもしろおかしい)
#ごめんなさいごめんなさいごめんなさい・・・
Re:次の10年で (スコア:0)
# デモのテキスト版マンデルブロ曲線に感激
止まってるものじゃなくて動いてるものを上げようよ (スコア:0)
Re:次の10年で (スコア:1)
「全てがObject」でありかつ「動的」なrubyみたいな言語だと
コンパイルしても速度とかはあんまり美味しくない、という話じゃありませんでしたっけ?
#Smalltalk→Cコンバータ(とかいうものが有るんですって?)がどうやってるのかは全然知らないのでG7
個人的には、速度について細かいこと言いたい欲求は無いし、コンパイル「せずに済む」なら
そのほうが楽(別解として「コンパイルを意識しない」ってのも有るが、それはそれ)だから
わざわざしたいと思わないし、ソースを秘匿したいという欲求も無いので、コンパイルは欲しがってません。
#テキストなソースのままで、ただしClass/Method/変数名をぐちゃぐちゃにスクランブルしちゃう、というのはどうだろう?>ソース秘匿派諸兄
##あ。予約語が残っちゃうか…
>Rubyには感謝してもしきれず。
はげしく同意。文句は色々有る(笑)が感謝する点もまた滅茶苦茶多数有るのも確かなんで。
#最近やっとyieldを呼ぶ関数/Methodを肩肘張らずに書けるようになったのでG7
個人的には、require unix(藁)と、関数/Methodの引数を囲う括弧を必須にするのと、くらいが望みといえば望みかな。
Palmにも乗るといいなぁ…
Re:次の10年で (スコア:3, 参考になる)
> 「全てがObject」でありかつ「動的」なrubyみたいな言語だと
> コンパイルしても速度とかはあんまり美味しくない、という話じゃありませんでしたっけ?
> ソースを秘匿したいという欲求も無いので、コンパイルは欲しがってません。
の2つの他に、
Rubyの実行環境がない場所でも動かせる (素人さん相手に配布しやすい)
というのがあって、これができるとうれしいかも。
# もしかして、ネイティブコンパイラの話じゃない?
# はずしてる?
だが、いいこともあるぞ、外の天気は上々なんだ
Re:次の10年で (スコア:2, 参考になる)
Re:次の10年で (スコア:1)
近いものになるんでしょうかね。
Ruby2.0に期待!
ん… (スコア:1)
のみになって、その分Rite ("real" [ruby-lang.org] implementation)は
もうちょっと先…だったりするかも。
(3日前の[ruby-dev:19657] [nagaokaut.ac.jp]より)
# というか、今の(ナイスキャッシュな)Rubyとバイトコード化済みのPythonとの
# 比較で、単純に軍配が後者に上がらない時点で、実装の完成度の高いのが
# どちらかは目に見えているような…
#
# (言語処理系の知識はhoc [bell-labs.com]以前くらいなので突っ込み大歓迎)
え、Riteのリリースを早める方法ですか?
ええと…
「あなた」が手伝うことです。手伝える範囲でね。
(↑これ見てる人すべての事ね)
(自戒を含めてID)
Re:次の10年で (スコア:1, 参考になる)
コンパイラという話からはそれますが、
windows限定で完全とはいえんけど、この用途ならexerbがありますね。
Re:次の10年で (スコア:0)
Re:次の10年で (スコア:2, 興味深い)
動的な言語で最適化をはかるには、動的分析が必要になりますよね。実行時にメソッドの呼ばれ方や引数の渡され方を蓄積して、実行回数とスクリプトのタイムスタンプを見て「安定している」とわかった時点で蓄積した情報をもとに暗黙のうちに最適化してくれるようなインタプリタ/コンパイラみたいなのがカッコイイと思います。
...芸というものは一生勉強だと思っています...
Re:次の10年で (スコア:1)
Re:次の10年で (スコア:1)
明示的なコンパイルを必要とするのはRubyの精神に反すると思います。
...芸というものは一生勉強だと思っています...
Re:次の10年で (スコア:1, 興味深い)
ぐちゃぐちゃに?
よく出てくるものほど短かくしてくれぇ! by ハフマン派
本当に速度(スループット性能)を求めるなら (スコア:3, 興味深い)
Ruby のメモリ管理に関するまつもと氏の講演を聞きました。
その話では、Ruby の実装は移植性を重視。速度を求めていないようでした。
例えば、オブジェクトは 5ワード固定で、そこからはみ出すクラスや
文字列型の実体部分は malloc/free してオブジェクトにリンクするそうです。
つまり、オブジェクトヘッダーとオブジェクトボディが別々に管理されている
格好ですな。ヘッダーは固定長(5ワード)で、ボディは必要に合わせて
「ヒープ」外に確保すると。
スループット性能を本当に重視するのであれば、
その方向に性能を伸ばすにはどうやればいいか分かっている人が、
フルスクラッチで実装し直せば それだけで速くなると思います。
後は JIT コンパイラ次第で Java と同じ速度は出ると思います。
p.s.
私は一時 Ruby のソースを Java のバイトコードに変換しようと沈思黙考しました。
ただ動けばいいというレベルの変換をすることは可能なのですが、
ちゃんとした速度を出すためには色々最適化が必要になります。
a. オブジェクトのうち可能なものはスタック割り付けに
b. メソッド呼び出しを高速化
a. に関しては、数値型オブジェクトを対象にコード解析(つまり、エスケープ解析)を行えば、かなりの部分が Java の primitive 型にできると踏んでいます。
問題は b. で、静的に VTBL が作れる C++ や、クラスロード時に VTBL が作れる Java と違って、Ruby のメソッド呼び出しは完全に late-binding で、その名前のメソッドがあるかどうかの名前解決も実行時にやりますよね。
つまり、Ruby のメソッド呼び出しを ナイーブに Java のバイトコードで実現しようとすると、全部 reflection 経由のメソッド呼び出しにする必要があります。これは大変に重い処理ですので、ここから通常のメソッド呼び出しに変換したいのです。
これ、.rb → .class コンパイラレベルで何かうまい最適かはありますかね?
# って 書いてますけど、
# JavaVM 側が reflection 経由のメソッド呼び出し → 通常のメソッド呼び出し →
# de-virtualization と最適化するのが 1 番ですね。。
コンタミは発見の母
Re:本当に速度(スループット性能)を求めるなら (スコア:1)
>メソッド呼び出しにする必要があります。これは大変に重い処理ですので、ここから通常のメソッド呼び出しに変換したいのです
俺も全然判ってないんですが、
以前CMPもどきを車輪再開発したとき(笑)にちょっと考えたんだけど、そのとき見つけたネタとして、
「 照合にキャッシュを使用する限りリフレクションは非常に高速です。 [borland.co.jp]」
なんてな話もあるようで、これってもしかして、反論(?)として意味有りでしょうか?あんまり関係ないかな…
#これって、java.lang.reflect.FieldやMethodといったObjectを後生大事にメモリ上に保持しておく、という意味ですよねよね?
Re:本当に速度(スループット性能)を求めるなら (スコア:1)
そうです。
例を#268334 [srad.jp]に挙げましたが、この例に沿って言うと Borland の言うキャッシュは m をどこかに保存しておいて再利用しようというものです。
この方法の問題点は m をどこに引っかけるかで、
ぱっと考えてメソッドコード中に埋め込むか、オブジェクトに埋め込むことになると思います。
メソッドコードに埋め込む場合、aSong.to_s をキャッシュすると
static Object cached_object ; // C 的な関数ローカルの static のイメージ
static Method cached_method ;
if( cached_object != aSong ){
// cache misshit
Method m = aSong.getClass().getMethod( "to_s", /* parameter types */ );
cached_object = aSong ;
cached_method = m;
}
cached_method.invoke( aSong, null ); // 呼び出し
オブジェクト(ruby.lang.Object) に埋め込む場合、
class ruby.lang.Object { // 根本のクラスに追加
// ...
int cached_line ;
Method cached_method ;
}
if( aSong.cached_line != 987654321 ){ // ソース行に対応した unique な番号
// cache misshit
aSong.cached_line = 987654321;
aSong.cached_method = aSong.getClass().getMethod( "to_s", /* parameter types */ );
}
aSong.cached_method.invoke( aSong.null ); // 呼び出し
ここまで書いて何なんですけど、速くなりそうにない変換っすね (;_;
コンタミは発見の母
Re:本当に速度(スループット性能)を求めるなら (スコア:1)
// Ruby のソース
class Song
def to_s
// ...
end
end
aSong = Song.new
aSong.to_s
をナイーブに Java に変換すると以下のようになります。
// Java のソース
class Song extends ruby.lang.Object {
ruby.lang.ReturnValue to_s(ruby.lang.Parameters parms){
//
}
}
aSong = new Song();
Method m = aSong.getClass().getMethod( "to_s", /* parameter types */ );
m.invoke( aSong, null );
このメソッド呼び出しの部分を
aSong.to_s( /* ? */ )
の形にできるのであれば、Ruby → Java に変換することで
パフォーマンスの向上が期待できると思います。
コンタミは発見の母
Re:次の10年で (スコア:0)
Re:次の10年で (スコア:1, すばらしい洞察)
たいして変わらない罠
Re:次の10年で (スコア:0)
もっとも速さのために何かを犠牲にしてもらっても困るのですが。
LightweightLanguage の考え方に共感を覚え使ってみようと思いましたが専ら web アプリケーションを作るのが主なのでどうしても PHP や Perl になってしまいます。
walrus も注目していましたがまだまだ重いようで、、
Re:次の10年で (スコア:1)
これこそがRubyの、というかLLの本質ではないでしょうか。
速さを重視するなら非LL指向品を使えば早くなるのは当然、
「人間の頭脳労働の低減」がLLの究極の目的である、と。
(自分の知識はあんまりありませんが、とりあえずここ [ruby-lang.org]とかどうぞ)
ちょっと強い言い方かもしれませんが、
「速さのために何かを犠牲にしてもらっても困る」とコメントされること自体、
「LightweightLanguage の考え方に共感を覚え」ているという事と
矛盾しているのでは、と感じてしまいました。
# ところで、実際にPHPやPerlで構築されたWebアプリケーションと、
# Rubyでのそれって、そんなにパフォーマンスに差がありましたか?
# 「実感として」とかの主観的なものでも構わないので、実際に開発に
# 携わる方としての意見をお聞きしたいです。
バイトコードインタープリタ (スコア:0)