Soot:

3 kinds of analyses:
 - fwd, bwd, fwd with different results on different branches

Abstracted over flowgraph (abstract DirectedGraph class)

Requires a new, annoying constructor for each analysis that calls ... doAnalysis()

Lattice join and _copy_ -- b/c it's _required_ to be mutable

No interleaving

Most useful reading: http://www.brics.dk/SootGuide/



CIL:

Not abstracted over flowgraph

Complicated interface that can affect how the analysis iterates
over the graph.

No interleaving

Most useful reading:
http://docs.camlcity.org/docs/godipkg/3.10/godi-cil/doc/godi-cil/html/api/Dataflow.ForwardsTransfer.html


Whirlwind:
Interleaving, of course.
Implementation much like our earlier efforts:
a complicated mix of interleaving and recursive rewriting,
with dynamic checks that the client returns correct graphs.
Representation of the transformations is generated by interleaved analysis and
transformation,
then the generated transformations are applied;
all of this is simpler in our story b/c we have immutable graphs.
No optimization fuel.

analyze-implementation.diesel - 284 non-comment, non-blank loc
analysis.diesel - 30 non-comment, non-blank loc
analysis-action.diesel - 45 non-comment, non-blank loc
analysis-graph.diesel - 79 non-comment, non-blank loc
analysis-info.diesel - 4 non-comment, non-blank loc
analyze.diesel - 20 non-comment, non-blank loc

core of implementation is about 500 non-comment, non-blank loc



LLVM:

Pass manager -- there's a lot of support for gathering passes
  and ordering them effectively, but I don't see anything
  that might be termed a dataflow framework
