RubyKaigi 2023 follow up
開場10分前ぐらいに着いたけど入館できた
締切効果
正規表現マッチング最適化のための制約がなるべく少ない世界を目指す
メモ化の話題
RubyKaigi 2023時点からある程度制約が緩くなった
あまり使われていない、理論的に改善が無理なものもある
入力文字列に対して線形時間でマッチさせたい
メモ化テーブルにマッチ成功という情報を含められるように
bit配列を2bit使ってメモ化する
プログラム中の正規表現が線形時間でマッチできるかを検査するRuboCopプラグインを作ってほしい
Bison Slayer
実行時にエラーリカバリするかどうかのオプション
CIを回すとSEGVする
Universal Parser macro
LRパーサーがいい
BNFがそのままパーサー生成に使える
あいまい構文チェック
parse.y
S/R conflict
具体例を出せるようになった
%prec
どう解決してほしいかを見たい
shiftしてほしい
リッチな表記が使えない
ripperとparserの実装が混ざっている
lexerと密結合している
新しい構文を追加したい
nobuの頭にはBNFが全部入っている
インデント減らす
全体を理解していなくても局所的に分かりたい
moduleはいけるけどclassはだめだっ
インタラクティブに情報を出してほしい
2023年だぞ!!
メンテナビリティと言語デザインのDX
|| の話
スキャナレスパーサー
一緒にまとめてしまう
パーサー側 (能力の高いほう) に寄せる
lexerのロジックをパーサーに寄せる
パーサーを理解にするにはRubyの構文とCのコードを理解する必要があるが
教科書にはない知識がいっぱい
パーサー側にはDSLとBNFしかない
とっつきやすく
Ruby 3.4のパーサーはyarpメインになる
Universal parserが早くほしい
RBSパーサの刷新
steep
rbs
rbs-src
秘蔵のRBSファイル
gem_rbs_collectionに送りつけるのが面倒
やっていること
rbs-collectionで管理されたRBSファイルをgit cloneする
symlink
型検査器が読めるように
RBSパーサの刷新
エラー回復
メンテナンスしんどい
Ruby版とC版がほしい
構文が壊れているとモジュールのネスト関係が壊れる
「変なトークンが来た」ことを表すtreeを挿入
構文エラーからASTを構築するのは自明でない
エラーのつじつまを合わせる
配列が多い
「構文エラーが来ない」tree
Shopifyのモノリスをsteepで型検査すると45分かかる
Progress report on the development of TypeProf
TypeProfの開発進捗
Rubyコードの型推論ツール
v2では編集されたコードだけ再解析するようにして高速化した
解析アルゴリズム
データフローグラフ
メソッド呼び出し
レシーバーが決まらないと型が決まらない
差分更新
いろいろある
LSPを喋っている
定数参照
むずかしい
スコープや継承関係に依存する
再解析すべきトリガーを覚えておく
open class
"Ractor" reconsidered' reconsidered
簡単で軽量な並行・並列処理をRubyでやる
Ruby thread : native thread
M:N Ractor scheduling
Goのgoroutine
IO待ち
Ractor local GC
分散GC
TLS (Thread local storage) 互換性問題
errnoとか
あるNTにしかないTLSがあるとき、別のNTで実行されるとまずい
Goでは
実際そこまで問題にならないのでは?
メインRactorではデフォルト無効
RUBY_NM_THREADS
RUBY_MAC_PROC
CIでしか再現しないバグ
M:Nを利用しない方法を整理する
複数OS対応
スケジューラー
Ractor用分散GC
5年前に議論したことがついに実現できた
RubyishなQUIC実装の進捗について
PythonのaioquicをRubyに移植した
raioquic
aioquicはドキュメントが少ないがち
TLS1.3完全に理解した
RubyっぽいAPIとは?
速さよりも相互運用性・準拠
受ける側のRubyプログラムが並列に動く必要があるのでは
Ractorでなんとかできないか
Fiberで書ければRactorで書けるはず
庭づくりをしています
KaigiEffect
Niwa
new integrated working annotations
ドキュメンテーション生成ツール
前例としてはYARDとか
RBS
YARDのつらみ
自分で作ったほうが早そう
YARD (庭) からNiwa (庭) へ
ドキュメントを書くのを楽しく
RSpecからドキュメントを生成
LSP
続・mruby/cにUTF-8を実装する
mrubyではもともとASCII/8-bitしか使えなかった
scalar value
Integer#chr
String#<< (concat)
Integer#chr を呼ぶぐらいでよくなった
String#encoding
String#valid_encoding?
well-formedかどうかの判定が必要
バイナリがStringに入らない
バリデーションアルゴリズムいろいろ
upcase,downcase
mrubyでは対応しない
対応テーブルを持つ必要がある
RedAmber
列指向
Apache Arrow
RedAmber自身の高速化
締切効果
データサイエンス100本ノック
Dev Container
Quarto
段階的に型を導入しよう
型
なかなか導入していなかった
katakata_irb の改善
Steep の改善
LSPサーバーとしてだけ使いたい
型抽出ツールの改善
ほどほどな型チェック
がんばらない型の導入
型の恩恵を増やす
型の導入障壁を下げる
パターンマッチを効率化するやつの仕上げ
Rubyのパターンマッチ構文
deconstructを持っているかどうかで分岐
ObjectがArrayならチェックを飛ばす
Array#deconstructがオーバーライドされたら……?
どうして人はコンパイラーを作りたくなるのか
gcc
GNU Assembler
静的にコンパイルした際にどこに困るのか確かめたい
ELF
as コマンドを置き換えられそう
次はリンカ
新しい Ruby プロファイラを作りたい
StackprofでFlamegraph
プロファイラ
任意のスレッドの情報を取れるAPIを入れたい
CPU時間とI/O時間を把握したい
ビジュアライザ
巨人の肩に乗る
ブラウザベンダのビジュアライザ
Firefox Profiler
マンデルブロ集合
GVLによってスレッドは並列に走っているわけではない
IRBの補完どうなった?
昔からタブ補完はあった
katakata_irb
irbのインデントがよくなった
不完全な構文木に足りないトークンを足す
ヒアドキュメントがあるときうまくいかない
閉じられていないtokenを行ごとに調べる
katakata_irbの実装を元にIRBのインデント計算を書き換えた
YARP
ruby.wasmに関する進捗報告
ブラウザでRubyをキメると気持ちいい
依存関係を自動的に解決してほしい
再帰的にrequire_relativeを呼ぶと動かなかった
動くようになった
関数呼び出しの間にJavaScriptが挟まっていた
FiberからJavaScriptに戻れなかった
RubyVM内で解決するように戻して解決
次はrequireを動かす