Intermediate representations of functional programming languages for - - PowerPoint PPT Presentation

intermediate representations of functional programming
SMART_READER_LITE
LIVE PREVIEW

Intermediate representations of functional programming languages for - - PowerPoint PPT Presentation

Intermediate representations of functional programming languages for software quality control Melinda Tth, Gordana Raki c Etvs Lornd University University of Novi Sad Faculty of Informatics Chair of Computer Science Aug. 27., 2013


slide-1
SLIDE 1

Intermediate representations of functional programming languages for software quality control

Melinda Tóth, Gordana Raki´ c

Eötvös Loránd University Faculty of Informatics University of Novi Sad Chair of Computer Science

  • Aug. 27., 2013

The 13th Workshop on "Software Engineering Education and Reverse Engineering"

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 1 / 31

slide-2
SLIDE 2

Motivation

Static Analyser Tools

RefactorErl

Static source code analyser and transformer Erlang

SSQSA

Set of Software Quality Static Analyzers Language independent

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 2 / 31

slide-3
SLIDE 3

Motivation

Static Analyser Tools

RefactorErl

Code Comprehension Refactoring Query Language Clone detection Metrics Dependence analysis

SSQSA

Clone detection Metrics Software network analysis Analyze evolutionary changes

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 3 / 31

slide-4
SLIDE 4

Motivation

Static Analyser Tools

RefactorErl

Semantic Program Graph, SPG

SSQSA

Enriched Concrete Syntax Tree, eCST

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 4 / 31

slide-5
SLIDE 5

Motivation

Static Analyser Tools

RefactorErl

Semantic Program Graph, SPG

SSQSA

Enriched Concrete Syntax Tree, eCST

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 5 / 31

slide-6
SLIDE 6

SSQSA

SSQSA

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 6 / 31

slide-7
SLIDE 7

RefactorErl

Erlang

Functional Highly concurrent Distributed Fault-tolerant Supervisor Soft real-time Hot code swap Erlang VM

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 7 / 31

slide-8
SLIDE 8

RefactorErl

History

Started in 2006 Software Technology Lab (4*4 ECTS) since 2008

One of the 8 labs 10-20 students (BSc, MSc, PhD)

ELTE-Ericsson Software Technology Lab since 2011

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 8 / 31

slide-9
SLIDE 9

RefactorErl

RefactorErl

Static source code analyser and transformer tool for Erlang

Refactoring – less error prone & fast Program comprehension

Support in everyday work & debugging & complex tasks, e.g.

Rename a function, search definition Find the value of a variable Program comprehension, component relation detection Program restructuring

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 9 / 31

slide-10
SLIDE 10

RefactorErl

RefactorErl (cont.)

Platform for source code transformations – 24 implemented refactorings

Rename/Move definition Expression structure Function interface

Structural source code analysis – Clustering Support program comprehension

Call graph visualisation Dependency analysis Semantic Query Language / Metric Query Language

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 10 / 31

slide-11
SLIDE 11

RefactorErl

User Interfaces

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 11 / 31

slide-12
SLIDE 12

RefactorErl

Semantic Program Graph

1 Lexical level

Tokens Preprocessing Comments, whitespace

2 Syntactic level

Abstract Syntax Tree Files

3 Semantic level

Module, function, record, variable nodes Links to definition and reference points

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 12 / 31

slide-13
SLIDE 13

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-14
SLIDE 14

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-15
SLIDE 15

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-16
SLIDE 16

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-17
SLIDE 17

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-18
SLIDE 18

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-19
SLIDE 19

RefactorErl

  • module(my).
  • define(EOL(X), X ++ "\n").

f(S) -> io:put_chars(?EOL(S)). f ( S ) -> io : put_chars ( ? EOL ( S ) ) . S ++ "\n" var atom atom atom modq var string ++ app function my.erl io my put_chars f S

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 13 / 31

slide-20
SLIDE 20

RefactorErl

Example graph

ROOT my.erl file/1 io module/2 my module/1 incl/1 form form/1 form form/2 function form/3 moddef/1

  • 1
  • flex/1
module 2 module flex/2 ( 3 ( flex/3 atom 4 my flex/4 ) 5 ) flex/5 stop 6 . flex/6
  • 7
  • flex/1
