  The rapid progress of computer technology has been accompanied by a
corresponding evolution of software development, from hardwired components and
binary machine code to high level programming languages, which allowed to
master the increasing hardware complexity and fully exploit its potential.
  This paper investigates, how classical concepts like hardware abstraction,
hierarchical programs, data types, memory management, flow of control and
structured programming can be used in quantum computing. The experimental
language QCL will be introduced as an example, how elements like irreversible
functions, local variables and conditional branching, which have no direct
quantum counterparts, can be implemented, and how non-classical features like
the reversibility of unitary transformation or the non-observability of quantum
states can be accounted for within the framework of a procedural programming
language.
