Co nowego w zestawie Azure Quantum Development Kit (modern QDK)

Nowoczesny zestaw QDK to najnowsza wersja języka Q# i narzędzi programistycznych. Dzięki mniejszej wydajności i mniejszej wydajności jest to jednokrotne rozszerzenie Visual Studio Code oraz ulepszenia języka funkcji, zintegrowana obsługa języka Python i Jupyter Notebook, wyróżnianie nowej składni, obsługa debugera, obsługa projektów z wieloma plikami, komunikaty o błędach i zintegrowana łączność platformy Azure. Eliminując zależności poprzedniego klasycznego zestawu QDK, jest ona teraz naprawdę niezależna od platformy, działająca w systemach Windows, Mac, Linux i sieci Web.

integracja Visual Studio Code

Nowoczesny zestaw QDK jest ściśle zintegrowany ze środowiskiem deweloperów Visual Studio Code. Nowe funkcje obejmują:

  • Nowy narzędzie do szacowania zasobów dla programu VS Code, które można uruchomić lokalnie bez konta platformy Azure
  • Debuger języka Q# do zintegrowanego debugowania z punktami przerwania, krokami oraz widokiem zmiennych lokalnych i kwantowych
  • Obsługa projektów języka Q# z wieloma plikami
  • Ulepszenia serwera językowego dzięki komunikatom o błędach, wyróżnianiu składni, uzupełnianiu kodu, najechaniu kursorem na informacje i przechodzeniu do definicji
  • Zintegrowana łączność obszaru roboczego platformy Azure i przesyłanie zadań
  • Wbudowany symulator rozrzedliwy (wolny od szumu)
  • Jupyter Notebook integracji z kodowaniem języka Q# w komórkach i wyróżnianiu składni
  • Generowanie QIR dla programów języka Q#

Już wkrótce

  • Zintegrowane hybrydowe przetwarzanie z profilem adaptacyjnym nie jest jeszcze obsługiwane przy użyciu nowoczesnego zestawu QDK. Jeśli musisz uruchamiać projekty przetwarzania hybrydowego, zobacz Kontynuuj pracę w klasycznym zestawie QDK.

Przestarzałe funkcje

  • Obsługa programu Visual Studio
  • Obsługa języków i projektów platformy .NET
  • Jądra IQ# i poleceń magic dla notesów Jupyter Notebook. Aby uzyskać szczegółowe informacje na temat korzystania z języka Q# i notesów Jupyter Notebook, zobacz Jupyter Notebook integracji i migrowania kodu.

Aktualizacje języka Q#

Ponieważ odkrycia kwantowe i innowacje nadal ewoluują w szybkim tempie, język Q# i zestaw Azure Quantum Development Kit nadal ewoluują w celu spełnienia bieżących i przyszłych potrzeb związanych z programowaniem kwantowym. W poniższych sekcjach opisano zmiany, aktualizacje i ulepszenia nowoczesnego zestawu QDK.

Aktualizacje składni języka

Oparte na wyrażeniach

Język Q# jest teraz oparty na wyrażeniach zamiast opartych na instrukcjach. Umożliwia to nowe użycie istniejącej składni, takiej jak osadzanie wyrażenia if w innym wyrażeniu:

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

Niejawny zwrot

W poprzednim przykładzie skorzystamy również z instrukcji using bez końcowego średnika na końcu bloku, aby zwrócić wartość z tego bloku. Tego wzorca można użyć zamiast jawnych wyrażeń zwracanych w wywołaniu:

function ReturnsThree() : Int {
    return 3;
}

function AlsoReturnsThree() : Int {
    3
}

Wyrażenia blokowe

Język Q# obsługuje teraz wyrażenia blokowe, które mogą organizować wiele wierszy, zmiennych zakresu i zwracać wartość:

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

Elementy jako instrukcje

Elementy, takie jak newtype, operation, function i mogą open teraz być wyświetlane jako instrukcje w zakresie lokalnym. Pozwala to na zdefiniowanie lokalnych typów pomocników i elementów wywoływanych, a także zakres zawiera. Na przykład funkcję pomocnika lokalnego można zdefiniować tuż przed jej potrzebami:

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

Zarówno funkcja SubOne , jak i otwarcie Microsoft.Quantum.Arrays przestrzeni nazw są ograniczone do ShowDecrement funkcji i nie mają wpływu na kod poza tym.

Cieniowanie nazw

Język Q# umożliwia teraz cieniowanie rozpoznanych nazw, w których wcześniej było to niedozwolone. Dzięki temu można łatwiej używać kodu, który zawiera zmienne lub nazwy wywoływane bez konieczności wprowadzania zmiennej modyfikowalnej:

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

Jawne typy zmiennych lokalnych

Zmienne lokalne można teraz jawnie wpisać przy użyciu tej samej składni co typy dla wywoływanych deklaracji argumentów:

let x : Int[] = [];

