asm.js
asm.js هي مجموعة فرعية من JavaScript مصممة للسماح بتشغيل برامج الكمبيوتر المكتوبة بلغات مثل C كتطبيقات ويب مع الحفاظ على خصائص الأداء بشكل أفضل بكثير من JavaScript القياسي ، وهي اللغة النموذجية المستخدمة لمثل هذه التطبيقات.
تتألف لغة asm.js من مجموعة فرعية صارمة من لغة جافا سكريبت، حيث تُترجم إليها الشيفرة المكتوبة بلغات ذات كتابة ثابتة مع إدارة يدوية للذاكرة (مثل لغة C) بواسطة مُترجم من المصدر إلى المصدر مثل Emscripten (المبني على LLVM ). [ 2 ] ويتحسن الأداء من خلال حصر ميزات اللغة بتلك التي يمكن تحسينها مسبقًا، بالإضافة إلى تحسينات أخرى في الأداء.
بدأ المشروع في موزيلا ، وكان فايرفوكس 22، الذي صدر عام 2013، أول متصفح ويب يُقدّم تحسينات خاصة بـ asm.js. [ 3 ] بعد تطوير WebAssembly ، تم تعطيل تحسينات asm.js في فايرفوكس 148 الذي صدر عام 2026.
تصميم
تتيح مكتبة asm.js تحسينات كبيرة في أداء تطبيقات الويب ، ولكنها لا تهدف إلى تحسين أداء كود JavaScript المكتوب يدويًا، كما أنها لا تتيح أي شيء آخر غير تحسين الأداء.
يهدف هذا الأسلوب إلى تحقيق خصائص أداء أقرب إلى خصائص الكود الأصلي مقارنةً بلغة جافا سكريبت القياسية، وذلك من خلال حصر ميزات اللغة في تلك القابلة للتحسين المسبق وتحسين الأداء. [ 4 ] وباستخدام مجموعة فرعية من جافا سكريبت، يحظى asm.js بدعم واسع من جميع متصفحات الويب الرئيسية ، [ 5 ] على عكس الأساليب البديلة مثل Google Native Client .
توليد الكود
لا تتم كتابة asm.js عادةً بشكل مباشر: بدلاً من ذلك، يتم إنشاؤها كلغة وسيطة من خلال استخدام مترجم يأخذ التعليمات البرمجية المصدرية بلغة مثل C++ ويخرج asm.js.
على سبيل المثال، بالنظر إلى كود C التالي:
int f ( int i ) { return i + 1 ; }سيُخرج برنامج Emscripten كود جافا سكريبت التالي:
دالة f ( i ) { i = i | 0 ; return ( i + 1 ) | 0 ; }لاحظ إضافة | 0مُحدِّدات النوع وغيابها. في جافا سكريبت، تُحوِّل عوامل التشغيل الثنائية مُعاملاتها إلى أعداد صحيحة مُوقَّعة من 32 بت، وتُعطي نتائج صحيحة. هذا يعني أن عملية OR الثنائية مع الصفر تُحوِّل القيمة إلى عدد صحيح (قد لا يتناول عرضٌ "مفاهيمي" بسيط لعوامل التشغيل الثنائية تحويل النوع على الإطلاق، ولكن كل لغة برمجة تُعرِّف عوامل التشغيل لتسهيل استخدامها، كما تفعل جافا سكريبت هنا). من خلال القيام بذلك لكل مُعامل، نضمن أنه إذا تم استدعاء الدالة من كود خارجي، فسيتم تحويل القيمة إلى النوع الصحيح. يُستخدم هذا أيضًا على القيمة المُعادة، في هذه الحالة لضمان أن تكون نتيجة إضافة 1 إلى i عددًا صحيحًا (وإلا فقد تصبح كبيرة جدًا)، ولتحديد نوع القيمة المُعادة من الدالة. هذه التحويلات مطلوبة من قِبل asm.js، حتى يتمكن المُصرِّف المُحسِّن من إنتاج كود أصلي عالي الكفاءة مُسبقًا. في مثل هذا المُصرّف المُحسّن، لا تُجرى أي تحويلات عند استدعاء كود asm.js لكود asm.js آخر، لأن مُحدِّدات النوع المطلوبة تضمن أن القيم ستكون من النوع الصحيح مُسبقًا. علاوة على ذلك، بدلًا من إجراء عملية جمع أعداد عشرية وتحويلها إلى عدد صحيح، يُمكن ببساطة إجراء عملية حسابية أصلية على الأعداد الصحيحة. يُؤدي هذا مجتمعًا إلى تحسينات كبيرة في الأداء.
إليك مثال آخر لحساب طول السلسلة النصية:
size_t strlen ( char * s ) { char * current = s ; while ( * current != 0 ) { ++ current ; } return ( current - s ); }سينتج عن ذلك الكود التالي في ملف asm.js:
دالة strlen ( s ) { s = s | 0 ; var current = 0 ; current = s ; while (( MEM8 [ current >> 0 ] | 0 ) != 0 ) { current = ( current + 1 ) | 0 ; } return ( current - s ) | 0 ; }في الكود المُولّد، يكون المتغير MEM8 في الواقع "عرضًا" بايتًا بايتًا لمخزن مؤقت مكتوب، والذي يعمل كـ "كومة" كود asm.js.
أداء
بما أن asm.js يعمل في المتصفح، فإن الأداء يعتمد بشكل كبير على كل من المتصفح والعتاد. عادةً ما تكون المعايير الأولية لبرامج C المُجمَّعة إلى asm.js أبطأ بمعامل 2 تقريبًا من التجميع الأصلي باستخدام Clang . [ 6 ]
يعود جزء كبير من هذا التحسن في الأداء مقارنةً بجافا سكريبت العادية إلى اتساق أنواع البيانات بنسبة 100% ، وانعدام عملية جمع البيانات المهملة تقريبًا (حيث تُدار الذاكرة يدويًا في مصفوفة كبيرة ذات أنواع محددة). يتيح هذا النموذج الأبسط، الذي لا يتضمن سلوكًا ديناميكيًا ولا تخصيصًا أو تحريرًا للذاكرة، بل مجموعة محدودة من عمليات الأعداد الصحيحة والعشرية المحددة جيدًا، أداءً أفضل بكثير وإمكانات أكبر للتحسين .
أظهرت نتائج اختبارات موزيلا المعيارية الصادرة في ديسمبر 2013 تحسينات ملحوظة: "يستطيع متصفح فايرفوكس، مع تحسينات float32، تشغيل جميع هذه الاختبارات المعيارية بسرعة أبطأ بنحو 1.5 مرة من النسخة الأصلية، أو أفضل." [ 7 ] وتشير موزيلا إلى أن أداء الكود المُترجم أصليًا ليس مقياسًا واحدًا، بل هو نطاق، حيث تُنتج مُترجمات أصلية مختلفة (في هذه الحالة Clang و GCC ) كودًا بأداء متفاوت. "في الواقع، في بعض الاختبارات المعيارية، مثل Box2D و FASTA وcopy، يكون أداء asm.js قريبًا من أداء Clang أو أقرب إليه من قرب Clang من GCC. وفي إحدى الحالات، يتفوق asm.js على Clang بفارق طفيف في Box2D." [ 7 ]
التطبيقات
يوفر مشروع Emscripten أدوات يمكن استخدامها لتجميع قواعد بيانات C و C++ (أو أي لغات أخرى يمكن تحويلها إلى LLVM IR ) إلى asm.js. [ 2 ]
ينبغي أن تتمكن جميع المتصفحات التي تدعم معيار ECMAScript 6 من تشغيل كود asm.js، لأنه جزء من هذا المعيار. مع ذلك، ونظرًا لإضافة ميزات في هذا الإصدار لتمكين الدعم الكامل لـ asm.js Math.fround()، فقد تواجه المتصفحات القديمة التي تفتقر إلى هذه الميزات مشاكل.
بعض تطبيقات المتصفحات مُحسّنة خصيصًا لـ asm.js:
- كان متصفح Mozilla Firefox أول متصفح ويب يقوم بتنفيذ تحسينات خاصة بـ asm.js، بدءًا من Firefox 22. [ 3 ] OdinMonkey ، وهو مترجم asm.js المسبق من Mozilla المستخدم في Firefox، هو أحد مكونات IonMonkey ، وهو مترجم JIT الخاص بـ SpiderMonkey .
- كانت مايكروسوفت تقوم بتطبيق دعم asm.js في Chakra ، محرك جافا سكريبت المستخدم بواسطة Microsoft Edge Legacy ، والذي يقوم بالتحقق من الصحة لإنتاج كود JIT عالي الكفاءة. [ 8 ]
- أدت التحسينات التي أُجريت على محرك V8 JavaScript الخاص بمتصفح جوجل كروم في الإصدار 28 من كروم إلى جعل معايير asm.js أسرع بأكثر من الضعف مقارنة بالإصدارات السابقة من كروم، [ 9 ] على الرغم من أن محرك V8 الخاص بمتصفح كروم لا يستخدم التجميع المسبق.
التبني
كانت معظم التطبيقات التي تستخدم asm.js تطبيقات مكتوبة بلغة C أو C++، تم تجميعها باستخدام أدوات مثل Emscripten أو Mandreel. وكانت asm.js تُستخدم بشكل أساسي للتطبيقات التي يمكن ترجمة قواعد بياناتها الأصلية تلقائيًا لتشغيلها في متصفحات الويب.
حتى الآن، تم نقل عدد من لغات البرمجة ، وأطر التطبيقات ، والبرامج ، والمكتبات ، والألعاب ، ومحركات الألعاب ، وغيرها من البرامج . [ 10 ] بعضها مذكور أدناه.
لغات البرمجة
أطر التطبيقات
البرامج والمكتبات
محركات الألعاب
- محرك Unreal Engine 3 : تم نقله في 4 أيام [ 25 ] [ 26 ]
- محرك Unreal Engine 4
- الوحدة [ 27 ]
- ScummVM ، الذي يدعم العديد من ألعاب المغامرات الكلاسيكية [ 28 ]
- جودو [ 29 ]
ألعاب
- Doom : أصول لعبة Freedoom مفتوحة المصدرالتي تعمل على PrBoom ، والتي تستند إلى كود Doom مفتوح المصدر [ 30 ]
- سوبرتاكس [ 31 ]
- Dune II عبر OpenDune [ 32 ]
- خبز الموز مبني على مكعب 2 [ 33 ]
- جميع الألعاب في حزمة Humble Mozilla [ 34 ] ( Super Hexagon و AaAaAA! for the Awesome و Osmos و Zen Bound 2 و Dustforce DX و Voxatron و FTL: Advanced Edition و Democracy 3 )
المحاكيات
الرياضيات
- HTML5 Fractal Playground [ 37 ] – يرسم الأشكال الكسورية المولدة بواسطة دالة التكرار ، مثل مجموعة ماندلبروت .
الاستهلاك
أصبح asm.js قديمًا إلى حد كبير مع ظهور WebAssembly (wasm)، الذي يتميز بصيغة بايت كود أسرع في التحليل. [ 38 ] كما توقفت الجهود المبذولة لتوسيع JavaScript بميزات أكثر دقة مثل SIMD.js منذ عام 2017. [ 39 ]
لا يزال asm.js مفيدًا بشكل أساسي كبديل احتياطي لـ wasm، من خلال برنامج طورته مؤسسة WebAssembly لتحويل wasm إلى asm.js. لا يوجد محول مخصص من asm.js إلى wasm، ولكن يمكن استخدام مترجمات TypeScript إلى wasm جزئيًا. [ 40 ] كان مُصدر WebAssembly المرجعي، Binaryen ، يحتوي على asm2wasmوحدة نمطية، ولكن تمت إزالتها بعد توقف Emscripten عن استخدامها. [ 41 ]
في 20 مايو 2026، أعلنت موزيلا عن إيقاف دعم asm.js: تم تعطيل هذه الميزة افتراضيًا منذ إصدار Firefox 148 في فبراير 2026، ويخطط مطورو Firefox "لإزالة الكود بالكامل في إصدار مستقبلي". [ 42 ]
انظر أيضاً
مراجع
- ↑ "asm.js في فايرفوكس نايتلي" . مدونة لوك واغنر . 21 مارس 2013. تم الاطلاع عليه بتاريخ 13 نوفمبر 2014 .
- 1 2 "kripken/emscripten · GitHub" . Github.com . تم الاسترجاع في 2015-03-05 .
- 1 2 "ملاحظات إصدار فايرفوكس 22.0" . موزيلا . تم الاطلاع عليه في 4 يوليو 2013 .
- ↑ "Asm.js" . Asm.js. تم الاسترجاع في 2015-03-05 .
- ↑ "asm.js — الأسئلة الشائعة" . Asmjs.org. 26 يوليو 2014.
- ↑ "asm.js" . Asm.js. تم الاسترجاع في 2015-03-05 .
- 1 2 ألون زكاي؛ روبرت نيمان (20 ديسمبر 2013). "الفجوة بين أداء asm.js والأداء الأصلي تتقلص أكثر مع تحسينات float32" . تم الاطلاع عليه في 11 أبريل 2014 .
- ↑ "دمج Asm.js مع Chakra وMicrosoft Edge" . مايكروسوفت. 7 مايو 2015. تم الاطلاع عليه في 7 مايو 2015 .
- ↑ "Chrome 28 Beta: ويب أكثر تفاعلية، في كل مكان" . جوجل . تم الاسترجاع في 2013-07-06 .
- ↑ "الرئيسية — العروض التوضيحية — الألعاب ومحركات الألعاب" . GitHub .
- ↑ "plu" . Themucker.github.io. مؤرشف من الأصل بتاريخ 2013-08-03 . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "repl.it — Python" . Repl.it. تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "repl.it — Ruby" . Repl.it. تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "أمثلة على مكتبة pepper.js" . Trypepperjs.appspot.com. مؤرشف من الأصل بتاريخ 14 فبراير 2020. تم الاطلاع عليه بتاريخ 5 مارس 2015 .
- ↑ "emscripten-qt — عروض توضيحية" . Vps.etotheipiplusone.com. مؤرشف من الأصل بتاريخ 13 فبراير 2015. تم الاطلاع عليه بتاريخ 5 مارس 2015 .
- ↑ "حول Emscripten" .
- ↑ "Vim.js — نسخة جافا سكريبت من Vim" . Coolwanglu.github.io . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "خطوط TrueType في جافا سكريبت" . مؤرشف من الأصل بتاريخ 2012-10-12.
- ↑ "نقل SQLite إلى جافا سكريبت" . Github.com . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "GnuPG.js" . Manuuels.github.io . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "ctags في المتصفح" . Github.com . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "Gnuplot online" . Gnuplot.respawned.com. مؤرشف من الأصل بتاريخ 22-02-2015 . تم الاطلاع عليه بتاريخ 05-03-2015 .
- ↑ "حيلة لوضع GraphViz على الويب" . Github.com . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "نسخة جافا سكريبت من ZLib DEFLATE للمتصفح" . Github.com . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "إبيك غيمز تُطلق لعبة 'إبيك سيتادل' على الإنترنت" . UnrealEngine.com (بيان صحفي). 2 مايو 2013. مؤرشف من الأصل في 30 نوفمبر 2016. تم الاطلاع عليه في 24 أكتوبر 2014 .
- ↑ "تم نقل محرك Unreal Engine 3 إلى JavaScript وWebGL، ويعمل على أي متصفح حديث" . ExtremeTech . Ziff Davis . تم الاطلاع عليه بتاريخ 5 مارس 2015 .
- ↑ "حول مستقبل النشر على الويب في Unity" . Blogs.unity3d.com. 29 أبريل 2014.
- ↑ "HTML5" . Clb.demon.fi. مؤرشف من الأصل بتاريخ 2015-03-06 . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "التجميع للويب" . godotengine.org . 10 نوفمبر 2016.
- ↑ "كود مُولّد بواسطة Emscripten" . Kripken.github.io . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "كود مُولّد بواسطة Emscripten" . Forandom.github.io . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ^ جوريانوف الكسندر. "Dune 2 - عبر الإنترنت (إصدار المتصفح)" . إبيكبورت . تم الاسترجاع 2015/03/05 .
- ↑ "عرض توضيحي لخبز الموز من موزيلا" . Developer.mozilla.org . تم الاطلاع عليه بتاريخ 5 مارس 2015 .
- ↑ "حزمة موزيلا المتواضعة تدعم ألعاب المتصفح المدعومة بتقنية WebGL" . آرس تكنيكا. 15 أكتوبر 2014. تم الاطلاع عليه بتاريخ 15 أكتوبر 2014 .
- ↑ "EM-Dosbox على جيت هاب" . جيت هاب . تم الاسترجاع في 9 أبريل 2015 .
- ↑ "إعادة توجيه الصفحة" . Jsmess.textfiles.com . تم الاطلاع عليه بتاريخ 2015-03-05 .
- ↑ "ملعب الفراكتال HTML5" . Danielsadvernture.info. مؤرشف من الأصل بتاريخ 22-02-2015 . تم الاطلاع عليه بتاريخ 05-03-2015 .
- ↑ "الأسئلة الشائعة" . WebAssembly .
- ↑ "مقترح اللجنة الفنية 39 بشأن SIMD.js" . اللجنة الفنية 39 التابعة لـ Ecma. 23 يونيو 2020.
- ↑ "WebAssembly/binaryen" . GitHub . WebAssembly. 25 يونيو 2020.
AssemblyScript الذي يُحوّل TypeScript إلى Binaryen IR؛ wasm2js الذي يُحوّل WebAssembly إلى JS
- ↑ "سجل تغييرات Binaryen" . GitHub .
الإصدار 97: إزالة asm2wasm، الذي كان يدعم الواجهة الخلفية fastcomp الخاصة بـ Emscripten، بعد إزالة fastcomp.
(انظر أيضًا PR#3042 .) - ↑ هانت، رايان (2026-05-20). "وداعًا لـ asm.js" . محرك SpiderMonkey JavaScript/WebAssembly . تم الاسترجاع في 2026-05-20 .
روابط خارجية
- جافا سكريبت
- موزيلا
- برمجة الويب
