  Quantum computing is an emerging computational paradigm that leverages the
laws of quantum mechanics to perform elementary logic operations. Existing
programming models for quantum computing were designed with fault-tolerant
hardware in mind, envisioning standalone applications. However, near-term
quantum computers are susceptible to noise which limits their standalone
utility. To better leverage limited computational strengths of noisy quantum
devices, hybrid algorithms have been suggested whereby quantum computers are
used in tandem with their classical counterparts in a heterogeneous fashion.
This {\it modus operandi} calls out for a programming model and a high-level
programming language that natively and seamlessly supports heterogeneous
quantum-classical hardware architectures in a single-source-code paradigm.
Motivated by the lack of such a model, we introduce a language extension
specification, called QCOR, that enables single-source quantum-classical
programming. Programs written using the QCOR library and directives based
language extensions can be compiled to produce functional hybrid binary
executables. After defining the QCOR's programming model, memory model, and
execution model, we discuss how QCOR enables variational, iterative, and feed
forward quantum computing. QCOR approaches quantum-classical computation in a
hardware-agnostic heterogeneous fashion and strives to build on best practices
of high performance computing (HPC). The high level of abstraction in the
developed language is intended to accelerate the adoption of quantum computing
by researchers familiar with classical HPC.
