- •Уважаемый читатель!
- •1. Мотивация
- •2. Практические языки программирования
- •2.1. Язык qcl (Омер)
- •2.2. Язык q (Беттелли, Каларко, Серафини)
- •3. Формальные языки программирования
- •3.1. Императивные и функциональные языки
- •3.2. Языки для параллельных процессов
- •3.3. Физическая модель
- •3.4. Расширение классических языков
- •3.5. Полезные особенности и вызовы
- •3.6. Предлагаемые языки
- •4. Заключение
- •Список источников
3. Формальные языки программирования
Формальная спецификацию любого языка квантового программирования разделена на две части: синтаксис и семантику. Поскольку определение синтаксиса является хорошо понимаемой задачей, которая вряд ли значительно изменится из-за квантовой природы языка программирования, большинство научных работ о формальных языках квантового программирования сосредотачиваются на возможности моделирования семантики квантовых программ. В настоящем разделе мы обсудим некоторые различные возможные подходы к моделированию языков квантового программирования.
3.1. Императивные и функциональные языки
Первым и главным семантическим различием является различие между императивными и функциональными языками программирования. Императивные языки описываются при помощи спецификации того, как исполнение программы изменяет глобальное состояние. Императивный подход имеет два следующих преимущества: во-первых, он напрямую моделирует то, как работает аппаратное обеспечение, поэтому это делает более простой реализацию таких языков прграммирования. Во-вторых, разработчики без знаний в области формальных грамматик находят императивный подход более естественным; фактически программирование в большей части осуществляется на императивных языках, таких как C++ и Java. С другой стороны программы на функциональных языках отображают входные данные в выходные результаты, и сложные программы построены из элементарных функций. Этот подход, в отличие от императивного, больше заостряет внимание на движении данных, и обычно программы проще анализировать и определять формально. В частности, проверка типов во время компиляции намного проще делается в функциональных языках программирования.
В этом свете не является сюрпризом то, что практические языки, описанные в разделе 2, следуют императивной парадигме. Другим примером императивного подхода является исчисление процессов (см. раздел 3.2) и моделирование программ в качестве измерений [Unr04a] (см. раздел 3.6). Более того, язык программирования QPL [Sel04] (см. раздел 3.6), несмотря на то, что является функциональным, имеет внешнюю форму императивного языка, так что может быть с лёгкостью использован разработчиком, знакомым с императивным подходом.
В качестве примеров функциональных языков программирования можно привести лямбда-исчисления [vT04, Val04, SV04, AD04] (см. раздел 3.6). Лямбда-исчисления представляют собой такие языки программирования, в которых особенностью является восприятие функций в качестве данных, то есть функции могут передаваться в другие функции в качестве аргументов. Ключевым моментом при разработке квантового лямбда-исчисления является то, должны ли функции восприниматься в качестве классических данных, либо функции так же могут представлять собой квантовые данные, то есть переменная может содержать суперпозицию различных функций с совершенно различным программным кодом. Языки программирования, описанные в [vT04, Val04, SV04], требуют, чтобы функции были классическими, в то время как в [AD04] описан квантовый тип данных, представляющий функцию (см. раздел 3.6). Однако открытым остаётся вопрос, насколько такой тип данных физически реализуем, поскольку до сих пор не ясно, как этот тип данных свести к набору примитивных квантовых операций (таких, как манипуляции над кубитами). Насколько известно автору, до сих пор нет информации о том, как физически реализовать кодирование функций в качестве квантовых данных.
