perl::lint - yet another perl source code linter

154
Perl::Lint - Yet Another Perl Source Code Linter http://bit.ly/1p5HdSA @moznion

Upload: moznion

Post on 26-May-2015

1.562 views

Category:

Technology


0 download

DESCRIPTION

YAPC::Asia 2014 Talking about Perl::Lint

TRANSCRIPT

Page 1: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint - Yet Another Perl Source Code Linter

http://bit.ly/1p5HdSA

@moznion

Page 2: Perl::Lint - Yet Another Perl Source Code Linter

VOTE ME!

Page 3: Perl::Lint - Yet Another Perl Source Code Linter

Perlの静的解析入門と Perlリファクタリングツール

App::PRTのご紹介 @hitode909

!

Day 2, 多目的教室3, 16:00

SEE ALSO

Page 4: Perl::Lint - Yet Another Perl Source Code Linter

@moznion

Page 5: Perl::Lint - Yet Another Perl Source Code Linter

@moznion@hitode909👆

Page 6: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint !https://github.com/moznion/Perl-Lint

 https://metacpan.org/release/MOZNION/Perl-Lint-0.01_01 (<= UNDERDEVELOPMENT!!!)

Page 7: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint !https://github.com/moznion/Perl-Lint

 https://metacpan.org/release/MOZNION/Perl-Lint-0.01_02 (<= UNDERDEVELOPMENT!!!)

Page 8: Perl::Lint - Yet Another Perl Source Code Linter

What is Perl::Lint?

Page 9: Perl::Lint - Yet Another Perl Source Code Linter

A. Source Code Linter for Perl

Page 10: Perl::Lint - Yet Another Perl Source Code Linter

Yes, It’s like…

Perl::

http://bit.ly/1l5HrYX

Page 11: Perl::Lint - Yet Another Perl Source Code Linter

Are you using Perl::Critic? http://bit.ly/1pfMxCW

Page 12: Perl::Lint - Yet Another Perl Source Code Linter

What is Perl::Critic?

Page 13: Perl::Lint - Yet Another Perl Source Code Linter

A. Source Code Linter for Perl

Page 14: Perl::Lint - Yet Another Perl Source Code Linter

Wait!!

Page 15: Perl::Lint - Yet Another Perl Source Code Linter

What is Source Code

Linter???

Page 16: Perl::Lint - Yet Another Perl Source Code Linter

A. Analyzes the source code and detects the causes of bugs

Page 17: Perl::Lint - Yet Another Perl Source Code Linter

Search and Destroy

http://bit.ly/1AT3Bl3

Page 18: Perl::Lint - Yet Another Perl Source Code Linter

Concretely…

Page 19: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 20: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 21: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 22: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 23: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 24: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 25: Perl::Lint - Yet Another Perl Source Code Linter

It was fun?

Page 26: Perl::Lint - Yet Another Perl Source Code Linter

Is this what I think it is?

Page 27: Perl::Lint - Yet Another Perl Source Code Linter

It’s just CODE REVIEW?

Page 28: Perl::Lint - Yet Another Perl Source Code Linter

But do you think human should do the such code review?

Page 29: Perl::Lint - Yet Another Perl Source Code Linter

Human should work more creative

Page 30: Perl::Lint - Yet Another Perl Source Code Linter

It seems possible to check by computer

Page 31: Perl::Lint - Yet Another Perl Source Code Linter

There are five bad things🐞

Page 32: Perl::Lint - Yet Another Perl Source Code Linter

And probably human overlooks

Page 33: Perl::Lint - Yet Another Perl Source Code Linter

Hard to Understand Code

Page 34: Perl::Lint - Yet Another Perl Source Code Linter

Hard to Understand CodeDestroy!

Page 35: Perl::Lint - Yet Another Perl Source Code Linter

Hard to Understand Code

Easy to review

Page 36: Perl::Lint - Yet Another Perl Source Code Linter

Do you like clean code, and why?

Page 37: Perl::Lint - Yet Another Perl Source Code Linter

Readable code !

!

Reviewable code

Page 38: Perl::Lint - Yet Another Perl Source Code Linter

Readable code !

!

Reviewable code≒

