The trace of a program-a string representing the sequence of statements executed for a particular input- and a program's trace language-all such strings-are considered as an expression of the control-flow possibilities inherent in the program. It is shown that, for a language like Turing's, programs always have trace languages that are context-sensitive but not always context-free. Such low-level languages lose most of their computing power if restricted to context-free traces. For languages in which individual statements are more powerful than those of a Turing machine, the trace languages may fail to be recursive, but the context-sensitive behavior may be regained by slightly altering the idea of a trace. In any case, it is also shown that it is impossible to effectively identify programs that have trace languages more restrictive than the widest class available in the programming language.