atom 8 define flex/2 ( 9 ( flex/3 variable 10 EOL flex/4 arg flex/5 , 14 , flex/6 body flex/7 ) 18 ) flex/8 stop 19 . flex/9 ( 11 ( llex/1 variable 12 X llex/2 ) 13 ) llex/3 variable 15 X llex/1 ++ 16 ++ llex/2 string 17 " " llex/3

clause 1 fundef funcl/1 f/1 fundef/1

stop 35 . flex/1 functx/1scope/1

expr 1 atom f name/1

( 21 ( clex/1

pattern 2 variable S pattern/1 visib/1 expr 10 application body/1 visib/2 S vardef/1 varvis/1

) 23 ) clex/2
  • >
24
  • >

clex/3 modctx/1 top/1 atom 20 f elex/1 top/1 variable 22 S elex/1 expr 6 variable S flow/1 varbind/1 token elex/1 expr 8 infix_expr ++ flow/1 top/1 varref/1 subst llex/1 variable 32 S

  • rig/1

mref/1 ? 29 ? llex/1 variable 30 EOL llex/2 ( 31 ( llex/3 param llex/4 ) 33 ) llex/5 llex/1 esub/1 token elex/1 expr 7 string esub/2 dep/1 top/1

  • rig/1

llex/1 flow/1 token elex/1 top/1

  • rig/1

llex/1 top/1 expr 5 infix_expr : esub/1 put_chars/1 funeref/1 expr 9 arglist esub/2 undefined 12 fret flow/1 top/1 expr 3 atom io esub/1 : 26 : elex/1 expr 4 atom put_chars esub/2 dep/1 top/1 atom 25 io elex/1 modref/1 func/1 undefined 13 fpar fpar/1 undefined 14 fret fret/1 dep/1 top/1 atom 27 put_chars elex/1 esub/1 top/1 ( 28 ( elex/1 ) 34 ) elex/2 varintro/1 func/1 funcall/1 fret/1 undefined 11 fpar fpar/1 flow/1

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 14 / 31

slide-21
SLIDE 21

RefactorErl

Analysis Details

Extended syntax description

Defines the representation Source for parser, lexer, and token updater

Semantic Analyser framework

Extensible, modular structure Works on syntactic subtrees (incremental) Asynchronous parallel execution Side-effect analysis, data-flow analysis, dynamic function call analysis

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 15 / 31

slide-22
SLIDE 22

Mapping

Mapping

Attila Páter-Részeg, TDK Thesis, Scientific Student Association Conference, June 2013 convert: SG → ECST convertN: SGN → ECSTM

file form ... COMPILATION_UNIT FUNCTION_DECL ...

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 16 / 31

slide-23
SLIDE 23

Mapping

Simple Erlang Module

  • module(a).

f() ->

  • k.

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 17 / 31

slide-24
SLIDE 24

Mapping

SPG representation for module a

ROOT a.erl

file/1

a

module/1 incl/1

form

form/1

function

form/2 moddef/1

  • 1
  • flex/1

module 2 module

flex/2

( 3 (

flex/3

atom 4 a

flex/4

) 5 )

flex/5

stop 6 .

flex/6

clause 1 fundef

funcl/1

f/0

fundef/1

stop 12 .

flex/1 functx/1scope/1

expr 1 atom f

name/1

( 8 (

clex/1

) 9 )

clex/2

  • >

10

  • >

clex/3

expr 2 atom

  • k

body/1 visib/1 modctx/1 top/1

atom 7 f

elex/1 top/1

atom 11

  • k

elex/1

undefined 3 fret

flow/1 func/1 fret/1

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 18 / 31

slide-25
SLIDE 25

Mapping

XML representation for module a

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 19 / 31

slide-26
SLIDE 26

Mapping

eCST representation for module a

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 20 / 31

slide-27
SLIDE 27

Mapping

Example: convertfunction(x) = y

Erlang source code f( ) -> ok. Imperative source code private any f( ){

  • k;

}

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 21 / 31

slide-28
SLIDE 28

Mapping

Example: convertfunction(x) = y

