Perl::Lint - Yet Another Perl Source Code Linter
-
Upload
moznion -
Category
Technology
-
view
1.562 -
download
0
description
Transcript of Perl::Lint - Yet Another Perl Source Code Linter
Perl::Lint - Yet Another Perl Source Code Linter
http://bit.ly/1p5HdSA
@moznion
VOTE ME!
Perlの静的解析入門と Perlリファクタリングツール
App::PRTのご紹介 @hitode909
!
Day 2, 多目的教室3, 16:00
SEE ALSO
@moznion
@moznion@hitode909👆
Perl::Lint !https://github.com/moznion/Perl-Lint
https://metacpan.org/release/MOZNION/Perl-Lint-0.01_01 (<= UNDERDEVELOPMENT!!!)
Perl::Lint !https://github.com/moznion/Perl-Lint
https://metacpan.org/release/MOZNION/Perl-Lint-0.01_02 (<= UNDERDEVELOPMENT!!!)
What is Perl::Lint?
A. Source Code Linter for Perl
Are you using Perl::Critic? http://bit.ly/1pfMxCW
What is Perl::Critic?
A. Source Code Linter for Perl
Wait!!
What is Source Code
Linter???
A. Analyzes the source code and detects the causes of bugs
Concretely…
There are five bad things🐞
There are five bad things🐞
There are five bad things🐞
There are five bad things🐞
There are five bad things🐞
There are five bad things🐞
It was fun?
Is this what I think it is?
It’s just CODE REVIEW?
But do you think human should do the such code review?
Human should work more creative
It seems possible to check by computer
There are five bad things🐞
And probably human overlooks
Hard to Understand Code
Hard to Understand CodeDestroy!
Hard to Understand Code
Easy to review
Do you like clean code, and why?
Readable code !
!
Reviewable code
Readable code !
!
Reviewable code≒
=> Maintainable!!
Maintainable code will be growing up along maintainable
Humans can focus on creative work
Okay, Make maintainable code by computer!
And then source code linter was appeared (1979 for C)
Now; js-lint, find-bugs, rubocop, etc…
And language processors: Go, Scala and etc.
Does Perl have?
Perl::Critic is awesome!
Perl::Critic checks the code conform to PBP style or not
Benefit to analyze code by computer
He don’t grumble
He is inexhaustible
He don’t take a mistake
He is fast (in many cases)
And can automation
Cost of human: HIGH !
Cost of computer: LOW
Cost of human: HIGH !
Cost of computer: LOWGood!!
Got it.
But… If there is Perl::Critic, Is Perl::Lint don’t need?
Perl::Critic is awesome but a little slow
In large project, It takes 3 minutes to run only Perl::Critic
How do you spend in meantime?
How do you spend in meantime?
Coffee?
How do you spend in meantime?
Coffee?
Chat?
How do you spend in meantime?
Coffee?
Chat?Nap?
How do you spend in meantime?
Coffee?
Chat?Nap?
Swing Copters?
Life is too short, so let’s accelerate!!
Rate
[num
/sec
]
0
25
50
75
100
Perl::Critic Perl::Lint
97
18
Rate
[num
/sec
]
0
25
50
75
100
Perl::Critic Perl::Lint
97
18
About 400% increase
Yeah!!!! I'll show you all my tricks
A little break
Background that led to the development
This project receive TPF grant
Do you know TPF grant?
Nozaki-san and Maki-san (@lestrrat-san) are people in a high position of TPF grant
Maki-san「日本人がトップになったのに日本から1つもProposal出ないのちょっとアレじゃない?」▼ me「そうですなあ」▼ Maki-san「moznion出してよ」▼ me「!!!!!」▼
Time flies everything goes…
Perl::Lint!!!!
Let’s apply!!!
Return to our subject…
How do we do static analyzing for Perl?
Enough!
Joke :p
Two major methods - Evaluate Token - Evaluate AST
Two major methods - Evaluate Token - Evaluate AST
Tools - PPI - Compiler::Lexer
Tools - PPI - Compiler::Lexer
What is Compiler::Lexer?
*Very Fast* tokenizer made of C++
Compiler::Lexer is fast ⇛ Perl::Lint is fast!
And others: Compiler::Parser, C::CodeGenerator::LLVM, etc… @goccy54++
Example of tokens that is generated by Compiler::Lexer
my $foo;
my $foo;
Points
Use these tokens to analyze
Enough!
Architecture of Perl::Lint
Top Level
+args +site_policies+lint +lint_string
Policies
+evaluate
Filters
+filter
1
1 .. *
1
1 .. *
Simple and Easy!
Policies
Each policies are isolated
Easy to make your own policy
Samples
*** CAUTION *** A lot of bad
code are here. Close your eyes.
@P::L::P::Miscellanea::ProhibitTies
@P::L::P::Miscellanea::ProhibitTies
Check type
@P::L::P::Miscellanea::ProhibitTies
Check data
アッ
Feature of Implementation and Bad Know-hows
Use C-Style for()
Use C-Style for()
But PBP prohibit it!!
Use List::Util::any instead of grep
Don’t use regex, compare by eq in series
Or use hash
…
Function calling is almost gone.
Use simple parts e.g. raw-bless, POPO
Filtering mechanism
Perl::Critic’s default rule system is a bit difficult…
Yes, I know, perlcriticrc can adjust them. But too much hustle
Perl::Lint checks the all of policies as default
And you can filter any policies as you like
Filter by `ignore`
Filter by `filter`
Yes, of course you can deny the all of policies :)
You can define your own filter
e.g.
And Perl::Lint provides default policies
For Perl::Critic users ;)
These are features of Perl::Lint
But installation is such a hassle!
Perl::Lint Playground http://perl-lint.moznion.net
You can try!
Meaning to publish Playground
It makes easy to get feedback
Motivation ➚
Publish the Playground is looking good!
Future works
Implement the all of policies…
## no lint
Module for testing (Like a Test::Perl::Critic)
Cooperate with GitHub (Like a Coveralls)
Inject the result into code as TODO comment (inspired by rubocop)
As you see, Perl::Lint is under development
SEGV, ABRT, etc…
I’m looking for contributors!
DEMO
Any Questions?