Perl::Lintを使ってみた
2014-08-13 11:26


TL;DR

moznionさんが書かれたブログ記事を見る方が早いです: Released Perl::Lint as underdevelopment

Perl::Lintとは?

開発版ではありますが, 遂にPerl::Lintがリリースされたようです.

Perl::Lintは, @moznionさんの提案がTPF(The Perl Foundation)の助成金プログラムに採択された結果, 開発が始まったプロダクトです. moznionさんの提案は, Perlのコードを静的に解析するPerl::Criticの高速化. Perl::CriticはPPIを利用して実装されていますが, Perl::Lintでは@goccy_54さん製のCompiler::LexerCompiler::Parserを利用しています. 全てPerlで実装されているPPIと違い, Compiler::LexerやCompiler::ParserはXSで実装されている為, 静的解析を実現する上で必須となる字句解析や構文解析が早くなり, 結果全体の高速化が期待できる... という訳です.

それでは早速, 使ってみましょう!

Perl::Lintのインストール

この記事を書いた段階でのPerl::Lintの最新版は, 0.01_01です(余談ではありますが, Perlのモジュールにおいてバージョンに_が入っているものは開発版として扱われます. CPANのPerl::Lintのページを見てみても, 「DEVELOPER RELEASE」と書かれていることが確認できると思います).

開発版のモジュールをインストールする場合, cpanm--devというオプションを与えましょう.

$ cpanm --dev Perl::Lint

Perl::Lintを使ってみる

というわけで早速Perl::Lintを使ってみましょう. 今回は, 会社の業務と趣味の狭間で開発をしているGaiaChanのコードでPerl::Lintを試してみたいと思います.

ひとまず, GaiaChan.pmで試してみます. コードは以下の通り.

package GaiaChan;
use 5.010;
use strict;
use warnings;
use utf8;

our $VERSION = 0.01;

1;

で, Perl::Lintを使ったテストはtディレクトリに, 99_perl_lint.tというファイル名で, 次のような形で置いてみました.

use strict;
use warnings;
use utf8;

use Perl::Lint qw/ lint /;

my $target_files = [qw(
    lib/GaiaChan.pm
)];
my $violations = lint($target_files);

use DDP { deparse => 1 };
p $violations;

Perl::Lintには, 現時点ではPerl::Criticに対するTest::Perl::Criticのようなモジュールは存在していません. なので, 今回はPerl::Lintがチェックした結果をそのままDDPで出力する, という若干強引な手法で確認してみることにします.

それではテストを実行してみましょう.

$ perl -Ilib t/99_perl_lint.t
\ [
    [0] {
        description   "",
        explanation   [
            [0] 45,
            [1] 46
        ],
        filename      "lib/GaiaChan.pm",
        line          7,
        policy        "Perl::Lint::Policy::NamingConventions::Capitalization"
    },
    [1] {
        description   "Code before strictures are enabled",
        explanation   [
            [0] 429
        ],
        filename      "lib/GaiaChan.pm",
        line          2,
        policy        "Perl::Lint::Policy::TestingAndDebugging::RequireUseStrict"
    },
    [2] {
        description   "Code before warnings are enabled",
        explanation   [
            [0] 431
        ],
        filename      "lib/GaiaChan.pm",
        line          2,
        policy        "Perl::Lint::Policy::TestingAndDebugging::RequireUseWarnings"
    }
]

...いろいろ出てきましたね.

1つ目は, 「description」が空欄なので何とも言えませんが... our $VERSION = 0.01;の行を指していて, policyがCapitalizationになっているので, 変数名が大文字になっているのが云々... という警告かなぁと.

で, 2つ目と3つ目は, use strict;use warnings;の前にuse 5.010;があるのが原因... なんだと思います. 実際, use 5.010;を後ろに持って行くと, 2つ目と3つ目の警告は出なくなりましたし.

感想

Perl::Lintをリリースした件ついてmoznionさんが書かれたブログ記事には, 「ご存知の通りこのモジュールは未完成です.このモジュール (の吐き出す結果) と俺を信用しないでください.」と書かれています. 実際, 「description」が空欄だったりと細かい部分がカバーできていない所が(先程の例でも)見受けられましたし, 未実装の部分だったり, バグがある部分等々もいくつかあるのかもしれません.

ただ, この段階でもPerl::Lintの利点というか, 可能性を十分感じる事ができました. それは実行速度の違いです. 今回, 比較対象としてPerl::Criticを使って同様のコードに対して静的解析をかけてみましたが, Perl::LintはPerl::Criticに比べて体感で倍くらい早い感じがしました(恐らくmoznionさんもPerl::LintとPerl::Criticの実行時間の差を比較していると思うので, いずれブログで紹介されるのではないでしょうか). テスト対象となるファイルが増えれば増える程, 実行時間の差は積もっていって実行時間に大きく差が出てくるので, これはPerl::LintとPerl::Criticを比べた時の大きな利点になるでしょう.

Perl::Lintの今後に超期待ですね!


created at
last modified at
2014-08-13 11:31
comments powered by Disqus