Novedades del Kit de desarrollo de Azure Quantum (QDK moderno)

El QDK moderno es la versión más reciente del lenguaje Q# y las herramientas de desarrollo. Con una superficie más pequeña y un rendimiento más rápido, se trata de una extensión de Visual Studio Code un solo clic y características de mejoras en el lenguaje, compatibilidad integrada con Python y Jupyter Notebook, nuevo resaltado de sintaxis, compatibilidad con el depurador, compatibilidad con proyectos de varios archivos, mensajes de error e conectividad integrada de Azure. Al eliminar las dependencias del QDK clásico anterior, ahora es realmente independiente de la plataforma, que se ejecuta en Windows, Mac, Linux y la web.

Integración con Visual Studio Code

El QDK moderno está estrechamente integrado en el entorno de desarrollo de Visual Studio Code. Nuevas características:

  • Nuevo estimador de recursos para VS Code que puede ejecutar localmente sin necesidad de ninguna cuenta de Azure.
  • Un depurador de Q# para la depuración integrada con puntos de interrupción, paso a paso y vista de variables locales y cuánticas
  • Compatibilidad con proyectos de Q# de varios archivos
  • Mejoras del servidor de lenguaje con mensajería de errores, resaltado de sintaxis, finalizaciones de código, información de desplazamiento y ir a definiciones
  • Conectividad y envío de trabajos integrados del área de trabajo de Azure
  • Un simulador disperso integrado (sin ruido)
  • Jupyter Notebook integración con codificación de Q# en celdas y resaltado de sintaxis
  • Generación de QIR para programas de Q#

Próximamente

  • La informática híbrida integrada con perfil adaptable aún no se admite con el QDK moderno. Si necesita ejecutar proyectos de informática híbrida, consulte Continuar trabajando en el QDK clásico.

Características en desuso

  • Compatibilidad con Visual Studio
  • Compatibilidad con proyectos y lenguajes de .NET
  • El kernel iq# y los comandos mágicos para cuadernos de Jupyter Notebook. Para más información sobre el uso de Q# y Jupyter Notebooks, consulte Jupyter Notebook integración y Migración del código.

Actualizaciones de idioma de Q#

A medida que las detecciones e innovaciones cuánticas siguen evolucionando a un ritmo rápido, el lenguaje Q# y el Kit de desarrollo de Azure Quantum siguen evolucionando para satisfacer las necesidades de desarrollo cuántico actuales y futuras. En las secciones siguientes se describen los cambios, las actualizaciones y las mejoras en el QDK moderno.

Actualizaciones de sintaxis del lenguaje

Basado en expresiones

El lenguaje Q# ahora está basado en expresiones en lugar de basado en instrucciones. Esto permite un nuevo uso de la sintaxis existente, como insertar una expresión if en otra expresión:

let x = if check { 0 } else { 1 };

Devolución implícita

En el ejemplo anterior también se aprovechan las instrucciones using sin punto y coma final al final de un bloque para devolver un valor de ese bloque. Este patrón se puede usar en lugar de expresiones de retorno explícitas en un elemento al que se puede llamar:

function ReturnsThree() : Int {
    return 3;
}

function AlsoReturnsThree() : Int {
    3
}

Expresiones de bloque

Q# ahora admite expresiones de bloque que pueden organizar varias líneas, variables de ámbito y devolver un valor:

let flip = {
    use q = Qubit();
    H(q);
    if M(q) == One {
        X(q);
        "Heads"
    } else {
        "Tails"
    }
} ;

Elementos como instrucciones

Los elementos como newtype, operationfunction e incluso open ahora pueden aparecer como instrucciones dentro de un ámbito local. Esto permite definir tipos auxiliares locales y invocables, así como incluir con ámbito. Por ejemplo, una función auxiliar local se puede definir justo antes de que sea necesaria:

function ShowDecrement() : Unit {
    open Microsoft.Quantum.Arrays;
    let before = [1, 2, 3];

    function SubOne(in : Int) : Int {
        in - 1
    }

    let after = Mapped(SubOne, before);
    // after will be [0, 1, 2]
}

Tanto la función SubOne como la apertura del Microsoft.Quantum.Arrays espacio de nombres se limitan a la ShowDecrement función y no afectan al código fuera de eso.

Sombreado de nombres

Q# ahora permite la sombra de los nombres resueltos en los que no se ha permitido anteriormente. Esto permite una reutilización más sencilla del código que incluye nombres variables o invocables sin necesidad de una variable mutable:

function Shadowing(input : Int) : Double {
    let input = 2 * input;
    let output = Calculate(input);
    let output = IntAsDouble(output);
    return output;
}

