はじめに
RubyKaigi参加時のメモ。
せっかくなので内容を整えて公開します。
Ruby Taught Me About Encoding Under the Hood
- 文字コードの歴史について学び、Unicodeの便利さを実感
- 書記素クラスタ
- ユーザーが1文字として認識する、見た目の1文字のことを書記素クラスタといいます
- 見かけが一文字でも実際は複数のバイト文字のことがあり、カーソル移動時に不具合が起きやすい
- rubyは、onigumoを使って正規表現している
- String#grapheme_clusters メソッドあり
Introducing Type Guard to Steep
- RBSメンテナーの話。RBSは型に関する定義ファイル。
- SteepはRBSを使ってRubyの型検査を行うライブラリ。
- Steep
- RBSを使ってRubyの型検査をしてくれるライブラリ
- https://qiita.com/kettomorrow/items/8ccada8a4c9eac85b7ad
- type guard
- 変数の型を特定すること。Type narrowingに使うメソッドや式のこと
- Steepはpresent?をtype guardとみなさない
- UnionType=複数の型の組み合わせ
- 現在のunion typeに対するtype guard対応状況
- 特定条件を満たしたメソッドを型分析扱いする案
- アノテーション
- 変数や関数に型情報を付与すること
- 提案:ユーザー定義type guardの導入
A side gig for RuboCop, the Bookworm code crawler
- Chef(インフラ構成管理ツール)とFoodcritic(Chef用Linter)の話
- RuboCopはリファクタツールとしても利用可能。
- cookstyle.yml、rubocop-ast(RubyコードをASTとして解析・操作するライブラリ)の紹介
- Debian 12「Bookworm」コードネームの由来。
Goodbye fat gem 2025
- fat gem=ビルド済みgem。コピーだけで利用可能だが開発側からは廃止したい動き。
- 理由:
- 最新Ruby対応が遅れる
- フォールバック対応
- 脆弱性対応が遅い
- メンテナンス負担大(クロスコンパイル必要)
- Pythonのwheel
- ビルド済み配布フォーマット
- rake-compiler-dock、rubyinstaller2、rubygems-requirements-systemの話
- Rubygems用wheel開発の動き
Ruby's Line Breaks
- 改行による文の切り分けルール。
- Automaton(プログラミング言語の要素)
- lookahead set
- 先読み用の未処理入力集合
- lexstate(できれば消したい)
- 字句解析時の状態
- 改行コードを変数に入れる例は通常ない
State of Namespace
- 今提案、取り組んでいることの話
- 同じライブラリの複数バージョンを同時ロードするためのnamespace提案
- RClass、rb_classext_tの話。
- autoload
- 遅延ロード機能
- RubyVERSION
- killed:9
- make examを実行するとき、ランダムでmacで起きる。Linuxでは起きないが代わりにSEGVが起きる
- dlopen
- make check、make examなど、rubyのコンパイルする時のコマンド
Parsing and generating SQLite's SQL dialect with Ruby
- Plume classというものがある
- Plume::CreateTableStatementクラスの紹介
Performance Bugs and Low-level Ruby Observability APIs
- X-Ray
- 詳細分析や透過的可視化の意味
- N+1問題やスレッド・接続問題。
- tracepoint API
- NEWOBJ Event
- GC
- flame profiling
- debug-inspector
- GVL profilerなど
Dissecting and Reconstructing Ruby Syntactic Structures
- grammar(文法)、syntax(構文規則)、semantics(意味)
- Syntactic Structures
- どう組み合わせれば意味のある文章になるか。ということ。トークンを特定の順序で配置するルールのこと
- sematics
- コード的に正しいプログラム。理論的に正しいかということ。意味のある文章か
- parse.yの役割
- rubyを構文解析する構文とトークンを書いたファイル。これをLarma パーサージェネレーターを読み込ませて解析することができる
- expression
- 主に四則演算やメソッド呼び出し
- statement
- メソッド定義とか。関数呼び出し、counter++とか。戻り値がないもの
- argとprimaryの区別
- role of arg メソッドの引数の役割
- role of primary リテラルとか
- Lramaによる構造整理
- 複雑さを軽減できる
- prismとの互換性維持
Keeping Secrets: Lessons Learned From Securing GitHub
- candidate methods
- 注目すべき候補メソッド
- envコピーの方法、環境変数管理
- intake→triage→remediation→variant analysis→disclosureプロセス
- object.send safely?
- code scnanning toole
- 環境変数を保持する方法はいくつかある
- envファイルに書くなど
- 最も良いのは。minimal footpoint of your pc memoryに保存すること
Writing Ruby Scripts with TypeProf
- 開発中のrubyのエディターのこと。似たようなものにrbs-inlineがある
- 型エラー指摘機能、定義ジャンプ
- エラーレベルを変更できる機能を追加した
- ディレクトリごとに解析単位を選べるようにした
- 継承探索の制限
- rubyの定数探索はややこしい仕様になっている
- 継承まで探すと無限ループになることがあり、継承までやると大変なので継承まで探すことをなくした
RuboCop: Modularity and AST Insights
- RuboCop拡張の中央集権化
- 今まで非公式で拡張を作っていたが、カスタムコップは、みんながバグとかそのままコピペして広めちゃってる
- lint_roller導入
- プラグイン形式変更(plugin化)
- 新しいrubocop-plugin-generatorバージョン6を使ってプラグインをつくるようにしよう
- rubocop 1.75以上を使いましょう
- rubocopは1.62からPrismを使うようにしてた
- rubyLSPの機能がrubocopでも使えるようになるように作っている
- rubocop裏側のパーサーについて、parser gemでなくこれからPrismtranslation layerを使うようにした方がいいのかなと思ってる
- AST
- 抽象構文木
- CST
- 具体構文木
Speeding up Class#new
- newメソッドは、インスタンスを作り、initializeにパラメータを渡し、インスタンスを返す
- newメソッドのCとRuby間呼び出しの高速化
- rubyのnewから始まり、Cが呼び出され、rubyのinitializeが呼び出される。違う言語が呼び出されるのでその分タイムラグが生じる
- 転送制御のコストが低くなるので、全体で早くなる
- インラインキャッシュ利用
- メソッド呼び出しを早くすること
- 親クラスを増やすほど検索するクラス増えて、メソッド検索にかかる時間が増える。なのでキャッシュを作るといい
- キーワード引数による遅延要因
- rubyの呼び出し規約は、Ruby:Stack KVに基づく
- Cにはキーワード引数はないので、stackをハッシュに変換し、一つの引数として渡す。Cからruby呼ぶ時、ハッシュをスタックに再度変更し、時間がその分かかる
- initializeはprivateメソッド
- sendを使わずにprivateメソッドを呼び出す必要がある。sendも使えないので
- primitive導入でsend不要化
- rubyでruby使わずにClass.neww呼び出すことができました
- インラインの欠点
- メモリを圧迫する
# The Implementations of Advanced LR Parser Algorithm
- LramaはRubyの構文解析器(パーサー)であり、バージョン0.7で新たにIELRアルゴリズムを実装している
- IELRは「読み込んだトークン(先読み情報)を利用して次の処理を決める」方式で、より多くの文脈を参照して解析の判断を行う
- 一般的なLRパーサーは入力を前から順に読み進めて(前向きに)解析を行うが、状態遷移や還元の判断で先読みが重要になる
- 先読み(lookahead)を用いて、次のトークンに基づき「シフト(shift)」か「還元(reduce)」か、それ以外(エラー)かを判断する
- コンフリクト(解析の曖昧さ)は主に次の2種類:
- shiftとreduceの衝突(shift/reduce)
- reduceとreduceの衝突(reduce/reduce)
- 「mysteriousconflict」という用語が登場しており、通常の先読みだけでは説明しにくい曖昧ケースを指すものとして扱われている
- lookaheadset(先読み集合)という概念を扱い、どのトークン群を先読みに使うかを明確にしている
- 文法上の具体的な要素としては cond_stmt や method_call などの構文記号が対象となる
- 互換性の問題にも注意を払いながら実装を進めている
- 実行時の振る舞い関連では、rescue Interrupt によって Control+C(割り込み)をキャッチして中断処理を行うようなケースを考慮している
- Ruby特有の「4種類の do」など複数のdo構文バリエーションも正しく構文解析できるようにしたい、という要望がある。
Analyzing Ruby Code in IRB
- 確かに、RailsのIRBは細かく言われてみれば確かに色がついているなと思った
- それを裏側で、なにに対してどのように色をつけるか判定をしており、裏側のメンテナーの努力の結果なのだと思いました
Matz Keynote
- AIの時代の言語について
- アルファシンドロームについて:犬は、甘やかしすぎると群れのボスだと勘違いする
- AIは得意なことと苦手なことがある
- シンプルなコーディングは得意
- 交渉や要件定義は苦手
- 自分たちはコーディングしなくなる?自分たちがAIのために働くことになる?
いやAIは道具。役割分担はきちんと考えよう - Reverse アルファシンドロームとは:相手ができないことは自分がやる。そうするとできない方が偉くなる。奉仕みたいになる
- 私たちはreverse アルファシンドロームについて気をつけないといけない
- 自分がやりたいことでもAIが得意なことは任せるというのは、よくない
- 主導権を誰が握るかを考えること
- AI時代のプログラミング言語について:単純な同じアーキテクチャだと作りやすい
- 言語開発には使い方が難しい
- AI時代、人間の言葉を使うのが主流だな(AI時代に使われる言語)
- 自然言語は冗長すぎる
- 簡潔、明確、論理的な言語だと研究が進むだろう
- 相補完的な関係が人間とAIの間に成り立つだろう
- 型のことか?→流行ってるけど未来において必要?大体エラーになっても大したことないエラーだよね
- 人間でも気づくしAIにもいらないんじゃないかと考えている
- 型は人気だね→でも本当は難しいことをするのが楽しいと考える人がいる。それが原因?
- Rubyが楽しいから選んでいる私たち。楽しいからやってるので楽しいと感じることを選べばいい
- AI時代で、PG言語は、簡潔さ(最小限、わかりやすい)、表現力、拡張性を兼ね備えていると良いと考える。まさにRubyのことだ!
- AIを活用するには正しいコードを教えないといけない
- みんなパフォーマンスが好き
- みんな色々工夫して早くしている
- 言語開発者は誰でもwelcomeにしてみんなでやっていくことが必要
-やりたいことがあればいつでも開発者になる - Ruby 4.0予定
- 実験的な名前空間を分けるようにする
- 実験的なYJITを導入する
- Method JITをやる。コンパイルしたコードを保存できるようにする
おわりに
雑なメモですが公開。
わからない単語が非常に多かったです。来年参加する時には、もう少し理解できるようになっていたい。