Page 39: Perl::Lint - Yet Another Perl Source Code Linter

=> Maintainable!!

Page 40: Perl::Lint - Yet Another Perl Source Code Linter

Maintainable code will be growing up along maintainable

Page 41: Perl::Lint - Yet Another Perl Source Code Linter

Humans can focus on creative work

Page 42: Perl::Lint - Yet Another Perl Source Code Linter

Okay, Make maintainable code by computer!

Page 43: Perl::Lint - Yet Another Perl Source Code Linter

And then source code linter was appeared (1979 for C)

Page 44: Perl::Lint - Yet Another Perl Source Code Linter

Now; js-lint, find-bugs, rubocop, etc…

Page 45: Perl::Lint - Yet Another Perl Source Code Linter

And language processors: Go, Scala and etc.

Page 46: Perl::Lint - Yet Another Perl Source Code Linter

Does Perl have?

Page 47: Perl::Lint - Yet Another Perl Source Code Linter
Page 48: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Critic is awesome!

Page 49: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Critic checks the code conform to PBP style or not

Page 50: Perl::Lint - Yet Another Perl Source Code Linter

Benefit to analyze code by computer

Page 51: Perl::Lint - Yet Another Perl Source Code Linter

He don’t grumble

Page 52: Perl::Lint - Yet Another Perl Source Code Linter

He is inexhaustible

Page 53: Perl::Lint - Yet Another Perl Source Code Linter

He don’t take a mistake

Page 54: Perl::Lint - Yet Another Perl Source Code Linter

He is fast (in many cases)

Page 55: Perl::Lint - Yet Another Perl Source Code Linter

And can automation

Page 56: Perl::Lint - Yet Another Perl Source Code Linter

Cost of human: HIGH !

Cost of computer: LOW

Page 57: Perl::Lint - Yet Another Perl Source Code Linter

Cost of human: HIGH !

Cost of computer: LOWGood!!

Page 58: Perl::Lint - Yet Another Perl Source Code Linter

Got it.

Page 59: Perl::Lint - Yet Another Perl Source Code Linter

But… If there is Perl::Critic, Is Perl::Lint don’t need?

Page 60: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Critic is awesome but a little slow

Page 61: Perl::Lint - Yet Another Perl Source Code Linter

In large project, It takes 3 minutes to run only Perl::Critic

Page 62: Perl::Lint - Yet Another Perl Source Code Linter

How do you spend in meantime?

Page 63: Perl::Lint - Yet Another Perl Source Code Linter

How do you spend in meantime?

Coffee?

Page 64: Perl::Lint - Yet Another Perl Source Code Linter

How do you spend in meantime?

Coffee?

Chat?

Page 65: Perl::Lint - Yet Another Perl Source Code Linter

How do you spend in meantime?

Coffee?

Chat?Nap?

Page 66: Perl::Lint - Yet Another Perl Source Code Linter

How do you spend in meantime?

Coffee?

Chat?Nap?

Swing Copters?

Page 67: Perl::Lint - Yet Another Perl Source Code Linter

Life is too short, so let’s accelerate!!

Page 68: Perl::Lint - Yet Another Perl Source Code Linter

Rate

[num

/sec

]

0

25

50

75

100

Perl::Critic Perl::Lint

97

18

Page 69: Perl::Lint - Yet Another Perl Source Code Linter

Rate

[num

/sec

]

0

25

50

75

100

Perl::Critic Perl::Lint

97

18

About 400% increase

Page 70: Perl::Lint - Yet Another Perl Source Code Linter

Yeah!!!! I'll show you all my tricks

Page 71: Perl::Lint - Yet Another Perl Source Code Linter

A little break

Page 72: Perl::Lint - Yet Another Perl Source Code Linter

Background that led to the development

Page 73: Perl::Lint - Yet Another Perl Source Code Linter

This project receive TPF grant

Page 74: Perl::Lint - Yet Another Perl Source Code Linter

Do you know TPF grant?

Page 75: Perl::Lint - Yet Another Perl Source Code Linter

Nozaki-san and Maki-san (@lestrrat-san) are people in a high position of TPF grant

