Neuerungen im Azure Quantum Development Kit (Modern QDK)

Das moderne QDK ist die neueste Version der Q#-Sprache und der Entwicklungstools. Mit einem geringeren Speicherbedarf und schnellerer Leistung ist es eine Visual Studio Code-Erweiterung mit einem Klick und bietet Sprachverbesserungen, integrierte Python- und Jupyter Notebook-Unterstützung, neue Syntaxhervorhebung, Debuggerunterstützung, Unterstützung von Projekten mit mehreren Dateien, Fehlermeldungen und integrierte Azure-Konnektivität. Durch die Beseitigung der Abhängigkeiten des vorherigen klassischen QDK ist es jetzt wirklich plattformunabhängig und wird unter Windows, Mac, Linux und dem Web ausgeführt.

Visual Studio Code-Integration

Das moderne QDK ist eng in die Visual Studio Code-Entwicklungsumgebung integriert. Neue verfügbare Funktionen:

  • Eine neue Ressourcenschätzung für VS Code, die Sie lokal ausführen können, ohne dass ein Azure-Konto erforderlich ist
  • Ein Q#-Debugger für das integrierte Debuggen mit Haltepunkten, Schrittschritten und der Ansicht lokaler und Quantenvariablen
  • Unterstützung für Q#-Projekte mit mehreren Dateien
  • Verbesserungen des Sprachservers mit Fehlermessaging, Syntaxhervorhebung, Codevervollständigen, Hover-Informationen und Wechseln zu Definitionen
  • Integrierte Azure-Arbeitsbereichskonnektivität und Auftragsübermittlung
  • Ein integrierter Sparsesimulator (rauschfrei)
  • Jupyter Notebook Integration mit Q#-Codierung in Zellen und Syntaxherhebung
  • QIR-Generierung für Q#-Programme

In Kürze verfügbar

  • Integriertes Hybrid Computing mit adaptivem Profil wird mit dem modernen QDK noch nicht unterstützt. Wenn Sie Hybrid Computing-Projekte ausführen müssen, lesen Sie Weiterarbeiten im klassischen QDK.

Veraltete Features

  • Unterstützung für Visual Studio
  • Unterstützung für .NET-Sprachen und -Projekte
  • Der IQ#-Kernel und magic-Befehle für Jupyter Notebooks. Ausführliche Informationen zur Verwendung von Q# und Jupyter Notebooks finden Sie unter Jupyter Notebook Integration und Migrieren Ihres Codes.

Q#-Sprachupdates

Da sich quantenerkenntnisse und -innovationen in rasantem Tempo weiterentwickeln, entwickeln sich die Q#-Sprache und das Azure Quantum Development Kit weiter, um aktuelle und zukünftige Anforderungen an die Quantenentwicklung zu erfüllen. In den folgenden Abschnitten werden die Änderungen, Updates und Verbesserungen im modernen QDK beschrieben.

Sprachsyntaxupdates

Ausdrucksbasiert

Die Q#-Sprache ist jetzt ausdrucksbasiert und nicht auf Anweisungsbasis. Dies ermöglicht die neue Verwendung vorhandener Syntax, z. B. das Einbetten eines if-Ausdrucks in einen anderen Ausdruck:

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

Implizite Rückgabe

Im vorherigen Beispiel wird auch die Verwendung von -Anweisungen ohne nachfolgendes Semikolon am Ende eines Blocks genutzt, um einen Wert aus diesem Block zurückzugeben. Dieses Muster kann anstelle expliziter Rückgabeausdrücke in einem aufrufbaren verwendet werden:

function ReturnsThree() : Int {
    return 3;
}

function AlsoReturnsThree() : Int {
    3
}

Blockausdrücke

Q# unterstützt jetzt Blockausdrücke, die mehrere Zeilen, Bereichsvariablen organisieren und einen Wert zurückgeben können:

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

Items as-Anweisungen

Elemente wie newtype, operationund function sogar open können jetzt als Anweisungen innerhalb eines lokalen Bereichs angezeigt werden. Dies ermöglicht die Definition lokaler Hilfstypen und aufrufbarer Typen sowie bereichsbezogener Includes. Beispielsweise kann eine lokale Hilfsfunktion definiert werden, bevor sie benötigt wird:

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]
}

Sowohl die Funktion SubOne als auch das Öffnen des Microsoft.Quantum.Arrays Namespaces sind auf die ShowDecrement Funktion ausgerichtet und wirken sich nicht auf Code außerhalb dieses Bereichs aus.

Namensschattierung

Q# ermöglicht jetzt das Shadowing von aufgelösten Namen, bei denen dies zuvor nicht zulässig war. Dies ermöglicht eine einfachere Wiederverwendung von Code, der Variablen- oder aufrufbare Namen enthält, ohne dass eine veränderliche Variable erforderlich ist:

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

Explizite Typen für lokale Variablen

Lokale Variablen können jetzt explizit mit der gleichen Syntax wie Typen für aufrufbare Argumentdeklarationen eingegeben werden:

let x : Int[] = [];

