[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

RubyKaigi 2025に「Road to Go gem」で登壇するので採択されたProposalを公開します

こんにちは、インフラ部のsue445です。

2025年4月16日(水)〜18日(金)に愛媛県松山市で開催されるRubyKaigi 2025に登壇します!

rubykaigi.org

自分のトークについて

3日目の4月18日(金)に登壇予定です。

rubykaigi.org

「Road to Go gem」というタイトルで、Rubyのnative extensionをGo言語で書きやすくした話をします。

RubyKaigiはコード自慢大会*1なのでここ最近趣味で作ってた https://github.com/ruby-go-gem/go-gem-wrapper やその周辺の話をします。

github.com

タイトルにGoが入っていますが実際にはC言語の話の方が多いかもしれません。

余談ですが僕の名前はGoです。

実際に採択されたProposal

実際に採択されたProposalはこちらになります。今後Proposalを出す時の参考にしてください。

このProposalの内容をベースに発表資料も作るので当日の僕のトークの予習資料としてもご利用ください。

Title

Road to Go gem

Agenda

Go talks about Ruby native extension gem with Go. (a.k.a. Go gem)

I created https://github.com/ruby-go-gem/go-gem-wrapper for Go gem.

This is a library to make it easier to create Go gem. (contains both Go module and Ruby gem)

I will talk the following regarding go-gem-wrapper and Go gem.

  • Auto-generate (almost) all of Go's bindings from ruby.h. (about 1,100 functions)
  • Parse CRuby's ruby.h with Ruby
  • C lang's pointer difficulties from ruby.h parser's point of view
  • Run go test with CRuby
  • Pros/Cons of Go gem
  • My bundler's patch for Go gem

Details

Goでnative extensionを作りやすくした話をします。

長いのでGoで作られたnative extensionのことを僕はGo gemと言っています。このプロポーザルでもそのように呼称します。

このトークは2024年9月に開催されたTokyuRuby会議15の発表の続きになります。 https://esa-pages.io/p/sharing/8985/posts/887/74fdd1ed44cec5284a40-slides.html#/18

Tokyuの時はWIPでしたが今回は完成してるので完成物(Go gemを作りやすくするためのライブラリとその周辺のエコシステム)の話をします。

これによりこれまでよりも少ないコード量でGo gemを作ることができます。

僕がbundlerに送ったパッチ(後述)がマージされると bundle gem --ext go でGo gemのスケルトンが作れるようになるんですが、プロポーザル執筆時点ではまだマージされていないです。

コードだと下記の話が中心になります

コード以外の部分のネタはこの辺があります。(探せばもっとあるかも)

  • ruby.h をparseするために頑張ったこと
  • Go gemのメリット
    • goroutineはRactorの約28倍速いw
    • 現状Rubyで並行・並列処理を書く場合にはThreadやFiberやRactorを使うことになると思いますが、Go gemによりgoroutineという新しい選択肢ができました
    • osyoyuさんも以前言ってたけどRubyを速くするためにRuby以外を書くことになった
  • 現在の課題(Go gemの制限)
  • bundlerにFeature proposalやPRを投げた時の苦労点など
    • 最初rubygemsのdiscussionに投稿した時にあまり反応がなかったのでruby-jp slackでhsbtさんに相談した
    • bundlerはUbuntu/macOS/WindowsでそれぞれCIを実行しているのだが、特定のテストを実行しようとするとなぜかWindows Runnerだけでハングする事象が見つかって調査して直した件
      • bundlerのWindowsのCIは通常時でも1.5時間くらいかかるので調査がむっちゃ大変だった

Pitch

Go gemに関する話は2015年のRubyKaigi( https://rubykaigi.org/2015/presentations/mmasaki/ )で話されたきりで、僕が知ってる範囲ではその後特に進展はなかったと思います。

2015年の発表当時だと bundle gem した直後のスケルトンに色々手を加える必要があったので万人が手を出せるものではありませんでした。

そのため、ruby.hからGoのbindingを自動生成する仕組みを整えてbundlerに組み込めるレベルまで持っていくという一連のエコシステムを全て僕1人で作りました。

僕が取り組むまではbundlerにこの手のissueやproposalはなかったので、Go gemに取り組んでいるのは現在世界中でおそらく僕しかおらず、間違いなく僕にしかこの話はできないです。

ここ数年のRubyKaigiではRubyで書かれたコードのparserのトークが盛り上がっていますが、僕はもうちょっと低レイヤー寄りでCRubyのソースコードのparser枠として話をすることになると思いますw

bundle gem に新しい言語を追加しようとしてる人はほとんどいないので、今後 bundle gem に他の言語を追加したい人の手助けになると思っています。

補足

TitleとAbstractはサイトに公開されるものなので全て英語で記載してますが、Details(発表のテーマや流れ)とPitch(このCFPを採択すべき理由やアピール文)に関してはレビュアーしか見ないものなので日本語で記載しています。

【おまけ】過去のRubyKaigiで採択されたProposalの一覧

inside.pixiv.blog

sue445.fanbox.cc

*1:諸説あります

20191219021925
sue445
2018年7月に中途入社。CIおじさん。好きな言葉は「全ての手作業を自動化」。 好きなアニメは女児アニメ全般(プリキュア・プリティーシリーズ・アイカツ)とサザエさん。 多数のgemをOSSで公開 https://rubygems.org/profiles/sue445 。代表作はプリキュアのRuby実装のrubicure (https://github.com/sue445/rubicure)