Технологии
IBM открыла Qiskit для Fortran, C++ и Julia напрямую через C API поверх Rust-ядра
IBM Quantum выпустила нативные интерфейсы к Qiskit для трёх языков научных вычислений — Fortran, C++ и Julia. Все они опираются на C API, появившийся в Qiskit v2.0, и ведут напрямую к тому же высокопроизводительному Rust-ядру, что и Python SDK, поэтому квантовые схемы можно собирать и запускать без прослойки на Python.

Зачем работать с Qiskit вне Python
Qiskit — самый популярный в мире SDK для квантовых вычислений, и большинство знакомятся с ним через язык Python. Но Python — не единственная точка входа: начиная с версии Qiskit v2.0 SDK открывает C API к своей core data model — тому же высокопроизводительному Rust-ядру, на котором построен Python SDK.
Поскольку C совместим почти с любым языком программирования, один этот интерфейс открывает дверь ко многим другим. Три из них — Fortran, C++ и Julia — теперь позволяют работать с квантовыми схемами на том же языке, на котором написан остальной код научного расчёта, без слоя на Python. Ключевое следствие: все языковые привязки опираются на одну и ту же разделяемую библиотеку Qiskit, поэтому они интероперабельны — схему, собранную на Fortran, в принципе можно передать в C++, и она отработает без проблем, потому что обе привязки указывают на один и тот же объект.
Это важно, потому что, по убеждению IBM, квантовые вычисления дают преимущество в сочетании с классическими ресурсами, а не отдельно от них. Годы исследований в оптимизации, машинном обучении и симуляции сложных квантовых систем велись в основном не на Python: вычислительные ядра кодов по физике, химии и инженерии традиционно пишут на Fortran и C++, а всё чаще — на Julia. В сообществах HPC эти языки нередко несут саму науку, тогда как shell- или Python-скрипты лишь оркеструют отдельные части. Заставлять исследователей-прикладников привинчивать интерпретатор Python к своему существующему коду — неправильный путь.
Fortran: прямая привязка к C API
Fortran — один из старейших языков высокого уровня: он задумывался как «система перевода формул», позволяющая учёному записывать численные выражения напрямую и получать быстрый машинный код. Спустя десятилетия на нём по-прежнему держится значительная часть HPC и научных вычислений: на Fortran реализованы библиотеки линейной алгебры BLAS и LAPACK, а также рабочие коды квантовой химии — Gaussian, VASP, Quantum ESPRESSO, CP2K, GAMESS, NWChem — и ядерно-физические инструменты KSHELL, BIGSTICK, MFDn.
Чтобы приблизить квантовые вычисления к этим прикладным областям, IBM построила qiskit-fortran — интерфейс для сборки и работы с квантовыми схемами на Fortran. Его дизайн складывался в активном обсуждении с сообществом разработчиков Fortran, чтобы интерфейс естественно вписывался в существующие рабочие процессы.
Под капотом qiskit-fortran привязывается к Qiskit C API через стандартный foreign-function interface iso_c_binding, вызывая функции C API напрямую, — так что писать биндинги вручную не нужно. Эти вызовы доходят до того же Rust-ядра, что и Python SDK, нигде не проходя через Python. В qiskit-fortran QuantumCircuit — это derived type с деструктором FINAL, то есть схема освобождает память, когда переменная выходит из области видимости. Активный гамильтониан FCIDUMP из GAMESS, уже находящийся в памяти Fortran, передаётся в процедуру построения схемы Qiskit как прямой указатель — без копирования в Python-объекты, без GIL и без перераспределения памяти. Подробный пример приведён в туториале qiskit-fortran.
C++: header-only надстройка над C API
C++ начинался как расширение C классами, добавившее высокоуровневые абстракции без накладных расходов во время выполнения, — отсюда его роль рабочей лошадки в критичной по производительности симуляции: от молекулярной динамики LAMMPS и GROMACS до ускорительных слоёв CUDA и Kokkos, программирующих сегодняшние экзамасштабные машины.
qiskit-cpp — это header-only интерфейс к Qiskit C API. Достаточно добавить его заголовочные файлы в include path, слинковать программу с C-библиотекой Qiskit и один раз скомпилировать из дерева исходников Qiskit. Здесь QuantumCircuit — объект C++ с синтаксисом, близким к Python-варианту, и он сам освобождает память при выходе из области видимости. Запуск гибкий: схемы можно отправлять через клиент qiskit-ibm-runtime C, через QRMI или через SQC. Пример рабочего процесса есть в туториале qiskit-cpp.
Julia: самый мягкий вход
Julia создавалась, чтобы соединить скорость компилируемого языка с простотой динамического. Во многом это самый мягкий способ начать пользоваться Qiskit вне Python: собирать из исходников не нужно, и всё работает в Jupyter-ноутбуках, так что взаимодействие получается таким же, как в Python.
Qiskit.jl оборачивает Qiskit C API и предоставляет его как нативные типы Julia, поэтому управлять указателями C вручную не требуется. Построение схемы похоже на Python-синтаксис, но пакет предлагает и идиоматичный для Julia стиль. Та же стратегия привязки распространяется и на исполнение: QiskitIBMRuntime.jl, лёгкая обёртка над клиентом qiskit-ibm-runtime C, отправляет схемы на квантовое железо IBM и получает результаты. С этими двумя пакетами можно вести полный квантовый рабочий процесс на Julia и подключать его к остальной экосистеме языка — решателям дифференциальных уравнений вроде DifferentialEquations.jl, библиотекам оптимизации вроде Optimization.jl, а для проверки результатов — тензорно-сетевым симуляторам ITensors.jl и TensorNetworkQuantumSimulator.jl.
Симуляция квантовой динамики на 100 кубитах
В блоге разобран пример работы с Qiskit.jl: квантовый подход к уравнению Шрёдингера, описывающему, как квантовая система эволюционирует во времени под своим гамильтонианом. Квантовые компьютеры естественно приспособлены для этой задачи — они просто эволюционируют состояние, закодированное в кубитах; но поскольку эволюцию приходится выполнять дискретными квантовыми гейтами, её приближают методом Trotterization, разбивая динамику на малые шаги. Меньше шаг — ниже ошибка дискретизации, но глубже схема.
Тестовая система — transverse-field Ising model: одномерная цепочка спинов с ближайшим соседним взаимодействием, эволюционирующая из начального состояния Néel |0101…⟩. Рабочий процесс следует обычным четырём шагам: сопоставить задачу схеме, оптимизировать её под железо, выполнить и обработать результат; разница лишь в том, что здесь каждый шаг идёт на Julia. Эквивалент Python-вызова rx(θ, i) — идиоматичная для Julia мутирующая функция rx!(qc, θ, i) с восклицательным суффиксом, принимающая схему первым аргументом. Единственная тонкость — индексирование: Julia считает кубиты с 1, а Python — с 0.
На малом масштабе, скажем 20 кубитов, результаты железа можно сверить с классическим эталоном — точным решением через решатель OrdinaryDiffEq.jl и бесшумной тензорно-сетевой симуляцией. На 100 кубитах точное решение недостижимо: только вектор состояния потребовал бы около 2¹⁰⁰ ≈ 10³⁰ амплитуд, поэтому эталоном становится бесшумная тензорно-сетевая симуляция — но она надёжна лишь пока состояние остаётся слабо запутанным, обычно на ранних временах эволюции. Здесь и проявляется ценность квантового подхода: классически каждый дополнительный спин вдвое увеличивает вектор состояния, а на железе он отображается на один дополнительный кубит, и запутанность несёт железо, а не усечённый анзац. Так вопрос точности смещается от того, сколько корреляций способно выдержать классическое представление, к ошибке Троттера и шуму железа.
Что это значит для quantum-centric supercomputing
Тесная связка классического кода и квантовых инструкций — именно то, что делает Qiskit C API привлекательным для quantum-centric supercomputing (QCSC), подхода, позволившего получить первые демонстрации квантового преимущества. Квантовый вызов становится связанной подпрограммой внутри существующего кода симуляции, а не отдельным процессом или Python-субинтерпретатором для оркестровки. Все три пути — Fortran, C++ и Julia — обладают этим свойством: каждый доходит до Rust-ядра Qiskit напрямую, без интерпретатора между ними. Это позволяет писать свою часть работы — собственную декомпозицию Троттера, новый анзац, специфичный для задачи оценщик подавления ошибок или целевую функцию, которую оптимизатор тысячи раз оценивает на квантовом железе, — на языке, на котором уже говорит остальной код.
Все эти не-Python привязки находятся в активной разработке; IBM предлагает сообществу открывать issue и pull request. Исследователям, чьим приложениям могут быть полезны Fortran, C++ или Julia, предлагают попробовать подходящий туториал и выполнить квантовый рабочий процесс на реальном железе, создав бесплатный аккаунт на IBM Quantum Platform.