Upgrade to Pro — share decks privately, control downloads, hide ads and more …

古典・量子ハイブリッドな高機能プログラミング言語の設計及び処理系の開発

terapoon
February 16, 2022

 古典・量子ハイブリッドな高機能プログラミング言語の設計及び処理系の開発

未踏ターゲット事業2021 成果報告会の資料です。
プロジェクトの概要は以下のリンクから閲覧できます。

Link: https://www.ipa.go.jp/jinzai/target/2021/gaiyou_fk-2.html

スライド中のデモ動画は以下のリンクから閲覧できます。
Link: https://www.youtube.com/watch?v=Dlt1ufYQZws

terapoon

February 16, 2022
Tweet

More Decks by terapoon

Other Decks in Programming

Transcript

  1. 古典・量子ハイブリッドな
    高機能プログラミング言語の
    設計及び処理系の開発
    (2022/02/07 成果報告会)
    平田 賢吾 (京都大学 数理解析研 M1)
    寺本 幸生 (東京大学 情報理工 CS専攻 M1)
    米内 貴志 (株式会社 Flatt Security)
    1

    View Slide

  2. 背景: 量子プログラミング
    富岳
    2
    IBM Quantum
    IonQ
    Rigetti













    計算デバイス プログラミング言語
    C++ Python Rust
    Go
    プログラム 記述
    実行
    古典デバイス同様、量子デバイス
    を利用する上でも量子プログラミ
    ング言語は必要

    View Slide

  3. 現状の量子プログラミング言語
    3
    低級 高級
    ccx c[0], c[1], q[0];
    x c[0];
    ccx c[0], c[1], q[1];
    x c[1];
    ccx c[0], c[1], q[2];
    x c[0];
    x c[1];
    OpenQASM
    ✗ アセンブリ言語として設計
    (原則プログラマは直接記述しない)
    ✗ 量子計算のみ記述可能
    ❍ 実機動作が容易
    (2017)

    View Slide

  4. 現状の量子プログラミング言語
    4
    ccx c[0], c[1], q[0];
    x c[0];
    ccx c[0], c[1], q[1];
    x c[1];
    ccx c[0], c[1], q[2];
    x c[0];
    x c[1];
    if (c[0] && c[1]) {
    q[0] := X(q[0]);
    } else if (!c[0] && c[1]) {
    q[1] := X(q[1]);
    } else if (!c[0] && !c[1]){
    q[2] := X(q[2]);
    }
    OpenQASM Silq
    低級 高級
    ❍ 古典-量子ハイブリッドな記述性
    ❍ 量子非計算を隠蔽する設計
    ❍ 型安全性によるプログラマの保護
    △ 可読性(古典言語と比した場合)
    ✗ コンパイル不可(実機動作不可)
    (2017) (2020)
    ✗ アセンブリ言語として設計
    (原則プログラマは直接記述しない)
    ✗ 量子計算のみ記述可能
    ❍ 実機動作が容易

    View Slide

  5. 理想の量子プログラミング言語
    5
    ccx c[0], c[1], q[0];
    x c[0];
    ccx c[0], c[1], q[1];
    x c[1];
    ccx c[0], c[1], q[2];
    x c[0];
    x c[1];
    match (c[0], c[1]) with
    | (1,1) -> q[0] := X(q[0]);
    | (0,1) -> q[1] := X(q[1]);
    | (0,0) -> q[2] := X(q[2]);
    | _ -> nop;
    OpenQASM
    if (c[0] && c[1]) {
    q[0] := X(q[0]);
    } else if (!c[0] && c[1]) {
    q[1] := X(q[1]);
    } else if (!c[0] && !c[1]){
    q[2] := X(q[2]);
    }
    Silq 理想
    ❍ 古典-量子ハイブリッド
    ❍ 自動量子非計算
    ❍ 型安全性
    ❍ より高い可読性
    ❍ コンパイル可能(実機動作可)
    ❍ 古典-量子ハイブリッドな記述性
    ❍ 量子非計算を隠蔽する設計
    ❍ 型安全性によるプログラマの保護
    △ 可読性(古典言語と比した場合)
    ✗ コンパイル不可(実機動作不可)
    低級 高級
    (2017) (2020)
    ✗ アセンブリ言語として設計
    (原則プログラマは直接記述しない)
    ✗ 量子計算のみ記述可能
    ❍ 実機動作が容易

    View Slide

  6. プロジェクト概要: 量子プログラミング言語 Qitten の開発
    目標
    ❍ ハイブリッドな記述
    ❍ 自動量子非計算
    ❍ 型安全性
    ❍ 高い可読性
    ❍ コンパイル可能
    内容
    古典-量子ハイブリッドな高機能言語 Qitten を設計・開発する
    下図の塗りつぶし部分を作成する
    6

    View Slide

  7. 言語設計
    Rust ベースに作成
    量子プログラム特有の要素
    1. 量子ゲート操作
    2. 測定
    3. 量子 if (式)
    fn main() {

    let mut bit: qbool = qfalse;
    let bit = h(bit);

    }
    fn h(mut bit: qbool) -> qbool {
    inline_qasm!(“Hadmard”, bit);
    bit
    } Qitten
    量子ゲートを表す
    特別な命令を用意
    返り値は()
    関数でラップして量子
    ゲートライブラリのよ
    うに使用可能
    ※ 量子ビットの型名はqbool
    qfalseは|0>を表す
    7

    View Slide

  8. 言語設計
    Rust ベースに作成
    量子プログラム特有の要素
    1. 量子ゲート操作
    2. 測定
    3. 量子 if (式)
    fn main() -> bool {

    let mut bit: qbool = qfalse;
    let bit: qbool = h(bit);

    measure(bit)
    }
    Qitten
    コンパイラ実装の特別
    な関数として用意
    qbool -> bool の関数の
    ように扱う
    8

    View Slide

  9. 言語設計
    Rust ベースに作成
    量子プログラム特有の要素
    1. 量子ゲート操作
    2. 測定
    3. 量子 if (式)
    fn main() {

    qif flag {
    gates::X(targ)
    }
    ….
    }
    Qitten
    制御付き量子操作に対応 (e.g. 制御ゲート)
    qif に続く表現の型は qbool
    qif のブロックの中で flag は使用できない
    qif は unit型 () を返り値にもつ式として扱う
    fn main() {

    let mut n = 0;

    qif flag {
    gates::X(targ);
    n = n + 1
    }
    ….
    } Qitten
    ※ qif 内でのローカ
    ルでない古典変数
    に対する代入、測
    定は禁止する
    9

    View Slide

  10. 言語設計
    Rust ベースに作成
    量子プログラム特有の要素
    1. 量子ゲート操作
    2. 測定
    3. 量子 if (式)
    fn main() {

    qif flag1 {
    gates::Hadmard(targ)
    } else qif flag2 {
    gates::Y(targ)
    }
    ….
    }
    fn main() {

    qif flag1 {
    gates::X(targ);
    qif flag2 {
    gates::Z(targ)
    }
    } else {
    gates::Y(targ)
    }
    ….
    } Qitten Qitten
    qif をネストさせること、qif を else で繋げることが可能
    青で囲まれたブロック内の操作は2変数により制御された
    量子操作に対応する
    qif のネストの例
    else qif の例
    10

    View Slide

  11. 内部のコンパイルフロー
    11
    文字列から実行ファイルまでの全行程

    View Slide

  12. Qitten の型システム
    fn main() {

    let x : qbool = …;

    let y = hadmard(x);
    let z = Rx_pi(x);

    } Qitten
    線形型システムを利用
    Type Error: 変数 x は既に消費されています.
    ● 量子複製不可能定理に基づき、量子状態の複製を禁止
    ● 一度 “消費” された変数は再使用できない
    H
    x
    y
    ?
    Rx(π
    )
    12

    View Slide

  13. 量子 if のコンパイル処理
    cif A {
    プログラム1
    } else {
    プログラム2
    }
    古典 if の場合

    A が true なら ブロック1へ
    A が false なら ブロック2へ

    プログラム1を
    コンパイルしたもの
    元のブロックへ
    プログラム2を
    コンパイルしたもの
    元のブロックへ
    ● どちらか一方のブロックが実行される
    ● 並列に分岐させれば良い
    ブロック1
    ブロック2
    メインブロック
    13

    View Slide

  14. 量子 if のコンパイル処理
    qif A {
    プログラム1
    } else {
    プログラム2
    }
    量子 if の場合
    ● A は量子制御ビット
    ● 両方のプログラムが実行される
    ● 直列に繋ぐ必要がある
    Aに対応する
    量子ビット
    プログラム1
    ※ イメージ図
    プログラム2
    14

    View Slide

  15. 量子 if のコンパイル処理
    qif A {
    qif B {

    量子ゲート1
    量子ゲート2

    }
    }
    量子 if の場合
    ● 量子 if のネストが深くなると制御ビットが多くなる
    ● 量子ゲート一つ一つに対してこれを展開すると効率が悪い
    Aに対応する
    量子ビット
    量子ゲート1
    ※ イメージ図
    量子ゲート2
    Bに対応する
    量子ビット

    : : :
    最適化
    補助ビットを導入してそこに制御条件をまとめる
    ことで、制御ビットの数を常に1に保つ 15

    View Slide

  16. 量子 if のコンパイル処理アルゴリズム (概要)
    qif A {
    プログラム1
    qif B {
    プログラム2
    } else {
    プログラム3
    }
    プログラム4
    } else qif C {
    プログラム5
    } else {
    プログラム6
    }
    [(A, true)]
    [(A, true), (B, true)]
    [(A, true), (B, false)]
    [(A, true)]
    [(A, false), (C, true)]
    [(A, false), (C, false)]
    1. それぞれのスコープに対し、量子
    的に制御している変数と制御の方法
    (true or false) をスタックとして持つ。
    量子制御のスコープに出入りするた
    びに情報を pop, push する。
    [ ]
    [ ]
    スタック
    16

    View Slide

  17. 量子 if のコンパイル処理アルゴリズム (概要)
    qif A {
    プログラム1
    qif B {
    プログラム2
    } else {
    プログラム3
    }
    プログラム4
    } else qif C {
    プログラム5
    } else {
    プログラム6
    }
    [(A, true)]
    [(A, true), (B, true)]
    [(A, true), (B, false)]
    [(A, true)]
    [(A, false), (C, true)]
    [(A, false), (C, false)]
    2. プログラムが量子制御可能かど
    うかをチェックする。その後、
    補助量子ビットを導入し、そこに
    制御条件を一般化Toffoliゲートで
    書き出す。
    [ ]
    [ ]
    Aに対応する
    量子ビット
    Bに対応する
    量子ビット
    補助量子ビット
    プログラムの
    標的となる
    量子ビット
    17

    View Slide

  18. 量子 if のコンパイル処理アルゴリズム (概要)
    qif A {
    プログラム1
    qif B {
    プログラム2
    } else {
    プログラム3
    }
    プログラム4
    } else qif C {
    プログラム5
    } else {
    プログラム6
    }
    [(A, true)]
    [(A, true), (B, true)]
    [(A, true), (B, false)]
    [(A, true)]
    [(A, false), (C, true)]
    [(A, false), (C, false)]
    3. プログラムをコンパイルし、量
    子ゲートがあれば2で用意された補
    助量子ビットを制御変数として制
    御ゲートに変換する。
    [ ]
    [ ]
    Aに対応する
    量子ビット
    Bに対応する
    量子ビット
    補助量子ビット
    プログラムの
    標的となる
    量子ビット
    プログラム3
    に含まれる
    量子操作
    18

    View Slide

  19. 量子 if のコンパイル処理アルゴリズム (概要)
    qif A {
    プログラム1
    qif B {
    プログラム2
    } else {
    プログラム3
    }
    プログラム4
    } else qif C {
    プログラム5
    } else {
    プログラム6
    }
    [(A, true)]
    [(A, true), (B, true)]
    [(A, true), (B, false)]
    [(A, true)]
    [(A, false), (C, true)]
    [(A, false), (C, false)]
    4. 補助量子ビットを初期化する。
    ※ 方法はいくつか考えられるが、Qitten
    ではスコープから出るタイミングで同じ
    一般化Toffoliゲートを適用するという実
    装になっている。
    [ ]
    [ ]
    Aに対応する
    量子ビット
    Bに対応する
    量子ビット
    補助量子ビット
    プログラムの
    標的となる
    量子ビット
    プログラム3
    に含まれる
    量子操作
    19

    View Slide

  20. シミュレータについて
    シミュレーター
    シミュレーションの際は、中間表現まで落として
    それを用いて古典シミュレーションを行う。
    20

    View Slide

  21. ● 先行研究* をもとに実装する予定だったが、難航
    線形型との整合性、プログラミング言語としての意味的な整合性、特定の基底への依存、など
    量子非計算 (uncomputation) について
    本プロジェクトでは量子非計算の実装はできなかった
    結論
    * [Bichsel, B., Baader, M., Gehr, T., & Vechev, M. (2020, June). Silq: A high-level quantum language with safe uncomputation and intuitive
    semantics. In Proceedings of the 41st ACM SIGPLAN Conference on Programming Language Design and Implementation (pp. 286-300).]
    問題点
    回路レベルでの設計 言語としての設計 Qitten への実装
    最終報告書に問題点や回路レベルでの設計について、まとめて記載する予定
    21

    View Slide

  22. デモ (ソースコードからIBMQ上での実行まで)
    22

    View Slide

  23. 既存言語との比較
    23
    Silq Quipper Qitten
    型システム 線形 線形でない 線形
    非計算 自動* + 隠蔽 自動 (明示的) なし
    手続き or 関数 手続き 関数型 手続き
    ライブラリ なし Haskell のものを使える 今後整える
    ハイブリッド yes yes yes
    量子 if がある yes no yes
    コンパイラ ない △ ある

    View Slide

  24. まとめ
    古典・量子ハイブリッドな高級プログラミング言語Qittenを開発した
    - 高級かつハイブリッドな記述が可能な言語設計
    - 実機での動作を可能にするコンパイラ
    - ローカルでテストするためのシミュレータ
    利用者価値、社会的貢献価値
    - 初めて高級な文法を含むハイブリッド言語をコンパイルした
    - 量子プログラマの開発環境の改善、古典プログラマの量子プログラミングへ
    の参入障壁の低減に向けた第一歩を踏み出した
    24

    View Slide

  25. 今後の展望
    言語設計、コンパイラの拡張
    - 文法の拡張 (パターンマッチ、バリアント、配列、etc…)
    - CFGレベルのプログラムに対する量子回路最適化の導入
    - 自動量子非計算の導入
    - 量子アルゴリズムライブラリの整備
    - インターフェースの改良
    - シミュレーターの高速化
    ユーザ or デベロッパー獲得へ向けた活動
    - オープンソース化
    - 研究会での発表や、量子人材育成活動との提携等
    25

    View Slide