Tipos explícitos para variables locales

Las variables locales ahora se pueden escribir explícitamente con la misma sintaxis que los tipos para las declaraciones de argumentos invocables:

let x : Int[] = [];

Los tipos explícitos no son necesarios, pero a veces pueden resultar útiles al resolver la ambigüedad de tipos para las funciones que aceptan genéricos, como Length. El patrón anterior para controlar esto: ya no se admite la adición de tipos concretos a una invocación de función genérica con sintaxis como Length<Int[]>([]); .

Preludio del espacio de nombres implícito

La resolución de nombres ahora incorpora un preludio implícito que es un conjunto de espacios de nombres que se tratan como si se hubieran abierto, siempre y cuando ningún otro nombre resuelto los sustituya. Los espacios de nombres que se tratan de esta manera son Microsoft.Quantum.Core, Microsoft.Quantum.Canony Microsoft.Quantum.Intrinsic. No es necesario abrirlos explícitamente, excepto cuando se usan alias o, de lo contrario, diferenciarse de posibles conflictos.

Biblioteca estándar

La biblioteca estándar de Q# ahora está hospedada en el mismo repositorio que el compilador y el tiempo de ejecución, y se puede encontrar en la carpeta de la biblioteca de nivel superior. No todas las funciones y características se han migrado desde las bibliotecas clásicas de Q#, a las que todavía se puede acceder en https://github.com/microsoft/QuantumLibraries. Si se necesita un elemento de la biblioteca anterior para un programa, ese elemento y las dependencias se pueden copiar en el programa de origen. Si alguna funcionalidad de biblioteca es fundamental para un flujo de trabajo y debe tenerse en cuenta para su inclusión en la nueva biblioteca estándar, envíe un problema de GitHub con los detalles.

Simulation

Simulación dispersa de forma predeterminada

El QDK moderno usa un simulador cuántico de estado disperso integrado como valor predeterminado target para la simulación local. Este simulador está escrito en Rust y procede del repositorio QIR Runner , lo que le permite compilar en WASM y ejecutarse en una variedad de entornos. Actualmente, este es el único back-end de simulación disponible en el QDK, aunque se están teniendo en cuenta otros back-end para la integración futura. Para obtener más información sobre el diseño de simulación dispersa, consulte Prueba de algoritmos cuánticos grandes mediante simulación dispersa.

Comprobaciones más estrictas en la versión de cúbits

El QDK clásico había relajado históricamente el requisito de que los cúbits estén en el suelo o |0⟩ estado antes de ser liberados al final de su ámbito, de modo que un cúbit que se ha medido y no funcionado en ningún otro elemento también era seguro para liberarse, ya que el simulador restablecería automáticamente el cúbit. Sin embargo, esto causó confusión cuando el mismo programa se ejecutó en hardware cuántico real donde este tipo de restablecimiento automático no está presente y los cúbits se pueden reutilizar en un estado inesperado. Para el QDK moderno, hemos vuelto al comportamiento más estricto de aplicar que los cúbits deben estar en estado de base al liberarse. Esto ayuda a los autores de algoritmos a comprobar el comportamiento de su algoritmo para su corrección en la preparación para ejecutarse en hardware.

Puertas multicontroladas descomponidas

El QDK moderno ahora usa estrategias de descomposición para puertas multicontroladas. Aunque esto no aprovecha los accesos directos disponibles para la simulación en los que las puertas controladas multicontrol se implementan fácilmente, coincide más estrechamente con el comportamiento de los sistemas cuánticos físicos. Esto significa que realizar una puerta con un gran número de cúbits de control incurrirá en asignaciones de cúbits adicionales y puertas de preparación, de la misma manera que lo haría cuando se compila para su ejecución en hardware. Para obtener más información sobre los algoritmos de descomposición usados, consulte la implementación en la biblioteca estándar.

Generación de QIR

El QDK moderno genera QIR generando la representación textual de LLVM (.ll) en lugar de usar bitcode (.bc). La mayoría targets de las herramientas y que aceptan código de bits también pueden analizar LLVM textual, incluidas herramientas como PyQIR y QIR Runner.

El QDK moderno se limita actualmente a la generación qiR para programas compatibles con el perfil base de QIR. Cuando se configura la compilación de perfiles base, el compilador y la extensión VSCode producen errores para patrones que no son compatibles con target. El compilador también puede omitir condicionalmente la compilación de elementos que tienen atributos que indican que son específicos de una compilación targetsdeterminada:

@Config(Unrestricted)
function ResultAsBool(input : Result) : Bool {
    input == One
}