# Programação quântica

Programação quântica é o processo de projetar ou montar sequências de instruções, chamadas circuitos quânticos, utilizando portas, interruptores e operadores para manipular um sistema quântico visando um resultado desejado ou os resultados de um experimento específico. Algoritmos de circuitos quânticos podem ser implementados em circuitos integrados, conduzidos com instrumentação, ou escritos em uma linguagem de programação para uso com um computador quântico ou um processador quântico.
Com sistemas baseados em processadores quânticos, as linguagens de programação quânticas ajudam a expressar algoritmos quânticos usando construções de alto nível. O campo está profundamente enraizado na filosofia de código aberto e, como resultado, a maioria do software quântico discutido neste artigo está livremente disponível como software de código aberto.
Computadores quânticos, como aqueles baseados no Protocolo KLM, um modelo de computação quântica óptica linear (CQOL), utilizam algoritmos quânticos (circuitos) implementados com eletrônicos, circuitos integrados, instrumentação, sensores e/ou por outros meios físicos.
Outros circuitos projetados para experimentação relacionada a sistemas quânticos podem ser baseados em instrumentação e sensores.

## Conjuntos de instruções quânticas

Conjuntos de instruções quânticas são usados para transformar algoritmos de nível superior em instruções físicas que podem ser executadas em processadores quânticos. Às vezes, essas instruções são específicas para uma plataforma de hardware específica, por exemplo, armadilhas de íons ou qubits supercondutores.

### cQASM

cQASM, também conhecido como QASM comum, é uma linguagem de montagem quântica independente de hardware que garante a interoperabilidade entre todas as ferramentas de compilação e simulação quântica. Foi introduzido pelo Laboratório QCA na TUDelft.

### Quil

Quil é uma arquitetura de conjunto de instruções para computação quântica que introduziu primeiro um modelo de memória compartilhada quântica/clássica. Foi introduzido por Robert Smith, Michael Curtis e William Zeng em Uma Arquitetura de Conjunto de Instruções Quânticas Práticas. Muitos algoritmos quânticos (incluindo teletransporte quântico, correção de erros quânticos, simulação, e algoritmos de otimização.) exigem uma arquitetura de memória compartilhada.

### OpenQASM

OpenQASM é a representação intermediária introduzida pela IBM para uso com Qiskit e o IBM Q Experience.

### Blackbird

Blackbird é um conjunto de instruções quânticas e representação intermediária usada pela Xanadu Quantum Technologies e Strawberry Fields. Foi projetado para representar programas quânticos de variáveis contínuas que podem ser executados em hardware quântico fotônico.

## Kits de desenvolvimento de software quântico

Os kits de desenvolvimento de software quântico fornecem coleções de ferramentas para criar e manipular programas quânticos. Eles também fornecem os meios para simular os programas quânticos ou prepará-los para serem executados usando dispositivos quânticos baseados em nuvem e dispositivos quânticos auto-hospedados.

### SDKs com acesso a processadores quânticos

Os seguintes kits de desenvolvimento de software podem ser usados para executar circuitos quânticos em dispositivos quânticos de protótipo, bem como em simuladores.

#### Perceval

Um projeto de código aberto criado por fr para projetar circuitos quânticos fotônicos e desenvolver algoritmos quânticos, baseado em Python. As simulações são executadas tanto no próprio computador do usuário quanto na nuvem. Perceval também é usado para se conectar ao processador quântico fotônico baseado em nuvem da Quandela.

#### Ocean

Um conjunto de ferramentas de código aberto desenvolvido pela D-Wave. Escrito principalmente na linguagem de programação Python, permite aos usuários formular problemas nos formatos do Modelo de Ising e da Otimização Binária Quadrática Irrestrita (QUBO). Os resultados podem ser obtidos enviando para um computador quântico online no Leap, o Ambiente de Aplicação Quântica em tempo real da D-Wave, máquinas de propriedade do cliente ou amostradores clássicos.

#### ProjectQ

Um projeto de código aberto desenvolvido no Instituto de Física Teórica da ETH, que usa a linguagem de programação Python para criar e manipular circuitos quânticos. Os resultados são obtidos usando um simulador ou enviando tarefas para dispositivos quânticos da IBM.