Explizite Typen sind nicht erforderlich, können aber manchmal hilfreich sein, wenn Typambiguität für Funktionen aufgelöst wird, die Generics akzeptieren, z Length. B. . Das vorherige Muster für die Behandlung dieses Vorgangs – hinzufügen konkreter Typen zu einem generischen Funktionsaufruf mit Syntax wie Length<Int[]>([]); – wird nicht mehr unterstützt.

Implizites Namespace-Prälude

Die Namensauflösung enthält nun ein implizites Präludieren, bei dem es sich um eine Reihe von Namespaces handelt, die so behandelt werden, als ob sie geöffnet worden seien, solange keine anderen aufgelösten Namen sie ersetzen. Die Namespaces, die auf diese Weise behandelt werden, sind Microsoft.Quantum.Core, Microsoft.Quantum.Canonund Microsoft.Quantum.Intrinsic. Diese müssen nicht explizit geöffnet werden, es sei denn, sie verwenden Aliase oder unterscheiden sich anderweitig von potenziellen Konflikten.

Standardbibliothek

Die Q#-Standardbibliothek wird jetzt im gleichen Repository wie der Compiler und die Runtime gehostet und befindet sich im Bibliotheksordner der obersten Ebene. Nicht alle Funktionen und Features wurden aus den klassischen Q#-Bibliotheken migriert, auf die weiterhin unter https://github.com/microsoft/QuantumLibrarieszugegriffen werden kann. Wenn ein Element aus der vorherigen Bibliothek für ein Programm benötigt wird, können dieses Element und alle Abhängigkeiten in das Quellprogramm kopiert werden. Wenn Bibliotheksfunktionen für einen Workflow wichtig sind und für die Aufnahme in die neue Standardbibliothek in Betracht gezogen werden sollten, melden Sie ein GitHub-Problem mit den Details.

Simulation

Standardmäßige Sparsesimulation

Das moderne QDK verwendet einen integrierten Quantensimulator für den Sparsezustand als Standard target für die lokale Simulation. Dieser Simulator ist in Rust geschrieben und stammt aus dem QIR Runner-Repository , sodass er in WASM kompiliert und in einer Vielzahl von Umgebungen ausgeführt werden kann. Derzeit ist dies das einzige Simulations-Back-End, das im QDK verfügbar ist, obwohl andere Back-Ends für die zukünftige Integration in Betracht gezogen werden. Weitere Informationen zum Entwurf der Sparsesimulation finden Sie unter Testen großer Quantenalgorithmen mithilfe der Sparsesimulation.

Strengere Überprüfungen für Qubit-Release

Das klassische QDK hatte in der Vergangenheit die Anforderung gelockert, dass Sich Qubits im Bodenzustand oder |0⟩ befinden, bevor sie am Ende ihres Bereichs freigegeben wurden, sodass ein qubit, das gemessen und nicht weiter betrieben wurde, auch sicher freigegeben werden konnte, da der Simulator das Qubit automatisch zurücksetzte. Dies führte jedoch zu Verwirrung, wenn dasselbe Programm auf echter Quantenhardware ausgeführt wurde, bei der eine solche automatische Zurücksetzung nicht vorhanden ist und Qubits möglicherweise in einem unerwarteten Zustand wiederverwendet werden. Für das moderne QDK haben wir zu dem strengeren Verhalten der Erzwingung, dass Qubits bei der Veröffentlichung im Grundzustand sein müssen, zurückgegeben. Dies hilft Algorithmusautoren, das Verhalten ihres Algorithmus auf Richtigkeit zu überprüfen, um die Ausführung auf Hardware vorzubereiten.

Zerlegte multikontrollierte Gates

Das moderne QDK verwendet jetzt Analysestrategien für multikontrollierte Gates. Dies nutzt zwar keine Tastenkombinationen, die für die Simulation verfügbar sind, bei der multigesteuerte Gates leicht implementiert werden können, entspricht aber eher dem Verhalten physischer Quantensysteme. Dies bedeutet, dass bei der Ausführung eines Gates mit einer großen Anzahl von Kontrollqubits zusätzliche Qubitzuordnungen und Vorbereitungsgates anfallen, genau wie bei der Kompilierung für die Ausführung auf Hardware. Weitere Informationen zu den verwendeten Analysealgorithmen finden Sie in der Implementierung in der Standardbibliothek.

QIR-Generation

Das moderne QDK erzeugt QIR, indem die Textdarstellung von LLVM (.ll) generiert wird, anstatt Bitcode (.bc) zu verwenden. Die meisten targets Tools und, die Bitcode akzeptieren, können auch textbezogene LLVM analysieren, einschließlich Tools wie PyQIR und QIR Runner.

Das moderne QDK ist derzeit auf die QIR-Generation für Programme beschränkt, die mit dem QIR-Basisprofil kompatibel sind. Wenn die Kompilierung des Basisprofils konfiguriert ist, erzeugen der Compiler und die VSCode-Erweiterung Fehler für Muster, die nicht mit dem targetkompatibel sind. Der Compiler kann auch die Kompilierung von Elementen mit Attributen, die angeben, dass sie für eine bestimmte Kompilierung targetsspezifisch sind, bedingt überspringen:

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