Google slide: https://docs.google.com/presentation/d/1Stym8x27poSsL2_RSCWHYu2zsbbEs4XhaWRZospbgok/edit?usp=sharing
近藤宇智朗 / 2022-05-11 Narrative of Ruby x Rust Fukuoka.rb #256 Special LT
View Slide
#256Mirrativ, Inc. Infra Engineer • 主にGoを書く、RubyとRustが好き • シニアシレンジャー • 好きなtrait: PartialEq • バイナリアンワナビ 近藤うちお (@udzura) ※ ミラティブはGo/フロントエンド/Unity/ネイティブアプリエンジニアを強烈に募集しています。
福岡市エンジニアカフェ ハッカーサポーターというタイトルで色々お手伝いしてます
Today’s LT
Rust、熱量ありますね Rubyist的には、YJITとか、RubyGemsのRustビルダー対応とか
#256今日のテーマ RustでRuby(MRI)の拡張gemを書く話 • LTなので時間厳守です、要点だけです • めちゃくちゃ早口です • 時間が余ったら僕とRustに関するナラティブを垂れ流します
#256なぜRustで拡張gemを書くのか?
#256Rubyで拡張を書きたい時 YJITはまあ置いときましょう • A. • スピードがとにかく欲しい。文字列操作でいちいちStringインスタンス作りたくないような状況など • B. • 特定のシステムコールやCライブラリ関数を呼びたいが既存のものがない • C. 他にあれば教えてください
#256第一の選択肢: C言語? • ところでC言語といえば… 脆弱性ですよね(諸説あり) • 僕が色々いうよりIPAの 資料を読んだ方がいい (古いのが難点) • 他の選択肢… • C++: Cより安全にする仕組みはあるがそれでも自由すぎ • FFIとか: 便利だが逆に自由度低い、ややバッドノウハウ https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html
#256C言語と脆弱性 • 2021 CWE Top 25 の上位には相変わらずCのメモリに関する脆弱性 2021年に起こった脆弱性を振り返る https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html
#256メモリの脆弱性を回避したコードを書くのは簡単ではない • 回避策やツールはある • が使われるとも限らない • udzura mruby本 第9章 • (第9章だけバラで売りたいw) • 他「初めて学ぶバイナリ解析」とか
そこでRustなんすよ…
#256Rust の特徴的機能 だいたい全てはメモリ安全性のために • 所有権 • 借用規則 • ライフタイム • Option • unsafe …
#256ただ安全なだけじゃない • 上記に加え、型の表現力がとても高く、意図を表現しやすい。 • 安全かつ快適にコードが書ける(しかも多くの場合速い) • これってすごくない? • Rubyと同じ雰囲気がある、Rubyistはしっくりくると思う
論より動くもの
How to Implement Rusty Gem
#256詳細はブログをじっくり読んでください LTじゃ無理っすわ、jimlockさん... • https://udzura.hatenablog.jp/entry/2022/05/11/193100
#256実装の全体だけでも
#256It works! よかったね。 オレはようやくのぼりはじめたばかりだからな
時間があれば話す
#256One More Thing 5分では絶対話せない • もうちょっと真面目に 中身を書いてみた • 実装例 👉
#256渋ポイント1 • bindgenはCマクロを エクスポートしない • 大事な機能に限って マクロだったりする • Cで小さなラッパ関数を 書いてリンクするとか おもてなしが必要…。 本当は RSTRING_LEN() が 使いたいんです…。
#256渋ポイント2 • Rubyメソッドに対応する 関数は、可変長引数(?) • transmuteして fn() -> VALUE 型扱い 他にもQnil→VALUEとか transmute多くて治安が • 一方mrubyは mrb_get_args()を使った… 治安が悪い!!
#256Rust gemを便利に作れるラッパcrate欲しい • 暇があればぼくが作…ウッ • !?: https://crates.io/crates/coffret • 名前重要なので押さえました • 頑張って中身を作りましょう nixみたいな。コントリチャンスだ! 少しだけ良くなります
終わりに
#256僕とRustのナラティブ • 口頭のみです!!(??) 僕が一番Rustをうまく使えるんだ(使えるとは言っていない)