本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは鍛治匠一さんで、テーマは「Perl 6の歩き方」です。
Perl 6リリース!
2015年のクリスマス、Perlの生みの親であるLarry Wallのポエム的なブログポストとともにPerl 6がリリースされました。2015年1月31日~2月1日に開催されたFOSDEM 2015で「今年のクリスマスにリリースする!」と彼が宣言してから開発ペースが急激に上がり、なんとかリリースにこぎつけた感じでした。
今回は、そのPerl 6の歩き方を紹介します。具体的には、Perl 6のインストール方法、特徴的な関数の文法、そしてモジュールのエコシステムについて扱います。
なお、リリースされたとは言っても、安定性、完成度においてPerl 6はプロダクション環境で使えるレベルにはまだ到達していません。しかし魅力的な文法が目白押しで、何より書いていて楽しいです。本稿がPerl 6に興味を持つきっかけになればうれしく思います。
リリースまでの道のり
簡単にPerl 6の歴史を振り返ります[1]。
今から16年前の2000年にPerl 6プロジェクトは始まりました。そのころPerl 5のソースコードは非常に複雑になっており、新たな機能を加えるのが難しくなっていました。そこでPerl 6プロジェクトでは、次世代を担うPerl 6のあるべき姿を考え、まず仕様を書くところから始まりました。この考えは今でも続いており、Perl 6は仕様であり、その実装がいくつか存在する、という構図になっています。
2005年、HaskellによるPerl 6実装のPugsが登場します。そして2008年には仮想マシンParrot上で動くPerl 6実装のRakudoが登場しました。その後、Rakudoは仮想マシン上で直接実装するのではなく、仮想マシン上でPerl 6のサブセット言語であるNQP(Not Quite Perl)を動かし、NQPでRakudoを実装するというように変わっていきました。
2016年現在では、仮想マシンがParrotからMoarVM(もしくはJVM)に変わり、「MoarVM+NQP+Rakudo」が最も完成度の高いPerl 6実装となっています。LarryのPerl 6リリース宣言も、この実装を念頭においての発言です。
Perl 6の長所
実際にPerl 6に触る前に、筆者の考えるPerl 6の長所を紹介します。
文法が多く表現力が豊か
Perl 6に少し触れてみればわかりますが、覚えるべき文法はかなり多いです。一方でそれは、その豊富な文法を駆使すればPerl 5よりも簡潔に、効果的にプログラムが書けるということです。
たとえばPerl 6にはジャンクションという機能があります。ジャンクションとは同時に複数の値のように振る舞える1つのスカラのことで、これを使うと次のように簡潔に書けます。
オブジェクト指向、メタプログラミングのサポート
Perl 6はいろいろなプログラミング手法をサポートしています。特にオブジェクト指向については必要十分な機能が備わっています。また、メタプログラミングについても意欲的にその機能を実装しています。
Perl 6では、class
キーワードでクラスを、has
キーワードでメンバー変数を定義できます。また^
からはじまるメソッドによってクラス自身を操作することができます。
強力な正規表現
Perlはもともとテキスト処理のために作られたプログラミング言語です。そしてテキスト処理の中心的な役割を担うのが正規表現です。Perl 6ではこの正規表現がさらに進化しました。
正規表現はややもすると複雑になり、可読性が悪くなります。Perl 6は正規表現を部品に分け、構造的に定義できるGrammarというしくみでこれを解決します。たとえば、
のようなkey=value
からなる設定ファイルをパースするコードは、次のようになります。
grammar KVPairs
で文字列をどのようにパースするかを定義しています。KVPairs.parse($content,:actions(KVActions))
が呼ばれると、$content
とKVPairs
のTOP
とのマッチが試されパースされます。class KVActions
はそのパースされた結果をどう扱うかを定義しています。
並行/非同期プログラミングのサポート
Perl 5の大きな欠点に、言語として並行/非同期プログラミングをサポートしていないことがあります。これを踏まえPerl 6では、中核機能として並行/非同期プログラミングのしくみをサポートしています。
たとえば以下は、HTTPリクエストを並行に行うコードです。start {}
によって非同期にHTTPリクエストを発行し、await
によってそれらが終了するのを待っています。
以上、筆者が考えるPerl 6の長所を4つ挙げました。なお、ここに挙げたGrammar、並行/非同期プログラミングなどについては、それ自体で閉じたトピックであるため本稿ではこれ以上扱いません[2]。その代わり、Perl 6全般に通用する関数と、エコシステムについて扱います。
Perl 6のインストール方法
では、Perl 6をインストールしてみましょう。先述したようにPerl 6は仕様です。よって実際にインストールするのは、Perl 6の実装であるRakudoと、それを動かすためのMoarVM、NQPです。
インストールには主に2つの方法があります。
- MoarVM、NQP、Rakudo、有用なモジュール一式をtarballにまとめたRakudo-Starをインストールする
- Rakudo管理ツールrakudobrewを使って、MoarVM、NQP、Rakudoをそれぞれソースリポジトリから取得してインストールする
Rakudo Starのほうがすべて1つのtarballにまとまっていて簡単にインストールできますが、Perl 6の開発スピードが早いため古くなりがちという欠点があります。よって今回は、rakudobrewを使ったインストール方法を説明します。
rakudobrewを使ったインストール
rakudobrewをインストールしたのち、MoarVM、NQP、Rakudoをインストールします。
Rakudoをアップデートする場合は、rakudobrew build moar
を再度実行してください。
外部モジュールのインストール
外部モジュールを使う場合は、モジュール管理ツールpandaをインストールしてから該当モジュールをインストールします。
次節でREPL(Read-eval-print loop)を使った説明をしますので、REPLを実行しやすくするためにLinenoise
という外部モジュールを入れておきましょう。
Linenoise
を入れることで、矢印キーによる以前実行した式の参照や、コントロールキーによるカーソル移動などができるようになります。
Perl 6はじめの一歩
それでは、Perl 6のはじめの一歩を踏み出しましょう! プログラミングの王道にのっとって、「Hello,World」と表示させます。
REPLでHello, World
perl6
とだけ打てば組込みのREPLが起動しますので、まずはREPLで試します。
p6ファイルでHello, World
次にファイルに書いて実行してみます。Perl 6は拡張子として、スクリプトの場合はp6、モジュールの場合はpm6を利用します[3]。
hello.p6の1行目にuse v6
と書きましたが、これによって「このスクリプトはPerl 6である」と宣言しています。こう書いておけば、このスクリプトが誤ってPerl 5で実行された場合、次のようにメッセージで教えてくれます。
<続きの(2)はこちら。>
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT