Q_04_01 什麼是Q#?

什麼是Q#? 

Q#是用於量子計算的可擴展的多範式特定領域編程語言。 Q#是一種量子編程語言,它可以用來描述如何在量子機器上執行指令。 可以定位的機器包括許多不同的抽象層次,從各種模擬器到實際的量子硬件。 Q#是多範式的,因爲它支持功能和命令式編程風格。 Q#具有可擴展性,因爲它允許編寫程序到各種尺寸的機器,範圍從僅有幾百個量子位的小型機器到具有數百萬個量子位的大型機器。 儘管大型物理機器可能只會在未來取得成果,但Q#允許程序員現在編寫複雜的量子算法。 更重要的是,Q#允許以可擴展的方式執行各種任務,例如調試,分析,資源評估和某些特殊用途的模擬。

從技術角度來看,量子程序是一組特殊的經典函數,它們在被稱爲時會產生量子電路作爲它們的副作用。 該觀點的一個重要結果是用Q#編寫的程序本身並不直接對量子比特進行建模,而是描述了經典控制計算機如何與這些量子比特進行交互。 通過設計,Q#因此不直接定義量子態或量子力學的其他屬性,而是通過語言中定義的各種子程序的行爲間接地定義量子態或其他屬性。 例如,考慮Quantum Computing Concepts指南中討論的狀態  爲了在Q#中準備這個狀態,我們使用在 狀態中初始化的量子位,並且 ,其中是Hadamard變換:

Q#
 using (register = Qubit[1]) {
    let qubit = register[0];
    // At this point, qubit is in the state |0〉.
    H(qubit);
    // We've now applied H, such that our qubit is in H|0〉 = |+〉, as we wanted.
} 

重要的是,在編寫上述程序時,我們沒有明確提到Q#中的狀態,而是描述了狀態如何通過我們的程序進行轉換 因此,類似於圖形着色器程序如何累積每個頂點變換的描述,Q#中的量子程序將量子態的變換累積起來。 這使得我們完全不知道每個目標機器上的量子狀態什麼,根據機器情況可能會有不同的解釋。

從Q#程序的角度來看,量子位是對目標機器內部結構的完全不透明的參考。 AQ#程序沒有能力反思量子比特的狀態,它在目標機器上的表示,或者它是否與該程序可用的任何其他量子位相同的量子位。 相反,程序可以調用諸如Measure操作來從量子位獲取信息,並且調用諸如XH來對量子位的狀態進行操作。 這些操作在語言中沒有內在的定義,只有用於運行特定Q#程序的目標機器才具體。 AQ#程序重新組合目標機器定義的這些操作,以創建新的更高級的操作來表達量子計算。 通過這種方式,Q#可以很容易地表達量子和混合量子經典算法的基礎邏輯,同時對於目標機器或模擬器的結構也是通用的。

具體來說,Q#程序由一個或多個操作 ,一個或多個功能和用戶定義的類型組成。 操作用於描述量子機器狀態的轉換,並且是Q#程序的最基本的組成部分。 Q#中定義的每個操作都可以調用任意數量的其他操作,包括由語言定義並由每個目標機器實現的內置基本操作。 編譯時,每個操作都表示爲可以提供給目標計算機的.NET類類型。

與操作相比,函數用於描述純粹的經典行爲,除了計算經典輸出值之外,沒有任何效果。 Q#是一種強類型語言,並帶有一組內置的基元類型以及對用戶定義類型的支持。

在本指南的其餘部分中,我們將看到如何使用不同的語言概念和結構來幫助我們通過操作,功能和類型的基本構建塊來定義複雜的量子程序。

Q#源文件的結構

最起碼,一個Q#源文件由一個名稱空間聲明組成,該聲明指定了一個.NET名稱空間,該名稱空間將包含源文件中的定義。 來自其他Q#源文件和庫的定義可以使用open語句來包含。 例如,大多數定義基本門的操作都是在Microsoft.Quantum.Primitive命名空間中定義的。 爲了使我們的代碼可用,我們只需在每個文件的頂部open該命名空間即可:

Q#
 namespace Example { open Microsoft.Quantum.Primitive; // ... } 

在命名空間中,每個Q#源文件可以定義操作函數用戶定義類型的任意組合。 在本節的其餘部分中,我們將逐一介紹並提供如何在實踐中使用它們來製作有用的量子程序的例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章