كيو شارب
لغة البرمجة Q# (تُنطق كيو شارب ) هي لغة برمجة خاصة بمجال معين تُستخدم للتعبير عن الخوارزميات الكمومية . [ 3 ] وقد أُصدرت في البداية للجمهور من قِبل مايكروسوفت كجزء من مجموعة أدوات تطوير الكم. [ 4 ]
يعمل Q# بالتزامن مع لغات البرمجة الكلاسيكية مثل C# وPython وF#، وهو مصمم لتمكين استخدام مفاهيم البرمجة التقليدية في الحوسبة الكمومية، بما في ذلك الدوال ذات المتغيرات والتفرعات، بالإضافة إلى بيئة تطوير مُلوّنة بالبنية النحوية مع مصحح أخطاء كمومي. [ 1 ] [ 5 ] [ 6 ]
تاريخ
تاريخياً، كان لدى مايكروسوفت للأبحاث فريقان مهتمان بالحوسبة الكمومية: فريق QuArC الذي يتخذ من ريدموند، واشنطن، مقراً له، [ 7 ] بقيادة كريستا سفور ، والذي استكشف بناء الدوائر الكمومية، وفريق Station Q الذي كان يقع في البداية في سانتا باربرا بقيادة مايكل فريدمان ، والذي استكشف الحوسبة الكمومية الطوبولوجية . [ 8 ] [ 9 ]
خلال مؤتمر مايكروسوفت إغنايت الرئيسي في 26 سبتمبر 2017، أعلنت مايكروسوفت عن عزمها إطلاق لغة برمجة جديدة مصممة خصيصًا لأجهزة الكمبيوتر الكمومية. [ 10 ] وفي 11 ديسمبر 2017، أطلقت مايكروسوفت لغة Q# كجزء من حزمة تطوير البرمجيات الكمومية. [ 4 ]
أعلنت مايكروسوفت في مؤتمر Build 2019 أنها ستجعل مجموعة أدوات تطوير Quantum مفتوحة المصدر، بما في ذلك مترجمات ومحاكيات Q# الخاصة بها. [ 11 ]
لدعم لغة Q#، طورت مايكروسوفت تمثيل الوسائط الكمومية (QIR) في عام 2023 كواجهة مشتركة بين لغات البرمجة والمعالجات الكمومية المستهدفة. كما أعلنت الشركة عن إضافة للمترجم تُولّد QIR من Q#. [ 12 ]
كانت بيتينا هايم تقود جهود تطوير لغة Q#. [ 13 ] [ 14 ]
الاستخدام
يتوفر برنامج Q# كإضافة قابلة للتنزيل بشكل منفصل لبرنامج Visual Studio ، [ 15 ] ولكن يمكن تشغيله أيضًا كأداة مستقلة من سطر الأوامر أو من Visual Studio Code. تم إطلاق Q# على نظام Windows وهو متوفر لأنظمة MacOS وLinux. [ 16 ]
تتضمن مجموعة تطوير الكم محاكيًا كميًا قادرًا على تشغيل Q# ومحاكاة 30 كيوبت منطقي. [ 17 ] [ 18 ]
من أجل استدعاء المحاكي الكمومي، يتم استخدام لغة برمجة أخرى من لغات .NET ، عادةً C# ، والتي توفر بيانات الإدخال (الكلاسيكية) للمحاكي وتقرأ بيانات الإخراج (الكلاسيكية) من المحاكي. [ 19 ]
سمات
تتمثل إحدى السمات الرئيسية لـ Q# في القدرة على إنشاء واستخدام الكيوبتات في الخوارزميات. ونتيجة لذلك، فإن بعض أبرز سمات Q# هي القدرة على تشابك الكيوبتات وإدخال التراكب إليها عبر بوابات NOT المتحكم بها وبوابات هادامارد ، على التوالي، بالإضافة إلى بوابات توفولي ، وبوابات باولي X وY وZ ، وغيرها الكثير التي تُستخدم في مجموعة متنوعة من العمليات (انظر بوابات المنطق الكمومي ).
من المتوقع أن تُنفذ مجموعة الأجهزة التي ستتكامل مع Q# في نهاية المطاف وحدات الكيوبت كوحدات كيوبت طوبولوجية . يستطيع المحاكي الكمومي المرفق مع حزمة تطوير الكم اليوم معالجة ما يصل إلى 32 كيوبت على جهاز المستخدم، وما يصل إلى 40 كيوبت على Azure . [ 20 ]
الوثائق والموارد
الموارد المتاحة حاليًا للغة Q# قليلة، ولكن الوثائق الرسمية منشورة على شبكة مطوري مايكروسوفت: Q# . كما يضم مستودع مايكروسوفت كوانتوم على جيت هاب مجموعة كبيرة من البرامج النموذجية التي تُنفذ مجموعة متنوعة من خوارزميات الحوسبة الكمومية واختباراتها.
كما استضافت مايكروسوفت مسابقة برمجة الكم على منصة Codeforces ، والتي تسمى مسابقة برمجة مايكروسوفت Q# - Codeforces ، وقدمت أيضًا مواد ذات صلة للمساعدة في الإجابة على الأسئلة الواردة في منشورات المدونة، بالإضافة إلى الحلول التفصيلية في الدروس التعليمية.
تستضيف مايكروسوفت مجموعة من التمارين التعليمية للمساعدة في تعلم Q# على GitHub: microsoft/QuantumKatas مع روابط للموارد وإجابات للمشاكل.
بناء الجملة
ترتبط لغة Q# من الناحية التركيبية بكل من لغتي C# و F#، ولكنها تحتوي أيضًا على بعض الاختلافات الهامة.
أوجه التشابه مع لغة C#
- استخدامات
namespaceلعزل التعليمات البرمجية - جميع العبارات تنتهي بـ
; - تُستخدم الأقواس المعقوفة في بيانات النطاق
- يتم استخدام التعليقات المكونة من سطر واحد
// - أنواع البيانات المتغيرة مثل
IntDoubleStringوBoolمتشابهة، على الرغم من أنها مكتوبة بأحرف كبيرة (وInt هو 64 بت) [ 21 ] - يتم تخصيص الكيوبتات والتخلص منها داخل
usingكتلة. - يتم تعريف دوال لامدا باستخدام المعامل.
=> - يتم إرجاع النتائج باستخدام الكلمة
returnالمفتاحية.
أوجه التشابه مع فا دييز
- يتم تعريف المتغيرات باستخدام إما
letأوmutable[ 3 ] - الدوال من الدرجة الأولى
- الوحدات النمطية، التي يتم استيرادها باستخدام
openالكلمة المفتاحية - يتم تعريف نوع البيانات بعد اسم المتغير
- مشغل ميدان الرماية
.. for … inالحلقات- لكل عملية/دالة قيمة إرجاع، بدلاً من قيمة فارغة
void. بدلاً من ذلك ، يتم إرجاع مجموعةvoidفارغة .() - تعريف أنواع بيانات السجلات (باستخدام الكلمة
newtypeالمفتاحية، بدلاً منtype).
الاختلافات
مثال
الكود المصدري التالي هو عبارة عن مُضاعِف إرسال من مستودع مكتبة Microsoft Q# الرسمي.
// حقوق الطبع والنشر © لشركة مايكروسوفت. // مرخص بموجب ترخيص MIT.namespace Microsoft.Quantum.Canon { open Microsoft.Quantum.Intrinsic ; open Microsoft.Quantum.Arithmetic ; open Microsoft.Quantum.Arrays ; open Microsoft.Quantum.Diagnostics ; open Microsoft.Quantum.Math ; }/// # ملخص /// يطبق عملية وحدوية متحكم بها ضربيًا $U$، والتي بدورها تطبق عملية وحدوية $V_j$ عند التحكم بها بواسطة حالة عددية مكونة من n كيوبت $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # المدخلات /// ## مولد العمليات الوحدوية /// مجموعة حيث العنصر الأول `Int` هو عدد العمليات الوحدوية $N$، /// والعنصر الثاني `(Int -> ('T => () is Adj + Ctl))` /// دالة تأخذ عددًا صحيحًا $j$ في $[0,N-1]$ وتُخرج العملية الوحدوية $V_j$. /// /// ## فهرس /// سجل تحكم مكون من n كيوبت يقوم بتشفير الحالات العددية $\ket{j}$ بتنسيق little-endian. /// /// ## الهدف /// سجل كيوبت عام يعمل عليه $V_j$. /// /// # ملاحظات /// سيتم إضافة عناصر الوحدة إلى `coefficients` إذا /// تم تحديد عدد أقل من $2^n$. يستخدم هذا التنفيذ /// $n-1$ كيوبت مساعد. /// /// # المراجع /// - [ *Andrew M. Childs, Dmitri Maslov, Yunseong Nam, Neil J. Ross, Yuan Su*, /// arXiv:1711.10980](https://arxiv.org/abs/1711.10980) operation MultiplexOperationsFromGenerator < ' T >( unitaryGenerator : ( Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), index : LittleEndian , target : ' T ) : Unit is Ctl + Adj { let ( nUnitaries , unitaryFunction ) = unitaryGenerator ; let unitaryGeneratorWithOffset = ( nUnitaries , 0 , unitaryFunction ); if Length ( index !) == 0 { fail "فشلت عملية MultiplexOperations. يجب أن يكون عدد الكيوبتات في الفهرس أكبر من 0." } إذا كان عدد الوحدات أكبر من صفر { دع auxiliary = [] ; Adjoint MultiplexOperationsFromGeneratorImpl ( unitaryGeneratorWithOffset , auxiliary , index , target); } }/// # ملخص /// خطوة تنفيذ `MultiplexOperationsFromGenerator`. /// # انظر أيضًا /// - Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator عملية داخلية MultiplexOperationsFromGeneratorImpl < ' T >( unitaryGenerator : ( Int , Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), auxiliary : Qubit [] , index : LittleEndian , target : ' T ) : Unit { body (...) { let nIndex = Length ( index !); let nStates = 2 ^ nIndex ;let ( nUnitaries , unitaryOffset , unitaryFunction ) = unitaryGenerator ;let nUnitariesLeft = MinI ( nUnitaries , nStates / 2 ); let nUnitariesRight = MinI ( nUnitaries , nStates );let leftUnitaries = ( nUnitariesLeft , unitaryOffset , unitaryFunction ); let rightUnitaries = ( nUnitariesRight - nUnitariesLeft , unitaryOffset + nUnitariesLeft , unitaryFunction );let newControls = LittleEndian ( Most ( index !));إذا كان عدد الوحدات أكبر من صفر { إذا كان طول ( المساعد ) يساوي 1 وعدد الفهارس يساوي صفر { // حالة الإنهاء( Controlled Adjoint ( unitaryFunction ( unitaryOffset )))( auxiliary , target ); } elif Length ( auxiliary ) == 0 and nIndex >= 1 { // حالة البداية let newauxiliary = Tail ( index !); if nUnitariesRight > 0 { MultiplexOperationsFromGeneratorImpl ( rightUnitaries , [ newauxiliary ], newControls , target ); } within { X ( newauxiliary ); } apply { MultiplexOperationsFromGeneratorImpl ( leftUnitaries , [ newauxiliary ], newControls , target ); } } else { // استدعاء ذاتي يقلل nIndex بمقدار 1 ويضبط Length(auxiliary) إلى 1. let controls = [ Tail ( index !)] + auxiliary ; use newauxiliary = Qubit () ; استخدم `andauxiliary = Qubit [ MaxI ( 0 , Length ( controls ) - 2 )]`؛ ضمن { ` ApplyAndChain ( andauxiliary , controls , newauxiliary ); ` } ` apply { if nUnitariesRight > 0 { MultiplexOperationsFromGeneratorImpl ( rightUnitaries , [ newauxiliary ], newControls , target ); ` } ضمن { ( Controled X )( auxiliary , newauxiliary ); ` } ` apply { MultiplexOperationsFromGeneratorImpl ( leftUnitaries , [ newauxiliary ], newControls , target ); ` }} } } } adjoint auto ; controlled ( controlRegister , ...) { MultiplexOperationsFromGeneratorImpl ( unitaryGenerator , auxiliary + controlRegister , index , target ); } adjoint controlled auto ; }/// # ملخص /// يطبق عملية وحدوية متعددة التحكم $U$ تُطبق عملية وحدوية $V_j$ عند التحكم بها بواسطة حالة عددية مكونة من n كيوبت $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # المدخلات /// ## مولد العمليات الوحدوية /// مجموعة حيث العنصر الأول `Int` هو عدد العمليات الوحدوية $N$، /// والعنصر الثاني `(Int -> ('T => () is Adj + Ctl))` /// دالة تأخذ عددًا صحيحًا $j$ في $[0,N-1]$ وتُخرج العملية الوحدوية $V_j$. /// /// ## فهرس /// سجل تحكم مكون من n كيوبت يُشفّر الحالات العددية $\ket{j}$ بتنسيق little-endian. /// /// ## الهدف /// سجل كيوبت عام يعمل عليه $V_j$. /// /// # ملاحظات /// سيتم إضافة عناصر الوحدة إلى `coefficients` إذا /// تم تحديد عدد أقل من $2^n$. يتم تنفيذ هذا الإصدار /// مباشرةً عن طريق التكرار عبر عوامل التشغيل الوحدوية التي يتم التحكم فيها بـ n. عملية MultiplexOperationsBruteForceFromGenerator < ' T >( unitaryGenerator : ( Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), index : LittleEndian , target : ' T ) : Unit is Adj + Ctl { let nIndex = Length ( index !); let nStates = 2 ^ nIndex ; let ( nUnitaries , unitaryFunction ) = unitaryGenerator ; for idxOp in 0 .. MinI ( nStates , nUnitaries ) - 1 { ( ControlledOnInt ( idxOp , unitaryFunction ( idxOp )))( index !, target ); } }/// # ملخص /// تُعيد عملية وحدوية مُتحكَّم بها ضربيًا $U$ تُطبِّق عملية وحدوية $V_j$ عند تحكُّمها بواسطة حالة عددية من n-كيوبت $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # المدخلات /// ## مولد_الوحدات /// مجموعة حيث العنصر الأول `Int` هو عدد العمليات الوحدوية $N$، /// والعنصر الثاني `(Int -> ('T => () is Adj + Ctl))` /// دالة تأخذ عددًا صحيحًا $j$ في $[0,N-1]$ وتُخرج العملية الوحدوية $V_j$. /// /// # المخرجات /// عملية وحدوية مُتحكَّم بها ضربيًا $U$ تُطبِّق العمليات الوحدوية /// الموصوفة بواسطة `مولد_الوحدات`. /// /// # انظر أيضًا /// - Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator function MultiplexerFromGenerator ( unitaryGenerator : ( Int , ( Int -> ( Qubit [] => Unit is Adj + Ctl )))) : (( LittleEndian , Qubit [] ) => Unit is Adj + Ctl ) { return MultiplexOperationsFromGenerator ( unitaryGenerator , _, _); }/// # ملخص /// تُعيد عملية وحدوية مُتحكَّم بها ضربيًا $U$ تُطبِّق عملية وحدوية $V_j$ عند تحكُّمها بواسطة حالة عددية من n-كيوبت $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # المدخلات /// ## مولد_الوحدات /// مجموعة حيث العنصر الأول `Int` هو عدد العمليات الوحدوية $N$، /// والعنصر الثاني `(Int -> ('T => () is Adj + Ctl))` /// دالة تأخذ عددًا صحيحًا $j$ في $[0,N-1]$ وتُخرج العملية الوحدوية $V_j$. /// /// # المخرجات /// عملية وحدوية مُتحكَّم بها ضربيًا $U$ تُطبِّق العمليات الوحدوية /// الموصوفة بواسطة `مولد_الوحدات`. /// /// # انظر أيضًا /// - Microsoft.Quantum.Canon.MultiplexOperationsBruteForceFromGenerator function MultiplexerBruteForceFromGenerator ( unitaryGenerator : ( Int , ( Int -> ( Qubit [] => Unit is Adj + Ctl )))) : (( LittleEndian , Qubit [] ) => Unit is Adj + Ctl ) { return MultiplexOperationsBruteForceFromGenerator ( unitaryGenerator , _, _); }/// # ملخص /// يحسب سلسلة من بوابات AND /// /// # الوصف /// يجب تحديد الكيوبتات المساعدة لحساب النتائج المؤقتة بشكل صريح. /// طول هذا السجل هو `Length(ctrlRegister) - 2`، إذا كان هناك عنصران تحكم على الأقل ///، وإلا فإن الطول هو 0. العملية الداخلية ApplyAndChain ( auxRegister : Qubit [] , ctrlRegister : Qubit [] , target : Qubit ) : Unit is Adj { if Length ( ctrlRegister ) == 0 { X ( target ); } elif Length ( ctrlRegister ) == 1 { CNOT ( Head ( ctrlRegister ), target ); } else { EqualityFactI ( Length ( auxRegister ), Length ( ctrlRegister )); let controls1 = ctrlRegister [ 0 .. 0 ] + auxRegister ; let controls2 = Rest ( ctrlRegister ); let targets = auxRegister + [ target ]; ApplyToEachA ( ApplyAnd , Zipped3 ( controls1 , controls2 , targets )); } } }مراجع
- 1 2 "لغة البرمجة الكمومية Q# من مايكروسوفت متاحة الآن في مرحلة المعاينة" . آرس تكنيكا . 12 ديسمبر 2017. تاريخ الاسترجاع: 4 سبتمبر 2024 .
- ↑ "مقدمة إلى Q#" (ملف PDF) . جامعة واشنطن .
- 1 2 QuantumWriter. "لغة برمجة Q#" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 11-12-2017 .
- 1 2 "الإعلان عن مجموعة أدوات تطوير مايكروسوفت كوانتوم" . تم الاطلاع عليه بتاريخ 11-12-2017 .
- ↑ "مايكروسوفت تستعد للموجة القادمة من الحوسبة باستخدام مجموعة أدوات الحوسبة الكمومية" . آرس تكنيكا . 25 سبتمبر 2017. تاريخ الاطلاع: 4 سبتمبر 2024 .
- ↑ "الحواسيب الكمومية تكاد تكون معدومة - إليكم سبب كتابة لغات البرمجة لها على أي حال" . مجلة إم آي تي للتكنولوجيا . 22 ديسمبر 2017. تاريخ الاسترجاع: 4 سبتمبر 2024 .
- ↑ "حل مشكلة الأجسام المتعددة الكمومية باستخدام الشبكات العصبية الاصطناعية" . مايكروسوفت أزور كوانتوم . 15 فبراير 2017.
- ↑ مدونة سكوت آرونسون ، 2013، "مايكروسوفت: من QDOS إلى QMA في أقل من 35 عامًا"، https://scottaaronson.blog/?p=1471
- ↑ "ما هي لغة البرمجة Q# وQDK؟ - Azure Quantum" . learn.microsoft.com . ١٢ يناير ٢٠٢٤.
- ↑ "مايكروسوفت تعلن عن لغة برمجة للحوسبة الكمومية" . تم الاطلاع عليه بتاريخ 14 ديسمبر 2017 .
- ↑ "تتيح مايكروسوفت حزمة تطوير الحوسبة الكمومية كمصدر مفتوح" . مؤرشف من الأصل بتاريخ 23 يناير 2021. تم الاطلاع عليه بتاريخ 12 ديسمبر 2020 .
- ↑ كريل، بول (29 سبتمبر 2020). "مايكروسوفت تستخدم LLVM للحوسبة الكمومية" . إنفوورلد . تم الاسترجاع في 4 سبتمبر 2024 .
- ↑ "نساء QuArC" . 30 مارس 2019.
- ↑ "مقدمة إلى Q# - مقدمة إلى تطوير البرمجيات الكمومية" . stem.mitre.org .
- ↑ QuantumWriter. "إعداد بيئة تطوير Q#" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 14-12-2017 .
- ↑ كوبوك، مارك (26 فبراير 2018). "لغة الحوسبة الكمومية من مايكروسوفت متاحة الآن لنظام التشغيل ماك أو إس" . ديجيتال تريندز . تم الاطلاع عليه بتاريخ 4 سبتمبر 2024 .
- ↑ أكدوغان، إرمان (23 أكتوبر 2022). "الحوسبة الكمومية قادمة إلى عالم التمويل والعملات المشفرة" . ميديوم .
- ↑ ميلانسون، مايك (16 ديسمبر 2017). "هذا الأسبوع في البرمجة: احصل على الحوسبة الكمومية مع كيو شارب" . ذا نيو ستاك . تم الاسترجاع في 4 سبتمبر 2024 .
- ↑ "هذا الأسبوع في البرمجة: احصل على الحوسبة الكمومية مع كيو شارب" . ذا نيو ستاك . 16 ديسمبر 2017.
- ↑ "مايكروسوفت تستعرض مجموعة أدوات تطوير الحوسبة الكمومية" . CIO . مؤرشف من الأصل بتاريخ 30 أكتوبر 2022. تم الاطلاع عليه بتاريخ 30 أكتوبر 2022 .
- ↑ "أنواع البيانات في Q# - مايكروسوفت كوانتوم" . docs.microsoft.com . 27 يوليو 2022.
روابط خارجية
- الموقع الرسمي
- qsharp-language على GitHub (تم إيقافها الآن)
- qsharp على GitHub (مستودع QDK الحديث)
- برامج مايكروسوفت المجانية
- لغات برمجة مايكروسوفت
- البرمجة الكمومية
- لغات البرمجة التي تم إنشاؤها في عام 2017
- برنامج مرخص بموجب ترخيص MIT
