この記事は、Perl Advent Calendar 2025 13日目の記事です。 12日目は@takihitoで「10年ぶりCPANリリース&爆破解体の裏話」でした。
背景
アドベントカレンダーのネタを探しインターネットの海を彷徨っていたところ、 fglock/PerlOnJavaというプロジェクトを見つけました。 なんと、Javaで実装されたPerlのインタープリターです!! これは熱い!!!
試してみた
今のところビルド済みのバイナリーは提供されていないようなので、 自前でビルドしてあげる必要があります。
macOS上で試してみました。 Javaの開発環境が必要なので、brewを使ってインストールしておきます。
brew install gradle
PATH=$(brew --prefix openjdk)/bin:$PATH
あとはcloneしてmakeしてあげるだけです。
git clone git@github.com:fglock/PerlOnJava.git
cd PerlOnJava
make
jperl というスクリプト経由でPerlを実行できるようになります。
./jperl -E 'say "Hello World"'
う、動いたああああーーーー!!!!
ベンチマーク
JVM上で実行されていることもあって、やはり性能が気になりますよね。 竹内関数 を使ってベンチマークを取ってみました。
use v5.42;
use strict;
use warnings;
use Benchmark qw(timethis);
sub tarai($x, $y, $z)
{
return $y if $x <= $y;
tarai( tarai($x-1, $y, $z),
tarai($y-1, $z, $x),
tarai($z-1, $x, $y));
}
timethis(10, sub { tarai(12, 6, 0) });
まずは普通のPerlから。
timethis 10: 17 wallclock secs (17.15 usr + 0.04 sys = 17.19 CPU) @ 0.58/s (n=10)
次はPerlOnJava。
timethis 10: 18 wallclock secs (18.22 usr + 0.12 sys = 18.33 CPU) @ 0.55/s (n=10)
約6.6% PerlOnJavaのほうが遅いという結果になりました。 遅いとはいえ僅差ですね。 簡単なマイクロベンチしか取っていませんが、この速度なら既存のPerlの置き換えとして使えるかも・・・?
ところでしれっと Benchmark を使ってみたのですが、なんか普通に動きました。 互換性の高さがうかがえますね。
Perl 5.42 の新機能を使ってみる
最新版のv5.42.2はPerlの5.42.0と互換性があるそうです。
そんなわけで「Perl 5.42.0 の any と all キーワードを試してみた」で試したコードをPerlOnJavaで動かしてみたところ、見事に動きました。
use v5.42;
use feature 'keyword_any';
no warnings 'experimental::keyword_any';
my @numbers = (2, 4, 8, 16);
if ( any { $_ % 2 == 0 } @numbers ) {
say "Any of the numbers are even";
}
まとめ
Javaで実装されたPerlのインタープリターfglock/PerlOnJavaを見つけたので遊んでみました。 速度も申し分ないし、互換性も高そうだし、かなり有望なプロジェクトだと感じました。 「perlだけがPerlを解釈することができる」とよく言われますが、この状況に一石を投じることはできるのでしょうか。 これからの進化が楽しみです。
明日14日はTBDさんで「TBD」です。
🐰 Javaの上で踊るPerlを見つけたよ、
ページに綴り、朝露のように輝く。
コマンド叩いて、ベンチ走らせ、
小さな訳注が旅を導く。
マークダウン畑に、また一粒の知識を。by CodeRabbit