ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Rubyに導入されたparse.yのUniversal Parserをビルドしてみる

こんにちは、構文解析器研究部員の S.H. です。 最近Rubyに導入された parse.yのUniversal Parser 周りに興味がありパッチを投げています。

github.com

github.com

そういった背景からRubyの parse.yのUniversal Parser を頻繫にビルドする機会があり、せっかくなので手順などをまとめてみました。

今回紹介するビルド方法は以下の二つになります。

  • rbenv経由でparse.yのUniversal Parserをビルドする
  • Rubyのソースコードからparse.yのUniversal Parserをビルドする

parse.yのUniversal Parserとは?

今年開催されたRubyKaigi 2023で登壇されたyui-knkさんがRubyに導入されたものです。

導入の背景としては

  • parse.yに記載されている文法ルールを他のRuby処理系へ移植しやすくする
  • parse.yを参照しているRuboCopなどの周辺ツールの追従コストを下げる

などのメリットがあるためのようです。

またparse.yのUniversal ParserをRuboCopなどの周辺ツールで利用する場合、Rubyが提供しているC APIと同じものを自前で実装する必要があります。 そのため以下のようなC APIへの依存を減らすという対応も必要になっています。

github.com

github.com

parse.yのUniversal Parser化についてのより詳しい話は以下のyui-knkさんのスライドが参考になります。

speakerdeck.com

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をビルドする

前提条件や環境など

手順

作業用のディレクトリを作成する

まずは作業用のディレクトリを作成します。

$ 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.shrubyディレクトリ内で実行し、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 とアジャイルソフトウェア開発と構文解析器の研究を通じてコミュニティと成長したいエンジニアを絶賛募集しています。

agile.esm.co.jp