The Q# Programming Language


A natural model for quantum computation is to treat the quantum computer as a coprocessor, similar to that used for GPUs, FPGAs, and other adjunct processors. The primary control logic runs classical code on a classical "host" computer. When appropriate and necessary, the host program can invoke a subroutine that runs on the adjunct processor. When the subroutine completes, the host program gets access to the subroutine's results.

Q# (Q-sharp) is a domain-specific programming language used for expressing quantum algorithms. It is to be used for writing subroutine that execute on an adjunct quantum processor, under the control of a classical host program and computer. Until quantum processors are widely available, Q# subroutines execute on a simulator.

Q# provides a small set of primitive types, along with two ways (arrays and tuples) for creating new, structured types. It supports a basic procedural model for writing programs, with loops and if/then statements. The top-level constructs in Q# are user defined types, operations, and functions.

The following sections detail:

🆕 Conventions

Starting in Q# 0.3, we are working to ensure that common punctuation marks are used consistently in all situations. We expect that this will make Q# easier to learn and to read because these marks always mean the same thing, and the same concept is always represented the same way.


  • The semi-colon, ;, is used to end a statement or single-line directive. It is not used for any other purpose.
  • The comma, ,, is used to separate elements of a sequence. It is used for tuple literals, array literals, argument lists, tuple definitions, and type lists. In a change from earlier versions, ; is no longer supported as an array literal separator.
  • The colon, :, is used to introduce a type annotation. It is primarily used in callable signatures. Because colon always introduces a type signature, the ternary conditional operator introduced in 0.3 uses a vertical bar, |, to separate the true and false values; thus, Q# uses cond ? tval | fval instead of the colon as separator as in C.