Az Azure Quantum Development Kit (Modern QDK) újdonságai

A Modern QDK a Q#nyelvi és fejlesztési eszközök legújabb verziója. Kisebb erőforrásigény és gyorsabb teljesítmény mellett egy kattintással elérhető Visual Studio Code-bővítmény, amely nyelvi fejlesztéseket, integrált Python- és Jupyter Notebook-támogatást, új szintaxiskiemelést, hibakeresési támogatást, többfájlos projekttámogatást, hibaüzeneteket és integrált Azure-kapcsolatot kínál. Az előző klasszikus QDK függőségeinek megszüntetésével már valóban platformfüggetlen, Windows, Mac, Linux és a weben fut.

Visual Studio Code-integráció

A Modern QDK szorosan integrálva van a Visual Studio Code fejlesztői környezetébe. Új funkciók többek között az alábbiak:

  • Új erőforrásbecslő a VS Code-hoz, amelyet helyileg futtathat, és nincs szükség Azure-fiókra
  • Q#-hibakereső az integrált hibakereséshez töréspontokkal, lépcsőkkel, helyi és kvantumváltozókkal
  • Többfájlos Q#-projektek támogatása
  • A nyelvi kiszolgáló fejlesztései a hibaüzenetekkel, a szintaxis kiemelésével, a kódkiegészítésekkel, az egérmutató adataival és a definíciók megtekintésével
  • Integrált Azure-munkaterületi kapcsolat és feladatbeküldés
  • Beépített ritka (zajmentes) szimulátor
  • Jupyter Notebook integráció a Q#-kódolással a cellákban és a szintaxis kiemelése
  • QIR-generáció Q#-programokhoz

Hamarosan elérhető

  • A modern QDK még nem támogatja az adaptív profillal rendelkező integrált hibrid számítástechnikát. Ha hibrid számítástechnikai projekteket kell futtatnia, olvassa el A klasszikus QDK használatának folytatása című témakört.

Elavult funkciók

  • A Visual Studio támogatása
  • .NET-nyelvek és -projektek támogatása
  • A Jupyter Notebooks IQ#-kernel- és magic parancsai. A Q#- és Jupyter-notebookok használatával kapcsolatos részletekért lásd: Jupyter Notebook integráció és a kód migrálása.

Q#-nyelvi frissítések

Ahogy a kvantumfelderítések és az innovációk gyors ütemben fejlődnek, a Q# nyelv és az Azure Quantum Development Kit folyamatosan fejlődik, hogy megfeleljen a jelenlegi és jövőbeli kvantumfejlesztési igényeknek. Az alábbi szakaszok a modern QDK változásait, frissítéseit és fejlesztéseit ismertetik.

Nyelvszintaxis frissítései

Kifejezésalapú

A Q#-nyelv mostantól kifejezésalapú a utasításalapú helyett. Ez lehetővé teszi a meglévő szintaxis új használatát, például ha-kifejezés beágyazását egy másik kifejezésbe:

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

Implicit visszatérés

Az előző példa azt is kihasználja, hogy a blokk végén záró pontosvesszőt nem tartalmazó utasításokat használ a blokkból származó érték visszaadásához. Ez a minta használható explicit visszatérési kifejezések helyett egy hívhatóban:

function ReturnsThree() : Int {
    return 3;
}

function AlsoReturnsThree() : Int {
    3
}

Blokkkifejezések

A Q# mostantól támogatja a blokkkifejezéseket, amelyek több sort, hatókörváltozót és értéket is visszaadhatnak:

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

Elemek utasításokként

Az olyan elemek, mint a newtype, operationfunction és még most is open megjelenhetnek utasításokként egy helyi hatókörön belül. Ez lehetővé teszi a helyi segédtípusok és hívható elemek, valamint a hatókörbe tartozók meghatározását. Egy helyi segédfüggvény például közvetlenül a szükséges előtt definiálható:

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

A függvény SubOne és a Microsoft.Quantum.Arrays névtér megnyitása is hatókörrel van elosztva a ShowDecrement függvényre, és nem befolyásolja azon kívül a kódot.

Név árnyékolása

A Q# mostantól lehetővé teszi a feloldott nevek árnyékolását, ahol ez korábban nem volt engedélyezve. Ez lehetővé teszi a változót vagy hívható neveket tartalmazó kód egyszerűbb újrafelhasználását anélkül, hogy egy változót kellene használnia:

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

Explicit típusok helyi változókhoz

A helyi változók mostantól explicit módon is beírhatók a hívható argumentum-deklarációk típusával megegyező szintaxissal:

let x : Int[] = [];

