Make minor edits to part 5 of SPA
Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
parent
697f083237
commit
d94ceeab2e
|
@ -9,7 +9,7 @@ draft: true
|
|||
|
||||
In the previous several posts, I've formalized the notion of lattices, which
|
||||
are an essential ingredient to formalizing the analyses in Anders Møller's
|
||||
lecutre notes. However, there can be no program analysis without a program
|
||||
lecture notes. However, there can be no program analysis without a program
|
||||
to analyze! In this post, I will define the (very simple) language that we
|
||||
will be analyzing. An essential aspect of the language is its
|
||||
[semantics](https://en.wikipedia.org/wiki/Semantics_(computer_science), which
|
||||
|
@ -40,9 +40,9 @@ This time, the English interpretation of the rule is as follows:
|
|||
> then to evaluate the statement, you evaluate its `then` branch.
|
||||
|
||||
These rules are certainly not equivalent. For instance, the former allows
|
||||
the "then" branch to be executed when the condition is `2` two; however, in
|
||||
the "then" branch to be executed when the condition is `2`; however, in
|
||||
the latter, the value of the conditional must be `1`. If our analysis were
|
||||
_flow-sensitive_ (our first few will not be), then this difference would change
|
||||
intelligent (our first few will not be), then this difference would change
|
||||
its output when determining the signs of the following program:
|
||||
|
||||
```
|
||||
|
@ -58,7 +58,7 @@ Using the first, more "relaxed" rule, the condition would be considered "true",
|
|||
and the sign of `y` would be `-`. On the other hand, using the second,
|
||||
"stricter" rule, the sign of `y` would be `+`. I stress that in this case,
|
||||
I am showing a flow-sensitive analysis (one that can understand control flow
|
||||
and make more speciifc predictions); for our simplest analyses, we will not
|
||||
and make more specific predictions); for our simplest analyses, we will not
|
||||
be aiming for flow-sensitivity. There is plenty of work to do even then.
|
||||
|
||||
The point of showing these two distinct rules is that we need to be very precise
|
||||
|
@ -137,7 +137,7 @@ it prints its argument to the console!
|
|||
For the formalization, it turns out to be convenient to separate "simple"
|
||||
statements from "complex" ones. Pragmatically speaking, the difference is that
|
||||
between the "simple" and the "complex" is control flow; simple statements
|
||||
will be guaranteed to always execute one-by-one, without any decisions or jumps.
|
||||
will be guaranteed to always execute without any decisions or jumps.
|
||||
The reason for this will become clearer in subsequent posts; I will foreshadow
|
||||
a bit by saying that consecutive simple statements can be placed into a single
|
||||
[basic block](https://en.wikipedia.org/wiki/Basic_block).
|
||||
|
@ -151,7 +151,7 @@ noop
|
|||
```
|
||||
|
||||
These will always be executed in the same order, exactly once. Here, `noop`
|
||||
is a conveneint type of statement that simply does nothing.
|
||||
is a convenient type of statement that simply does nothing.
|
||||
|
||||
On the other hand, the following statement is not simple:
|
||||
|
||||
|
@ -161,7 +161,7 @@ while x {
|
|||
}
|
||||
```
|
||||
|
||||
it's not simple because it makes decisions about how the code should be executed;
|
||||
It's not simple because it makes decisions about how the code should be executed;
|
||||
if `x` is nonzero, it will try executing the statement in the body of the loop
|
||||
(`x = x - 1`). Otherwise, it would skip evaluating that statement, and carry on
|
||||
with subsequent code.
|
||||
|
@ -171,12 +171,12 @@ I first define simple statements using the `BasicStmt` type:
|
|||
{{< codelines "Agda" "agda-spa/Language/Base.agda" 18 20 >}}
|
||||
|
||||
Complex statements are just called `Stmt`; they include loops, conditionals and
|
||||
sequences (
|
||||
sequences ---
|
||||
{{< sidenote "right" "then-note" "\(s_1\ \text{then}\ s_2\)" >}}
|
||||
The standard notation for sequencing in imperative languages is
|
||||
\(s_1; s_2\). However, Agda gives special meaning to the semicolon,
|
||||
and I couldn't find any passable symbolic alternatives.
|
||||
{{< /sidenote >}} is a sequence where \(s_2\) is evaluated after \(s_1\)).
|
||||
{{< /sidenote >}} is a sequence where \(s_2\) is evaluated after \(s_1\).
|
||||
Complex statements subsume simple statements, which I model using the constructor
|
||||
`⟨_⟩`.
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user