SlideShare a Scribd company logo
Universit´e Libre de Bruxelles
Computer Science Department
MEMO-F524 Masters thesis
An Efficient and Parallel
Abstract Interpreter in Scala
— Second Presentation —
Olivier Pirson — opi@opimedia.be
orcid.org/0000-0001-6296-9659
March 20, 2018
(Little corrections: July 1st, 2018)
https://bitbucket.org/OPiMedia/efficient-parallel-abstract-interpreter-in-scala
Vrije Universiteit Brussel
Promotors Coen De Roover
Wolfgang De Meuter
Advisor Quentin Stievenart
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
1 The context: Abstract Interpretation for Static Analysis
2 The problematic: Too heavy for real programs
3 Parallel algorithms
4 Done and todo
5 References
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 2 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
The context: Abstract Interpretation for Static Analysis
We need tools to help us to build correct programs.
Figure:
First “flight” of
Ariane 5 in 1996.
Testing is not enough.
Static Analysis:
study the behaviour of programs without executing them.
Not trivial questions about the behaviour of a program
are undecidable (Rice’s theorem).
Abstract Interpretation:
approximation technique to perform static analysis.
Trade-off:
approximation must be enough precise to have an useful analysis,
and enough imprecise to make the problem decidable.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 3 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
From Concrete Interpretation. . .
Trace: concrete interpretation with small-step semantics, for one instance.
e
s0 s1 s2 s3 s4 · · ·
injection
function
concrete transition function
Program is executed by interpreter,
described by an Abstract Machine (AM).
One execution is for one instance on this program.
e is for one expression, i.e. a program.
si are the successive states during this execution.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 4 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
From Concrete Interpretation to Abstract Interpretation
Trace: concrete interpretation with small-step semantics, for one instance.
e
s0 s1 s2 s3 s4 · · ·
s0 s1 s2 s3 s4
s3′
injection
function
injection
function
abstract transition function
abstraction
function α
Abstracting Abstract Machine (AAM).
2 over-approximations:
on addresses: by modulo; give a finite state space
on values: abstraction
Abstract transition function returns all directly reachable states.
State graph: abstract interpretation, for all instances.
“The abstract simulates the concrete” (Might).
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 5 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Approximation of values: abstraction
Based on mathematical notion of lattice
(partially ordered sets with additional properties).
Examples of abstraction for the set of integer values:
Figure: Ren´e Magritte,
Le Calcul Mental. 1940.
the type integer
intervals
sign: {. . . , −3, −2, −1, 0, 1, 2, 3, . . .}
abstracted by {⊥, −, 0, +, (− and 0), (0 and +), ⊤}
⊤ (top, no information)
(− and 0) (0 and +)
− 0 +
⊥ (bottom, no information yet)
Figure: Hasse diagram of the complete lattice of signs.
Properties of a lattice are such that it contains the join of 2 elements
and the succession of operation give a fixed point.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 6 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Example of a state graph on a very simple program
ev((letrec ((abs (lambda (x) (if (>= x 0) x (- x))))) (abs -42)))
0
ev((abs -42))
1
ev((if (>= x 0) x (- x)))
2
ev((>= x 0))
3
ko(Bool)
4
ev(x)
5
ev((- x))
6
ko(Int)
7
#nodes: 8
#edges: 8
graph density: 0,143
outdegree min: 1
outdegree max: 2
outdegree avg: 1,000
language: Scheme
machine: AAM
lattice: TypeSet
address: Classical
Figure: State graph of the abs program with a type lattice.
Algorithm 1: Absolute value of −42
( Ò ( × x )
( i f (>= x 0)
x
(− x ) ) )
( × −42)
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 7 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
1 The context: Abstract Interpretation for Static Analysis
2 The problematic: Too heavy for real programs
3 Parallel algorithms
4 Done and todo
5 References
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 8 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Example of a state graph on a other very simple program
ev((letrec ((fibonacci (lambda (n) (if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))))) (fibonacci 10)))
0
ev((fibonacci 10))
1
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
2
ev((<= n 1))
3
ko(Bool)
4
ev(n)
5
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
6
ko(Int)
7
ev((fibonacci (- n 1)))
8
ev((- n 1))
9
ko(Int)
10
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
11
ev((<= n 1))
12
ko(Bool)
13
ev(n)
14
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
15
ev(n)
16
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
17
ko(Int)
18
ev((fibonacci (- n 1)))
19
ko(Int)
20
ev((fibonacci (- n 1)))
21
ev((- n 1))
22
ev((fibonacci (- n 2)))
23
ev((- n 1))
24
ko(Int)
25
ev((- n 2))
26
ko(Int)
27
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
28
ko(Int)
29
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
30
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
31
ev((<= n 1))
32
ev((<= n 1))
33
ko(Bool)
34
ko(Bool)
35
ev(n)
36
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
37
ev(n)
38
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
39
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
40
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
41
ev(n)
42
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
43
ev(n)
44
ev(n)
45
ko(Int)
46
ko(Int)
47
ev((fibonacci (- n 1)))
49
ev((fibonacci (- n 1)))
52
ko(Int)
48
ev((fibonacci (- n 1)))
51
ko(Int)
50
ko(Int)
53
ev((fibonacci (- n 2)))
54
ev((fibonacci (- n 2)))
55
ev((- n 1))
56
ev((- n 1))
57
ev((- n 1))
58
ev((fibonacci (- n 2)))
59
ev((- n 2))
60
ev((- n 2))
61
ko(Int)
62
ko(Int)
63
ko(Int)
64
ev((- n 2))
65
ko(Int)
66
ko(Int)
67
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
68
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
69
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
70
ko(Int)
71
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
72
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
73
ev((<= n 1))
74
ev((<= n 1))
75
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
76
ev((<= n 1))
77
ko(Bool)
78
ko(Bool)
79
ko(Bool)
80
ev(n)
81
ev(n)
82
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
83
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
84
ev(n)
85
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
86
ev(n)
87
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
88
ev(n)
89
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
90
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
91
ev(n)
92
ev(n)
93
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
94
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
95
ev(n)
96
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
97
ev(n)
98
ko(Int)
100
ko(Int)
99
ev((fibonacci (- n 1)))
101
ko(Int)
102
ko(Int)
103
ko(Int)
105
ko(Int)
104
ko(Int)
109
ev((fibonacci (- n 1)))
106
ev((fibonacci (- n 1)))
110
ko(Int)
108
ko(Int)
107
ev((fibonacci (- n 2)))
111
ev((fibonacci (- n 2)))
112
ev((- n 1))
113
ev((fibonacci (- n 2)))
114
ev((fibonacci (- n 2)))
115
ev((- n 1))
116
ev((fibonacci (- n 2)))
117
ev((- n 1))
118
ev((- n 2))
119
ev((- n 2))
120
ko(Int)
121
ev((- n 2))
122
ev((- n 2))
123
ko(Int)
124
ev((- n 2))
125
ko(Int)
126
ko(Int)
127
ko(Int)
128
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
129
ko(Int)
130
ko(Int)
131
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
132
ko(Int)
133
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
134
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
135
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
136
ev((<= n 1))
137
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
138
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
139
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
140
ev((<= n 1))
141
ev((<= n 1))
142
ko(Bool)
143
ev((<= n 1))
144
ko(Bool)
145
ko(Bool)
146
ev(n)
147
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
148
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
149
ev(n)
150
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
151
ev(n)
152
ko(Bool)
153
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
154
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
155
ev(n)
156
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
157
ev(n)
158
ev(n)
159
ev(n)
160
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
161
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
162
ev(n)
163
ev(n)
164
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
165
ko(Int)
167
ko(Int)
168
ko(Int)
166
ev(n)
169
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
170
ev(n)
171
ev(n)
172
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
173
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
174
ko(Int)
177
ko(Int)
175
ko(Int)
176
ko(Int)
178
ev((fibonacci (- n 1)))
180
ko(Int)
181
ko(Int)
179
ev((fibonacci (- n 1)))
182
ev((fibonacci (- n 2)))
183
ev((fibonacci (- n 2)))
184
ev((fibonacci (- n 2)))
185
ko(Int)
190
ev((fibonacci (- n 1)))
187
ko(Int)
189
ko(Int)
188
ev((fibonacci (- n 1)))
186
ev((fibonacci (- n 2)))
191
ev((fibonacci (- n 2)))
192
ev((- n 1))
193
ev((- n 1))
194
ev((- n 2))
195
ev((- n 2))
196
ev((- n 2))
197
ev((- n 1))
198
ev((- n 1))
199
ev((- n 2))
200
ev((- n 2))
201
ko(Int)
202
ko(Int)
203
ko(Int)
204
ko(Int)
205
ko(Int)
206
ko(Int)
207
ko(Int)
208
ko(Int)
209
ko(Int)
210
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
211
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
212
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
213
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
214
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
215
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
216
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
217
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
218
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
219
ev((<= n 1))
220
ev((<= n 1))
221
ev((<= n 1))
222
ko(Bool)
223
ko(Bool)
224
ko(Bool)
225
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
226
ev(n)
227
ev(n)
228
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
229
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
230
ev(n)
231
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
232
ev(n)
233
ev(n)
234
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
235
ev(n)
236
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
237
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
238
ev(n)
239
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
240
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
241
ev(n)
242
ev(n)
243
ko(Int)
246
ko(Int)
244
ko(Int)
245
ko(Int)
248
ko(Int)
249
ko(Int)
247
ev((fibonacci (- n 1)))
251
ko(Int)
253
ko(Int)
250
ko(Int)
252
ev((fibonacci (- n 2)))
254
ev((- n 1))
255
ev((- n 2))
256
ko(Int)
257
ko(Int)
258
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
259
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
260
ev((<= n 1))
261
ko(Bool)
262
ev(n)
263
ev(n)
264
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
265
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
266
ev(n)
267
ev((+ (fibonacci (- n 1)) (fibonacci (- n 2))))
268
ko(Int)
271
ko(Int)
269
ev((fibonacci (- n 1)))
270
ko(Int)
272
ev((- n 1))
273
ko(Int)
274
ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
275
#nodes: 276
#edges: 346
graph density: 0,005
outdegree min: 1
outdegree max: 6
outdegree avg: 1,254
language: Scheme
machine: AAM
lattice: TypeSet
address: Classical
Figure: State graph of the Fibonacci program with a type lattice.
Algorithm 2: The 10th Fibonacci number.
; ; nth number of F i b o n a c c i ( by r e c u r s i v e p r o c e s s )
( Ò ( f i b o n a c c i n )
( i f (<= n 1)
n
(+ ( f i b o n a c c i (− n 1))
( f i b o n a c c i (− n 2 ) ) ) ) )
( f i b o n a c c i 10)
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 9 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Example of a state graph on a other very simple program (bis)
ev((letrec ((fibonacci2 (lambda (n fn_1 fn) (if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1))))) (fibonacci (lambda (n) (cdr (fibonacci2 n 1 0))))) (fibonacci 10)))
0
ev((fibonacci 10))
1
ev((cdr (fibonacci2 n 1 0)))
2
ev((fibonacci2 n 1 0))
3
ev((if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1))))
4
ev((= n 0))
5
ko({#f,#t})
6
ev((cons fn_1 fn))
7
ev((fibonacci2 (- n 1) fn (+ fn fn_1)))
8
ko(Cons(@fn_1-Time(),@fn-Time()))
9
ev((- n 1))
10
ko(Int)
11
ko(Int)
12
ev((+ fn fn_1))
13
ko(Int)
14
ev((if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1))))
15
ev((= n 0))
16
ko({#f,#t})
17
ev((cons fn_1 fn))
18
ev((fibonacci2 (- n 1) fn (+ fn fn_1)))
19
ko(Cons(@fn_1-Time(),@fn-Time()))
20
ev((- n 1))
21
ko(Int)
22
ko(Int)
23
#nodes: 24
#edges: 24
graph density: 0,043
outdegree min: 1
outdegree max: 2
outdegree avg: 1,000
language: Scheme
machine: AAM
lattice: TypeSet
address: Classical
Figure: State graph of the Fibonacci program with a type lattice.
Algorithm 3: The 10th Fibonacci number.
; ; nth number of F i b o n a c c i ( by i t e r a t i v e p r o c e s s )
( Ò ( f i b o n a c c i 2 n f n 1 fn )
( i f (= n 0)
( 
ÓÒ× f n 1 fn )
( f i b o n a c c i 2 (− n 1) fn (+ fn f n 1 ) ) ) )
( Ò ( f i b o n a c c i n )
( c dr ( f i b o n a c c i 2 n 1 0 ) ) )
( f i b o n a c c i 10)
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 10 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
The problematic: Too heavy for real programs
With an AAM the problem is became decidable.
But in general an AAM is too slow to analyse real programs.
One way to have a faster AAM is to
parallelize generation of the state graph.
Goal of this master thesis:
implement and compare several parallelizations of AAM
in the framework Scala-AM.
Parallel model for the implementation: actors with Akka.
Language analysed: Scheme.
Figure: Ferdinand Hodler, View to Infinity. 1913.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 11 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
1 The context: Abstract Interpretation for Static Analysis
2 The problematic: Too heavy for real programs
3 Parallel algorithms
4 Done and todo
5 References
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 12 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Sequential worklist strategy
s
s
s
s
s
worklist
Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 13 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Naive worklist parallel strategy
s
s
s
s
s
worklist
merge
Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 14 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Naive worklist parallel strategy
Redundant computations.
Synchronization at the merge step.
Article test on few real JavaScript programs.
Results show that this adaptation of the sequential algorithm is not optimal.
Figure: L. Andersen, M. Might. Multi-core Parallelization of Abstracted. 2013.
Improvements with producer/consumer model.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 15 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Better, per-context parallel strategy
Authors introduce a per-context parallel strategy.
The main idea is to separate these two parts:
state exploration
control of state space by some merging operations.
The intuitive idea is to parallelize “functions” instead basic “blocks”.
Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 16 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
1 The context: Abstract Interpretation for Static Analysis
2 The problematic: Too heavy for real programs
3 Parallel algorithms
4 Done and todo
5 References
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 17 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Work done
Reading of theoretical background on lattice and AAM.
Redaction of an introduction to the subject and a lattice presentation
(preparatory work, last year).
Reading of some articles on parallelization.
Learning actors, Akka.
Learning use of some tools: sbt, Scala environments. . .
(discovery of GraalVM!)
Learning functioning of Scala-AM.
Removed some parts of Scala-AM (other machines or languages),
implementation of little features.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 18 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
Work to be done
Implement the naive parallel algorithm, and experiment, really ASAP.
Implement better parallel algorithms.
Evaluate all of them,
identify advantages and disadvantages for each of them.
Reading of other articles on parallelization.
Have a great idea!
Final redaction.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 19 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
1 The context: Abstract Interpretation for Static Analysis
2 The problematic: Too heavy for real programs
3 Parallel algorithms
4 Done and todo
5 References
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 20 / 21
An Efficient and
Parallel Abstract
Interpreter
in Scala
—
Second
Presentation
The context:
Abstract
Interpretation for
Static Analysis
The problematic:
Too heavy for
real programs
Parallel
algorithms
Done and todo
References
References
Thank you! Questions time. . .
L. Andersen, M. Might. Multi-core Parallelization of Abstracted
Abstract Machines. 2013.
Patrick Cousot. Abstract Interpretation in a Nutshell.
K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract
interpreter for JavaScript. 2015.
Matthew Might. Tutorial: Small-step CFA. 2011.
Quentin Sti´evenart. Static Analysis of Concurrency Constructs
in Higher-Order Programs. 2014.
D. Van Horn, M. Might. Abstracting Abstract Machines. 2010.
Document, LATEX sources, complete references and first presentation on
https:// Ø Ù
 غÓÖ »ÇÈ Å /efficient-parallel-abstract-interpreter-in-scala
Olivier Pirson. An Efficient and Parallel Abstract Interpreter in
Scala — Preparatory Work. 2017.
An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 21 / 21

More Related Content

PDF
An Efficient and Parallel Abstract Interpreter in Scala — First Algorithm
PPT
DESIGN AND ANALYSIS OF ALGORITHMS
PPTX
Linear Algebra and Matlab tutorial
PPTX
Writing Fast MATLAB Code
An Efficient and Parallel Abstract Interpreter in Scala — First Algorithm
DESIGN AND ANALYSIS OF ALGORITHMS
Linear Algebra and Matlab tutorial
Writing Fast MATLAB Code

What's hot (20)

RTF
Design and Analysis of algorithms
PPTX
Electrical Engineering Assignment Help
PPTX
Data Structures- Hashing
PPT
Analysis of Algorithm
PPTX
Signal Processing Assignment Help
DOC
Algorithms Question bank
PDF
Introduction to MATLAB 1
PDF
01. design & analysis of agorithm intro & complexity analysis
PDF
Parallel Algorithms
PPTX
Asymptotic Notation and Data Structures
PPTX
Signal Processing Homework Help
PDF
Parallel Algorithms
PDF
PDF
Design and analysis of algorithm
PPTX
asymptotic notation
PPT
Analysis Of Algorithms I
PPTX
Introduction to matlab
Design and Analysis of algorithms
Electrical Engineering Assignment Help
Data Structures- Hashing
Analysis of Algorithm
Signal Processing Assignment Help
Algorithms Question bank
Introduction to MATLAB 1
01. design & analysis of agorithm intro & complexity analysis
Parallel Algorithms
Asymptotic Notation and Data Structures
Signal Processing Homework Help
Parallel Algorithms
Design and analysis of algorithm
asymptotic notation
Analysis Of Algorithms I
Introduction to matlab
Ad

Similar to An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation (20)

PDF
An Efficient and Parallel Abstract Interpreter in Scala — 3x3 Parallel Implem...
PDF
An Efficient and Parallel Abstract Interpreter in Scala — Presentation
PPTX
20101017 program analysis_for_security_livshits_lecture02_compilers
PDF
Fibonacci Function Gallery - Part 2 - One in a series
PDF
Compiling fµn language
PDF
An Efficient and Parallel Abstract Interpreter in Scala — Preparatory Work — ...
PDF
Yoyak ScalaDays 2015
ODP
Scala as a Declarative Language
PDF
Compiler Construction | Lecture 11 | Monotone Frameworks
PDF
Scala Functional Patterns
PPTX
Tools for reading papers
PPTX
Principles of functional progrmming in scala
PDF
Large-scale computation without sacrificing expressiveness
PDF
pure-functional-programming.pdf
PDF
Shape Safety in Tensor Programming is Easy for a Theorem Prover -SBTB 2021
PDF
Introduction to Functional Programming with Scala
PDF
Formal Methods in Computer Science – Modeling, Verification, and Semantics
PDF
programacion funcional.pdf
PDF
Static Analysis of Computer programs
PDF
Lecture 5: Functional Programming
An Efficient and Parallel Abstract Interpreter in Scala — 3x3 Parallel Implem...
An Efficient and Parallel Abstract Interpreter in Scala — Presentation
20101017 program analysis_for_security_livshits_lecture02_compilers
Fibonacci Function Gallery - Part 2 - One in a series
Compiling fµn language
An Efficient and Parallel Abstract Interpreter in Scala — Preparatory Work — ...
Yoyak ScalaDays 2015
Scala as a Declarative Language
Compiler Construction | Lecture 11 | Monotone Frameworks
Scala Functional Patterns
Tools for reading papers
Principles of functional progrmming in scala
Large-scale computation without sacrificing expressiveness
pure-functional-programming.pdf
Shape Safety in Tensor Programming is Easy for a Theorem Prover -SBTB 2021
Introduction to Functional Programming with Scala
Formal Methods in Computer Science – Modeling, Verification, and Semantics
programacion funcional.pdf
Static Analysis of Computer programs
Lecture 5: Functional Programming
Ad

Recently uploaded (20)

PDF
AlphaEarth Foundations and the Satellite Embedding dataset
PDF
CAPERS-LRD-z9:AGas-enshroudedLittleRedDotHostingaBroad-lineActive GalacticNuc...
PPTX
BIOMOLECULES PPT........................
PPTX
ognitive-behavioral therapy, mindfulness-based approaches, coping skills trai...
PDF
ELS_Q1_Module-11_Formation-of-Rock-Layers_v2.pdf
PDF
Phytochemical Investigation of Miliusa longipes.pdf
PDF
An interstellar mission to test astrophysical black holes
PPTX
Introduction to Cardiovascular system_structure and functions-1
PPTX
ECG_Course_Presentation د.محمد صقران ppt
PPTX
Protein & Amino Acid Structures Levels of protein structure (primary, seconda...
PPTX
2. Earth - The Living Planet Module 2ELS
PPTX
7. General Toxicologyfor clinical phrmacy.pptx
PPTX
Introduction to Fisheries Biotechnology_Lesson 1.pptx
PPT
protein biochemistry.ppt for university classes
PPTX
Cell Membrane: Structure, Composition & Functions
PDF
Biophysics 2.pdffffffffffffffffffffffffff
PPTX
neck nodes and dissection types and lymph nodes levels
PPTX
Derivatives of integument scales, beaks, horns,.pptx
PPTX
Classification Systems_TAXONOMY_SCIENCE8.pptx
PDF
Unveiling a 36 billion solar mass black hole at the centre of the Cosmic Hors...
AlphaEarth Foundations and the Satellite Embedding dataset
CAPERS-LRD-z9:AGas-enshroudedLittleRedDotHostingaBroad-lineActive GalacticNuc...
BIOMOLECULES PPT........................
ognitive-behavioral therapy, mindfulness-based approaches, coping skills trai...
ELS_Q1_Module-11_Formation-of-Rock-Layers_v2.pdf
Phytochemical Investigation of Miliusa longipes.pdf
An interstellar mission to test astrophysical black holes
Introduction to Cardiovascular system_structure and functions-1
ECG_Course_Presentation د.محمد صقران ppt
Protein & Amino Acid Structures Levels of protein structure (primary, seconda...
2. Earth - The Living Planet Module 2ELS
7. General Toxicologyfor clinical phrmacy.pptx
Introduction to Fisheries Biotechnology_Lesson 1.pptx
protein biochemistry.ppt for university classes
Cell Membrane: Structure, Composition & Functions
Biophysics 2.pdffffffffffffffffffffffffff
neck nodes and dissection types and lymph nodes levels
Derivatives of integument scales, beaks, horns,.pptx
Classification Systems_TAXONOMY_SCIENCE8.pptx
Unveiling a 36 billion solar mass black hole at the centre of the Cosmic Hors...

An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation

  • 1. Universit´e Libre de Bruxelles Computer Science Department MEMO-F524 Masters thesis An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation — Olivier Pirson — opi@opimedia.be orcid.org/0000-0001-6296-9659 March 20, 2018 (Little corrections: July 1st, 2018) https://bitbucket.org/OPiMedia/efficient-parallel-abstract-interpreter-in-scala Vrije Universiteit Brussel Promotors Coen De Roover Wolfgang De Meuter Advisor Quentin Stievenart
  • 2. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References 1 The context: Abstract Interpretation for Static Analysis 2 The problematic: Too heavy for real programs 3 Parallel algorithms 4 Done and todo 5 References An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 2 / 21
  • 3. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References The context: Abstract Interpretation for Static Analysis We need tools to help us to build correct programs. Figure: First “flight” of Ariane 5 in 1996. Testing is not enough. Static Analysis: study the behaviour of programs without executing them. Not trivial questions about the behaviour of a program are undecidable (Rice’s theorem). Abstract Interpretation: approximation technique to perform static analysis. Trade-off: approximation must be enough precise to have an useful analysis, and enough imprecise to make the problem decidable. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 3 / 21
  • 4. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References From Concrete Interpretation. . . Trace: concrete interpretation with small-step semantics, for one instance. e s0 s1 s2 s3 s4 · · · injection function concrete transition function Program is executed by interpreter, described by an Abstract Machine (AM). One execution is for one instance on this program. e is for one expression, i.e. a program. si are the successive states during this execution. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 4 / 21
  • 5. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References From Concrete Interpretation to Abstract Interpretation Trace: concrete interpretation with small-step semantics, for one instance. e s0 s1 s2 s3 s4 · · · s0 s1 s2 s3 s4 s3′ injection function injection function abstract transition function abstraction function α Abstracting Abstract Machine (AAM). 2 over-approximations: on addresses: by modulo; give a finite state space on values: abstraction Abstract transition function returns all directly reachable states. State graph: abstract interpretation, for all instances. “The abstract simulates the concrete” (Might). An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 5 / 21
  • 6. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Approximation of values: abstraction Based on mathematical notion of lattice (partially ordered sets with additional properties). Examples of abstraction for the set of integer values: Figure: Ren´e Magritte, Le Calcul Mental. 1940. the type integer intervals sign: {. . . , −3, −2, −1, 0, 1, 2, 3, . . .} abstracted by {⊥, −, 0, +, (− and 0), (0 and +), ⊤} ⊤ (top, no information) (− and 0) (0 and +) − 0 + ⊥ (bottom, no information yet) Figure: Hasse diagram of the complete lattice of signs. Properties of a lattice are such that it contains the join of 2 elements and the succession of operation give a fixed point. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 6 / 21
  • 7. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Example of a state graph on a very simple program ev((letrec ((abs (lambda (x) (if (>= x 0) x (- x))))) (abs -42))) 0 ev((abs -42)) 1 ev((if (>= x 0) x (- x))) 2 ev((>= x 0)) 3 ko(Bool) 4 ev(x) 5 ev((- x)) 6 ko(Int) 7 #nodes: 8 #edges: 8 graph density: 0,143 outdegree min: 1 outdegree max: 2 outdegree avg: 1,000 language: Scheme machine: AAM lattice: TypeSet address: Classical Figure: State graph of the abs program with a type lattice. Algorithm 1: Absolute value of −42 ( Ò ( × x ) ( i f (>= x 0) x (− x ) ) ) ( × −42) An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 7 / 21
  • 8. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References 1 The context: Abstract Interpretation for Static Analysis 2 The problematic: Too heavy for real programs 3 Parallel algorithms 4 Done and todo 5 References An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 8 / 21
  • 9. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Example of a state graph on a other very simple program ev((letrec ((fibonacci (lambda (n) (if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))))) (fibonacci 10))) 0 ev((fibonacci 10)) 1 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 2 ev((<= n 1)) 3 ko(Bool) 4 ev(n) 5 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 6 ko(Int) 7 ev((fibonacci (- n 1))) 8 ev((- n 1)) 9 ko(Int) 10 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 11 ev((<= n 1)) 12 ko(Bool) 13 ev(n) 14 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 15 ev(n) 16 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 17 ko(Int) 18 ev((fibonacci (- n 1))) 19 ko(Int) 20 ev((fibonacci (- n 1))) 21 ev((- n 1)) 22 ev((fibonacci (- n 2))) 23 ev((- n 1)) 24 ko(Int) 25 ev((- n 2)) 26 ko(Int) 27 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 28 ko(Int) 29 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 30 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 31 ev((<= n 1)) 32 ev((<= n 1)) 33 ko(Bool) 34 ko(Bool) 35 ev(n) 36 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 37 ev(n) 38 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 39 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 40 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 41 ev(n) 42 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 43 ev(n) 44 ev(n) 45 ko(Int) 46 ko(Int) 47 ev((fibonacci (- n 1))) 49 ev((fibonacci (- n 1))) 52 ko(Int) 48 ev((fibonacci (- n 1))) 51 ko(Int) 50 ko(Int) 53 ev((fibonacci (- n 2))) 54 ev((fibonacci (- n 2))) 55 ev((- n 1)) 56 ev((- n 1)) 57 ev((- n 1)) 58 ev((fibonacci (- n 2))) 59 ev((- n 2)) 60 ev((- n 2)) 61 ko(Int) 62 ko(Int) 63 ko(Int) 64 ev((- n 2)) 65 ko(Int) 66 ko(Int) 67 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 68 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 69 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 70 ko(Int) 71 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 72 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 73 ev((<= n 1)) 74 ev((<= n 1)) 75 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 76 ev((<= n 1)) 77 ko(Bool) 78 ko(Bool) 79 ko(Bool) 80 ev(n) 81 ev(n) 82 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 83 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 84 ev(n) 85 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 86 ev(n) 87 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 88 ev(n) 89 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 90 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 91 ev(n) 92 ev(n) 93 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 94 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 95 ev(n) 96 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 97 ev(n) 98 ko(Int) 100 ko(Int) 99 ev((fibonacci (- n 1))) 101 ko(Int) 102 ko(Int) 103 ko(Int) 105 ko(Int) 104 ko(Int) 109 ev((fibonacci (- n 1))) 106 ev((fibonacci (- n 1))) 110 ko(Int) 108 ko(Int) 107 ev((fibonacci (- n 2))) 111 ev((fibonacci (- n 2))) 112 ev((- n 1)) 113 ev((fibonacci (- n 2))) 114 ev((fibonacci (- n 2))) 115 ev((- n 1)) 116 ev((fibonacci (- n 2))) 117 ev((- n 1)) 118 ev((- n 2)) 119 ev((- n 2)) 120 ko(Int) 121 ev((- n 2)) 122 ev((- n 2)) 123 ko(Int) 124 ev((- n 2)) 125 ko(Int) 126 ko(Int) 127 ko(Int) 128 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 129 ko(Int) 130 ko(Int) 131 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 132 ko(Int) 133 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 134 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 135 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 136 ev((<= n 1)) 137 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 138 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 139 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 140 ev((<= n 1)) 141 ev((<= n 1)) 142 ko(Bool) 143 ev((<= n 1)) 144 ko(Bool) 145 ko(Bool) 146 ev(n) 147 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 148 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 149 ev(n) 150 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 151 ev(n) 152 ko(Bool) 153 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 154 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 155 ev(n) 156 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 157 ev(n) 158 ev(n) 159 ev(n) 160 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 161 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 162 ev(n) 163 ev(n) 164 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 165 ko(Int) 167 ko(Int) 168 ko(Int) 166 ev(n) 169 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 170 ev(n) 171 ev(n) 172 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 173 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 174 ko(Int) 177 ko(Int) 175 ko(Int) 176 ko(Int) 178 ev((fibonacci (- n 1))) 180 ko(Int) 181 ko(Int) 179 ev((fibonacci (- n 1))) 182 ev((fibonacci (- n 2))) 183 ev((fibonacci (- n 2))) 184 ev((fibonacci (- n 2))) 185 ko(Int) 190 ev((fibonacci (- n 1))) 187 ko(Int) 189 ko(Int) 188 ev((fibonacci (- n 1))) 186 ev((fibonacci (- n 2))) 191 ev((fibonacci (- n 2))) 192 ev((- n 1)) 193 ev((- n 1)) 194 ev((- n 2)) 195 ev((- n 2)) 196 ev((- n 2)) 197 ev((- n 1)) 198 ev((- n 1)) 199 ev((- n 2)) 200 ev((- n 2)) 201 ko(Int) 202 ko(Int) 203 ko(Int) 204 ko(Int) 205 ko(Int) 206 ko(Int) 207 ko(Int) 208 ko(Int) 209 ko(Int) 210 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 211 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 212 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 213 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 214 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 215 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 216 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 217 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 218 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 219 ev((<= n 1)) 220 ev((<= n 1)) 221 ev((<= n 1)) 222 ko(Bool) 223 ko(Bool) 224 ko(Bool) 225 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 226 ev(n) 227 ev(n) 228 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 229 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 230 ev(n) 231 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 232 ev(n) 233 ev(n) 234 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 235 ev(n) 236 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 237 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 238 ev(n) 239 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 240 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 241 ev(n) 242 ev(n) 243 ko(Int) 246 ko(Int) 244 ko(Int) 245 ko(Int) 248 ko(Int) 249 ko(Int) 247 ev((fibonacci (- n 1))) 251 ko(Int) 253 ko(Int) 250 ko(Int) 252 ev((fibonacci (- n 2))) 254 ev((- n 1)) 255 ev((- n 2)) 256 ko(Int) 257 ko(Int) 258 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 259 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 260 ev((<= n 1)) 261 ko(Bool) 262 ev(n) 263 ev(n) 264 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 265 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 266 ev(n) 267 ev((+ (fibonacci (- n 1)) (fibonacci (- n 2)))) 268 ko(Int) 271 ko(Int) 269 ev((fibonacci (- n 1))) 270 ko(Int) 272 ev((- n 1)) 273 ko(Int) 274 ev((if (<= n 1) n (+ (fibonacci (- n 1)) (fibonacci (- n 2))))) 275 #nodes: 276 #edges: 346 graph density: 0,005 outdegree min: 1 outdegree max: 6 outdegree avg: 1,254 language: Scheme machine: AAM lattice: TypeSet address: Classical Figure: State graph of the Fibonacci program with a type lattice. Algorithm 2: The 10th Fibonacci number. ; ; nth number of F i b o n a c c i ( by r e c u r s i v e p r o c e s s ) ( Ò ( f i b o n a c c i n ) ( i f (<= n 1) n (+ ( f i b o n a c c i (− n 1)) ( f i b o n a c c i (− n 2 ) ) ) ) ) ( f i b o n a c c i 10) An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 9 / 21
  • 10. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Example of a state graph on a other very simple program (bis) ev((letrec ((fibonacci2 (lambda (n fn_1 fn) (if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1))))) (fibonacci (lambda (n) (cdr (fibonacci2 n 1 0))))) (fibonacci 10))) 0 ev((fibonacci 10)) 1 ev((cdr (fibonacci2 n 1 0))) 2 ev((fibonacci2 n 1 0)) 3 ev((if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1)))) 4 ev((= n 0)) 5 ko({#f,#t}) 6 ev((cons fn_1 fn)) 7 ev((fibonacci2 (- n 1) fn (+ fn fn_1))) 8 ko(Cons(@fn_1-Time(),@fn-Time())) 9 ev((- n 1)) 10 ko(Int) 11 ko(Int) 12 ev((+ fn fn_1)) 13 ko(Int) 14 ev((if (= n 0) (cons fn_1 fn) (fibonacci2 (- n 1) fn (+ fn fn_1)))) 15 ev((= n 0)) 16 ko({#f,#t}) 17 ev((cons fn_1 fn)) 18 ev((fibonacci2 (- n 1) fn (+ fn fn_1))) 19 ko(Cons(@fn_1-Time(),@fn-Time())) 20 ev((- n 1)) 21 ko(Int) 22 ko(Int) 23 #nodes: 24 #edges: 24 graph density: 0,043 outdegree min: 1 outdegree max: 2 outdegree avg: 1,000 language: Scheme machine: AAM lattice: TypeSet address: Classical Figure: State graph of the Fibonacci program with a type lattice. Algorithm 3: The 10th Fibonacci number. ; ; nth number of F i b o n a c c i ( by i t e r a t i v e p r o c e s s ) ( Ò ( f i b o n a c c i 2 n f n 1 fn ) ( i f (= n 0) ( ÓÒ× f n 1 fn ) ( f i b o n a c c i 2 (− n 1) fn (+ fn f n 1 ) ) ) ) ( Ò ( f i b o n a c c i n ) ( c dr ( f i b o n a c c i 2 n 1 0 ) ) ) ( f i b o n a c c i 10) An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 10 / 21
  • 11. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References The problematic: Too heavy for real programs With an AAM the problem is became decidable. But in general an AAM is too slow to analyse real programs. One way to have a faster AAM is to parallelize generation of the state graph. Goal of this master thesis: implement and compare several parallelizations of AAM in the framework Scala-AM. Parallel model for the implementation: actors with Akka. Language analysed: Scheme. Figure: Ferdinand Hodler, View to Infinity. 1913. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 11 / 21
  • 12. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References 1 The context: Abstract Interpretation for Static Analysis 2 The problematic: Too heavy for real programs 3 Parallel algorithms 4 Done and todo 5 References An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 12 / 21
  • 13. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Sequential worklist strategy s s s s s worklist Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 13 / 21
  • 14. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Naive worklist parallel strategy s s s s s worklist merge Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 14 / 21
  • 15. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Naive worklist parallel strategy Redundant computations. Synchronization at the merge step. Article test on few real JavaScript programs. Results show that this adaptation of the sequential algorithm is not optimal. Figure: L. Andersen, M. Might. Multi-core Parallelization of Abstracted. 2013. Improvements with producer/consumer model. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 15 / 21
  • 16. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Better, per-context parallel strategy Authors introduce a per-context parallel strategy. The main idea is to separate these two parts: state exploration control of state space by some merging operations. The intuitive idea is to parallelize “functions” instead basic “blocks”. Figure: K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 16 / 21
  • 17. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References 1 The context: Abstract Interpretation for Static Analysis 2 The problematic: Too heavy for real programs 3 Parallel algorithms 4 Done and todo 5 References An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 17 / 21
  • 18. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Work done Reading of theoretical background on lattice and AAM. Redaction of an introduction to the subject and a lattice presentation (preparatory work, last year). Reading of some articles on parallelization. Learning actors, Akka. Learning use of some tools: sbt, Scala environments. . . (discovery of GraalVM!) Learning functioning of Scala-AM. Removed some parts of Scala-AM (other machines or languages), implementation of little features. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 18 / 21
  • 19. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References Work to be done Implement the naive parallel algorithm, and experiment, really ASAP. Implement better parallel algorithms. Evaluate all of them, identify advantages and disadvantages for each of them. Reading of other articles on parallelization. Have a great idea! Final redaction. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 19 / 21
  • 20. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References 1 The context: Abstract Interpretation for Static Analysis 2 The problematic: Too heavy for real programs 3 Parallel algorithms 4 Done and todo 5 References An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 20 / 21
  • 21. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation The context: Abstract Interpretation for Static Analysis The problematic: Too heavy for real programs Parallel algorithms Done and todo References References Thank you! Questions time. . . L. Andersen, M. Might. Multi-core Parallelization of Abstracted Abstract Machines. 2013. Patrick Cousot. Abstract Interpretation in a Nutshell. K. Dewey, V. Kashyap, B. Hardekopf. A parallel abstract interpreter for JavaScript. 2015. Matthew Might. Tutorial: Small-step CFA. 2011. Quentin Sti´evenart. Static Analysis of Concurrency Constructs in Higher-Order Programs. 2014. D. Van Horn, M. Might. Abstracting Abstract Machines. 2010. Document, LATEX sources, complete references and first presentation on https:// Ø Ù ØºÓÖ »ÇÈ Å /efficient-parallel-abstract-interpreter-in-scala Olivier Pirson. An Efficient and Parallel Abstract Interpreter in Scala — Preparatory Work. 2017. An Efficient and Parallel Abstract Interpreter in Scala — Second Presentation 21 / 21