Design: الدعم غير المتزامن / الوعد

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

العديد من مكتبات JavaScript غير متزامنة ولم أر أن WebAssembly يدعم الوعود حتى الآن.
من أجل كتابة تطبيقات عالية الأداء بسهولة تستفيد من نظام JS البيئي ، أقترح إضافة دعم للوعود في الوظائف المستوردة.

على سبيل المثال يجب أن يعمل هذا:

const importObject = { 
  returnOneAsync: () => new Promise(done => done(1)) 
};
extern "C" int returnOneAsync();

int main(){
  int x = returnOneAsync(); // should suspend main until promise resolved.
  return x+x;
}

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

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

ال 7 كومينتر

أي دعم لوعود JS يجب أن يكون جزءًا من مقترح ربط مضيف JS .

لكنني أخشى أنه لا يمكن أن يعمل كما يوحي مثالك ، لأن ذلك سيتطلب من C نفسها أن تفهم التنفيذ غير المتزامن والتعليق ، وهو ما لا يفعله. أيضًا ، لا يوجد أي شيء غير متزامن في مثالك ، إنه فقط يخلق وعدًا ، لذلك لن يتم تعليق الكود المكافئ في JS نفسه ، ولكنه ينتج سلسلة مثل "[object Promise][object Promise]" .

أيضًا ، لا يوجد شيء غير متزامن في مثالك

حسنًا ، القيمة غير متاحة حتى تعالج حلقة الحدث الوعد.
الفكرة هي تعليق تنفيذ محرك Webassembly حتى تتوفر القيمة.
المثال المقدم بالطبع تافه للغاية. يمكن أن يكون أحد الأمثلة الأكثر واقعية هو إجراء استعلام db عبر الشبكة: getAgeOf: (name) => db.find({name}).then(x=>x.age)

C نفسها لفهم التنفيذ غير المتزامن والتعليق ، وهو ما لا يحدث

هذا غير صحيح. هناك العديد من تطبيقات coroutine لـ C.
علاوة على ذلك ، يدعم LLVM-5.0 وما بعده coroutines وعدم التزامن / الانتظار.

https://llvm.org/docs/Coroutines.html

وكإضافة إلى C ++ 17 ، هناك coroutine-ts التي تم تنفيذها منذ clang-5.0.
هناك نوعان من المكتبات التجريبية التي تستخدمها بالفعل:
https://github.com/lewissbaker/cppcoro#generator

تطبيقات coroutines في C لا تتفاعل بطريقة سحرية مع حلقة حدث JavaScript. أيضًا ، يعتمدون عادةً على السلوك الخاص بالتنفيذ. لتنفيذ شيء مثل coroutines أو غير متزامن بشكل موثوق وقابل للنقل ، ستحتاج إلى شكل من أشكال الاستمرارية المحددة في اللغة. أقرب C يجب أن تقدمه هو longjmp ، وهذا ليس كافيًا ولا يمكن تنفيذه حاليًا في Wasm نفسها (مع Emscripten ، يتم تنفيذ longjmp في JS مع استثناءات JS). لا يستطيع Wasm حاليًا التعبير عن التعليق ، على الرغم من وجود خطط لإضافة شيء على هذا المنوال في النهاية. Coroutines C ++ ليست قياسية حتى الآن ولا يمكن معالجتها بواسطة Emscripten AFAICT.

رايت المكان الذي اتيت منه.
أعتقد أنني لم أعبر عن فكرتي بشكل جيد بما فيه الكفاية.
أنا لا أقترح دعم coroutines ولا الوعود في C / C ++ أو إدراك ذلك في the wasm bytecode.

لكنني أخشى أنه لا يمكن أن يعمل كما يوحي المثال الخاص بك ، لأن ذلك سيتطلب من C نفسه فهم التنفيذ غير المتزامن والتعليق ، وهو ما لا يفعله

لماذا تعتقد أنه مطلوب من C لفهم التنفيذ غير المتزامن؟

ما هي الصعوبة الفنية لتعليق محرك تنفيذ wasm حتى يتم الوفاء بالوعد؟

أفهم أنه من المفترض أن يتم تجميع wasm مسبقًا إلى x86 ولكن هذا لا يعني أنه لا يمكنك التحكم في تدفق التنفيذ.
تتمثل إحدى الطرق الشائعة لإيقاف التنفيذ في استخدام المقاطعات ومكالمات syscalls للأجهزة مثل ptrace ؛ هذه هي الطريقة التي يعمل بها مصحح الأخطاء. نحن نعرف بالضبط الوظائف التي يتم استيرادها ويمكننا حقن أكواد التشغيل المناسبة (x86) لإنجاز ذلك. على الرغم من أن هذا سيؤدي إلى إبطاء تنفيذ تلك الوظائف - لن يكون مهمًا لأننا ننتظر في تلك الحالات الوعد بحل على أي حال.
هذه هي الطريقة التي قمنا بها بتنفيذ الإيقاف / التصحيح / الاستئناف في C ++ JIT / AoT الخاص بنا على LLVM.

أعتقد أنه يجب تقديم هذه المشكلة في مستودع ربط المضيف ...

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

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

بالضبط ، يجب تشغيل wasm داخل العمال حيث تم إنشاؤهم لمهام الحساب بدلاً من التعامل مع واجهة المستخدم.

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

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

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

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

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

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

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6تعليقات