**Abstract:**
In the beginning, there were two measures of computational complexity: time
and space. From an engineering standpoint, these were very natural
measures, quantifying the amount of physical resources needed to perform a
computation. From a mathematical viewpoint, time and space were somewhat
less satisfying, since neither appeared to be tied to the inherent mathematical
complexity of the computational problem.

In 1974, Ron Fagin changed this. He showed that the complexity class NP --- those problems computable in nondeterministic polynomial time --- is exactly the set of problems describable in second-order existential logic. This was a remarkable insight, for it demonstrated that the computational complexity of a problem can be understood as the richness of a language needed to specify the problem. Time and space are not model-dependent engineering concepts, they are more fundamental.

Although few programmers consider their work in this way, a computer
program is a completely precise description of a mapping from inputs to
outputs. We follow database terminology and call such a map a
*query* from input structures to output structures. Typically a
program describes a precise sequence of steps that compute a given query.
However, we may choose to describe the query in some other precise way.
For example, we may describe queries in variants of first- and second-order
mathematical logic.

Fagin's Theorem gave the first such connection. Using first-order languages, this approach, commonly called descriptive complexity, demonstrated that virtually all measures of complexity can be mirrored in logic. Furthermore, as we will see, the most important classes have especially elegant and clean descriptive characterizations.

In this column I will survey a few of the connections between descriptive and computational complexity. I will also describe some recent progress and applications. Further detail can be found in Descriptive Complexity.

Recent Publications of Neil Immerman