Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Унру Д. — Квантовые языки программирования.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
25.49 Кб
Скачать

3.4. Расширение классических языков

Классические языки программирования являются хорошо известной областью знаний. Поэтому выглядит вполне выгодным использование существующих классических языков, которые удовлетворяют нашим потребностям, предварительно расширив их для обработки квантовой информации. Это желание порождает естественный подход к проектированию квантовых языков программирования. Кратко его можно описать при помощи следующего рецепта:

  • Возьмите классический вероятностный язык программирования (в целях упрощения мы предполагаем, что взят императивный язык).

  • Добавьте новый тип данных: ссылка на кубит (то есть индекс кубита в классическом состоянии).

  • Глобальное состояние содержит всю информацию, необходимую для исполнения программы (например, классические переменные, указатели на инструкции). Дополните это глобальное состояние вектором в достаточно большом гильбертовом пространстве (квантовое состояние системы).

  • Определите элементарные операции над кубитами (например, унитарные преобразования, измерение): формально такие операции принимают на вход ссылку на кубиты, а затем модифицирует глобальное состояние в качестве побочного эффекта. Но с точки зрения программиста такая операция выполняет действия непосредственно над кубитами.

На этом гибридном подходе основаны такие формальные квантовые языки программирования, как QPAlg [LJ04], CQP [GN04] и лямбда-исчисление в [Val04, SV04] (см. раздел 3.6).

Также необходимо отметить, что практические языки программирования QCL [Ome03a, Ome03b] и Q [BCS03], описанные в разделе 2, также основаны на этом подходе.

Некоторое внимание необходимо уделить тому, что не должно быть операций, которые выполняют над разными ссылками на один и тот же кубит действия в одно и то же время, поскольку у этого нет хорошо определённого физического смысла (это позволит клонировать состояние). Одним из подходов является выброс ошибки времени исполнения (то есть, если такая операция вызывается, то необходимо проверять, являются ли кубиты разными), а другим подходом предполагается использование подходящей системы типизации, которая проверяет это условие во время компиляции, то есть невозможно написать правильную программу, которая применяет операцию к неразличимым кубитам. Языками программирования, которые используют такую ситсему типизации, являются лямбда-исчисления, описанные в [vT04, Val04, SV04] (см. раздел 3.6).

Однако и у этого подхода есть некоторые проблемы. Во-первых, вышеприведённый рецепт подразумевает подход, основанный на унитарных операциях, и расширение его до использования операторов плотности может быть нетривиальным. Во-вторых, поскольку мы явным образом ссылаемся на глобальное состояние, нет необходимости напрямую переносить это в функциональные языки программирования. В-третьих, этот подход не предоставляет семантику квантового ветвления, когда какая-то часть алгоритма выполняется в зависимости от значения кубита, но без разрушения суперпозиции этого кубита (см. раздел 3.5). Наконец, поскольку этот подход подразумевает чёткое разделение между квантовыми типами данных и классическим управлением, должны быть исключены высокоуровневые типы данных. Например, если функции рассматриваются в виде данных, то такое разделение является проблемой.