Design: متى نحتاج إلى رمز الغراء؟

تم إنشاؤها على ٩ أبريل ٢٠١٨  ·  4تعليقات  ·  مصدر: WebAssembly/design

أقابل بعض الحالات.

واحد نحن بحاجة إلى بعض كود الغراء:

int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

ولكن ، بطريقة بسيطة ، نحتاج فقط إلى استخدام ملف .wasm

int adder (int a, int b) {
    return a + b;
}

لذا ، ماذا يفعل كود الغراء؟ لم أتمكن من العثور على بعض المستندات.

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

رمز الغراء الموصوف في التعليق أعلاه هو أداة تحميل JavaScript التي ينشئها Emscripten. إنه يفعل بالضبط ما يقوله التعليق: يحول بين تمثيلات البيانات JS و C ++ (مثل السلاسل) ، وبين تمثيلات الكائنات المختلفة (أي إنشاء كائنات وكيل JS لكائنات C ++). يقوم أيضًا بإنشاء المصفوفات المكتوبة المطلوبة.

كما لاحظت ، يمكنك الاستغناء عن أداة تحميل Emscripten في حالات بسيطة مثل الوظيفتين اللتين استخدمتهما كأمثلة. لا يتطلب أي منهما أي رمز غراء معقد: كل واحد يحتاج ببساطة إلى ملف JS لتحميل ملف Wasm (وفي المثال الثاني ، سيحتاج ملف wasm الخاص بـ addThree أيضًا إلى إنشاء Uint8Array).

أخيرًا ، يتم التعامل مع تخصيص الذاكرة بواسطة كود Wasm ، والذي يجب أن يتضمن نسخة من malloc من musl (على الرغم من أن Emscripten لا يزال يتضمن malloc في الواقع ، بدلاً من استخدام musl one). يتم تجنب تسرب الذاكرة بالطريقة القياسية ببساطة عن طريق تحرير الذاكرة في كود C / C ++ بعد الانتهاء من ذلك ، فلا يوجد شيء خاص يتطلبه Wasm هنا.

في النهاية ، لا تحتاج إلا إلى رمز الغراء الذي ستستخدمه بالفعل ، بناءً على المكالمات العابرة للحدود التي يقوم بها الكود الخاص بك (من JS إلى C ++ ومن C ++ إلى JS).

يمكن إغلاق هذه المشكلة ، إنها سؤال حول Emscripten وليس خطأ في تصميم WebAssembly نفسه.

ال 4 كومينتر

ما رمز الغراء؟ يبدو أنك نسخت هنا وظيفتين ( addThree() و adder() ) من بعض دروس Wasm ربما؟ يبدو أنها مجرد أمثلة لوظائف لا تفعل الكثير حقًا ، وتعمل ببساطة على إظهار برنامج تعليمي بسيط لـ Wasm. لا تحتوي أي من هاتين الوظيفتين على توقيع معقد ، ويجب أن تكون قابلة للاستدعاء بدون أي كود لاصق.

لكنها ليست وجهة نظري. من بعض المستندات ، تشرح مثل هذه:

على المدى الطويل ، يمكن أن يساعد الوسم مع الكائنات المكتوبة و GC. هل هذا هو المقصود هنا؟
بخلاف ذلك ، لست متأكدًا من كيفية إزالة أي من كود الغراء هذا على المدى القصير أو المتوسط. يتطلب الأمر الكثير من العمل لتشكيل غلاف حول أشياء C / C ++ التي تجعلها تبدو وكأنها شيء JS. على سبيل المثال ، يجب أن يحتوي كود الغراء على طرق لتحويل سلسلة C إلى سلسلة JS ، والعكس صحيح. على مستوى C ++ ، فإن دعم توسيع فئة C ++ في JS وتنفيذ الأساليب الافتراضية في JS يتطلب قدرًا كبيرًا من القرصنة. وبشكل عام ، سيكون من الضروري استخدام الكثير من الغراء للوصول إلى واجهات برمجة تطبيقات الويب من wasm عبر JS.

و اخرين:

يتطلب Emscripten مجموعة كبيرة ومتنوعة من كود JavaScript "اللاصق" للتعامل مع تخصيص الذاكرة ، وتسرب الذاكرة ، ومجموعة من المشكلات الأخرى ، والتي تم تضمينها بالفعل في النموذج المقدم. من الأسهل استخدام ذلك من الاضطرار إلى كتابته بنفسك

عندما أقابل بعض أكواد C / C ++ ببساطة ، يمكنني بسهولة استخدام wasm عن طريق تجميعها ، و export.xxxFn() .

int adder (int a, int b) {
    return a + b;
}

وعندما أستخدم الكود الذي يستخدم Buffer ، أفضل استخدام كود الغراء.

# C/C++
int addThree(uint8_t *buf, int len) {
  uint8_t *item;
  uint8_t *end = buf + len;

  for (item = buf; item<end; item++) {
    *item += 3;
  }

  return 0;
}

# deal with buffer in JS
...
let dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes);
dataHeap.set(new Uint8Array(buffer_pcm.buffer));
...

لذلك ، يمكنني أن أستنتج أنه عندما أقوم بنقل Buffer إلى WASM ، أحتاج إلى رمز لاصق للتعامل مع تخصيص الذاكرة وتسرب الذاكرة ومجموعة من المشكلات الأخرى؟

رمز الغراء الموصوف في التعليق أعلاه هو أداة تحميل JavaScript التي ينشئها Emscripten. إنه يفعل بالضبط ما يقوله التعليق: يحول بين تمثيلات البيانات JS و C ++ (مثل السلاسل) ، وبين تمثيلات الكائنات المختلفة (أي إنشاء كائنات وكيل JS لكائنات C ++). يقوم أيضًا بإنشاء المصفوفات المكتوبة المطلوبة.

كما لاحظت ، يمكنك الاستغناء عن أداة تحميل Emscripten في حالات بسيطة مثل الوظيفتين اللتين استخدمتهما كأمثلة. لا يتطلب أي منهما أي رمز غراء معقد: كل واحد يحتاج ببساطة إلى ملف JS لتحميل ملف Wasm (وفي المثال الثاني ، سيحتاج ملف wasm الخاص بـ addThree أيضًا إلى إنشاء Uint8Array).

أخيرًا ، يتم التعامل مع تخصيص الذاكرة بواسطة كود Wasm ، والذي يجب أن يتضمن نسخة من malloc من musl (على الرغم من أن Emscripten لا يزال يتضمن malloc في الواقع ، بدلاً من استخدام musl one). يتم تجنب تسرب الذاكرة بالطريقة القياسية ببساطة عن طريق تحرير الذاكرة في كود C / C ++ بعد الانتهاء من ذلك ، فلا يوجد شيء خاص يتطلبه Wasm هنا.

في النهاية ، لا تحتاج إلا إلى رمز الغراء الذي ستستخدمه بالفعل ، بناءً على المكالمات العابرة للحدود التي يقوم بها الكود الخاص بك (من JS إلى C ++ ومن C ++ إلى JS).

يمكن إغلاق هذه المشكلة ، إنها سؤال حول Emscripten وليس خطأ في تصميم WebAssembly نفسه.

شكرا جزيلا

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

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

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

Artur-A picture Artur-A  ·  3تعليقات

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

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

chicoxyzzy picture chicoxyzzy  ·  5تعليقات