[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-7-halaqat-shurut-faaila-ghaz-yul":3},{"article":4,"author":58},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":38,"related_articles":39},"d9000000-0000-0000-0000-000000000107","a0000000-0000-0000-0000-000000000092","Deep EVM #7: الحلقات والشروط الفعالة من حيث الغاز في Yul","deep-evm-7-halaqat-shurut-faaila-ghaz-yul","أنماط متقدمة لتدفق التحكم في Yul: حلقات for محسنة، جداول switch بدلاً من سلاسل if\u002Felse، وأنماط فك الحلقات لتوفير غاز JUMP.","## تدفق التحكم في Yul\n\nYul يوفر ثلاث بنى للتحكم في التدفق: `if`، `switch`، و`for`. على عكس Solidity، لا يوجد `else` مباشر — تستخدم `switch` بدلاً من ذلك.\n\n## الحلقات في Yul\n\n### بنية for الأساسية\n```solidity\nassembly {\n    for { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n        \u002F\u002F جسم الحلقة\n    }\n}\n```\n\nيتم ترجمة هذا إلى أكواد تشغيل:\n- تهيئة `i := 0`\n- فحص الشرط `lt(i, 10)` -> JUMPI\n- جسم الحلقة\n- التحديث `i := add(i, 1)`\n- JUMP للعودة إلى الفحص\n\nكل تكرار يكلف: JUMP (8 غاز) + JUMPI (10 غاز) + LT (3 غاز) + ADD (3 غاز) = ~24 غاز كحد أدنى.\n\n### تحسين: العد التنازلي\n\n```solidity\nassembly {\n    \u002F\u002F العد التنازلي أرخص بغاز واحد لكل تكرار\n    for { let i := 10 } gt(i, 0) { i := sub(i, 1) } {\n        \u002F\u002F استخدم sub(i, 1) للفهرس المعتمد على الصفر\n    }\n}\n```\n\nلماذا أرخص؟ `iszero(i)` (3 غاز) مقابل `lt(i, n)` حيث n يحتاج PUSH إضافي.\n\n### فك الحلقات\n\nإذا كان عدد التكرارات معروفاً في وقت الترجمة، يمكن فك الحلقة:\n\n```solidity\nassembly {\n    \u002F\u002F بدلاً من حلقة 4 تكرارات (96+ غاز للتحكم)\n    \u002F\u002F فك يدوياً (0 غاز للتحكم):\n    let sum := calldataload(0x04)\n    sum := add(sum, calldataload(0x24))\n    sum := add(sum, calldataload(0x44))\n    sum := add(sum, calldataload(0x64))\n}\n```\n\nالتوفير: لا JUMP ولا JUMPI = توفير ~24 غاز لكل تكرار مُزال.\n\n## جداول Switch\n\n`switch` في Yul هو أكثر كفاءة من سلاسل if\u002Felse المتعددة:\n\n```solidity\nassembly {\n    switch shr(224, calldataload(0))\n    case 0x6d4ce63c \u002F* get() *\u002F {\n        mstore(0, sload(0))\n        return(0, 32)\n    }\n    case 0x60fe47b1 \u002F* set(uint256) *\u002F {\n        sstore(0, calldataload(4))\n        stop()\n    }\n    default {\n        revert(0, 0)\n    }\n}\n```\n\n## أنماط الشرط\n\n### تجنب الفروع عند الإمكان\n\nالعمليات الحسابية أحياناً تحل محل الشروط:\n\n```solidity\nassembly {\n    \u002F\u002F بدلاً من:\n    \u002F\u002F if gt(a, b) { result := sub(a, b) }\n    \u002F\u002F else { result := sub(b, a) }\n    \n    \u002F\u002F القيمة المطلقة بدون فروع:\n    let diff := sub(a, b)\n    let mask := sar(255, diff)  \u002F\u002F 0x00..00 أو 0xff..ff\n    result := xor(add(diff, mask), mask)\n}\n```\n\n### الحد الأقصى والأدنى بدون فروع\n\n```solidity\nassembly {\n    \u002F\u002F max(a, b) بدون فرع\n    result := xor(a, mul(xor(a, b), gt(b, a)))\n    \n    \u002F\u002F min(a, b) بدون فرع\n    result := xor(a, mul(xor(a, b), lt(b, a)))\n}\n```\n\n## تحسين حلقات التكرار على المصفوفات\n\n```solidity\nassembly {\n    let len := sload(arraySlot)\n    mstore(0x00, arraySlot)\n    let dataSlot := keccak256(0x00, 0x20)\n    \n    let sum := 0\n    for { let i := 0 } lt(i, len) { i := add(i, 1) } {\n        sum := add(sum, sload(add(dataSlot, i)))\n    }\n}\n```\n\n## مقارنة الغاز: Solidity مقابل Yul\n\n| النمط | Solidity | Yul |\n|-------|----------|-----|\n| حلقة 10 تكرارات | ~400 غاز | ~280 غاز |\n| if\u002Felse متداخل | ~50 غاز | ~35 غاز |\n| switch 4 حالات | ~80 غاز | ~50 غاز |\n| جمع مصفوفة | ~600 غاز | ~400 غاز |\n\nالتوفير يتراكم بشكل كبير في الحلقات والعمليات المتكررة.\n\n## الخلاصة\n\nالحلقات والشروط في Yul تمنحك تحكماً دقيقاً في تكلفة الغاز. العد التنازلي، فك الحلقات، جداول switch، والعمليات بدون فروع هي أدوات أساسية في ترسانة مطور EVM المتقدم. في المقالة التالية سنطبق هذه المفاهيم لبناء مبادل رموز كامل في Yul خالص.","\u003Ch2 id=\"yul\">تدفق التحكم في Yul\u003C\u002Fh2>\n\u003Cp>Yul يوفر ثلاث بنى للتحكم في التدفق: \u003Ccode>if\u003C\u002Fcode>، \u003Ccode>switch\u003C\u002Fcode>، و\u003Ccode>for\u003C\u002Fcode>. على عكس Solidity، لا يوجد \u003Ccode>else\u003C\u002Fcode> مباشر — تستخدم \u003Ccode>switch\u003C\u002Fcode> بدلاً من ذلك.\u003C\u002Fp>\n\u003Ch2 id=\"yul\">الحلقات في Yul\u003C\u002Fh2>\n\u003Ch3>بنية for الأساسية\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    for { let i := 0 } lt(i, 10) { i := add(i, 1) } {\n        \u002F\u002F جسم الحلقة\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>يتم ترجمة هذا إلى أكواد تشغيل:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>تهيئة \u003Ccode>i := 0\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>فحص الشرط \u003Ccode>lt(i, 10)\u003C\u002Fcode> -&gt; JUMPI\u003C\u002Fli>\n\u003Cli>جسم الحلقة\u003C\u002Fli>\n\u003Cli>التحديث \u003Ccode>i := add(i, 1)\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>JUMP للعودة إلى الفحص\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>كل تكرار يكلف: JUMP (8 غاز) + JUMPI (10 غاز) + LT (3 غاز) + ADD (3 غاز) = ~24 غاز كحد أدنى.\u003C\u002Fp>\n\u003Ch3>تحسين: العد التنازلي\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    \u002F\u002F العد التنازلي أرخص بغاز واحد لكل تكرار\n    for { let i := 10 } gt(i, 0) { i := sub(i, 1) } {\n        \u002F\u002F استخدم sub(i, 1) للفهرس المعتمد على الصفر\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>لماذا أرخص؟ \u003Ccode>iszero(i)\u003C\u002Fcode> (3 غاز) مقابل \u003Ccode>lt(i, n)\u003C\u002Fcode> حيث n يحتاج PUSH إضافي.\u003C\u002Fp>\n\u003Ch3>فك الحلقات\u003C\u002Fh3>\n\u003Cp>إذا كان عدد التكرارات معروفاً في وقت الترجمة، يمكن فك الحلقة:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    \u002F\u002F بدلاً من حلقة 4 تكرارات (96+ غاز للتحكم)\n    \u002F\u002F فك يدوياً (0 غاز للتحكم):\n    let sum := calldataload(0x04)\n    sum := add(sum, calldataload(0x24))\n    sum := add(sum, calldataload(0x44))\n    sum := add(sum, calldataload(0x64))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>التوفير: لا JUMP ولا JUMPI = توفير ~24 غاز لكل تكرار مُزال.\u003C\u002Fp>\n\u003Ch2 id=\"switch\">جداول Switch\u003C\u002Fh2>\n\u003Cp>\u003Ccode>switch\u003C\u002Fcode> في Yul هو أكثر كفاءة من سلاسل if\u002Felse المتعددة:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    switch shr(224, calldataload(0))\n    case 0x6d4ce63c \u002F* get() *\u002F {\n        mstore(0, sload(0))\n        return(0, 32)\n    }\n    case 0x60fe47b1 \u002F* set(uint256) *\u002F {\n        sstore(0, calldataload(4))\n        stop()\n    }\n    default {\n        revert(0, 0)\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">أنماط الشرط\u003C\u002Fh2>\n\u003Ch3>تجنب الفروع عند الإمكان\u003C\u002Fh3>\n\u003Cp>العمليات الحسابية أحياناً تحل محل الشروط:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    \u002F\u002F بدلاً من:\n    \u002F\u002F if gt(a, b) { result := sub(a, b) }\n    \u002F\u002F else { result := sub(b, a) }\n    \n    \u002F\u002F القيمة المطلقة بدون فروع:\n    let diff := sub(a, b)\n    let mask := sar(255, diff)  \u002F\u002F 0x00..00 أو 0xff..ff\n    result := xor(add(diff, mask), mask)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>الحد الأقصى والأدنى بدون فروع\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    \u002F\u002F max(a, b) بدون فرع\n    result := xor(a, mul(xor(a, b), gt(b, a)))\n    \n    \u002F\u002F min(a, b) بدون فرع\n    result := xor(a, mul(xor(a, b), lt(b, a)))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">تحسين حلقات التكرار على المصفوفات\u003C\u002Fh2>\n\u003Cpre>\u003Ccode class=\"language-solidity\">assembly {\n    let len := sload(arraySlot)\n    mstore(0x00, arraySlot)\n    let dataSlot := keccak256(0x00, 0x20)\n    \n    let sum := 0\n    for { let i := 0 } lt(i, len) { i := add(i, 1) } {\n        sum := add(sum, sload(add(dataSlot, i)))\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"solidity-yul\">مقارنة الغاز: Solidity مقابل Yul\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>النمط\u003C\u002Fth>\u003Cth>Solidity\u003C\u002Fth>\u003Cth>Yul\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>حلقة 10 تكرارات\u003C\u002Ftd>\u003Ctd>~400 غاز\u003C\u002Ftd>\u003Ctd>~280 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>if\u002Felse متداخل\u003C\u002Ftd>\u003Ctd>~50 غاز\u003C\u002Ftd>\u003Ctd>~35 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>switch 4 حالات\u003C\u002Ftd>\u003Ctd>~80 غاز\u003C\u002Ftd>\u003Ctd>~50 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>جمع مصفوفة\u003C\u002Ftd>\u003Ctd>~600 غاز\u003C\u002Ftd>\u003Ctd>~400 غاز\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>التوفير يتراكم بشكل كبير في الحلقات والعمليات المتكررة.\u003C\u002Fp>\n\u003Ch2 id=\"\">الخلاصة\u003C\u002Fh2>\n\u003Cp>الحلقات والشروط في Yul تمنحك تحكماً دقيقاً في تكلفة الغاز. العد التنازلي، فك الحلقات، جداول switch، والعمليات بدون فروع هي أدوات أساسية في ترسانة مطور EVM المتقدم. في المقالة التالية سنطبق هذه المفاهيم لبناء مبادل رموز كامل في Yul خالص.\u003C\u002Fp>\n","ar","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:32.254735Z","أنماط متقدمة لتدفق التحكم في Yul: حلقات محسنة، جداول switch، فك الحلقات، وعمليات بدون فروع لتوفير غاز EVM.","Yul حلقات غاز EVM",null,"index, follow",[21,26,30,34],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":35,"name":36,"slug":37,"created_at":25},"c0000000-0000-0000-0000-000000000018","Yul","yul","بلوكتشين",[40,46,52],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":38,"published_at":45},"d0000000-0000-0000-0000-000000000617","طبقة التشغيل البيني لـ Ethereum: كيف تصبح 55+ سلسلة L2 سلسلة واحدة","tabaqat-altashghil-albaini-ethereum-55-l2-silsila-wahida","يملك Ethereum اكثر من 55 rollup من الطبقة الثانية، مما يجزئ السيولة وتجربة المستخدم. طبقة التشغيل البيني لـ Ethereum — الجمع بين الرسائل عبر الـ rollups والمتسلسلات المشتركة والـ based rollups — تهدف الى توحيدها في شبكة قابلة للتركيب واحدة.","2026-03-28T10:44:45.626845Z",{"id":47,"title":48,"slug":49,"excerpt":50,"locale":12,"category_name":38,"published_at":51},"d0000000-0000-0000-0000-000000000616","اثباتات ZK ما وراء الـ Rollups: استدلال الذكاء الاصطناعي القابل للتحقق على Ethereum","ithbatat-zk-ma-waraa-rollups-istidlal-dhakaa-istinaai-ethereum","اثباتات المعرفة الصفرية لم تعد مجرد اداة للتوسع. في 2026، يتيح zkML استدلال الذكاء الاصطناعي القابل للتحقق على السلسلة، وتنقل معالجات ZK المشتركة الحسابات الثقيلة خارج السلسلة مع التحقق على السلسلة، وانظمة الاثبات الجديدة مثل SP1 وJolt تجعل ذلك عمليا.","2026-03-28T10:44:45.621594Z",{"id":53,"title":54,"slug":55,"excerpt":56,"locale":12,"category_name":38,"published_at":57},"d0000000-0000-0000-0000-000000000593","EIP-7702 في الممارسة العملية: بناء تدفقات الحساب الذكي بعد Pectra","eip-7702-fi-almumaarasa-alamaliyya-binaa-tadaffuqat-alhisab-aldhaki-baad-pectra","يسمح EIP-7702 لأي EOA على Ethereum بالعمل مؤقتاً كعقد ذكي في معاملة واحدة. إليك كيفية تنفيذ المعاملات المجمّعة ورعاية الغاز والاسترداد الاجتماعي باستخدام البدائية الجديدة لتجريد الحساب.","2026-03-28T10:44:44.185251Z",{"id":13,"name":59,"slug":60,"bio":61,"photo_url":18,"linkedin":18,"role":62,"created_at":63,"updated_at":63},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]