<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Microsoft on kenji.blog</title><link>http://kenji.blog/ar/tags/microsoft/</link><description>Recent content in Microsoft on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/microsoft/index.xml" rel="self" type="application/rss+xml"/><item><title>تجربة استخدام لغة البرمجة الكمية "Q#"</title><link>http://kenji.blog/ar/p/qsharp-quantum-programming-language-intro/</link><pubDate>Sat, 12 Sep 2026 00:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/qsharp-quantum-programming-language-intro/</guid><description>&lt;img src="http://kenji.blog/p/qsharp-quantum-programming-language-intro/img/eyecatch.jpg" alt="Featured image of post تجربة استخدام لغة البرمجة الكمية "Q#"" />&lt;h2 id="1-مقدمة-فجر-الحوسبة-الكمية-ونموذج-جديد-للبرمجة">1. مقدمة: فجر الحوسبة الكمية ونموذج جديد للبرمجة
&lt;/h2>&lt;p>في السنوات الأخيرة، كان الابتكار التكنولوجي في مجال الحوسبة الكمية، سواء في الأجهزة أو البرمجيات، ملحوظًا. في حين أن أجهزة الكمبيوتر الكلاسيكية (مثل أجهزة الكمبيوتر الشخصية والهواتف الذكية وأجهزة الكمبيوتر العملاقة التي نستخدمها يوميًا) تعالج المعلومات كمجموعة من البتات المحددة إما &amp;ldquo;0&amp;rdquo; أو &amp;ldquo;1&amp;rdquo;، تستخدم أجهزة الكمبيوتر الكمية ظواهر فيزيائية خاصة بميكانيكا الكم مثل &amp;ldquo;التراكب&amp;rdquo; (Superposition) و&amp;quot;التشابك الكمي&amp;quot; (Entanglement) مباشرة كأساس لمعالجة المعلومات. وقد أظهر هذا إمكانية تحقيق سرعات حسابية لفئات معينة من المشاكل لا يمكن لأجهزة الكمبيوتر الكلاسيكية الوصول إليها حتى لو استغرقت وقتًا يعادل عمر الكون، وهو ما يُعرف باسم &amp;ldquo;التفوق الكمي&amp;rdquo; (Quantum Supremacy) أو &amp;ldquo;الميزة الكمية&amp;rdquo; (Quantum Advantage). على سبيل المثال، من المتوقع حدوث انخفاض كبير في التعقيد الحسابي في مجالات مثل تحليل الأعداد الكبيرة إلى عواملها الأولية (خوارزمية شور)، والبحث السريع في قواعد البيانات (خوارزمية غروفر)، ومحاكاة الكيمياء الكمية (خوارزمية VQE)، ومشاكل التحسين التوافقي، وحتى في عمليات معينة للتعلم الآلي (التعلم الآلي الكمي).&lt;/p>
&lt;p>ومع ذلك، من أجل تحويل هذه الإمكانات المذهلة لأجهزة الكمبيوتر الكمية إلى تطبيقات واقعية، فإن التقدم في الأجهزة المادية (مثل الكيوبتات فائقة التوصيل أو المصائد الأيونية) وحده غير كافٍ. من الضروري وجود &amp;ldquo;لغة برمجة كمية&amp;rdquo; لتصميم الدوائر الكمية بدقة ووصف الخوارزميات الكمية دون أخطاء وبكفاءة، إلى جانب بيئة قوية للتطوير والتنفيذ وتصحيح الأخطاء. لغات البرمجة الكلاسيكية (مثل C++، Python، Java، إلخ) ممتازة في تجريد سلوك بنية وحدة المعالجة المركزية الكلاسيكية، ولكنها لم تُصمم لوصف التلاعب بالحالات الكمية بشكل طبيعي، والتي تتميز بطبيعتها غير الحتمية وسعاتها الاحتمالية المركبة.&lt;/p>
&lt;p>في هذه المقالة، من بين العديد من بيئات البرمجة الكمية، سنسلط الضوء على &amp;ldquo;مجموعة تطوير الكم&amp;rdquo; (Quantum Development Kit - QDK)، والتي تدفع بها شركة مايكروسوفت بقوة ويتم تطويرها كمصدر مفتوح، ولغة البرمجة المخصصة الأساسية التابعة لها &amp;ldquo;Q#&amp;rdquo; (كيو شارب).&lt;/p>
&lt;p>كـ لغة خاصة بالمجال (DSL) متخصصة في وصف الخوارزميات الكمية، تم تصميم Q# من الصفر مع استيعاب أفضل أجزاء من C# و F# و Python. إنها تتميز بقدرات قوية تسمح بدمج سلس لتدفق التحكم الكلاسيكي (مثل عبارات if وحلقات for) والعمليات الكمية (تطبيق البوابات والقياسات). في هذه المقالة، بدءًا من النماذج الرياضية الأساسية للحوسبة الكمية، سنشرح بالتفصيل وبشكل شامل الخصائص اللغوية لـ Q#، ومقارنة فلسفة تصميمها مع Qiskit في Python، وبناء &amp;ldquo;حالة بيل&amp;rdquo; (حالة التشابك الكمي) وقياسها باستخدام الكود الفعلي، وحتى طرق دمجها مع اللغات الكلاسيكية (Python و C#). بحلول الوقت الذي تنتهي فيه من قراءة هذه المقالة، ستكون قد فهمت أساسيات البرمجة الكمية ومستعدًا للبدء في كتابة كود Q# في بيئتك الخاصة.&lt;/p>
&lt;h2 id="2-الأساس-الرياضي-للحوسبة-الكمية-الحالات-التراكب-والتشابك">2. الأساس الرياضي للحوسبة الكمية: الحالات، التراكب، والتشابك
&lt;/h2>&lt;p>من أجل فهم بناء الجملة وميزات Q# بعمق وكتابة برامج كمية فعالة، من الضروري أولاً تنظيم المعرفة الرياضية الأساسية (وخاصة الجبر الخطي) وراء الحالات الكمية وعمليات البوابات الكمية. هنا، سنستعرض النماذج الرياضية الأساسية اللازمة للبرمجة الكمية.&lt;/p>
&lt;h3 id="21-الكيوبت-qubit-وحالة-التراكب">2.1 الكيوبت (Qubit) وحالة التراكب
&lt;/h3>&lt;p>في حين أن البت الكلاسيكي (Classical Bit) يمكن أن يأخذ فقط إحدى الحالتين $0$ أو $1$، يتم تمثيل الكيوبت (Qubit) كـ &amp;ldquo;تركيبة خطية&amp;rdquo; (Linear Combination)، أو &amp;ldquo;تراكب&amp;rdquo;، من الحالتين $|0\rangle$ و $|1\rangle$. يتم وصف هذه الحالة باستخدام تدوين برا-كيت (تدوين ديراك) والمعاملات المركبة $\alpha$ و $\beta$ على النحو التالي:&lt;/p>
$$ |\psi\rangle = \alpha|0\rangle + \beta|1\rangle $$
&lt;p>هنا، $\alpha$ و $\beta$ هي أعداد مركبة تُعرف باسم &amp;ldquo;السعات الاحتمالية&amp;rdquo; (Probability Amplitude). عند قياس هذا الكيوبت، فإن احتمال رصد الحالة $|0\rangle$ هو $|\alpha|^2$، واحتمال رصد الحالة $|1\rangle$ هو $|\beta|^2$. كقيد فيزيائي، يجب أن يكون مجموع احتمالات رصد جميع الحالات الممكنة دائمًا $1$، لذلك يجب أن يفي بالشرط التالي المعروف باسم &amp;ldquo;شرط التسوية&amp;rdquo; (Normalization Condition):&lt;/p>
$$ |\alpha|^2 + |\beta|^2 = 1 $$
&lt;p>غالبًا ما يتم تصور حالة الكيوبت كنقطة على سطح كرة الوحدة في فضاء ثلاثي الأبعاد تُعرف باسم &amp;ldquo;كرة بلوخ&amp;rdquo; (Bloch Sphere). يتوافق القطب الشمالي مع $|0\rangle$، والقطب الجنوبي مع $|1\rangle$، وتمثل النقاط على خط الاستواء حالات يتراكب فيها $|0\rangle$ و $|1\rangle$ باحتمالات متساوية (على سبيل المثال، الحالة ذات الطور 0 هي $|+\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)$، والحالة ذات الطور $\pi/2$ هي $|i\rangle = \frac{1}{\sqrt{2}}(|0\rangle + i|1\rangle)$). يمكن فهم عمليات البوابات الكمية هندسيًا كعمليات دوران على كرة بلوخ هذه.&lt;/p>
&lt;h3 id="22-الكيوبتات-المتعددة-الجداء-الموتري-والتشابك-الكمي">2.2 الكيوبتات المتعددة، الجداء الموتري، والتشابك الكمي
&lt;/h3>&lt;p>تظهر القوة الحقيقية للحوسبة الكمية عند الجمع بين عدة كيوبتات. يتم وصف حالة النظام المكون من كيوبتات متعددة من خلال &amp;ldquo;الجداء الموتري&amp;rdquo; (Tensor Product) لمساحات الحالة للكيوبتات الفردية. على سبيل المثال، حالة النظام بأكمله المكون من اثنين من الكيوبتات هي كما يلي:&lt;/p>
$$ |\psi\rangle = \alpha_{00}|00\rangle + \alpha_{01}|01\rangle + \alpha_{10}|10\rangle + \alpha_{11}|11\rangle $$
&lt;p>هنا أيضًا يسري شرط التسوية $\sum_{i,j} |\alpha_{ij}|^2 = 1$. النقطة المهمة هي أنه لوصف نظام مكون من n كيوبت بالكامل، نحتاج إلى $2^n$ من السعات المركبة. على سبيل المثال، حتى في نظام مكون من 50 كيوبتًا فقط، لتمثيل حالته، نحتاج إلى حوالي $2^{50} \approx 10^{15}$ عدد مركب، وهو ما يتجاوز بكثير سعة الذاكرة لأسرع أجهزة الكمبيوتر العملاقة في العالم حاليًا. هذا أحد الأسباب التي تجعل أجهزة الكمبيوتر الكمية تتمتع بميزة أسية على أجهزة الكمبيوتر الكلاسيكية.&lt;/p>
&lt;p>يشير &amp;ldquo;التشابك الكمي&amp;rdquo; (Entanglement) إلى حالة في نظام متعدد الكيوبتات حيث لا يمكن تحليل الحالة ببساطة كجداء موتري لحالات الكيوبتات الفردية. واحدة من أشهر حالات التشابك وأهمها هي &amp;ldquo;حالة بيل&amp;rdquo; (Bell State) التالية:&lt;/p>
$$ |\Phi^+\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle) $$
&lt;p>في هذه الحالة، في اللحظة التي نقيس فيها أحد الكيوبتات ونحصل على $0$ (أو $1$)، يتم تحديد حالة الكيوبت الآخر فورًا إلى $0$ (أو $1$) بغض النظر عن المسافة بينهما. هذا الارتباط غير المحلي، الذي أطلق عليه أينشتاين &amp;ldquo;التأثير الشبحي عن بعد&amp;rdquo;، هو مورد أساسي في النقل الآني الكمي، التشفير فائق الكثافة، اتصالات التشفير الكمي، بالإضافة إلى التنفيذ الفعال للعديد من الخوارزميات الكمية. في الأقسام اللاحقة، سنقوم فعليًا بإنشاء حالة بيل هذه باستخدام Q#.&lt;/p>
&lt;h3 id="23-عمليات-البوابات-الكمية-والمصفوفات-الوحدوية">2.3 عمليات البوابات الكمية والمصفوفات الوحدوية
&lt;/h3>&lt;p>تسمى العمليات التي تغير الحالة الكمية (والتي تعادل بوابات AND و OR و NOT في الدوائر المنطقية الكلاسيكية) بالبوابات الكمية. رياضيًا، يتم تمثيل البوابة الكمية كمصفوفة من الأعداد المركبة التي تعمل كضرب مصفوفة لمتجه الحالة الكمية. وفقًا لمسلمات ميكانيكا الكم، يجب أن تكون هذه المصفوفات دائمًا &amp;ldquo;مصفوفات وحدوية&amp;rdquo; (Unitary Matrix، وهي المصفوفة التي تلبي شرط $U^\dagger U = I$، حيث $U^\dagger$ هي المصفوفة المرافقة و $I$ هي مصفوفة الوحدة). نتيجة لذلك، تكون جميع العمليات الكمية باستثناء القياس &amp;ldquo;قابلة للعكس&amp;rdquo; (Reversible).&lt;/p>
&lt;p>بوابات الكيوبت المفردة التمثيلية:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>بوابة Pauli-X (بوابة NOT)&lt;/strong>: تعكس $|0\rangle$ إلى $|1\rangle$، و $|1\rangle$ إلى $|0\rangle$.
$$ X = \begin{pmatrix} 0 &amp; 1 \\ 1 &amp; 0 \end{pmatrix} $$&lt;/li>
&lt;li>&lt;strong>بوابة Pauli-Z (بوابة إزاحة الطور)&lt;/strong>: تترك $|0\rangle$ كما هو، وتعكس إشارة $|1\rangle$ (تضيف $\pi$ إلى الطور النسبي).
$$ Z = \begin{pmatrix} 1 &amp; 0 \\ 0 &amp; -1 \end{pmatrix} $$&lt;/li>
&lt;li>&lt;strong>بوابة Hadamard (بوابة H)&lt;/strong>: تحول حالة حتمية إلى حالة تراكب.
$$ H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 &amp; 1 \\ 1 &amp; -1 \end{pmatrix} $$&lt;/li>
&lt;/ul>
&lt;p>بوابات الكيوبت المزدوجة التمثيلية:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>بوابة CNOT (بوابة NOT المحكومة)&lt;/strong>: تطبق بوابة X (عملية NOT) على الكيوبت المستهدف (Target Qubit) فقط عندما يكون كيوبت التحكم (Control Qubit) في حالة $|1\rangle$.
$$ CNOT = \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 1 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 1 \\ 0 &amp; 0 &amp; 1 &amp; 0 \end{pmatrix} $$&lt;/li>
&lt;/ul>
&lt;p>يمكن القول إن الخوارزمية الكمية هي تصميم لعملية تحقيق العملية الحسابية المطلوبة من خلال الجمع بين هذه المصفوفات الوحدوية الأساسية.&lt;/p>
&lt;h2 id="3-ما-هي-مجموعة-تطوير-الكم-من-مايكروسوفت-qdk">3. ما هي مجموعة تطوير الكم من مايكروسوفت (QDK)؟
&lt;/h2>&lt;p>مجموعة تطوير الكم (QDK) التي تقدمها مايكروسوفت هي مجموعة أدوات شاملة لدعم تطوير برمجيات الحوسبة الكمية. وهي تدعم دورة حياة التطوير بأكملها، من تصميم الخوارزميات الكمية، وتصحيح الأخطاء، والتحسين، إلى تنفيذها على أجهزة المحاكاة أو الأجهزة الكمية الفعلية.&lt;/p>
&lt;p>تتضمن QDK العناصر الرئيسية التالية:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>مترجم وبيئة تشغيل Q#&lt;/strong>: يقوم بتحليل الكود المكتوب بلغة Q# بدقة عالية، وتحسينه، وتحويله إلى تنسيق قابل للتنفيذ (مثل QIR) على المحاكي أو الأجهزة الكمية الفعلية (عبر Azure Quantum). يقوم مترجم Q# بإجراء تحليل ثابت خاص بالحسابات الكمية، مثل التحقق من نقاء الدوال وإدارة دورة حياة الكيوبتات.&lt;/li>
&lt;li>&lt;strong>محاكي كمي&lt;/strong>: يتضمن &amp;ldquo;محاكي الحالة الكاملة&amp;rdquo; (Full State Simulator) الذي يحاكي تطور الحالة الكمية على جهاز المطور المحلي. يتيح ذلك اختبار وتصحيح الأخطاء بسرعة للخوارزميات صغيرة الحجم على نطاق عشرات الكيوبتات محليًا. علاوة على ذلك، يتم توفير &amp;ldquo;مقدر الموارد&amp;rdquo; (Resource Estimator) لتقدير متطلبات الموارد للدوائر واسعة النطاق (آلاف إلى ملايين الكيوبتات).&lt;/li>
&lt;li>&lt;strong>مكتبات غنية&lt;/strong>: توفر المكتبة القياسية لـ Q# (Standard Library) وحدات بناء متقدمة مختلفة، تتراوح من البوابات الكمية الأساسية (H، X، Y، Z، CNOT، إلخ) إلى العمليات الحسابية المعقدة (مثل الجامع الكمي)، وتضخيم السعة (Amplitude Amplification)، وخوارزمية تقدير الطور الكمي (Quantum Phase Estimation). يجنب هذا المطورين إعادة اختراع العجلة.&lt;/li>
&lt;li>&lt;strong>تكامل بيئة التطوير المتكاملة (IDE)&lt;/strong>: تتوفر إضافات لـ Visual Studio و Visual Studio Code، مما يوفر ميزات لا غنى عنها في تطوير البرمجيات الحديثة، مثل تمييز بناء الجملة، وإكمال الكود (IntelliSense)، وإمكانيات تصحيح الأخطاء القوية، والتكامل مع أطر الاختبار.&lt;/li>
&lt;/ol>
&lt;p>يُظهر مخطط Mermaid التالي سير العمل من وقت كتابة برنامج Q# حتى تنفيذه على الأجهزة.&lt;/p>
&lt;div class="mermaid">graph TD
A["كود المصدر Q# (.qs)"] --> B["مترجم Q#"]
B --> C["التمثيل الوسيط الكمي (QIR)"]
C --> D["محاكي كمي محلي"]
C --> E["خدمة Azure Quantum"]
E --> F["أجهزة IonQ"]
E --> G["أجهزة Quantinuum"]
E --> H["أجهزة Rigetti"]
D --> I["النتيجة / بيانات الإخراج"]
F --> I
G --> I
H --> I
style A fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px;
style B fill:#fff3e0,stroke:#ff9800,stroke-width:2px;
style C fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px;&lt;/div>
&lt;p>الميزة الرائعة لهذه البنية هي أنها تجرد تمامًا الاختلافات في بنيات الأجهزة الأساسية (الكيوبتات فائقة التوصيل، المصائد الأيونية، الكيوبتات الطوبولوجية، الكيوبتات الضوئية، إلخ) من خلال تمريرها عبر تمثيل وسيط يسمى QIR (التمثيل الوسيط الكمي) والمبني على LLVM. يمكن للمطورين التركيز على التصميم المنطقي البحت للخوارزمية دون القلق بشأن التفاصيل المادية للأجهزة (مجموعة البوابات الأصلية والطوبولوجيا الخاصة بكل جهاز). ستقوم مسارات المترجم بعد طبقة QIR بنقل البوابات المحسنة تلقائيًا إلى الأجهزة المستهدفة.&lt;/p>
&lt;h2 id="4-q-مقابل-pythonqiskit-لماذا-نحتاج-إلى-لغة-جديدة">4. Q# مقابل Python/Qiskit: لماذا نحتاج إلى لغة جديدة؟
&lt;/h2>&lt;p>عند تعلم البرمجة الكمية، فإن أول ما يواجهه الكثير من الناس هو &amp;ldquo;Qiskit&amp;rdquo;، وهو إطار عمل قائم على Python تم تطويره بواسطة IBM، نظرًا لسهولة استخدامه وانتشار لغة Python. في حين أن Qiskit هي أيضًا أداة قوية ومستخدمة على نطاق واسع، إلا أن فلسفة التصميم الأساسية (النموذج) تختلف اختلافًا كبيرًا عن Q# الخاصة بمايكروسوفت.&lt;/p>
&lt;h3 id="نهج-qiskit-بناء-كائنات-الدوائر-باستخدام-python">نهج Qiskit (بناء كائنات الدوائر باستخدام Python)
&lt;/h3>&lt;p>Qiskit هي في جوهرها &amp;ldquo;مكتبة واجهة برمجة تطبيقات (API) لـ Python لبناء الدوائر الكمية&amp;rdquo;. عندما يقوم المطور بتنفيذ نص Python، يتم تجميع تسلسل البوابات الكمية (كائن الدائرة) تدريجيًا في الذاكرة. بعد إضافة جميع البوابات، يتم أخيرًا إرسال (Submit) كائن الدائرة الضخم هذا إلى الواجهة الخلفية (المحاكي المحلي أو جهاز حقيقي على السحابة) للتنفيذ.
هذا النهج الميتا-برمجي له ميزة كبيرة تتمثل في سهولة التكامل للغاية مع النظام البيئي الحالي لـ Python (مثل مكتبات التعلم الآلي NumPy و SciPy و PyTorch وأدوات التصور). ومع ذلك، عندما يتعلق الأمر بالتعبير عن &amp;ldquo;الدوائر الديناميكية&amp;rdquo; (Dynamic Circuits) ذات التدفق التحكمي المعقد الذي يمزج بين الكلاسيكي والكمي، مثل &amp;ldquo;قياس كيوبت معين، وإذا كانت النتيجة فقط 1، قم بتطبيق عملية وحدوية معقدة محددة على مجموعة أخرى من الكيوبتات، ثم قم بتشغيل حلقة while&amp;rdquo;، لا يمكن استخدام عبارات if وحلقات for الأصلية في Python (لأنها يتم تقييمها &amp;ldquo;في وقت بناء الدائرة&amp;rdquo;). ينتج عن هذا الحاجة إلى استخدام تعليمات التحكم الخاصة بـ Qiskit، مما يجعل الكود غالبًا معقدًا للغاية وغير بديهي.&lt;/p>
&lt;h3 id="نهج-q-لغة-خاصة-بالمجال-تضع-الكم-أولا">نهج Q# (لغة خاصة بالمجال تضع الكم أولاً)
&lt;/h3>&lt;p>من ناحية أخرى، فإن Q# هي لغة مجمعة قائمة بذاتها صُممت من الصفر للتعامل مع الحوسبة الكمية نفسها كـ &amp;ldquo;مواطن من الدرجة الأولى&amp;rdquo; (First-class citizen). داخل Q#، يمكن وصف عمليات تخصيص الكيوبتات، وتطبيق البوابات، والقياس بشكل طبيعي وسلس داخل قاعدة كود واحدة، وبنفس الطريقة تمامًا مثل معالجة المتغيرات الكلاسيكية، وعبارات if، وحلقات المعالجة.
يقوم مترجم Q# بتحليل الكود بأكمله بشكل ثابت ويحدد الأجزاء التي يجب تنفيذها على أجهزة الحوسبة الكلاسيكية (وحدة المعالجة المركزية المضيفة أو إلكترونيات التحكم) والأجزاء التي يجب تنفيذها على المعالج المساعد الكمي (QPU)، ويقوم بإجراء تحسينات متقدمة. يتيح ذلك تحقيق مستوى أعلى من النمطية وقابلية القراءة وقابلية الصيانة و &amp;ldquo;أمان الكتابة&amp;rdquo; (Type Safety) في تنفيذ الخوارزميات الكمية المعقدة واسعة النطاق. Q# هي لغة &amp;ldquo;لكتابة الخوارزميات&amp;rdquo; وليس &amp;ldquo;لكتابة الدوائر&amp;rdquo;.&lt;/p>
&lt;h2 id="5-نظرة-متعمقة-على-بناء-الجملة-الأساسي-لـ-q-ومفاهيمها-المميزة">5. نظرة متعمقة على بناء الجملة الأساسي لـ Q# ومفاهيمها المميزة
&lt;/h2>&lt;p>يتمتع بناء جملة Q# بتصميم مصقول للغاية، حيث يجمع بين بنية الكتلة باستخدام الأقواس المعقوفة &lt;code>{}&lt;/code> كما في C#، وعناصر البرمجة الوظيفية من F#، واستنتاج الأنواع (Type Inference) القوي. هنا، سنشرح بالتفصيل الكلمات الرئيسية والمفاهيم المهمة لفهم Q# بعمق.&lt;/p>
&lt;h3 id="51-التمييز-الصارم-بين-operation-و-function">5.1 التمييز الصارم بين &lt;code>operation&lt;/code> و &lt;code>function&lt;/code>
&lt;/h3>&lt;p>في Q#، يتم التمييز بدقة بين نوعين لتعريف الكتل البرمجية (الروتينات الفرعية): &lt;code>operation&lt;/code> و &lt;code>function&lt;/code>. ينبع هذا من مفهوم &amp;ldquo;النقاء&amp;rdquo; (Purity) في البرمجة الوظيفية.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>function&lt;/code>&lt;/strong>: هي دالة نقية تؤدي فقط حسابات كلاسيكية حتمية (Deterministic). إذا تم إعطاؤها نفس معاملات الإدخال، فسترجع دائمًا نفس نتيجة الإخراج بغض النظر عن عدد مرات تنفيذها. داخل &lt;code>function&lt;/code>، ستؤدي العمليات الكمية (العمليات المصحوبة بآثار جانبية) مثل تخصيص الكيوبتات، وتطبيق البوابات، والقياس إلى حدوث خطأ في الترجمة. تُستخدم للحسابات الرياضية وتحويلات البيانات.&lt;/li>
&lt;li>&lt;strong>&lt;code>operation&lt;/code>&lt;/strong>: هو روتين غير حتمي (Non-deterministic) يتضمن حسابات كمية. يحتوي على عمليات على الكيوبتات أو قياسات، وحتى مع نفس الإدخال، قد تتغير النتيجة بسبب الطبيعة الاحتمالية لميكانيكا الكم (مثل انهيار الدالة الموجية بسبب القياس). يتم تعريف جميع الأجزاء الأساسية للخوارزميات الكمية على أنها &lt;code>operation&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="52-نوع-qubit-وإدارة-دورة-الحياة-باستخدام-الكلمة-الرئيسية-use">5.2 نوع &lt;code>Qubit&lt;/code> وإدارة دورة الحياة باستخدام الكلمة الرئيسية &lt;code>use&lt;/code>
&lt;/h3>&lt;p>في Q#، يتم التعامل مع الكيوبتات ككائنات &amp;ldquo;مبهمة&amp;rdquo; (Opaque) من النوع &lt;code>Qubit&lt;/code>. يُمنع المطورون عمدًا من القراءة المباشرة أو إعادة كتابة السعات الاحتمالية للحالة الداخلية (مثل قيم $\alpha$ و $\beta$) داخل البرنامج (يتوافق هذا مع &amp;ldquo;مشكلة القياس&amp;rdquo; في الأنظمة الكمية المادية الحقيقية). الطريقة الوحيدة للتفاعل مع الكيوبتات هي استدعاء عمليات البوابات الكمية أو دوال القياس المتوفرة.&lt;/p>
&lt;p>لتخصيص (Allocate) كيوبتات جديدة داخل البرنامج، استخدم الكلمة الرئيسية &lt;code>use&lt;/code> (في الإصدارات القديمة من Q# كانت تسمى &lt;code>using&lt;/code>). تحدد كتلة &lt;code>use&lt;/code> بوضوح نطاق الكيوبت ودورة حياته.
كقاعدة هامة، عند الخروج من كتلة &lt;code>use&lt;/code>، يجب أن تعود جميع الكيوبتات المخصصة بداخلها بالكامل إلى الحالة $|0\rangle$ (وإلا سيحدث استثناء في وقت التشغيل). تعد هذه آلية أمان قوية في Q# لضمان إعادة استخدام الكيوبتات ومنع تسرب الذاكرة.&lt;/p>
&lt;h3 id="53-القياس-m-و-mresetz-المفيدة">5.3 القياس &lt;code>M&lt;/code> و &lt;code>MResetZ&lt;/code> المفيدة
&lt;/h3>&lt;p>تتم عملية القياس (Measurement) لتحويل الحالة الكمية إلى معلومات كلاسيكية (0 أو 1) من خلال العملية الأساسية &lt;code>M&lt;/code>. يتم إرجاع نتيجة القياس في أساس Z (الأساس القياسي) كنوع تعداد (Enum) يُسمى &lt;code>Result&lt;/code> (القيم هي &lt;code>Zero&lt;/code> أو &lt;code>One&lt;/code>).
ومع ذلك، كما ذكرنا سابقًا، عند تحرير الكيوبت، يجب أن يكون في الحالة $|0\rangle$. إذا قمنا فقط بالقياس &lt;code>M&lt;/code>، وإذا كانت النتيجة &lt;code>One&lt;/code>، فإن الكيوبت سيكون قد انهار إلى الحالة $|1\rangle$. لذلك، في الكود العملي، يتم استخدام العملية القياسية المفيدة &lt;code>MResetZ&lt;/code> بشكل متكرر للغاية، والتي تعيد ضبط حالة الكيوبت بشكل موثوق إلى $|0\rangle$ فور إجراء القياس.&lt;/p>
&lt;h3 id="54-عدم-قابلية-المتغيرات-للتغيير-immutability-و-mutable">5.4 عدم قابلية المتغيرات للتغيير (Immutability) و &lt;code>mutable&lt;/code>
&lt;/h3>&lt;p>تأثرت Q# بشدة بالبرمجة الوظيفية، لذا فإن جميع المتغيرات افتراضيًا غير قابلة للتغيير (Immutable). بمجرد ربط المتغير باستخدام الكلمة الرئيسية &lt;code>let&lt;/code>، لا يمكن تغيير قيمته بعد ذلك. يساعد هذا في تقليل الآثار الجانبية غير المقصودة في المعالجة المتوازية والخوارزميات الكمية.
إذا كنت بحاجة إلى الإعلان عن متغير يجب تحديث قيمته، مثل عداد الحلقة أو حساب تراكمي، فيمكنك استخدام الكلمة الرئيسية &lt;code>mutable&lt;/code> صراحةً، واستخدام الكلمة الرئيسية &lt;code>set&lt;/code> لتحديث القيمة.&lt;/p>
&lt;h2 id="6-التدريب-العملي-إنشاء-حالة-بيل-التشابك-الكمي-وقياسها-باستخدام-q">6. التدريب العملي: إنشاء حالة بيل (التشابك الكمي) وقياسها باستخدام Q#
&lt;/h2>&lt;p>الآن، دعونا نجمع كل المعرفة التي تعلمناها حتى الآن ونستخدم Q# فعليًا لإنشاء &amp;ldquo;حالة بيل&amp;rdquo; (Bell State) التي شرحناها في القسم الرياضي سابقًا، وكتابة برنامج لقياسها. هذه خطوة مهمة جدًا يمكن اعتبارها &amp;ldquo;مرحبًا بالعالم&amp;rdquo; (Hello World) في البرمجة الكمية.&lt;/p>
&lt;h3 id="تصميم-الدائرة-الكمية-وشرحها">تصميم الدائرة الكمية وشرحها
&lt;/h3>&lt;p>إليك الخطوات القياسية للدائرة الكمية لإنشاء حالة بيل $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$:&lt;/p>
&lt;ol>
&lt;li>قم بإعداد اثنين من الكيوبتات $q_0$ و $q_1$ في الحالة الابتدائية $|00\rangle$.&lt;/li>
&lt;li>قم بتطبيق بوابة هادامارد (بوابة $H$) على $q_0$. يؤدي هذا إلى وضع $q_0$ في حالة تراكب متساوية الاحتمال بين $|0\rangle$ و $|1\rangle$، وهي $\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)$. في هذه المرحلة، حالة النظام بأكمله هي $\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle) \otimes |0\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |10\rangle)$.&lt;/li>
&lt;li>قم بتطبيق بوابة CNOT (NOT المحكومة) باستخدام $q_0$ ككيوبت تحكم (Control) و $q_1$ ككيوبت مستهدف (Target). هذا يعكس $q_1$ فقط عندما يكون $q_0$ في حالة $|1\rangle$. نتيجة لذلك، تبقى الحالة $|00\rangle$ كما هي $|00\rangle$، بينما تتغير الحالة $|10\rangle$ إلى $|11\rangle$، وتكون الحالة النهائية للنظام بأكمله $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$. وبذلك يكتمل إنشاء حالة التشابك ذات الارتباط المثالي.&lt;/li>
&lt;/ol>
&lt;h3 id="كود-التنفيذ-باستخدام-q">كود التنفيذ باستخدام Q#
&lt;/h3>&lt;p>الكود التالي هو مثال عملي للتنفيذ يستخدم Q# لإنشاء حالة بيل وتكرار تجربة القياس لعدد محدد من المرات لجمع الإحصائيات (توزيع الاحتمالات).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">namespace Quantum.BellState {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // استيراد مساحات الأسماء الضرورية
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> open Microsoft.Quantum.Intrinsic;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> open Microsoft.Quantum.Canon;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> open Microsoft.Quantum.Measurement;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> open Microsoft.Quantum.Diagnostics;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// # Summary
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// يولد حالة بيل واحدة ويقيس اثنين من الكيوبتات في أساس Z.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ///
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// # Output
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// (Result, Result): نتائج قياس qubit1 و qubit2. إذا كانت في حالة بيل، فستكون متطابقة دائمًا.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> operation GenerateAndMeasureBellState() : (Result, Result) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تخصيص اثنين من الكيوبتات (تكون الحالة الابتدائية تلقائيًا |00&amp;gt;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> use (q1, q2) = (Qubit(), Qubit());
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تطبيق بوابة هادامارد على q1 لإنشاء حالة تراكب
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> H(q1);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تطبيق بوابة CNOT مع q1 ككيوبت تحكم و q2 ككيوبت مستهدف
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // يؤدي هذا إلى إنشاء تشابك كمي (Entanglement) بين q1 و q2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> CNOT(q1, q2);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // كطريقة لتصحيح الأخطاء أثناء التطوير، يمكنك تفريغ متجه الحالة في المحاكي للتحقق منه
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // DumpMachine(); // أزل التعليق إذا لزم الأمر
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // إجراء القياس، وفي نفس الوقت إعادة تعيين حالة الكيوبت إلى |0&amp;gt; لتحريره بأمان
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let res1 = MResetZ(q1);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let res2 = MResetZ(q2);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // إرجاع زوج من نتائج القياس
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> return (res1, res2);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// # Summary
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// الروتين الرئيسي الذي ينفذ تجربة إنشاء حالة بيل وقياسها عدة مرات ويجمع إحصائيات النتائج.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ///
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// # Input
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// ## count
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// عدد مرات تكرار التجربة (مثال: 1000 مرة)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ///
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// # Output
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /// (Int, Int, Int, Int): عدد المرات التي تم فيها رصد (00, 01, 10, 11) على التوالي
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> @EntryPoint()
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> operation RunBellStateExperiment(count: Int) : (Int, Int, Int, Int) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تهيئة المتغيرات القابلة للتغيير (mutable) لعد مرات الرصد
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mutable num00 = 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mutable num01 = 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mutable num10 = 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mutable num11 = 0;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تدوير حلقة التجربة بالعدد المحدد من المرات
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> for _ in 1..count {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // إنشاء حالة بيل واستقبال نتائج القياس
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> let (r1, r2) = GenerateAndMeasureBellState();
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // حساب أنماط النتائج
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> if r1 == Zero and r2 == Zero {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> set num00 += 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> } elif r1 == Zero and r2 == One {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> set num01 += 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> } elif r1 == One and r2 == Zero {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> set num10 += 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> } else { // حالة r1 == One and r2 == One
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> set num11 += 1;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // إخراج المعلومات الإحصائية المجمعة كرسالة إلى وحدة التحكم
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;--- Experiment Results ---&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;Total runs: {count}&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;00 observed: {num00}&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;01 observed: {num01}&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;10 observed: {num10}&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Message($&amp;#34;11 observed: {num11}&amp;#34;);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> return (num00, num01, num10, num11);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="شرح-الكود-والتحقق-من-التشغيل">شرح الكود والتحقق من التشغيل
&lt;/h3>&lt;ul>
&lt;li>&lt;code>namespace&lt;/code>: كما هو الحال في Java و C#، يعد هذا إعلانًا لمساحة اسم (Namespace) لتنظيم البرنامج منطقيًا ومنع تعارض الأسماء.&lt;/li>
&lt;li>&lt;code>open&lt;/code>: يستورد المكتبات (الوحدات) الضرورية. تحتوي &lt;code>Microsoft.Quantum.Intrinsic&lt;/code> على البوابات الكمية الأساسية مثل H و X و Y و Z و CNOT، بينما تحتوي &lt;code>Microsoft.Quantum.Measurement&lt;/code> على وظائف مفيدة متعلقة بالقياس مثل &lt;code>MResetZ&lt;/code>.&lt;/li>
&lt;li>&lt;code>use (q1, q2) = (Qubit(), Qubit());&lt;/code>: يخصص اثنين من الكيوبتات بشكل ديناميكي.&lt;/li>
&lt;li>&lt;code>H(q1); CNOT(q1, q2);&lt;/code>: هذان السطران هما الجزء الأساسي الذي يولد التشابك الكمي. يمكن كتابتهما ببساطة وبديهية شديدة.&lt;/li>
&lt;li>&lt;code>let res1 = MResetZ(q1);&lt;/code>: كما ذكرنا سابقًا، يقوم &lt;code>MResetZ&lt;/code> بربط نتيجة القياس بمتغير وفي الوقت نفسه يعيد ضبط حالة الكيوبت قسراً إلى $|0\rangle$. يسمح هذا بتحرير الكيوبت بأمان عند نهاية كتلة &lt;code>use&lt;/code>.&lt;/li>
&lt;li>&lt;code>@EntryPoint()&lt;/code>: بإضافة هذه السمة، فإنها تشير للمترجم إلى أن هذه العملية هي نقطة البداية لتنفيذ البرنامج (مشابهة لدالة main في لغة C).&lt;/li>
&lt;/ul>
&lt;p>نظريًا، الحالة المتولدة هي حالة بيل $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$، لذلك إذا قمنا بتشغيل هذا البرنامج لعدد كافٍ من المرات (على سبيل المثال 10,000 مرة)، فسيتم رصد &lt;code>00&lt;/code> و &lt;code>11&lt;/code> بنسبة تقارب 50% لكل منهما (حوالي 5,000 مرة)، بينما سيتم رصد &lt;code>01&lt;/code> و &lt;code>10&lt;/code> بصفر مرة (إذا لم يكن هناك خطأ نظري، فلن يتم رصدهما على الإطلاق). هذا دليل على أن الكيوبتات لهما ارتباط قوي (متشابكان).&lt;/p>
&lt;h2 id="7-التكامل-السلس-مع-اللغات-المضيفة-python--c">7. التكامل السلس مع اللغات المضيفة (Python / C#)
&lt;/h2>&lt;p>يمكن تشغيل Q# بمفردها (كتطبيق Q# مستقل) من خلال تحديد &lt;code>@EntryPoint()&lt;/code> كما رأينا في المثال السابق، ولكن في حالات الاستخدام للبحث أو تطوير المؤسسات الفعلي، يتم استخدامها ارتباطًا وثيقًا بالعمليات الكلاسيكية مثل واجهة المستخدم الرسومية للواجهة الأمامية، واسترجاع البيانات من قواعد البيانات الضخمة، وحلقات تحسين التعلم الآلي (مثل تحديثات المعلمات في VQE). لذلك، توفر Q# قابلية تشغيل بيني (Interoperability) متطورة للغاية بحيث يمكن استدعاؤها وتنفيذها بسهولة تامة مباشرة من اللغات المضيفة مثل Python أو C# (.NET).&lt;/p>
&lt;h3 id="71-مثال-على-الاستدعاء-من-python-لعلماء-البيانات">7.1 مثال على الاستدعاء من Python: لعلماء البيانات
&lt;/h3>&lt;p>لاستدعاء Q# من لغة Python، التي تتمتع بحصة ساحقة في عالم علوم البيانات والتعلم الآلي وأبحاث الفيزياء، يتم استخدام حزمة Python &lt;code>qsharp&lt;/code>. كما أن لديها توافقًا عاليًا مع Jupyter Notebook، مما يجعلها مثالية للدمج مع التطوير التفاعلي وتصور البيانات.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. استيراد وحدة التكامل مع Q# الضرورية&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">qsharp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. استيراد عمليات Q# مباشرة، وكأنها دالة في Python&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (يقوم المترجم تلقائيًا بالربط والترجمة في الخلفية)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">Quantum.BellState&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. استدعاؤها وتنفيذها من نص Python (باستخدام المحاكي)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Starting quantum simulation for &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> iterations...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># يتم تنفيذها على المحاكي المحلي عن طريق استدعاء الدالة simulate()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">simulate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># استقبال صف النتائج، وتنسيقها وإخراجها في جانب Python&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">--- Simulation Results ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|00&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected ~500)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|01&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected 0)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|10&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected 0)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|11&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected ~500)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>بهذه الطريقة، نظرًا لأن مترجم Q# والمترجم الفوري يولدون بشكل شفاف روابط عبر C API في الخلفية، يمكن لجانب كود Python التعامل مع الخوارزمية الكمية كمجرد دالة صندوق أسود واحدة، وبناء خوارزمية هجينة بين الكلاسيكي والكمي بسهولة بالغة.&lt;/p>
&lt;h3 id="72-مثال-على-الاستدعاء-من-c-لتطوير-المؤسسات">7.2 مثال على الاستدعاء من C#: لتطوير المؤسسات
&lt;/h3>&lt;p>يمكن دمج كود Q# بنفس الطريقة تمامًا من C#، وهو لغة قوية في تطوير الأنظمة الخلفية واسعة النطاق وتطبيقات المؤسسات. من خلال وضع مشروع Q# (.csproj) ومشروع C# داخل نفس الحل (Solution) وإنشاء علاقة مرجعية، سيتم إنشاء فئة غلاف (Class Wrapper) لـ C# تلقائيًا أثناء البناء.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System.Threading.Tasks&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.Quantum.Simulation.Simulators&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// مساحة اسم المحاكي الكمي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Quantum.BellState&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// مساحة الاسم المعرفة في Q#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">namespace&lt;/span> &lt;span class="nn">QuantumRunner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">class&lt;/span> &lt;span class="nc">Program&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">static&lt;/span> &lt;span class="kd">async&lt;/span> &lt;span class="n">Task&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// إنشاء مثيل لمحاكي الحالة الكاملة الكمي&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// يدير الموارد بشكل مناسب باستخدام عبارة using لأنه يطبق IDisposable&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="nn">var&lt;/span> &lt;span class="n">sim&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">QuantumSimulator&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">long&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Running {count} iterations of Bell State generation...&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ينفذ عملية Q# بشكل غير متزامن. يتم إنشاء الطريقة Run تلقائيًا.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// نمرر sim كهدف التنفيذ، ونمرر count كوسيطة.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">var&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sim&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// يتم إرجاع النتيجة كـ ValueTuple في C#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|00&amp;gt;: {result.Item1}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|01&amp;gt;: {result.Item2}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|10&amp;gt;: {result.Item3}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|11&amp;gt;: {result.Item4}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>هنا، لأغراض التطوير، نستخدم فئة &lt;code>QuantumSimulator&lt;/code> المحلية، ولكن عند الانتقال إلى بيئة الإنتاج، تحتاج فقط إلى استبدال جزء إنشاء مثيل المحاكي بمزود هدف سحابي (Cloud Target Provider) يشير إلى مساحة عمل Azure Quantum (على سبيل المثال، كائن جهاز لـ IonQ أو Quantinuum). يصبح من الممكن تنفيذ الخوارزمية على الأجهزة الكمية الفعلية على السحابة دون إجراء أي تغييرات على كود Q# أو منطق العمل. هذه هي القيمة الحقيقية لـ QDK.&lt;/p>
&lt;h2 id="8-مواضيع-متقدمة-الميزات-التي-تجسد-فلسفة-تصميم-q">8. مواضيع متقدمة: الميزات التي تجسد فلسفة تصميم Q#
&lt;/h2>&lt;p>لقد رأينا الاستخدام الأساسي لـ Q#، ولكن الآن دعونا نتعمق قليلاً في الميزات الأكثر تقدمًا لـ Q# وفلسفة تصميمها. هذه الميزات هي التي تجعل Q# أكثر من مجرد &amp;ldquo;بديل لـ Python&amp;rdquo;، بل لغة كمية حقيقية خاصة بالمجال.&lt;/p>
&lt;h3 id="81-الإنشاء-التلقائي-للعملية-العكسية-adjoint-والعملية-المحكومة-controlled">8.1 الإنشاء التلقائي للعملية العكسية (Adjoint) والعملية المحكومة (Controlled)
&lt;/h3>&lt;p>إحدى الميزات الرئيسية للحسابات الكمية هي &amp;ldquo;قابلية العكس&amp;rdquo; (Reversibility) المستمدة من &amp;ldquo;الوحدوية&amp;rdquo; (Unitarity). جميع العمليات الأساسية باستثناء القياس هي مصفوفات وحدوية، وبالتالي يوجد دائمًا مصفوفة عكسية (عملية عكسية) يمكنها إعادة الحالة إلى ما كانت عليه. في Q#، يتم توفير معدّلات دالية (Functor Modifiers) قوية تسمى &lt;code>Adjoint&lt;/code> (العملية المرافقة/العكسية) و &lt;code>Controlled&lt;/code> (العملية المحكومة) لدعم هذا كميزة من الدرجة الأولى على مستوى اللغة.&lt;/p>
&lt;p>بالنسبة لعملية كمية معينة &lt;code>Op&lt;/code>، دون الحاجة إلى حساب المصفوفة يدويًا أو عكس ترتيب البوابات لتنفيذ العملية العكسية، من خلال مجرد إضافة كلمات رئيسية معينة إلى توقيع الدالة، سيقوم مترجم Q# تلقائيًا بإنشاء &lt;code>Adjoint Op&lt;/code>. وبالمثل، يمكن إنشاء &lt;code>Controlled Op&lt;/code> تلقائيًا، وهي عملية شرطية تنفذ &lt;code>Op&lt;/code> فقط عندما تكون جميع كيوبتات التحكم المحددة في الحالة $|1\rangle$.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">// بإضافة is Adj + Ctl ، يتم توجيه المترجم لإنشاء العملية العكسية والمحكومة تلقائيًا
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operation MyComplexSubroutine(qubits: Qubit[]) : Unit is Adj + Ctl {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // اكتب هنا تسلسل بوابات كمية معقدة للغاية
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // مثال: مزيج من H، T، CNOT، أو أي إزاحة طور اختيارية
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// مثال على الجانب المستدعي
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operation UseMyOp(controlQubit: Qubit, targetQubits: Qubit[]) : Unit {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // استدعاء عادي
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MyComplexSubroutine(targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تنفيذ العملية العكسية: إرجاع الحالة بالكامل إلى حالتها الأصلية (مفيد جدًا لإلغاء الحساب - Uncomputation)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Adjoint MyComplexSubroutine(targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // تنفيذ العملية المحكومة: تنفيذ الروتين الفرعي المعقد فقط عندما يكون controlQubit في حالة |1&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Controlled MyComplexSubroutine([controlQubit], targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // علاوة على ذلك، يمكن إجراء مجموعات مثل العملية العكسية للعملية المحكومة!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Controlled Adjoint MyComplexSubroutine([controlQubit], targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>تُبسط هذه الميزة بشكل كبير عملية تنفيذ الخوارزميات المتقدمة التي تستخدم بكثرة الروتينات الفرعية المعقدة وعملياتها العكسية (لإلغاء الحساب غير المرغوب فيه: Uncomputation)، مثل تنفيذ أوراكل (Oracle) في خوارزمية غروفر أو خوارزمية شور لتحليل العوامل، مما يقلل بشكل كبير من الأخطاء البشرية والثغرات. بالمقارنة مع Qiskit، وهو نموذج بناء للدوائر، يمكن القول إن هذه واحدة من أعظم نقاط القوة لـ Q# كلغة لوصف الخوارزميات.&lt;/p>
&lt;h3 id="82-تقدير-الموارد-resource-estimation-والتحضير-للمستقبل">8.2 تقدير الموارد (Resource Estimation) والتحضير للمستقبل
&lt;/h3>&lt;p>توجد أجهزة الكمبيوتر الكمية الحالية في مرحلة تطور تُعرف باسم &amp;ldquo;NISQ&amp;rdquo; (الكم ذو المقياس المتوسط الصاخب - Noisy Intermediate-Scale Quantum)، حيث يتراوح عدد الكيوبتات المتاحة من العشرات إلى المئات فقط، وتكون معدلات الخطأ مرتفعة. ومع ذلك، بالنظر إلى عصر &amp;ldquo;الحواسيب الكمية المتسامحة مع الأخطاء&amp;rdquo; (FTQC - Fault-Tolerant Quantum Computer) في المستقبل، من المهم للغاية أن نقدر مسبقًا بدقة &amp;ldquo;كم عدد الكيوبتات المنطقية المطلوبة فعليًا&amp;rdquo; لتنفيذ خوارزمية جديدة، و &amp;ldquo;كم عدد المرات التي سيتم فيها استخدام بوابة T أو بوابة توفولي عالية التكلفة في تصحيح الأخطاء&amp;rdquo;، و &amp;ldquo;كم سيكون وقت التنفيذ&amp;rdquo;.&lt;/p>
&lt;p>تتضمن QDK &amp;ldquo;مقدر الموارد&amp;rdquo; (Resource Estimator) كأحد أهداف بيئة التنفيذ. باستخدام هذا، يمكنك تحليل المسار المنطقي للكود على الفور وحساب متطلبات الموارد وإنتاجها للخوارزميات واسعة النطاق، دون تشغيل الكود على الأجهزة الفعلية أو محاكيات الحالة الكاملة الثقيلة. يتيح ذلك لمصممي الخوارزميات والباحثين تكرار عملية التحسين بسرعة حتى للخوارزميات المستقبلية التي قد تتطلب آلاف أو عشرات الآلاف من الكيوبتات، ليس فقط بناءً على التعقيد الحسابي النظري، بل على مستوى عدد البوابات المحددة.&lt;/p>
&lt;h2 id="9-الخاتمة-التوقعات-لمهندسي-البرمجيات-في-الجيل-القادم">9. الخاتمة: التوقعات لمهندسي البرمجيات في الجيل القادم
&lt;/h2>&lt;p>تتحول الحوسبة الكمية بسرعة من مفهوم نظري بحت كان موجودًا فقط في أذهان علماء الفيزياء مثل أينشتاين وشرودنغر وفاينمان، إلى مجال هندسي وتنفيذي ملموس يمكن لأي شخص في العالم الوصول إليه عبر متصفح أو سطر الأوامر من خلال البنية التحتية السحابية (Azure Quantum، AWS Braket، IBM Quantum، إلخ). إن سرعة تطور الأجهزة مذهلة، ويتوقع العديد من الخبراء أنه سيأتي يوم في غضون بضع سنوات يتم فيه إثبات الميزة الكمية &amp;ldquo;المفيدة&amp;rdquo;.&lt;/p>
&lt;p>لغة Q# من مايكروسوفت المقدمة في هذه المقالة قد جلبت بشكل جميل الممارسات الممتازة التي تطورت على مدى عقود في عالم البرمجة الكلاسيكية (الكتابة القوية (Strong Typing)، عناصر البرمجة الوظيفية، النمطية (Modularization)، التغليف (Encapsulation)، الدعم المتقدم من IDE) إلى العالم الجديد تمامًا للبرمجة الكمية. من خلال تعلم Q# وتنفيذ الخوارزميات الكمية، يمكننا اكتساب رؤى عميقة تعيدنا إلى جذور علوم الكمبيوتر والفيزياء، مثل &amp;ldquo;ما هي الحالة؟&amp;quot;، &amp;ldquo;ما هي الملاحظة والقياس؟&amp;quot;، و &amp;ldquo;كيف تنتشر المعلومات عبر الفضاء؟&amp;rdquo;. هذه تجربة مثيرة فكريًا تتجاوز مجرد تعزيز المهارات.&lt;/p>
&lt;p>في المستقبل القريب، تمامًا كما يستفيد مهندسو التعلم الآلي اليوم بشكل طبيعي من قدرة الحوسبة المتوازية لوحدات معالجة الرسومات (GPU) باستخدام PyTorch و TensorFlow، سيستغل &amp;ldquo;مهندسو البرمجيات الكمية&amp;rdquo; في الجيل القادم القدرات الحسابية الفائقة لوحدات المعالجة الكمية (QPU) باستخدام Q# و Qiskit، ومن المؤكد أنه سيأتي عصر يتم فيه التصدي لتحديات هائلة على مستوى البشرية، مثل اكتشاف مواد جديدة من خلال علوم المواد، ومحاكاة الجزيئات لاكتشاف الأدوية، ونمذجة تغير المناخ، وتحسين المخاطر في التمويل.&lt;/p>
&lt;p>بالنسبة لأولئك المطورين الذين يعملون حاليًا بشكل أساسي في تطبيقات الويب الكلاسيكية، أو تطبيقات الهاتف المحمول، أو تحليل البيانات، نرجو منكم اغتنام هذه الفرصة للدخول إلى عالم البرمجة الكمية. في البداية، قد تشعرون بالارتباك بسبب الظواهر غير البديهية الخاصة بميكانيكا الكم (التراكب، التشابك، السلوك الاحتمالي). ومع ذلك، فإن لغة مخصصة مصقولة مثل Q# وسلسلة أدوات قوية مثل QDK ستدعم بالتأكيد وبقوة منحنى التعلم الخاص بكم.&lt;/p>
&lt;h2 id="10-روابط-مرجعية-للتعلم-المتعمق">10. روابط مرجعية للتعلم المتعمق
&lt;/h2>&lt;p>إليك بعض الموارد الممتازة لمواصلة رحلتك في البرمجة الكمية:&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://learn.microsoft.com/azure/quantum/" target="_blank" rel="noopener"
>الوثائق الرسمية لـ Microsoft Azure Quantum&lt;/a> : بوابة الوثائق الشاملة لـ QDK و Azure Quantum.&lt;/li>
&lt;li>&lt;a class="link" href="https://learn.microsoft.com/azure/quantum/user-guide/" target="_blank" rel="noopener"
>دليل مستخدم Q# والمراجع&lt;/a> : مرجع كامل لقواعد النحو، ونظام الأنواع، والمكتبة القياسية لـ Q#.&lt;/li>
&lt;li>&lt;a class="link" href="https://quantum.microsoft.com/en-us/experience/quantum-katas" target="_blank" rel="noopener"
>Quantum Katas&lt;/a> : مجموعة من البرامج التعليمية مفتوحة المصدر تقدمها مايكروسوفت. إنها مورد رائع للتعلم الذاتي التفاعلي للمفاهيم الأساسية للحوسبة الكمية (البوابات الكمية، القياس، بناء الخوارزميات) أثناء كتابة كود Q# الفعلي بأسلوب التطوير القائم على الاختبار (TDD).&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/microsoft/qsharp-compiler" target="_blank" rel="noopener"
>مستودع Q# على GitHub&lt;/a> : يتم تطوير مترجم لغة Q# والمكتبة القياسية بنشاط كمصدر مفتوح. لا غنى عن زيارته لمن يهتم بالهيكل الداخلي للمترجم.&lt;/li>
&lt;/ul>
&lt;p>لا يزال مستقبل الحوسبة الكمية في بداياته وهو مليء بالإمكانيات اللانهائية. بقلب مستعد للاستمتاع بنموذج برمجة جديد، نرجو منكم تحدي أنفسكم بالبرمجة في Q#!&lt;/p></description></item></channel></rss>