こんにちは、構文解析器研究部員の S.H. です。 最近Rubyに導入された parse.yのUniversal Parser 周りに興味がありパッチを投げています。
そういった背景からRubyの parse.yのUniversal Parser を頻繫にビルドする機会があり、せっかくなので手順などをまとめてみました。
今回紹介するビルド方法は以下の二つになります。
- rbenv経由でparse.yのUniversal Parserをビルドする
- Rubyのソースコードからparse.yのUniversal Parserをビルドする
parse.yのUniversal Parserとは?
今年開催されたRubyKaigi 2023で登壇されたyui-knkさんがRubyに導入されたものです。
- [Feature #19719] Universal Parser @GitHub Pull Request
- Feature #19719 Universal Parser @bugs.ruby-lang.co.jp
導入の背景としては
- parse.yに記載されている文法ルールを他のRuby処理系へ移植しやすくする
- parse.yを参照しているRuboCopなどの周辺ツールの追従コストを下げる
などのメリットがあるためのようです。
またparse.yのUniversal ParserをRuboCopなどの周辺ツールで利用する場合、Rubyが提供しているC APIと同じものを自前で実装する必要があります。 そのため以下のようなC APIへの依存を減らすという対応も必要になっています。
parse.yのUniversal Parser化についてのより詳しい話は以下のyui-knkさんのスライドが参考になります。
rbenv経由でparse.yのUniversal Parserをビルドする
rbenv
を使ってparse.yのUniversal Parserをビルドする場合は以下のようにconfigure用のオプションにRUBY_CONFIGURE_OPTS="cppflags=-DUNIVERSAL_PARSER"
を渡します。
$ RUBY_CONFIGURE_OPTS="cppflags=-DUNIVERSAL_PARSER" rbenv install 3.3.0-dev --verbose
--verbose
を渡すことでビルドログを表示できるので、そこに以下のようなログが出ていればparse.yのUniversal Parserを使う形でビルドされています。
$ CPPFLAGS = -I/home/sh/.rbenv/versions/3.3.0-dev/include -DUNIVERSAL_PARSER
Rubyのソースコードからparse.yのUniversal Parserをビルドする
前提条件や環境など
- Ubuntu 22.04 LTS
- Ruby Hack Challenge (RHC)に書かれている必要なライブラリなどはインストール済み
手順
作業用のディレクトリを作成する
まずは作業用のディレクトリを作成します。
$ mkdir rubydev
次に作業用ディレクトリへ移動します。
$ cd rubydev
CRubyのソースコードをcloneする
Rubyのソースコードを手元にcloneします。 cloneの方法は以下のどちらでもOKです。
# ssh $ git clone git@github.com:ruby/ruby.git # https $ git clone https://github.com/ruby/ruby.git
CRubyでUniversal Parserを使う形でビルドする
cloneしてきたRubyのソースコードのディレクトリまで移動します。
$ cd ruby
次に./autogen.sh
をruby
ディレクトリ内で実行し、Ruby自体をビルドするために必要な設定などを生成します。
$ ./autogen.sh
次にrubydev
ディレクトリ配下にbuild
というビルド用のディレクトリを作成し、そこへ移動します。
$ mkdir ../build && cd ../build
build
ディレクトリ内で以下のコマンドを実行し、parse.yのUniversal Parserを使うようにconfigureでフラグを渡します。
$ ../ruby/configure --prefix=$PWD/../install --enable-shared cppflags=-DUNIVERSAL_PARSER
あとはmake all install
コマンドを実行すればparse.yのUniversal Parserが有効になったRubyがビルドできます。
$ make all install
まとめ
現在ホットなトピックである parse.yのUniversal Parser を使ったビルドする方法を紹介しました。
今後 parse.yのUniversal Parser が発展していくことで
- JRubyなどの他のRubyの処理系が新しいRubyの文法に追従しやすくなる
- 新しいRubyの処理系が開発しやすくなる
- RuboCopなどの周辺ツールの文法ルールのメンテナンスコストが削減できる
などの恩恵が受けられそうです。
またparse.yのUniversal Parserをより使いやすいものにするために C API への依存を減らす取り組みも進んでいます。 この記事を読んでparse.yのUniversal Parserに興味を持った方は、ぜひ僕と一緒にparse.yのUniversal Parserへコントリビューションしていきましょう!
参考資料
- Ruby Hack Challenge (RHC)
- The future vision of Ruby Parser
- [Feature #19719] Universal Parser @GitHub Pull Request
- Feature #19719 Universal Parser @bugs.ruby-lang.co.jp
永和システムマネジメントでは、Ruby とアジャイルソフトウェア開発と構文解析器の研究を通じてコミュニティと成長したいエンジニアを絶賛募集しています。