Квантове програмування є набором комп'ютерних мов програмування, які дозволяють запис квантового алгоритму з використанням конструкцій високого рівня[1]. Завдання квантових мов не полягає у тому, щоб надати інструмент для програмістів, а в тому, щоб надати інструменти для дослідників, щоб зрозуміти краще, як працюють квантові обчислення і як формально доводити коректність квантових алгоритмів.
Можна виділити дві основні групи квантових мов програмування: імперативні квантові мови програмування і функціональні квантові мови програмування.
Найбільш відомими представниками першої групи є QCL[2] і LanQ.[3]
Ведеться робота з розробки функціональних мов програмування для квантових обчислень. Приклади включають QPL Селінджера,[4] і Haskell-подібну мову QML, розроблену Алтенкірчом і Ґретажем.[5][6] Квантові мови програмування високого рівня, засновані на лямбда-численні, були запропоновані ван Тондером,[7] Селінджером і Валіроном[8] Аріґі і Довеком[9].
Оглядова стаття Саймона Ґея[10] надає інформацію про стан досліджень і всеосяжну бібліографію ресурсів про квантове програмування станом на 2007 рік.
Імперативні квантові мови програмування
Квантовий псевдокод
Квантовий псевдокод, запропонований Е. Кнілом, є першою формалізованою мовою для опису квантових алгоритмів. Він був введений, і, крім того, був тісно пов'язаний з моделлю квантової машини під назвою квантова машина з довільним доступом. Квантова машина з довільним доступом є віртуальною моделлю апаратних засобів для обчислень, і може виявитися корисною для інтерпретації квантових мов програмування. Моделі таких машин дозволяють вільно чергувати унітарне перетворення і вимірювання за допомогою квантового пристрою під керуванням класичного комп'ютера.
Квантовий пристрій міститиме велике, але скінченне число індивідуально адресованих квантових бітів, так само, як класичний чип пам'яті RAM містить велику кількість бітів.
Обчисленнями управлятиме класичний комп'ютер посилаючи послідовність команд, що мають форму "застосувати" унітарне перетворення U до кубітів I і J або "виміряти" кубіт I. Квантовий пристрій виконує ці інструкції і надає доступ до результатів вимірювань.
Квантова мова обчислень
Квантова мова обчислень (англ.Quantum Computation Language) — одна з перших реалізованих квантових мов програмування.[11] Її синтаксис нагадує синтаксис мови програмування C, а її класичні типи даних схожі на примітивні типи даних в C. Можна поєднувати класичний код і квантовий код в тій же програмі.
Базовим вбудованим квантовим типом даних в QCL є квантовий регістр куреґ (англ.qureg). Його можна інтерпретувати як масив кубітів (квантових бітів).
qureg x1[2]; // 2-кубітний квантовий регістр x1
qureg x2[2]; // 2-кубітний квантовий регістр x2
H(x1); // Операція Адамара на x1
H(x2[1]); // Операція Адамара на першому кубіті регістру x2
Оскільки інтерпретатор QCL використовує бібліотеку qlib для моделювання, за внутрішнім станом квантової машини під час виконання квантової програми можна спостерігати.
Найважливішою особливістю QCL є підтримка визначених користувачем операторів і функцій. Як і в сучасних мовах програмування, можна визначити нові операції, які можуть бути використані для маніпулювання квантовими даними. Наприклад:
operator diffuse (qureg q) {
H(q); // перетворення Адамара
Not(q); // інвертувати q
CPhase(pi, q); // Обертати якщо q=1111..
!Not(q); // скасувати інверсію
!H(q); // скасувати перетворення Адамара
}
визначає оператор інверсії щодо середнього значення, що використовується в алгоритмі Ґровера. Це дозволяє визначати алгоритми на вищому рівні абстракції і розширити бібліотеку функцій, доступних для програмістів.
Оператори - матриця 2х2, матриця 4x4, матриця 8x8, Rot, Mix, H, CPhase, SqrtNot, X, Y, Z, S, T
Процедури - вимірювання, дамп, скидання стану
Класичні
Арифметика - sin (синус), cos (косинус), tan (тангенс), log (логарифм), sqrt (корінь квадратний), ...
Комплексні - Re (взяття дійсної частини), Im (взяття уявної частини), conj (операція спряження).
Мова Q
Мова Q [12] — це друга реалізована імперативна квантова мова програмування.
Мова Q була реалізована як розширення мови програмування C++. Вона надає класи для основних квантових операцій, таких як QHadamard, QFourier, QNot і QSwap, які є похідними від базового класу QOP. Нові оператори можуть бути визначені за допомогою класового механізму C++.
Квантова пам'ять представлена класом Qreg.
Qreg x1; // однокубітний квантовий регістр з початковим значенням 0
Qreg x2(2,0); // двокубітний квантовий регістр з початковим значенням 0
Процес обчислення виконується за допомогою вбудованого імітатора. Дисперсне середовище може бути змодельоване з використанням параметрів імітатора.
Квантова Мова Обачних Команд
Квантова Мова Обачних Команд (qGCL, англ.Quantum Guarded Command Language) була означена П. Зуліані в його кандидатській дисертації.
Вона базується на мові обачних команд[en], створеній Едсґером Дейкстрою.
Її можна охарактеризувати як «мову опису квантових програм».
Інші
У вересні 2017 року на конференції Ignite компанія Microsoft представила квантову мову програмування власної розробки. На той час мова не мала назви. Окрім мови програмування компанія запропонувала і дві версії симулятора квантового комп'ютера: один працюватиме на локальному комп'ютері, інший — в хмарі Microsoft Azure. Мова та симулятор будуть доступні в наступних випусках Microsoft Visual Studio[13].
Функційні квантові мови програмування
За останні кілька років була запропонована низка квантових мов програмування на основі парадигми функційного програмування. Функційні мови програмування добре підходять для доведення коректності програм.
QFC і QPL
QFC і QPL — дві тісно пов'язані квантові мови програмування означені Пітером Селінджером. Вони відрізняються лише в їхньому синтаксисі: QFC використовує синтаксис блок-схем, в той час як QPL використовує текстовий синтаксис. Ці мови мають класичну систему керування, але можуть працювати на квантових або класичних даних. Селінджер дає денотаційну семантику для цих мов у категорії супероператорів[en].
QML
QML[14] — це Haskell-подібна квантова мова програмування, створена Алтенкірчом і Ґретажом.[5] На відміну від мови Селінджера QPL ця мова виконує дублювання, а не викидання, квантової інформації як примітивну операцію. Під дублюванням у даному контексті розуміється операція, яка перетворює у , і її не слід плутати з неможливою операцією клонування; автори стверджують, що це схоже на те, як спільне використання моделюється в класичних мовах. QML також вводить як класичні, так і квантові оператори керування, тоді як більшість інших мов покладаються на класичне керування.
Перша спроба визначити квантове лямбда-числення була зроблена Філіпом Мейміном у 1996 році[16]
Його лямбда-q-числення досить потужне, щоб виразити будь-які квантові обчислення. Проте, ця мова може ефективно розв'язувати NP-повні задачі, і, тому виглядає суворо строгішою, ніж стандартні квантові обчислювальні моделі (наприклад, квантова машина Тюрінґа або модель квантових схем). Тому лямбда-q-числення Мейміна, швидше за все, неможливо буде реалізувати на фізичному пристрої.
У 2003 році Андре ван Тондер означив розширення лямбда-числення, що підходить для доведення коректності квантових програм. Він також надав реалізацію на мові програмування Scheme.[17]
У 2004 році Селінджер і Валірон означили строго типізоване лямбда-числення для квантових обчислень із системою типів, заснованою на лінійній логіці[en].
Quipper
Мова Quipper[18] була опублікована в 2013 році.[19] Її реалізовано у вигляді вбудованої мови, використовуючи Haskell як мову-господаря.[20] З цієї причини квантові програми, написані на Quipper, записуються в Haskell, використовуючи надані бібліотеки. Наприклад, цей код реалізує підготовку суперпозиції
import Quipper
spos :: Bool -> Circ Qubit
spos b = do
q <- qinit b
r <- hadamard q
return r
Проект з відкритим кодом, розроблений IBM.[21] Створення та маніпуляція квантовими схемами здійснюється за допомогою Python, Swift або JavaScript. Результати отримують або за допомогою симуляторів, що працюють на власному пристрої користувача, симуляторів, що надаються IBM, або прототипів квантових пристроїв, що надаються IBM. Окрім можливості створювати програми з використанням базових квантових операцій, в пакеті Qiskit Aqua доступні алгоритми вищого рівня.[22] Qiskit базується на стандарті OpenQASM для представлення квантових ланцюгів і підтримуватиме контроль на рівні імпульсів квантових систем, як це визначено стандартом OpenPulse.[23]
↑Quipper. Архів оригіналу за 30 Квітня 2016. Процитовано 16 Квітня 2016.
↑Alexander S. Green, Peter LeFanu Lumsdaine, Neil J. Ross, Peter Selinger, Benoît Valiron. The Quipper Language (website). Архів оригіналу за 30 Квітня 2016. Процитовано 16 Квітня 2016.