LLVMを基盤とするMicrosoft Quantum Intermediate Representation(QIR)は、LLVM IRを拡張して、量子構造の表現により適するようにしたものだ。
Microsoftを出自とするQIRの対象言語はQ#だが、いかなる意味でもそれに限定されるものではないと、同社で量子ソフトウェアとアプリケーションのソフトウェアアーキテクトを務めるAlan Geller氏は述べている。
ゲートベースの量子コンピューティング用プログラミング言語であれば、QIRで表現することが可能です。同様に、QIRはハードウェアにも依存しません。量子インストラクションやゲートセットを特定せず、ターゲットとするコンピューティング環境に任せているのです。
Geller氏によると、QIRは従来型計算と量子計算を統合するプログラムの表現に適している。量子ハードウェアの進歩につれて、この傾向はますます重要なものになるだろう、と氏は言う。
さらにGeller氏は、Q#で記述した単純な量子関数がQIRではどうなるのか、例を挙げて説明している。
// Assumes that qb1 and qb2 are already in the |0> state
operation BellPair(qb1 : Qubit, qb2 : Qubit) : Unit
{
H(qb1);
CNOT(qb1, qb2);
}
Q#の各操作はプレフィックス__quantum_qis__
で始まるLLVM関数によって、キュービットは'%Qubit'と呼ばれる名前付き不透明(opaque)タイプで、それぞれ表現される。これを念頭に置くと、先程のスニペットのQIRは次のようなものになる。
define void @BellPair__body(%Qubit* %qb1, %Qubit* %qb2) {
entry:
call void @__quantum__qis__h(%Qubit* %qb1)
call void @__quantum__qis__cnot(%Qubit* %qb1, %Qubit* %qb2)
ret void
}
特に量子計算に適用される場合、中間表現にはさまざまな興味深い可能性が開かれている。例えば、LLVMのC言語フロントエンドであるclangを使用すれば、QIRを旧式ハードウェア用の実行コードにコンパイルすることが可能だが、これは単純に量子シミュレータを作ったことになる。さらには、言語やハードウェアに依存しない方法で中間表現に変換する、量子オプティマイザの開発も可能になる。このようなオプティマイザは、さまざまな言語や計算プラットフォームにおいて、ほぼ修正することなく再利用できるはずだ。
言語に依存しないプログラムの中間表現というアイデアは、LLVMや他のコンパイラの根幹をなすものであり、数多くのさまざまなプログラミング言語のサポートを実現する上でのキーとなっている。つまり中間表現は、プログラムの抽象表現の役割を果たすのである。すべてのプログラムは、それが記述されている言語に関係なく、いわゆるフロントエンドコンパイラによってこの中間表現に変換される。それをマシン表現に変換するのはバックエンドコンポーネントの役割である。つまり中間表現は、ソース言語をハードウェアプラットフォームから分離することにより、コンパイラをモジュール構造で構築可能にするのだ。新しい言語の開発で必要なのは、バックエンドが利用可能なすべてのプラットフォームをサポートする、新たなフロントエンドのみである。