Page 76: Perl::Lint - Yet Another Perl Source Code Linter

Maki-san「日本人がトップになったのに日本から1つもProposal出ないのちょっとアレじゃない?」▼ me「そうですなあ」▼ Maki-san「moznion出してよ」▼ me「!!!!!」▼

Page 77: Perl::Lint - Yet Another Perl Source Code Linter

Time flies everything goes…

Page 78: Perl::Lint - Yet Another Perl Source Code Linter
Page 79: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint!!!!

Page 80: Perl::Lint - Yet Another Perl Source Code Linter

Let’s apply!!!

Page 81: Perl::Lint - Yet Another Perl Source Code Linter

Return to our subject…

Page 82: Perl::Lint - Yet Another Perl Source Code Linter

How do we do static analyzing for Perl?

Page 83: Perl::Lint - Yet Another Perl Source Code Linter
Page 84: Perl::Lint - Yet Another Perl Source Code Linter

Enough!

Page 85: Perl::Lint - Yet Another Perl Source Code Linter

Joke :p

Page 86: Perl::Lint - Yet Another Perl Source Code Linter

Two major methods - Evaluate Token - Evaluate AST

Page 87: Perl::Lint - Yet Another Perl Source Code Linter

Two major methods - Evaluate Token - Evaluate AST

Page 88: Perl::Lint - Yet Another Perl Source Code Linter

Tools - PPI - Compiler::Lexer

Page 89: Perl::Lint - Yet Another Perl Source Code Linter

Tools - PPI - Compiler::Lexer

Page 90: Perl::Lint - Yet Another Perl Source Code Linter

What is Compiler::Lexer?

Page 91: Perl::Lint - Yet Another Perl Source Code Linter

*Very Fast* tokenizer made of C++

Page 92: Perl::Lint - Yet Another Perl Source Code Linter

Compiler::Lexer is fast ⇛ Perl::Lint is fast!

Page 93: Perl::Lint - Yet Another Perl Source Code Linter

And others: Compiler::Parser, C::CodeGenerator::LLVM, etc… @goccy54++

Page 94: Perl::Lint - Yet Another Perl Source Code Linter

Example of tokens that is generated by Compiler::Lexer

Page 95: Perl::Lint - Yet Another Perl Source Code Linter

my $foo;

Page 96: Perl::Lint - Yet Another Perl Source Code Linter

my $foo;

Page 97: Perl::Lint - Yet Another Perl Source Code Linter

Points

Page 98: Perl::Lint - Yet Another Perl Source Code Linter

Use these tokens to analyze

Page 99: Perl::Lint - Yet Another Perl Source Code Linter
Page 100: Perl::Lint - Yet Another Perl Source Code Linter

Enough!

Page 101: Perl::Lint - Yet Another Perl Source Code Linter

Architecture of Perl::Lint

Page 102: Perl::Lint - Yet Another Perl Source Code Linter

Top Level

+args +site_policies+lint +lint_string

Policies

+evaluate

Filters

+filter

1

1 .. *

1

1 .. *

Page 103: Perl::Lint - Yet Another Perl Source Code Linter

Simple and Easy!

Page 104: Perl::Lint - Yet Another Perl Source Code Linter

Policies

Page 105: Perl::Lint - Yet Another Perl Source Code Linter

Each policies are isolated

Page 106: Perl::Lint - Yet Another Perl Source Code Linter

Easy to make your own policy

Page 107: Perl::Lint - Yet Another Perl Source Code Linter

Samples

Page 108: Perl::Lint - Yet Another Perl Source Code Linter

*** CAUTION *** A lot of bad

code are here. Close your eyes.

Page 109: Perl::Lint - Yet Another Perl Source Code Linter

@P::L::P::Miscellanea::ProhibitTies

Page 110: Perl::Lint - Yet Another Perl Source Code Linter

@P::L::P::Miscellanea::ProhibitTies

Check type

Page 111: Perl::Lint - Yet Another Perl Source Code Linter

@P::L::P::Miscellanea::ProhibitTies

Check data

Page 112: Perl::Lint - Yet Another Perl Source Code Linter
Page 113: Perl::Lint - Yet Another Perl Source Code Linter

