  This dissertation proves lower bounds on the inherent difficulty of deciding
flow analysis problems in higher-order programming languages. We give exact
characterizations of the computational complexity of 0CFA, the $k$CFA
hierarchy, and related analyses. In each case, we precisely capture both the
expressiveness and feasibility of the analysis, identifying the elements
responsible for the trade-off.
  0CFA is complete for polynomial time. This result relies on the insight that
when a program is linear (each bound variable occurs exactly once), the
analysis makes no approximation; abstract and concrete interpretation coincide,
and therefore pro- gram analysis becomes evaluation under another guise.
Moreover, this is true not only for 0CFA, but for a number of further
approximations to 0CFA. In each case, we derive polynomial time completeness
results.
  For any $k > 0$, $k$CFA is complete for exponential time. Even when $k = 1$,
the distinction in binding contexts results in a limited form of closures,
which do not occur in 0CFA. This theorem validates empirical observations that
$k$CFA is intractably slow for any $k > 0$. There is, in the worst case---and
plausibly, in practice---no way to tame the cost of the analysis. Exponential
time is required. The empirically observed intractability of this analysis can
be understood as being inherent in the approximation problem being solved,
rather than reflecting unfortunate gaps in our programming abilities.
