Внедрение Q# в ваши любимые языки и платформы (Python, .NET, ASP.NET, Julia, Lua, PowerShell)

Не секрет, что Q# и Quantum Development Kit позволяют легко писать квантовые программы и запускать их на симуляторах и на оборудовании через службу Azure Quantum, с использованием Python, .NET или даже через Jupyter Notebook. Более того, инфраструктура, которая поддерживает все эти различные способы использования Q#, также позволяет создавать новые и захватывающие способы написания и выполнения квантовых программ. В этой статье мы немного рассмотрим эту инфраструктуру и то, как вы можете использовать эту инфраструктуру для подключения Q# к вашим любимым языкам и платформам.

Python и Interactive Q#

Для начала давайте посмотрим, как Q# подключается к таким платформам, как Python и Jupyter. Обе платформы в значительной степени ориентированы на интерактивное использование, при котором программы не обязательно предварительно компилируются, а создаются разработчиками по частям.

image-loader.svg

Само по себе это сильно отличается от того, как можно использовать Q# из командной строки или при создании приложения .NET, использующего квантовые вычисления. Чтобы Q# работал в интерактивной среде, Quantum Development Kit также включает IQ#, сокращенно от Interactive Q# и следуя схеме именования, популяризированной IPython, IJulia и другими подобными инструментами. Ядро IQ# использует компилятор и среду выполнения Q# в качестве библиотеки, что позволяет ему на лету вызывать компилятор и среду выполнения Q#. Это тот же подход, который используется многими другими инструментами, включенными в Quantum Development Kit, такими как интерфейс командной строки компилятора Q# (qsc.exe) или языковой сервер, используемый расширениями Visual Studio Code и Visual Studio 2019.

Использование ядра IQ# из Q# notebookИспользование ядра IQ# из Q# notebook

Когда ядро IQ# получает сообщения от клиентов Jupyter, оно передает исходный код Q# компилятору, возвращая программы, которые можно запускать на симуляторах или отправлять в службы Azure Quantum. Такой подход позволяет нам подключать интерактивные среды, такие как Jupyter, к остальной части Quantum Development Kit. С точки зрения платформы Jupyter ядро IQ# — это просто еще один исполняемый файл; То, что ядро IQ# написано с использованием .NET, на тот момент является деталью реализации.

Тот же подход также позволяет использовать Python в качестве основного языка для ваших квантовых программ. В частности, пакет jupyter_client можно использовать для вызова из хост-программы Python в любое ядро, распознаваемое платформой Jupyter. Пакет qsharp для Python использует jupyter_client для загрузки IQ#, отправки команд ядру и получения обратно расширенных отображаемых данных. За кулисами ваша хост-программа Python действует как другой клиент Jupyter, обмениваясь сообщениями с ядром IQ#, чтобы вы могли создавать свою программу Q# из среды со сценариями.

Использование ядра IQ# из программы PythonИспользование ядра IQ# из программы Python

Вызов квантовых программ из Julia? Lua…? PowerShell…‽

Однако IQ# — это не просто исполняемая программа. Большая часть логики, которую IQ# использует для взаимодействия с компилятором Q# и средой выполнения, упакована в виде собственной библиотеки, доступной на NuGet.org в виде пакетов Microsoft.Quantum.IQSharp.Core и Microsoft.Quantum.IQSharp.Jupyter. Эти два пакета могут использоваться любыми другими приложениями .NET для реализации интеграции вашего собственного языка для Q#.

Например, мы можем написать небольшое приложение C#, которое использует библиотеку IQ#, чтобы предоставить компилятору Q# и среде выполнения серию простых сообщений JSON, которые легко отправлять и получать с других языков. Используя JSON.jl, мы можем написать клиент для этого нового приложения в Julia и использовать его для интерактивного создания квантовых приложений из среды Julia.

Вызов в Q# из JuliaВызов в Q# из Julia

Этот подход не ограничивается только Julia, но может использоваться в большинстве мест, где вы можете вызывать приложения командной строки. То же самое приложение C#, которое мы использовали выше, также можно быстро адаптировать, чтобы мы могли вызывать Q# из других языков, таких как Lua или даже PowerShell.

Вызов Q# из LuaВызов Q# из Lua Вызов Q# из PowerShellВызов Q# из PowerShell

→ Изучите примеры кода

Написание ботов с внедрением зависимостей

Однако мы можем пойти еще дальше и использовать IQ# в качестве библиотеки для встраивания Q# в веб-приложения и чат-ботов. Различные компоненты, составляющие IQ#, представлены пакетами Microsoft.Quantum.IQSharp.Core и Microsoft.Quantum.IQSharp.Jupyter как службы, которые можно добавлять в ваши собственные приложения с помощью внедрения зависимостей ASP.NET Core.

Изучим, что нужно сделать, чтобы добавить IQ# к боту в Discord:

public void ConfigureServices(IServiceCollection services)
{
     services
     // Добавьте службы, необходимые для работы в качестве приложения Discord. 
        .AddDiscord()
            // Добавьте службы логирования. 
            .AddLogging(
                builder => builder
                    .SetMinimumLevel(LogLevel.Debug)
                    .AddAzureWebAppDiagnostics()
                    .AddConsole()
                )
        // Добавьте сервисы, уникальные для этого бота. 
        .AddSingleton()
        .AddSingleton();

    // Добавьте сервисы, необходимые для работы с компилятором Q# и средой выполнения. 
    services.AddIQSharp();

    // Добавьте необходимые службы.
    services.AddRazorPages();
    services.AddServerSideBlazor();
}

Здесь AddIQSharp — это метод расширения, предоставляемый библиотекой IQ#, который добавляет службы IQ# в существующую коллекцию служб. Поскольку Discord.NET написан с использованием той же инфраструктуры внедрения зависимостей, вызов AddIQSharp позволяет нам немедленно запрашивать службы IQ# так же, как мы бы предоставляли сервисы Discord.NET:

public class SimulateModule : ModuleBase
{
    private readonly ISnippets snippets;
    private readonly IWorkspace workspace;
    private readonly ILogger logger;
    private static readonly Emoji waiting = new Emoji("⌛");

    public SimulateModule(
        ISnippets snippets, IWorkspace workspace,
        ILogger logger)
    {
        this.snippets = snippets;
        this.workspace = workspace;
        this.logger = logger;
    }

    // ...

Здесь команда нашего бота %simulate использует свой конструктор для запроса служб IQ#, таких как его фрагменты кода и менеджеры рабочей области, а также средство ведения журнала ASP.NET Core, используемое для предоставления отладочной информации.

Тот же подход можно использовать даже для предоставления REST API для компилятора Q# и среды выполнения! Например, веб-проект в репозитории microsoft/iqsharp использует IQ# вместе с ASP.NET Core, чтобы разрешить использование Q# через HTTP.

Итого

Какие бы инструменты и платформы вы ни любили, Q# и Quantum Development Kit помогут вам максимально эффективно использовать квантовые вычисления. Используя такие инструменты, как библиотека и ядро IQ#, вы можете легко расширить Q# для работы с широким спектром языков, платформ и экосистем.

© Habrahabr.ru