アッ

Page 114: Perl::Lint - Yet Another Perl Source Code Linter

Feature of Implementation and Bad Know-hows

Page 115: Perl::Lint - Yet Another Perl Source Code Linter

Use C-Style for()

Page 116: Perl::Lint - Yet Another Perl Source Code Linter

Use C-Style for()

But PBP prohibit it!!

Page 117: Perl::Lint - Yet Another Perl Source Code Linter

Use List::Util::any instead of grep

Page 118: Perl::Lint - Yet Another Perl Source Code Linter

Don’t use regex, compare by eq in series

Page 119: Perl::Lint - Yet Another Perl Source Code Linter

Or use hash

Page 120: Perl::Lint - Yet Another Perl Source Code Linter

Function calling is almost gone.

Page 121: Perl::Lint - Yet Another Perl Source Code Linter

Use simple parts e.g. raw-bless, POPO

Page 122: Perl::Lint - Yet Another Perl Source Code Linter

Filtering mechanism

Page 123: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Critic’s default rule system is a bit difficult…

Page 124: Perl::Lint - Yet Another Perl Source Code Linter

Yes, I know, perlcriticrc can adjust them. But too much hustle

Page 125: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint checks the all of policies as default

Page 126: Perl::Lint - Yet Another Perl Source Code Linter

And you can filter any policies as you like

Page 127: Perl::Lint - Yet Another Perl Source Code Linter

Filter by `ignore`

Page 128: Perl::Lint - Yet Another Perl Source Code Linter

Filter by `filter`

Page 129: Perl::Lint - Yet Another Perl Source Code Linter

Yes, of course you can deny the all of policies :)

Page 130: Perl::Lint - Yet Another Perl Source Code Linter

You can define your own filter

Page 131: Perl::Lint - Yet Another Perl Source Code Linter

e.g.

Page 132: Perl::Lint - Yet Another Perl Source Code Linter

And Perl::Lint provides default policies

Page 133: Perl::Lint - Yet Another Perl Source Code Linter
Page 134: Perl::Lint - Yet Another Perl Source Code Linter
Page 135: Perl::Lint - Yet Another Perl Source Code Linter

For Perl::Critic users ;)

Page 136: Perl::Lint - Yet Another Perl Source Code Linter

These are features of Perl::Lint

Page 137: Perl::Lint - Yet Another Perl Source Code Linter

But installation is such a hassle!

Page 138: Perl::Lint - Yet Another Perl Source Code Linter

Perl::Lint Playground http://perl-lint.moznion.net

Page 139: Perl::Lint - Yet Another Perl Source Code Linter

You can try!

Page 140: Perl::Lint - Yet Another Perl Source Code Linter

Meaning to publish Playground

Page 141: Perl::Lint - Yet Another Perl Source Code Linter

It makes easy to get feedback

Page 142: Perl::Lint - Yet Another Perl Source Code Linter

Motivation ➚

Page 143: Perl::Lint - Yet Another Perl Source Code Linter

Publish the Playground is looking good!

Page 144: Perl::Lint - Yet Another Perl Source Code Linter

Future works

Page 145: Perl::Lint - Yet Another Perl Source Code Linter

Implement the all of policies…

Page 146: Perl::Lint - Yet Another Perl Source Code Linter

## no lint

Page 147: Perl::Lint - Yet Another Perl Source Code Linter

Module for testing (Like a Test::Perl::Critic)

Page 148: Perl::Lint - Yet Another Perl Source Code Linter

Cooperate with GitHub (Like a Coveralls)

Page 149: Perl::Lint - Yet Another Perl Source Code Linter

Inject the result into code as TODO comment (inspired by rubocop)

Page 150: Perl::Lint - Yet Another Perl Source Code Linter

As you see, Perl::Lint is under development

Page 151: Perl::Lint - Yet Another Perl Source Code Linter

SEGV, ABRT, etc…

Page 152: Perl::Lint - Yet Another Perl Source Code Linter

I’m looking for contributors!

Page 153: Perl::Lint - Yet Another Perl Source Code Linter

DEMO

Page 154: Perl::Lint - Yet Another Perl Source Code Linter

Any Questions?