Erlang source code

  • export([f/0]).

f( ) -> ok. Imperative source code public any f( ){

  • k;

}

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 22 / 31

slide-29
SLIDE 29

Mapping

Example: convertfunction(x) = y

Erlang source code

  • export([f/2]).

f(A, B) -> ok. Imperative source code public any f(any Var1, any Var2){

  • k;

}

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 23 / 31

slide-30
SLIDE 30

Mapping

Example: convertfunction(x) = y

Erlang source code

  • export([f/2]).

f(A, A) -> ok. Imperative source code public any f(any Var1, any Var2){ if(Var1 == Var2) ok; }

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 24 / 31

slide-31
SLIDE 31

Mapping

Example: convertfunction(x) = y

Erlang source code

  • export([f/2]).

f(A, A) -> ok; f(_, _) -> nok. Imperative source code public any f(any Var1, any Var2){ if(Var1 == Var2) ok; else nok; }

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 25 / 31

slide-32
SLIDE 32

Mapping

The steps of the mapping

Exported → public/private Return value, type → any Formal parameter list → new variable Pattern matching, guards → branching conditions

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 26 / 31

slide-33
SLIDE 33

Mapping

Simple Erlang Module

  • module(a).
  • export([f/2]).

f(A, A) ->

  • k;

f(_, _)-> nok.

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 27 / 31

slide-34
SLIDE 34

Mapping

SPG representation for module a

ROOT a.erl file/1 a module/1 incl/1 form form/1 form form/2 function form/3 moddef/1

  • 1
  • flex/1

module 2 module flex/2 ( 3 ( flex/3 atom 4 a flex/4 ) 5 ) flex/5 stop 6 . flex/6

  • 13
  • flex/1

export 14 export flex/2 ( 15 ( flex/3

attr 7 funlist eattr/1

) 21 ) flex/4 stop 22 . flex/5 top/1 [ 16 [ elex/1

attr 6 funref esub/1

] 20 ] elex/2 top/1

attr 4 atom f esub/1

/ 18 / elex/1

attr 5 integer 2 esub/2 f/2 funlref/1 top/1

atom 17 f elex/1 top/1 integer 19 2 elex/1

undefined 17 fpar fpar/1 undefined 18 fpar fpar/2 undefined 16 fret fret/1 pattern 9 variable A flow/1 pattern 13 joker flow/2 top/1

variable 25 A elex/1

pattern 10 variable A flow/1 A varbind/1 top/1

variable 27 A elex/1 varref/1 varintro/1 top/1 _ 34 _ elex/1 flow/1

pattern 14 joker flow/2 top/1

_ 36 _ elex/1 fundef/1

clause 2 fundef funcl/1

; 31 ; flex/1

clause 3 fundef funcl/2

stop 40 . flex/2 pattern/1 visib/1 pattern/2 visib/2 vardef/1 varvis/1 functx/1scope/1

expr 8 atom f name/1

( 24 ( clex/1 , 26 , clex/2 ) 28 ) clex/3

  • >

29

  • >

clex/4 expr 11 atom

  • k

body/1 visib/3 modctx/1 top/1 atom 23 f elex/1 flow/1 top/1 atom 30

  • k

elex/1 func/1 funexp/1 pattern/1 visib/1 pattern/2 visib/2 modctx/1 functx/1scope/1 expr 12 atom f name/1 ( 33 ( clex/1 , 35 , clex/2 ) 37 ) clex/3

  • >

38

  • >

clex/4 expr 15 atom nok body/1 visib/3 top/1 atom 32 f elex/1 flow/1 top/1 atom 39 nok elex/1

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 28 / 31

slide-35
SLIDE 35

Mapping

eCST representation for module a

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 29 / 31

slide-36
SLIDE 36

Results

Results

Defined Mapping

Syntax driven, recursive

Prototype implementation

Available through RefactorErl

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 30 / 31

slide-37
SLIDE 37

Results

Future Work

Refinements of the mapping Direct connection between the two tools Validating the results, example:

Compare the value of metrics Evaluate the result

T., Melinda, R., Gordana (ELTE-IK, PERUN) RefactorErl & SSQSA DAAD-WS 31 / 31