SlideShare a Scribd company logo
1 of 36
Download to read offline
Ruby 3の型解析に向けた計画
遠藤 侑介
名古屋Ruby会議04 (2019/06/08)
1
自己紹介:遠藤侑介 (@mametter)
•クックパッドで働く
フルタイムRubyコミッタ
•Rubyプログラムを堅牢に
•テスト、Ruby 3の静的解析
•クックパッドに興味あったら
お声がけください
2
この発表では
•Ruby 3の静的解析のmatz構想
•型プロファイラの紹介と進捗
を話します
3
Rubyの型と名古屋の関係
•三浦さんからmrubyでの型推定の話を聞いて
Ruby 3の静的解析は回りだした
•型プロファイラはmruby-meta-circularの
パクリ
•細かい設計指針の違いはあとで
4
Ruby 3の静的解析のmatz構想
•目的: バグっぽいコードを指摘する
•高速化のための解析ではない(間違ってもいい)
•要件: Rubyのプログラミング体験を維持する
•型を書かない選択肢を残す
5
Ruby 3の静的解析の構想
1. 標準の型シグネチャフォーマット
2. 型シグネチャなし型検査器
+ 型シグネチャのプロトタイプ生成器
3. 型シグネチャあり型検査器
6
1. 型シグネチャフォーマット
•Rubyコードの型情報を示すもの
class Array[A]
include Enumerable
def []: (Integer) -> A
def []=: (Integer,A) -> A
def each:
{ (A) -> void } -> self
...
end
interface
generics
union type
option type
any type
Proposal:
ruby-signature
7
2. 型シグネチャなし型検査
•型エラーの可能性を指摘する解析器
•アプリの型シグネチャが無くても動作する
•false positive は許容する
def foo(s)
s.gsuub!(//, "")
s + 42
end
foo("foo")
NoMethodError?
TypeError?
Proposals:
• mruby-meta-circular
• 型プロファイラ
8
2'. 型シグネチャプロトタイプ生成
•無注釈コードから型シグネチャを推測する
•メソッドの呼び出しを追う
def foo(s)
s.to_s
end
foo("foo")
foo(42)
(String | Integer)
-> String ?
Proposals:
• mruby-meta-circular
• 型プロファイラ
9
3. 型シグネチャあり型検査
•型エラーの可能性を指摘する解析器
•型シグネチャとコードの整合性を検査する
•わりと普通の型検査
•ツール定義の
inline annotation も def foo(s)
s.gsuub!(//, "")
s + 42
end
TypeError!
def foo:
(String) -> Integer
Proposals:
• Steep
• Sorbet
NoMethodError!
10
Ruby 3の静的解析の図
Library code
type signature
Sorbet
Steep
RDL
Type error
warnings
Application code
mmc
Type Profiler
Type error
warnings
type signature
11
ユースケースに合わせた使い方
•緩く検査したい派:型シグネチャなし型検査
•きっちり検査したい派:
•コーディング→型シグネチャプロトタイプ→
型シグネチャあり型検査
•型ドリブン開発派:
•型シグネチャ手書き→コーディング→
型シグネチャあり型検査
12
Ruby 3の静的解析の進捗
•ruby-signature: ツール開発者間で議論中
•https://github.com/ruby/ruby-signature
•Type-Profiler: 試験実装状態
•mruby-meta-circular: (次の発表で)
•Steep: Siderで試用中、型注釈が結構必要
•Sorbet: Stripeで試用中、duck typingがない
13
Ruby 3には何が入る?
•「型シグネチャ」はバンドルしたい
•型シグネチャフォーマットのパーサ
•標準添付ライブラリの型シグネチャファイル
•型シグネチャ対応版RubyGems
•ツール群はバンドルの予定なし
•当面は外部ライブラリとして提供される
14
型プロファイラの
紹介と進捗
15
型プロファイラとは
•目的:型レベルテストとシグネチャ推定
•型エラーの可能性を指摘する
•型シグネチャのプロトタイプを生成する
•対象:型注釈のない素のRubyコード
16
型エラーの指摘
•NoMethodErrorやTypeErrorの可能性を示す
def foo(n)
if n < 10
n.timees {|x|
}
end
end
foo(42)
Type
Profiler
t.rb:3: [error] undefined method:
Integer#timees
Typo
17
型シグネチャ推定
•型シグネチャのプロトタイプを生成する
def foo(n)
n.to_s
end
foo(42)
Type
Profiler
Object#foo ::
(Integer) -> String
18
型プロファイラの動作イメージ
•Rubyコードを「型レベル」で実行する
普通のインタプリタ
def foo(n)
n.to_s
end
foo(42)
Calls w/
42
Returns
"42"
型プロファイラ
def foo(n)
n.to_s
end
foo(42)
Calls w/
Integer
Returns
String
Object#foo ::
(Integer) -> String
19
デモ:オーバーロードの例
def my_to_s(x)
x.to_s
end
my_to_s(42)
my_to_s("STR")
my_to_s(:sym)
Type
Profiler
Object#my_to_s :: (Integer) -> String
Object#my_to_s :: (String) -> String
Object#my_to_s :: (Symbol) -> String
20
デモ:再帰関数の例
def fib(n)
if n > 1
fib(n-1) + fib(n-2)
else
n
end
end
fib(10000)
Type
Profiler
Object#fib ::
(Integer) -> Integer
21
デモ:ユーザ定義クラスの例
class Foo
end
class Bar
def make_foo
Foo.new
end
end
Bar.new.make_foo
Type
Profiler
Bar#make_foo :: () -> Foo
22
型プロファイラと分岐
•実行を「フォーク」する
def foo(n)
if n < 10
n
else
"error"
end
end
foo(42)
Fork!
イマココ
n<10 の真偽は
わからない
Returns
Integer
Returns
String
Object#foo ::
(Integer) ->
(Integer | String)
23
最大の問題:状態爆発
•RubyKaigi時点(4月)の実験結果
•型プロファイラの型プロファイル:約10分
•optcarrotの型プロファイル:約3分
a=b=c=d=e=nil
a = 42 if n < 10
b = 42 if n < 10
c = 42 if n < 10
d = 42 if n < 10
e = 42 if n < 10
Fork!
Fork!
Fork!
Fork!
Fork!
2
4
8
16
32
状態数
24
RubyKaigi からの進捗 (1)
•解析方式を大きく変えた(後述)
•state merging 風の改良を加えた
•改善後の実験結果
•セルフ型プロファイル:約10分 ➔ 約2.5秒
•optcarrotの型プロファイル:約3分 ➔ 約6秒
25
解析にかかる時間
0
200
400
600
800
self-profiling optcarrot
seconds
old new
26
RubyKaigi からの進捗 (2)
•Flow sensitiveな解析
•右の例で警告が出ない
•分岐で単純フォークすると
誤警告が出てしまう
def foo(x)
if x.is_a?(Integer)
x + 42
else
x + "str"
end
end
foo(42)
foo("str")
27
解析アルゴリズム
•環境:各変数がとりうる型
•{ x: Integer or String, y: Integer } とか
•行ごとの「環境」を更新していく
•正確に言うとYARVのバイトコードごと
•「環境」が更新されなくなったら終わり
28
解析の例
1: def foo(a)
2: if a < 10
3: b = 42
4: else
5: b = "str"
6: end
7: c = b
8: c
9: end
10:
11: ret = foo(42)
行番号 a b c
1 ∅ ∅ ∅
2 ∅ ∅ ∅
3 ∅ ∅ ∅
4 - - -
5 ∅ ∅ ∅
6 -
7 ∅ ∅ ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 ∅ ∅ ∅
3 ∅ ∅ ∅
4 - - -
5 ∅ ∅ ∅
6 -
7 ∅ ∅ ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 ∅ ∅ ∅
4 - - -
5 ∅ ∅ ∅
6 -
7 ∅ ∅ ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 ∅ ∅ ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 { Int } { Int } ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 { Int } { Int } ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 { Int } { Int, Str } ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 { Int } { Int, Str } ∅
8 ∅ ∅ ∅
行番号 a b c
1 { Int } ∅ ∅
2 { Int } ∅ ∅
3 { Int } ∅ ∅
4 - - -
5 { Int } ∅ ∅
6 -
7 { Int } { Int, Str } ∅
8 { Int } { Int, Str } { Int, Str }
Object#foo ::
(Int) -> (Int|Str)
29
他の問題
•嘘の警告・推定が出ることがある
•原理的に扱えない言語機能がある
•sendメソッド・特異クラス
30
# b: Integer or String
c = b
# c: Integer or String
# 「bとcの型は同じ」という条件が消えるので
b + c # 「Integer + String の可能性あり!」
mmcとの方針の違い
•mmc: ヒューリスティクス盛りだくさん
•ターゲットアプリで正しい推定をするように
•mmcを更新したら推定結果が結構変わったり
•型プロファイラ:理解可能な動きをすること
•解析方法を複雑化し、正しく推定するより
•解析方法を単純化し、なぜ間違えるか
ユーザが理解できるようにしたい
31
実装進捗:できてること
•基本的な言語機能のサポート
•変数、メソッド、ユーザ定義クラスなど
•一部の組み込みクラス
•ブロックと配列(たぶん)
•解析アルゴリズムの基本設計
32
実装予定:やっていくこと
•言語機能のサポート
•ハッシュ
•複雑な引数(可変長やキーワード)
•例外
•モジュール
•型シグネチャ言語の読み書き
•実用性向上
33
関連研究
•mruby-meta-circular (Hideki Miura)
•型プロファイラの元ネタ
•HPC Ruby (Koichi Nakamura)
•抽象解釈でRubyからCへ変換(HPC向け)
•pytype (Google's unofficial project)
•型解析のための抽象解釈器
34
謝辞
•Hideki Miura
•Matz, Akr, Ko1
•PPL paper co-authors
• Soutaro Matsumoto
• Katsuhiro Ueno
• Eijiro Sumii
•Stripe team & Jeff Foster
•And many people
35
まとめ
•Ruby 3の静的解析の構想を説明しました
•型プロファイラの概略を説明しました
•お便りお寄せください!
•https://github.com/mame/ruby-type-profiler
36

More Related Content

What's hot

リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道Satoshi Sato
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Masayuki Isobe
 
.NET系開発者から見たJava
.NET系開発者から見たJava.NET系開発者から見たJava
.NET系開発者から見たJavableis tift
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門AimingStudy
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrowharu haru
 
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzzConstexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz京大 マイコンクラブ
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Inc.
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへNaoki Kitora
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようHiro H.
 

What's hot (20)

リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」Tokyo.R #19 発表資料 「Rで色々やってみました」
Tokyo.R #19 発表資料 「Rで色々やってみました」
 
.NET系開発者から見たJava
.NET系開発者から見たJava.NET系開発者から見たJava
.NET系開発者から見たJava
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
Control.Arrow
Control.ArrowControl.Arrow
Control.Arrow
 
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzzConstexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
More C++11
More C++11More C++11
More C++11
 
AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説AtCoder Regular Contest 030 解説
AtCoder Regular Contest 030 解説
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
C++入門?
C++入門?C++入門?
C++入門?
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみよう
 

Similar to Ruby 3 の型解析に向けた計画

ライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しnoanoa07
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日nukaemon
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo StringsearchAkio Ishida
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術SeiyaSakata
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践LINE Corporation
 
形式手法とalloyの紹介
形式手法とalloyの紹介形式手法とalloyの紹介
形式手法とalloyの紹介Daisuke Tanaka
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dpKensuke Otsuki
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20Yasuo Tabei
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
R による文書分類入門
R による文書分類入門R による文書分類入門
R による文書分類入門Takeshi Arabiki
 

Similar to Ruby 3 の型解析に向けた計画 (20)

講座Java入門
講座Java入門講座Java入門
講座Java入門
 
ライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話しライントレースで役立った「キュー」の話し
ライントレースで役立った「キュー」の話し
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術乱数と擬似乱数の生成技術
乱数と擬似乱数の生成技術
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
形式手法とalloyの紹介
形式手法とalloyの紹介形式手法とalloyの紹介
形式手法とalloyの紹介
 
Tokyo r7 sem_20100724
Tokyo r7 sem_20100724Tokyo r7 sem_20100724
Tokyo r7 sem_20100724
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dp
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
R による文書分類入門
R による文書分類入門R による文書分類入門
R による文書分類入門
 

More from mametter

error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticsmametter
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
 
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料mametter
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfmametter
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotationsmametter
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画mametter
 
emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRubymametter
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3mametter
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析mametter
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってますmametter
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介mametter
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3mametter
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Typesmametter
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understandingmametter
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能mametter
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Rubymametter
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpretermametter
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるmametter
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 resultsmametter
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesmametter
 

More from mametter (20)

error_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
 
Enjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
 
TypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
 
Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
 
emruby: ブラウザで動くRuby
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRuby
 
Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
 
Ruby 3の型推論やってます
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
 
マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
 
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
 
A Plan towards Ruby 3 Types
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
 
A Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
 
本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
 
Transcendental Programming in Ruby
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Ruby
 
Cookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
 
TRICK 2018 results
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 results
 
Type Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
 

Ruby 3 の型解析に向けた計画