在本书中我们经常会发现,以重新审视类似的经典概念的方式来解释一个量子概念是有用的。具体来说,让我们回头看看什么是经典程序。
定义 “程序”是一连串的指令,它可以被经典计算机解释为执行一项预期的任务。税单、驾驶指南、菜谱和Python脚本都是程序的例子。
我们可以编写经典程序来分解各种不同的任务,以便由各种不同的计算机来解释。一些程序的例子见图1.4。
我们来看一个简单的“Hello, world!”程序在Python中会是怎样的:
>>> def hello():
... print("Hello, world!")
...
>>> hello()
Hello, world!
图1.4 经典程序示例。税单、地图指示和菜谱都是由经典计算机(或人)解释一连串指令的示例。这些示例看起来可能非常不同,但每一个示例都用一个步骤列表来传达一个程序
最基本的是,这个程序可以认为是给Python“解释器”的一连串指令,然后依次执行每条指令来实现某种效果——本例中是向屏幕打印一条信息。也就是说,这个程序是对一个任务的“描述”,然后由Python“解释”,接下来由CPU解释,以完成我们的目标。这种描述和解释之间的相互作用促使我们把Python、C和其他类似的编程工具称为“语言”,强调编程是我们与计算机的交流方式。
在使用Python打印“Hello, world!”的例子中,可以认为,我们是在与Python语言的创始设计师Guido van Rossum沟通。然后,Guido代表我们与我们正在使用的操作系统的设计者沟通。这些设计者又代表我们与英特尔、AMD、ARM或任何我们正在使用的CPU的设计公司沟通,等等。
与经典程序一样,量子程序由指令序列组成,这些指令被经典计算机解释为执行一项特定的任务。然而不同之处在于,在量子程序中,我们想完成的任务包括让量子系统执行一项计算。
因此,经典程序和量子程序中使用的指令也有所不同。一个经典程序可能会将“从互联网加载一些猫的图片”这种任务描述为网络栈的指令,并最终由类似“mov(移动)”的汇编指令描述。相比之下,像Q#这样的量子语言允许程序员用M(测量)这样的指令来表达量子任务。当量子硬件运行时,这些程序可以指示数字信号处理器将微波、激光或其他种类的电磁波送入量子设备,并放大从该设备传出的信号。
在本书,我们将看到许多说明量子程序所面临的要解决的(或至少是关注的)任务种类,以及可以使量子编程更容易的经典工具实例。例如,图1.5显示了一个在Visual Studio Code(一个经典的集成开发环境)中编写量子程序的示例。
图1.5 用QDK和Visual Studio Code编写量子程序。第7章中会讲解该程序的内容,但从高层面上来看,它与你可能做过的其他软件项目相似
我们将逐章建立起编写量子程序所需的概念,图1.6展示了其路线图。在第2章中,我们将学习构成量子计算机的基本构件,并用它们来编写我们的第一个量子程序,从而拉开学习的序幕。
图1.6 本书阐述了编写量子程序所需的概念。从第一部分开始,通过在Python中建立我们自己的模拟器,对模拟器和内在运算(考虑硬件API)进行低层次的描述。第二部分研究了Q#语言和量子开发技术,这将有助于我们开发自己的应用程序。第三部分展示了一些已知的量子计算的应用,以及我们在这项技术上的挑战和机遇