- •Уважаемый читатель!
- •Введение в квантовое программирование на языке Quipper Грин а. С., Лумсдайне п. Л., Росс н. Дж., Зелингер п., Валирон б.
- •Аннотация
- •1. Введение
- •1.1. Обзор
- •1.2. Язык Quipper как встроенный язык программирования
- •1.3. Схемная модель языка Quipper
- •2. Язык Quipper в примерах
- •2.1. Квантовая телепортация
- •2.2. Квантовое преобразование Фурье и квантовое сложение
- •2.3. Квантовые схемы из классических функций
- •3. Окончательные замечания
- •3.1. Масштабируемость и оценка ресурсов
- •3.2. Искусство
- •3.3. Заключение
- •Список источников
1.2. Язык Quipper как встроенный язык программирования
Язык Quipper был реализован в виде встроенного языка программирования, для которого основным языком является язык Haskell. Поэтому язык Quipper можно рассматривать как совокупность типов данных, комбинаторов и библиотек функций языка Haskell, однако совместно с дополнительной идиомой, то есть предпочтительным стилем написания программ на этом встроенном языке. В этой статье мы описываем язык Quipper так, как если бы это был язык программирования сам по себе, то есть мы не предполагаем никаких знаний языка Haskell у читателя.
В то время как подход с построением встроенного языка программирования имеет много преимуществ (см. [6, гл. 1.3], где представлено общее обсуждение вопроса), есть и определённые потенциальные ловушки, о которых должны знать программисты. Одной из них является искушение использовать основной языке, то есть в данном случае написание программ на языке Haskell, а не следование идиоме языка Quipper. Это может нарушить используемые абстракции и сделать программу менее переносимой в случае изменения реализации. Другой недостаток подхода встраиваемого языка заключается в том, что часто ошибки компиляции сложно расшифровать, потому что компилятор представляет их в терминах базового, а не встроенного языка. Наконец, в то время как язык Haskell во всех отношениях является прекрасным базовым языком программирования, в частности для модели квантовых вычислений есть действительно два важных недостатка: отсутствие линейных типов и отсутствие зависимых типов, поэтому мы должны проверять некоторые свойства программ во время выполнения, хотя они в принципе могли бы быть проверены системой типизации во время компиляции.
1.3. Схемная модель языка Quipper
Язык Quipper использует расширенную схемную модель в рамках квантовых вычислений. В рамках квантовой схемы позволена как квантовые, так и классические данные и операции над ними. Квантовыми операциями можно управлять с помощью классических данных, но не наоборот. Квантовые данные могут быть явно измерены, в результате чего будут созданы классические данные. Схемная модель языка Quipper также включает в себя явно определённые области действия вспомогательных кубитов, что позволяет для них быть использованными только в той части схемы, в которых они действительно используются. Это достигается путём позволяя явной инициализации и уничтожения кубита в цепи.
Использование схемной модели приводит к трём различным этапам выполнения программы: компиляция, время генерации схемы и время исполнения схемы. Это, в свою очередь, приводит к дополнительному различию между входными данными. Входные данные, значение которых известно на стадии генерации схемы, называются параметрами, тогда как входные данные, значение которых известно только во время исполнения схемы, будут так и называться входными данными. Чтобы сохранить это различие явным, в языке Quipper вводится три основных типа для битов и кубитов. Мы используем тип Bool для логического параметра, значение которого известно на стадии генерации схемы, тип Bit для классических булевских входных данных, а также тип Qubit для квантовых входных данных схемы. Параметр типа Bool может быть легко преобразован к входному значению типа Bit, но не наоборот. Кроме того, поскольку измерения могут происходить только во время исполнения схем, типом результата измерения является Bit, а не Bool.