#### Qrisp

Qrisp é um projeto de código aberto coordenado pela Fundação Eclipse e desenvolvido em linguagem de programação Python pelo Fraunhofer FOKUS Qrisp é uma linguagem de programação de alto nível para criar e compilar algoritmos quânticos. Seu modelo de programação estruturada permite um desenvolvimento e manutenção escaláveis. A sintaxe expressiva é baseada em variáveis em vez de qubits, com a QuantumVariable como classe central, e funções em vez de portas. Ferramentas adicionais, como um simulador eficiente e descompilação automática, complementam o amplo framework. Além disso, é independente de plataforma, pois oferece compilação alternativa de funções elementares até o nível do circuito, com base em conjuntos de portas específicas do dispositivo.

#### Qiskit

Um projeto de código aberto desenvolvido pela IBM. Circuitos quânticos são criados e manipulados usando Python. Os resultados são obtidos utilizando simuladores que rodam no dispositivo do usuário, simuladores fornecidos pela IBM ou dispositivos quânticos de protótipo fornecidos pela IBM. Além da capacidade de criar programas usando operações quânticas básicas, ferramentas de nível superior para algoritmos e benchmarking estão disponíveis dentro de pacotes especializados. Qiskit é baseado no padrão OpenQASM para representar circuitos quânticos. Ele também oferece suporte ao controle em nível de pulso de sistemas quânticos por meio do padrão QiskitPulse.

#### Qibo

Uma API de pilha completa de código aberto para simulação quântica, controle de hardware quântico e calibração desenvolvida por vários laboratórios de pesquisa, incluindo QRC, CQT e INFN. Qibo é um framework modular que inclui vários back-ends para simulação quântica e controle de hardware. Este projeto visa fornecer um framework de controle de hardware quântico independente de plataforma com drivers para vários instrumentos e ferramentas para calibração, caracterização e validação quânticas. Este framework foca em dispositivos quânticos auto-hospedados, simplificando o desenvolvimento de software necessário em laboratórios.

#### Forest

Um projeto de código aberto desenvolvido pela Rigetti, que utiliza a linguagem de programação Python para criar e manipular circuitos quânticos. Os resultados são obtidos utilizando simuladores ou dispositivos quânticos de protótipo fornecidos pela Rigetti. Além da capacidade de criar programas usando operações quânticas básicas, algoritmos de nível superior estão disponíveis dentro do pacote Grove. Forest é baseado no conjunto de instruções Quil.

#### t|ket>

Um ambiente de programação quântica e compilador otimizador desenvolvido pela Cambridge Quantum Computing que visa simuladores e diversos back-ends de hardware quântico, lançado em dezembro de 2018.

#### Strawberry Fields

Uma biblioteca de código aberto em Python desenvolvida pela Xanadu Quantum Technologies para projetar, simular e otimizar circuitos quânticos de variáveis contínuas (CV) em óptica quântica. Três simuladores são fornecidos - um na base de Fock, outro utilizando a formulação Gaussiana da óptica quântica, e um utilizando a biblioteca de aprendizado de máquina TensorFlow. Strawberry Fields também é a biblioteca para executar programas no hardware fotônico quântico da Xanadu.

#### PennyLane

Uma biblioteca open-source em Python desenvolvida pela Xanadu Quantum Technologies para programação diferenciável de computadores quânticos. PennyLane oferece aos usuários a capacidade de criar modelos usando TensorFlow, NumPy ou PyTorch, e conectá-los com plataformas de computação quântica disponíveis de IBMQ, Google Quantum, Rigetti, Quantinuum e Alpine Quantum Technologies.

#### Kit de Desenvolvimento Quântico

Um projeto desenvolvido pela Microsoft como parte do .NET Framework. Programas quânticos podem ser escritos e executados dentro do Visual Studio e do VSCode usando a linguagem de programação quântica Q#. Programas desenvolvidos no QDK podem ser executados no Azure Quantum da Microsoft, e executar em computadores quânticos da Quantinuum, IonQ e Pasqal.

#### Cirq

