Design: توضيح تفرقع المكدس للفروع الشرطية

تم إنشاؤها على ٢٧ مارس ٢٠١٧  ·  5تعليقات  ·  مصدر: WebAssembly/design

أنا ألعب ث / أكتب مترجم WebAssembly. أنا أنظر إلى الاختبار https://github.com/WebAssembly/spec/blob/634f0d9009404f498ef8d8d8bd510bd6f0941219cc/test/core/br_if.wast#L272 الذي يبدو وكأنه موسع قليلاً:

(module
    (func
      $type-arg-void-vs-num-nested
      (result i32)

      block i32
        (i32.const 0)
        block
          (i32.const 1)
          (br_if 1)
        end
      end
    )
)

الخطأ الذي أحصل عليه هو:

Error: check failed:
test.wast:10:12
type stack size too small at br_if value. got 0, expected at least 1
          (br_if 1)
           ^^^^^^^

أعتقد أن حجم المكدس عندما يصل إلى br_if هو 2 مما يعني أنه ينبثق 1 من أجل الشرطي ومن ثم لديه بقايا واحدة لتلبية الكتلة الخارجية. افترضت أن (i32.const 0) سينخفض ​​إلى الكتلة المتداخلة. أي جزء أنا مفقود؟ شكرا لك مقدما.

التعليق الأكثر فائدة

>

هل هذا يعني أن كل كتلة تحصل على مكدس خاص بها؟

لن أقول أنهم حصلوا على مكدساتهم الخاصة ، فقط أن هناك حدًا
إلى ما يمكن تفرقعه. هذا في الواقع كيف يتم تنفيذه في wabt ، هناك
هو مكدس قيم ومكدس "تسمية". كل تسمية تخزن "حد" وهو
حجم مكدس القيمة عند دفع التسمية. ثم كلما كنت
البوب ​​، تحقق من الحد الأعلى للتسمية.

كلاهما وجهات نظر صحيحة. معنويًا ، تشتمل طريقة العرض "block-local stack" على الامتداد
ميزة أنه لا يتطلب ثوابت إضافية. مع "مكدس واحد"
افتراضات صحة إضافية ضرورية ، مثل جميع الحدود
التي تحدث في مكدس الملصقات يجب أن تكون في حدود مكدس المعامل الحالي
الارتفاع ، يجب أن تحدث بترتيب متزايد (ليس بالضرورة بشكل صارم) ، و
يجب ألا تكون حزمة الملصقات فارغة أبدًا.

ال 5 كومينتر

نعم ، يمكن تحسين الإبلاغ عن خطأ wabt هنا. على الرغم من وجود اثنين i32 s على المكدس ، فإن المشغلين لن يتخطوا بداية الكتلة أبدًا ، لذلك هناك فعليًا واحدًا فقط.

هل هذا يعني أن كل كتلة تحصل على مكدس خاص بها؟ كنت في حيرة من أمري من العبارة التالية في وثيقة الدلالات:

لا يؤثر تنفيذ تعليمات الكتلة أو الحلقة على مكدس القيمة.

ربما يجب أن يتغير ذلك إلى:

لا يؤثر تنفيذ تعليمات الكتلة أو الحلقة على مكدس القيمة ، ولكن يتعذر الوصول إلى جميع قيم المكدس خارج الكتلة المنفذة.

أم أنا سوء فهم؟

هل هذا يعني أن كل كتلة تحصل على مكدس خاص بها؟

لن أقول أنهم حصلوا على مكدساتهم الخاصة ، فقط أن هناك حدًا لما يمكن تفرقعه. هذا في الواقع كيف يتم تنفيذه في wabt ، هناك قيمة مكدس ومكدس "تسمية". يخزن كل ملصق "حدًا" وهو حجم حزمة القيمة عند دفع التسمية. ثم عندما تنفجر ، تحقق من الحد الأعلى للتسمية.

لا يؤثر تنفيذ تعليمات الكتلة أو الحلقة على مكدس القيمة.

ربما يجب أن يتغير ذلك إلى:

لا يؤثر تنفيذ تعليمات الكتلة أو الحلقة على مكدس القيمة ، ولكن يتعذر الوصول إلى جميع قيم المكدس خارج كتلة تنفيذ الكتلة.

أم أنا سوء فهم؟

نعم ، ربما يجدر ذكر شيء من هذا القبيل في Semantics.md. على الرغم من أنني يجب أن أذكر أن هناك عملًا على مواصفات نثر رسمية أيضًا.

>

هل هذا يعني أن كل كتلة تحصل على مكدس خاص بها؟

لن أقول أنهم حصلوا على مكدساتهم الخاصة ، فقط أن هناك حدًا
إلى ما يمكن تفرقعه. هذا في الواقع كيف يتم تنفيذه في wabt ، هناك
هو مكدس قيم ومكدس "تسمية". كل تسمية تخزن "حد" وهو
حجم مكدس القيمة عند دفع التسمية. ثم كلما كنت
البوب ​​، تحقق من الحد الأعلى للتسمية.

كلاهما وجهات نظر صحيحة. معنويًا ، تشتمل طريقة العرض "block-local stack" على الامتداد
ميزة أنه لا يتطلب ثوابت إضافية. مع "مكدس واحد"
افتراضات صحة إضافية ضرورية ، مثل جميع الحدود
التي تحدث في مكدس الملصقات يجب أن تكون في حدود مكدس المعامل الحالي
الارتفاع ، يجب أن تحدث بترتيب متزايد (ليس بالضرورة بشكل صارم) ، و
يجب ألا تكون حزمة الملصقات فارغة أبدًا.

شكرا للمعلومة. أقوم بإغلاق هذا لأنه لا يوجد شيء يمكن اتخاذ إجراء منه ، كما أن المزيد من المواصفات الرسمية تأتي لتوضيح ذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

dpw picture dpw  ·  3تعليقات

thysultan picture thysultan  ·  4تعليقات

ghost picture ghost  ·  7تعليقات

bobOnGitHub picture bobOnGitHub  ·  6تعليقات

nikhedonia picture nikhedonia  ·  7تعليقات