読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Ruby2.0 #devsumiA

勉強会

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

  • キーワード引数(2.0)
  • 新ハッシュリテラル
  • メソッドコンビネーション(2.0)
  • セレクターネームスペース(2.0)

心理的壁が高い(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リリース予定、です。

2.0以後

言語としてはほぼ完成(でも今のrubyを壊さない範囲で)
Ruby言語の限界→性能改善(まだ遅いと言われるから)
適用分野拡大?
マルチコア?
アクター?