Um projeto de código aberto desenvolvido pelo Google, que utiliza a linguagem de programação Python para criar e manipular circuitos quânticos. Programas escritos em Cirq podem ser executados em IonQ, Pasqal, Rigetti, e Alpine Quantum Technologies.

## Linguagens de programação quântica

Existem dois principais grupos de linguagens de programação quântica: linguagens de programação quântica imperativas e linguagens de programação quântica funcionais.

### Linguagens imperativas

Os representantes mais proeminentes das linguagens imperativas são QCL, LanQ e Q|SI>.

#### Ket

Ket é uma linguagem embutida de código aberto projetada para facilitar a programação quântica, aproveitando a sintaxe familiar e a simplicidade do Python. Ele serve como um componente integral da Plataforma de Programação Quântica Ket, integra-se perfeitamente a uma biblioteca de tempo de execução Rust e a um simulador quântico. Mantido pela Quantuloop, o projeto enfatiza acessibilidade e versatilidade para pesquisadores e desenvolvedores. O exemplo a seguir demonstra a implementação de um estado de Bell usando Ket:

#### QCL

Linguagem de computação quântica, em inglês "Quantum Computation Language" (QCL), é uma das primeiras linguagens de programação quântica implementadas. A característica mais importante do QCL é o suporte para operadores e funções definidos pelo usuário. Sua sintaxe se assemelha à sintaxe da linguagem de programação C e seus tipo de dados clássicos são semelhantes aos tipos de dados primitivos em C. É possível combinar código clássico e código quântico no mesmo programa.

#### Pseudocódigo quântico

O pseudocódigo quântico proposto por E. Knill é a primeira linguagem formalizada para a descrição de algoritmo quânticos. Foi introduzido e, além disso, estava intimamente ligado a um modelo de máquina quântica chamada Máquina de Acesso Aleatório Quântico (QRAM).

#### Q#

Uma linguagem desenvolvida pela Microsoft para ser usada com o Kit de Desenvolvimento Quântico.

#### Q|SI>

Q|SI> é uma plataforma incorporada na linguagem .Net que oferece suporte à programação quântica em uma extensão quântica da linguagem while. Esta plataforma inclui um compilador da linguagem while quântica e uma cadeia de ferramentas para a simulação de computação quântica, otimização de circuitos quânticos, análise de terminação de programas quânticos, e verificação de programas quânticos.

#### Linguagem Q

A Linguagem Q é a segunda linguagem de programação quântica imperativa implementada.

#### Linguagem Q

A Linguagem Q foi implementada como uma extensão da linguagem de programação C++. Ela fornece classes para operações quânticas básicas como QHadamard, QFourier, QNot e QSwap, que são derivadas da classe base Qop. Novos operadores podem ser definidos usando o mecanismo de classe C++.
A memória quântica é representada pela classe Qreg.
O processo de computação é executado usando um simulador fornecido. Ambientes ruidosos podem ser simulados usando parâmetros do simulador.

#### qGCL

A Linguagem de Comando Guardado Quântico (qGCL) foi definida por P. Zuliani em sua tese de doutorado. É baseada na Linguagem de Comando Guardado criada por Edsger Dijkstra.
Pode ser descrita como uma linguagem de especificação de programas quânticos.

#### QMASM

Montador Macro Quântico (QMASM) é uma linguagem de baixo nível específica para recristalizadores quânticos como o D-Wave.

#### Scaffold

Scaffold é uma linguagem semelhante a C, que compila para QASM e OpenQASM. É construída sobre a Infraestrutura do Compilador LLVM para realizar otimizações no código Scaffold antes de gerar um conjunto de instruções especificado.

#### Silq

Silq é uma linguagem de programação de alto nível para computação quântica com um sistema de tipos estáticos robusto, desenvolvido na ETH Zürich.

#### LQP

A Lógica dos Programas Quânticos (LQP) é uma lógica quântica dinâmica, capaz de expressar características importantes de medições quânticas e evoluções unitárias de estados multipartidos, e fornece caracterizações lógicas de várias formas de emaranhamento. A lógica tem sido usada para especificar e verificar a correção de vários protocolos na computação quântica.