Jawne typy nie są wymagane, ale czasami mogą być przydatne podczas rozpoznawania niejednoznaczności typów dla funkcji, które akceptują typy ogólne, takie jak Length. Poprzedni wzorzec obsługi tego — dodawanie konkretnych typów do wywołania funkcji ogólnej z taką składnią jak Length<Int[]>([]); — nie jest już obsługiwane.

Preludium niejawnej przestrzeni nazw

Rozpoznawanie nazw zawiera teraz niejawne preludium, które jest zestawem przestrzeni nazw, które są traktowane tak, jakby zostały otwarte, o ile żadne inne rozpoznane nazwy nie zastępują ich. Przestrzenie nazw, które są traktowane w ten sposób, to Microsoft.Quantum.Core, Microsoft.Quantum.Canoni Microsoft.Quantum.Intrinsic. Nie trzeba ich jawnie otwierać, z wyjątkiem sytuacji, gdy używasz aliasów lub inaczej różni się od potencjalnych konfliktów.

Standardowa biblioteka

Standardowa biblioteka języka Q# jest teraz hostowana w tym samym repozytorium co kompilator i środowisko uruchomieniowe i znajduje się w folderze biblioteki najwyższego poziomu. Nie wszystkie funkcje i funkcje zostały zmigrowane z klasycznych bibliotek języka Q#, do których nadal można uzyskać dostęp pod adresem https://github.com/microsoft/QuantumLibraries. Jeśli element z poprzedniej biblioteki jest wymagany dla programu, ten element i wszelkie zależności można skopiować do programu źródłowego. Jeśli jakakolwiek funkcja biblioteki ma kluczowe znaczenie dla przepływu pracy i powinna być brana pod uwagę podczas dołączania do nowej biblioteki standardowej, zgłoś problem z usługą GitHub ze szczegółami.

Symulacja

Symulacja rozrzedliwająca domyślnie

Nowoczesny zestaw QDK używa wbudowanego, rozrzedzonych symulatorów kwantowych stanu jako domyślnego target dla lokalnej symulacji. Ten symulator jest napisany w języku Rust i pochodzi z repozytorium QIR Runner , co umożliwia kompilowanie aplikacji WASM i uruchamianie w różnych środowiskach. Obecnie jest to jedyne zaplecze symulacji dostępne w zestawie QDK, choć inne zaplecza są brane pod uwagę pod kątem przyszłej integracji. Aby uzyskać więcej informacji na temat rozrzednego projektu symulacji, zobacz Testowanie dużych algorytmów kwantowych przy użyciu rozrzedliwej symulacji.

Bardziej rygorystyczne kontrole wersji kubitu

Klasyczny zestaw QDK historycznie złagodził wymaganie, aby kubity znajdowały się w stanie ziemi lub |0⟩ przed zwolnieniem na końcu ich zakresu, tak aby kubit, który został zmierzony i nie działał dalej, był również bezpieczny do zwolnienia, ponieważ symulator automatycznie resetuje kubit. Jednak spowodowało to zamieszanie, gdy ten sam program został uruchomiony na rzeczywistym sprzęcie kwantowym, w którym takie automatyczne resetowanie nie jest obecne, a kubity mogą być ponownie używane w nieoczekiwanym stanie. W przypadku nowoczesnego zestawu QDK wróciliśmy do ostrzejszego zachowania wymuszania, że kubity muszą znajdować się w stanie ziemi po wydaniu. Pomaga to autorom algorytmów weryfikować zachowanie algorytmu pod kątem poprawności w ramach przygotowań do działania na sprzęcie.

Rozłożone wielokontrolowane bramy

Nowoczesny zestaw QDK używa teraz strategii dekompozycji dla wielokontrolowanych bram. Chociaż nie korzysta to ze skrótów dostępnych do symulacji, w których bramy sterowane wieloma funkcjami są łatwo implementowane, jest ona ściślej zgodna z zachowaniem fizycznych systemów kwantowych. Oznacza to, że wykonanie bramy z dużą liczbą kubitów sterujących spowoduje naliczenie dodatkowych alokacji kubitów i bram przygotowania, tak samo jak w przypadku kompilacji na potrzeby wykonywania na sprzęcie. Aby uzyskać więcej informacji na temat używanych algorytmów dekompozycji, zobacz implementację w bibliotece standardowej.

Generowanie QIR

Nowoczesny zestaw QDK tworzy QIR, generując tekstową reprezentację maszyny WIRTUALNEJ LLVM (.ll) zamiast używać kodu bitowego (bc). Większość targets narzędzi, które akceptują kod bitowy, może również analizować tekstową maszynę LLVM, w tym narzędzia, takie jak PyQIR i QIR Runner.

Nowoczesny zestaw QDK jest obecnie ograniczony do generowania QIR dla programów zgodnych z profilem podstawowym QIR. Po skonfigurowaniu kompilacji profilu podstawowego kompilator i rozszerzenie VSCode generują błędy dla wzorców, które nie są zgodne z programem target. Kompilator może również warunkowo pominąć kompilację elementów, które mają atrybuty wskazujące, że są specyficzne dla konkretnej kompilacji targets:

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