Az explicit típusok nem kötelezőek, de néha hasznosak lehetnek az általános függvényeket elfogadó függvények( például Length) kétértelműségének feloldásakor. Az előző kezelési minta – amely konkrét típusokat ad hozzá egy általános függvényhíváshoz, például Length<Int[]>([]); szintaxissal – már nem támogatott.

Implicit névtérelőtag

A névfeloldás mostantól tartalmaz egy implicit előtagot, amely olyan névterek halmaza, amelyek úgy vannak kezelve, mintha meg lettek volna nyitva, feltéve, hogy más feloldott nevek nem váltják fel őket. Az így kezelt névterek a következők: Microsoft.Quantum.Core, Microsoft.Quantum.Canonés Microsoft.Quantum.Intrinsic. Ezeket nem kell explicit módon megnyitni, kivéve, ha aliasokat használnak, vagy más módon különböznek a lehetséges ütközésektől.

Standard kódtár

A standard Q#-kódtár mostantól ugyanabban az adattárban található, mint a fordító és a futtatókörnyezet, és megtalálható a legfelső szintű könyvtármappában. Nem minden funkció és funkció lett migrálva a klasszikus Q#-kódtárakból, amelyek továbbra is elérhetők a címen https://github.com/microsoft/QuantumLibraries. Ha egy programhoz az előző kódtár egyik elemére van szükség, akkor az elem és a függőségek átmásolhatók a forrásprogramba. Ha valamelyik tárfunkció kritikus fontosságú egy munkafolyamathoz, és figyelembe kell venni az új szabványos kódtárba való felvételt, küldjön egy GitHub-problémát a részletekkel.

A szimuláció

Ritka szimuláció alapértelmezés szerint

A Modern QDK beépített ritka állapotú kvantumszimulátort használ alapértelmezettként target a helyi szimulációhoz. Ez a szimulátor a Rustban van megírva, és a QIR Runner adattárból származik, amely lehetővé teszi a WASM-re való fordítást és a különböző környezetek futtatását. Jelenleg ez az egyetlen olyan szimulációs háttérrendszer, amely elérhető a QDK-ban, bár a jövőbeli integráció során más háttérrendszereket is figyelembe kell venni. A ritka szimulációk tervezésével kapcsolatos további információkért lásd: Nagy kvantumalgoritmusok tesztelése ritka halmazszimulációval.

A qubit kiadásának szigorúbb ellenőrzése

A klasszikus QDK korábban enyhítette azt a követelményt, hogy a qubitek a hatókörük végén történő kiadásuk előtt a talajon vagy |0⟩ állapotban legyenek, így a mért és nem tovább működő qubitek is biztonságosak voltak, mivel a szimulátor automatikusan alaphelyzetbe állította a qubitet. Ez azonban zavart okozott, amikor ugyanazt a programot valós kvantumhardveren futtatták, ahol nincs ilyen automatikus visszaállítás, és a qubitek váratlan állapotban újra felhasználhatók. A Modern QDK esetében visszatértünk ahhoz a szigorúbb viselkedéshez, amely szerint a qubiteknek a kiadáskor földi állapotban kell lenniük. Ez segít az algoritmusok szerzőinek ellenőrizni az algoritmusuk viselkedését a hardveren való futtatás előkészítése során.

Több vezérlésű lebontású kapuk

A Modern QDK mostantól felbontási stratégiákat használ a több vezérlésű kapukhoz. Bár ez nem használja ki a szimulációhoz elérhető billentyűparancsokat, ahol a több vezérelt kapuk könnyen implementálhatók, jobban illeszkedik a fizikai kvantumrendszerek viselkedéséhez. Ez azt jelenti, hogy a nagy számú vezérlő qubittel rendelkező kapuk végrehajtása további qubit-foglalásokat és előkészítési kapukat fog eredményezni, ugyanúgy, mint a hardveres végrehajtásra fordítva. A használt felbontási algoritmusokkal kapcsolatos további részletekért lásd a standard kódtár implementációját.

QIR-generáció

A Modern QDK a bitkód (.bc) helyett az LLVM (.ll) szöveges megjelenítésének létrehozásával állítja elő a QIR-t. A bitkódot elfogadó eszközök többsége targets szöveges LLVM-et is képes elemezni, beleértve az olyan eszközöket is, mint a PyQIR és a QIR Runner.

A Modern QDK jelenleg a QIR-alapú profillal kompatibilis programok QIR-generációjára korlátozódik. Az alapprofil összeállítása konfigurálásakor a fordító és a VSCode-bővítmény hibát okoz azokkal a mintákkal kapcsolatban, amelyek nem kompatibilisek a targetparanccsal. A fordító feltételesen kihagyhatja az olyan elemek fordítását is, amelyek attribútumai azt jelzik, hogy az adott fordításra targetsjellemzőek:

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