### Linguagens Funcionais

Esforços estão em andamento para desenvolver linguagens de programação funcional para computação quântica. Linguagens de programação funcional são bem adequadas para raciocinar sobre programas. Exemplos incluem QPL de Selinger, e a linguagem semelhante a Haskell QML, desenvolvida por Altenkirch e Grattage. Linguagens de programação quântica de ordem superior, baseadas no cálculo lambda, foram propostas por van Tonder, Selinger e Valiron e por Arrighi e Dowek.

#### QFC e QPL

QFC e QPL são duas linguagens de programação quântica intimamente relacionadas definidas por Peter Selinger. Elas diferem apenas em sua sintaxe: QFC usa uma sintaxe de fluxograma, enquanto QPL usa uma sintaxe textual. Essas linguagens têm fluxo de controle clássico, mas podem operar em dados quânticos ou clássicos. Selinger fornece uma semântica denotacional para essas linguagens em uma categoria de superoperadores.

#### QML

QML é uma linguagem de programação quântica semelhante ao Haskell desenvolvida por Altenkirch e Grattage. Ao contrário do QPL de Selinger, esta linguagem considera a duplicação, em vez do descarte, da informação quântica como uma operação primitiva. A duplicação, neste contexto, é entendida como a operação que mapeia $|\phi \rangle$ para $|\phi \rangle \otimes |\phi \rangle$, e não deve ser confundida com a operação impossível de clonagem; os autores afirmam que é semelhante à forma como o compartilhamento é modelado em linguagens clássicas. QML também introduz operadores de controle clássico e quântico, enquanto a maioria das outras linguagens depende de controle clássico.
Uma semântica operacional para QML é fornecida em termos de circuito quânticos, enquanto uma semântica denotacional é apresentada em termos de superoperadores, e estes são mostrados para concordar. Tanto a semântica operacional quanto a denotacional foram implementadas (de forma clássica) em Haskell.

#### LIQUi|>

LIQUi|> (pronunciado como líquido) é uma extensão de simulação quântica na linguagem de programação F#. Atualmente, está sendo desenvolvido pelo Grupo de Arquiteturas e Computação Quântica (QuArC) Parte dos esforços da StationQ na Microsoft Research. O LIQUi|> busca permitir que os teóricos experimentem o design de algoritmos quânticos antes que computadores quânticos físicos estejam disponíveis para uso.
Isso inclui uma linguagem de programação, algoritmos de otimização e agendamento, e simuladores quânticos. O LIQUi|> pode ser usado para traduzir um algoritmo quântico escrito na forma de um programa de alto nível em instruções de máquina de baixo nível para um dispositivo quântico.

#### Cálculos lambda quânticos

Os cálculos lambda quânticos são extensões do clássico cálculo lambda introduzido por Alonzo Church e Stephen Cole Kleene na década de 1930. O propósito dos cálculos lambda quânticos é estender as linguagens de programação quântica com uma teoria de função de ordem superior.
A primeira tentativa de definir um cálculo lambda quântico foi feita por Philip Maymin em 1996. Seu cálculo lambda-q é poderoso o suficiente para expressar qualquer computação quântica. No entanto, essa linguagem pode resolver eficientemente problemas NP-completos, e portanto parece ser estritamente mais forte do que os modelos computacionais quânticos padrão (como a máquina de Turing quântica ou o modelo de circuito quântico). Portanto, é provável que o cálculo lambda-q de Maymin não seja implementável em um dispositivo físico.
Em 2003, André van Tonder definiu uma extensão do cálculo lambda adequada para provar a correção de programas quânticos. Ele também forneceu uma implementação na linguagem de programação Scheme.
Em 2004, Selinger e Valiron definiram um cálculo lambda fortemente tipado para computação quântica com um sistema de tipos baseado em lógica linear.

#### Quipper

Quipper foi publicado em 2013. É implementado como uma linguagem incorporada, usando Haskell como a linguagem hospedeira. Por esse motivo, os programas quânticos escritos em Quipper são escritos em Haskell usando bibliotecas fornecidas. Por exemplo, o seguinte código implementa a preparação de uma superposição: