Rubyアソシエーション理事長
2013年←1993/2(Ruby開発開始)概念を作ってだいたいこの流れで開発しよっか★
hello worldから出るまでに半年ェ…
(文字列という概念を作って、IO概念など…)
1995/12 公開
19966/12 1.0
例によって奇数バージョンを開発版、偶数バージョンを安定版とする。
2003/8 1.8
2007/12 1.9.0
2011/10 1.9.3
(そろそろ2.0か…)
rubyconf2001 ruby2に言及
新VM
新GC
ネイティブスレッド
埋め込みAPI
心理的「壁」
コア実装の置き換え
perl pythonの人から「遅くて使いモノにならない」というクレーム
新VM YARV (1.9から)
新GC 世代別GC(あたらしいアルゴリズムのGCを実装するようにする?)
2.0ではbitmap markingでアルゴリズムを改善
1.8はグリーンスレッド(効率ではなく書き方を支援する でも「マルチコアのくせにマルチコアつかえねーじゃん」っていうクレームが…)
1.9はネイティブスレッド GILを使う Giant Interpreter Lock(IOヘビーだとマルチコアが使えないことには変わりない)
埋め込みAPI 互換性重視のために不採用とする
2007年のruby1.9
現代のRuby2.0の起源
rubyconf2003
心理的壁が高い(20周年に2.0)
Aniversary Driven Development
2.0の新機能
キーワード引数
Dtrace
Module#prepend
Enumerable#lazy
Refinements ナド
キーワード引数(引数として展開するのは手動だったのを改善した)
- 名前つきオプショナル引数
- 順序不定
- 記述性
- 記憶想起
def downto(from, to, step: 1) ... end downto(10, 0, step:2) do |i| p i end
- APIの柔軟性
- ドキュメント化
- 読みやすさ
- 覚えやすさ
Module#prepend
- メソッドコンビネーション
- 既存のクラスの修飾
- alias method chain
alias method chainの欠点
- 名前衝突の危険性
- 名前管理(毎回名前をつけないといけない)
- 修飾のグループ化が困難(全部修飾したいけどまとめてグループにしづらい)
メソッドコンビネーション
- CLOS(CommonLisp Object System)
- メソッドを拡張する仕組み
- MOP
beforeフック(実行前)
afterフック(実行後)
aroundフック(実行時のラップ)
でもcommonlispに比べたらオーバースペックすぎるだろ…
単純化メソッドコンビネーション
Module#prepend
- prepend
- includeは後ろに追加
- prependは前に追加
- 既存のメソッドをラップ
class Foo def foo; p :foo; end end module Prepend def foo p: before super p: after end end class Foo prepend Prepend end Foo.new.foo
(最終的にsuperが呼ばれる)
prepend vs chain
名証重複問題
グループ化問題
既存クラスの拡張
メソッドの追加
メソッドのラップ
オープンクラス
クラス再定義
mathn(既存の整数のクラスを書き換えてくれる), jcode(バイト単位ではなく文字単位でカウントしてくれる) → どちらも今のままでは誤動作が予想され、実用化が難しい
スコープ問題(問題はある特定のスコープに留めておきたい)
Refinements スコープ限定のオープンクラス
(リリースギリギリだし、あってもいいし、なくてもいい。故に遊んでみて問題があったら教えてね★)
module R refine String do def foo .... end end end "".foo # => error! using R # => fooメソッドありますよ "".foo
スコープを区切った既存クラスの置き換え…
(実装にあたって専門家に聞くこともあった)
既存クラス拡張の試み
selector namespace
classbox
拡張メソッド
プロファイル
selector namespace
「メッセージ」の多重化 (名前空間を持つメッセージ)
挙動がむずかしい
Smallscriptが入手困難(オープンソースになってくれなかった)
Classbox
既存のクラスを置き換える
例: GUIのルックアンドフィール変更
ローカルリバインディング(=動的スコープ)
でも見えないところが書きかわると挙動が全く読めない
拡張メソッド
メソッドの追加しかできない
Scalaも同様?
プロファイル
ひとつの構造体に複数のインターフェース
プロファイル
相互に代入可能
(アイデンティティは同じだけど見た目がそれぞれ違う)
enumerable#lazy (遅延評価)
関数型プログラミングが流行っているっぽいので、
関数型のよいところを取りこみたいんだ(でもほぼメソッドチェーン)
遅延評価
lazy(遅延)を求めるものはlazy(怠惰)であるということで生まれたのがEnumerable#lazy
デフォルト utf-8(unicode浸透 普通にutf-8が使える)
Dtarace デバッグ
高速化 (VM GC require)
2013/2/24リリース予定、です。