Abstract This paper surveys techniques for the expression of software requirements and specifications. A distinction is developed between requirements and two types of specifications. Summaries are provided of existing languages. Although the concepts surveyed apply, for the most part, to systems in general, the primary focus is on software systems. An appendix discusses the use of the terms “requirements” and “specification” in the Department of Defense. Primary findings are as follows: 1. (1) In the continuum of possible ways of describing systems, the software engineering community has focused on three distinct classes of description: requirements, system specification, and abstract program specification; 2. (2) each form of description serves distinct needs and focuses on distinct aspects of the system described as requirements; properties needed for a system to be a solution to a problem, generally presented in terms of the anticipated environment and user needs; system specification; what a system does—its externally visible behavioral characteristics; and abstract program specification; mathematically formal and verifiable specifications; and 3. (3) each form of description is represented in the literature by a distinct type of description language. Table 1 summarizes the capabilities of the various language classes.