你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Quantum 开发工具包中的新增功能 (新式 QDK)

新式 QDK 是最新版本的 Q# 语言和开发工具。 它占用空间更小,性能更快,是一键式Visual Studio Code扩展,具有语言改进、集成的 Python 和Jupyter Notebook支持、新语法突出显示、调试器支持、多文件项目支持、错误消息和集成的 Azure 连接。 通过消除以前的经典 QDK 的依赖项,它现在真正独立于平台,在 Windows、Mac、Linux 和 Web 上运行。

Visual Studio Code 集成

新式 QDK 紧密集成到Visual Studio Code开发环境中。 新的功能包括:

  • 适用于 VS Code 的新 资源估算器 ,无需 Azure 帐户即可在本地运行
  • 用于集成调试的 Q# 调试器 ,其中包含断点、单步执行以及局部变量和量子变量视图
  • 支持多文件 Q# 项目
  • 语言服务器改进,包括错误消息、语法突出显示、代码完成、悬停信息和转到定义
  • 集成的 Azure 工作区连接 和作业提交
  • 内置稀疏 (无噪音) 模拟器
  • Jupyter Notebook与单元格中的 Q# 编码和语法突出显示集成
  • Q# 程序的 QIR 生成

即将推出

  • 新式 QDK 尚不支持具有自适应配置文件的集成混合计算。 如果需要运行混合计算项目,请参阅 继续在经典 QDK 中工作

弃用的功能

  • 支持 Visual Studio
  • 支持 .NET 语言和项目
  • 适用于 Jupyter Notebook 的 IQ# 内核和 magic 命令。 有关使用 Q# 和 Jupyter Notebook 的详细信息,请参阅Jupyter Notebook集成迁移代码

Q# 语言更新

随着量子发现和创新不断快速发展,Q# 语言和 Azure Quantum 开发工具包不断发展,以满足当前和未来的量子开发需求。 以下部分介绍新式 QDK 中的更改、更新和改进。

语言语法更新

基于表达式

Q# 语言现在 基于表达式 ,而不是 基于语句。 这允许新使用现有语法,例如将 if-expression 嵌入到另一个表达式中:

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

隐式返回

上一个示例还利用在块末尾不使用尾随分号的语句从该块返回值。 可以在可调用项中使用此模式,而不是显式返回表达式:

function ReturnsThree() : Int {
    return 3;
}

function AlsoReturnsThree() : Int {
    3
}

块表达式

Q# 现在支持块表达式,这些表达式可以组织多行、作用域变量并返回值:

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

项作为语句

、 和 opennewtypeoperationfunction项现在可以在本地范围内显示为语句。 这允许定义本地帮助程序类型和可调用项,以及作用域包含。 例如,可以在需要本地帮助程序函数之前对其进行定义:

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

函数 SubOne 和命名空间的 Microsoft.Quantum.Arrays 打开范围都限定为 函数, ShowDecrement 不会影响该函数之外的代码。

名称隐藏

Q# 现在允许对以前不允许的已解析名称进行隐藏。 这样就可以更轻松地重用包含变量或可调用名称的代码,而无需可变变量:

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

局部变量的显式类型

现在,可以使用与可调用参数声明的类型相同的语法显式键入局部变量:

let x : Int[] = [];

显式类型不是必需的,但有时在解析接受泛型的函数的类型歧义时很有用,例如 Length。 不再支持以前用于处理此情况的模式(使用等 Length<Int[]>([]); 语法向泛型函数调用添加具体类型)。

隐式命名空间前奏

名称解析现在包含一个隐式前奏,这是一组命名空间,只要没有其他已解析名称取代它们,这些命名空间就被视为已打开。 以这种方式处理的命名空间为 Microsoft.Quantum.CoreMicrosoft.Quantum.CanonMicrosoft.Quantum.Intrinsic。 除非使用别名或以其他方式区分潜在冲突,否则不需要显式打开它们。

标准库

Q# 标准库现在托管在编译器和运行时所在的存储库中,可以在 顶级库文件夹中找到。 并非所有功能和功能都已从经典 Q# 库迁移,这些库仍可在 上 https://github.com/microsoft/QuantumLibraries访问。 如果某个程序需要上一个库中的项,则可以将该项和任何依赖项复制到源程序中。 如果任何库功能对工作流至关重要,并且应考虑将其包含在新的标准库中,请提交 GitHub 问题 ,并提供详细信息。

模拟

默认情况下稀疏模拟

新式 QDK 使用内置的稀疏状态量子模拟器作为本地模拟的默认 target 模拟器。 此模拟器是用 Rust 编写的,来自 QIR 运行器 存储库,允许它编译为 WASM 并在各种环境中运行。 目前,这是 QDK 中唯一可用的模拟后端,但考虑将来集成时会考虑其他后端。 有关稀疏模拟设计的详细信息,请参阅 使用稀疏模拟测试大型量子算法

更严格的量子比特释放检查

经典 QDK 历来放宽了量子比特在范围结束时释放之前处于地面或 |0⟩ 状态的要求,这样,已测量且未在任何其他位置上操作的量子比特也可以安全地释放,因为模拟器会自动重置量子比特。 但是,当同一程序在实际量子硬件上运行时,如果不存在此类自动重置,并且量子比特可能以意外状态重复使用,这会导致混淆。 对于新式 QDK,我们回到了更严格的行为,即强制要求量子比特在发布时处于基本状态。 这有助于算法作者验证其算法的行为是否正确,以便为在硬件上运行做准备。

分解的多控制门

新式 QDK 现在对多控制门使用分解策略。 虽然这不会利用可用于模拟的快捷方式,其中多控制门易于实现,但它与物理量子系统的行为更匹配。 这意味着,使用大量控制量子比特执行门将产生额外的量子比特分配和准备入口,就像编译在硬件上执行时一样。 有关所用分解算法的更多详细信息,请参阅 标准库中的实现。

QIR 生成

新式 QDK 通过生成 LLVM (.ll) 的文本表示形式而不是使用位代码 (.bc) 来生成 QIR。 大多数 targets 接受位代码的工具还可以分析文本 LLVM,包括 PyQIRQIR 运行器等工具。

新式 QDK 目前仅限于与 QIR 基本配置文件兼容的程序的 QIR 代系。 配置基配置文件编译后,编译器和 VSCode 扩展会为与 target不兼容的模式生成错误。 编译器还可以有条件地跳过具有属性的项的编译,这些属性指示它们特定于特定编译 targets:

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