آلة جافا الافتراضية

آلة جافا الافتراضية ( JVM ) هي آلة افتراضية تُمكّن الحاسوب من تشغيل برامج جافا ، بالإضافة إلى البرامج المكتوبة بلغات أخرى، تُعرف بلغات JVM ، والتي تُترجم أيضًا إلى بايت كود جافا . يتم تحديد تفاصيل JVM من خلال مواصفات تُحدد رسميًا متطلبات تطبيقها. يضمن وجود هذه المواصفات توافق برامج جافا عبر مختلف التطبيقات، بحيث لا يحتاج مطورو البرامج الذين يستخدمون حزمة تطوير جافا (JDK) إلى القلق بشأن خصائص منصة الأجهزة الأساسية.
تم تطوير تطبيق JVM المرجعي بواسطة مشروع OpenJDK كشفرة مفتوحة المصدر ، ويتضمن مُترجم JIT يُسمى HotSpot . وتعتمد إصدارات Java المدعومة تجاريًا والمتوفرة من Oracle على بيئة تشغيل OpenJDK. يُعد Eclipse OpenJ9 بيئة JVM مفتوحة المصدر أخرى لـ OpenJDK.
مواصفات JVM
آلة جافا الافتراضية عبارة عن حاسوب افتراضي مجرد مُعرَّف بمواصفات محددة. وهي جزء من بيئة تشغيل جافا . لم يتم تحديد خوارزمية جمع البيانات المهملة المستخدمة، ولا أي تحسينات داخلية لتعليمات آلة جافا الافتراضية (ترجمتها إلى لغة الآلة ). والسبب الرئيسي لهذا الإغفال هو تجنب فرض قيود غير ضرورية على المطورين. لا يمكن تشغيل أي تطبيق جافا إلا داخل تطبيق ملموس للمواصفات المجردة لآلة جافا الافتراضية. [ 4 ]
ابتداءً من منصة جافا، الإصدار القياسي (J2SE) 5.0، تم تطوير تغييرات على مواصفات JVM في إطار عملية مجتمع جافا تحت مسمى JSR 924. [ 5 ] اعتبارًا من عام 2006تُجرى التغييرات على المواصفات لدعم التغييرات المقترحة على تنسيق ملف الفئة (JSR 202) [ 6 ] كإصدار صيانة لـ JSR 924. نُشرت مواصفات JVM ككتاب أزرق [ 7 ] ، والذي تنص مقدمته على ما يلي:
نهدف من خلال هذه المواصفات إلى توثيق آلة جافا الافتراضية بشكل كافٍ لتمكين تطبيقات متوافقة في بيئة نظيفة. توفر أوراكل اختبارات للتحقق من التشغيل السليم لتطبيقات آلة جافا الافتراضية.
تُعد آلة جافا الافتراضية الأكثر استخدامًا هي HotSpot من أوراكل .
تمتلك شركة أوراكل العلامة التجارية جافا وقد تسمح باستخدامها لاعتماد مجموعات التنفيذ على أنها متوافقة تمامًا مع مواصفات أوراكل.
جامعو القمامة
تتضمن أدوات جمع البيانات المهملة المتوفرة في الآلة الافتراضية (JVM) الخاصة بـ Java OpenJDK ما يلي:
- مسلسل
- موازي
- CMS (مسح العلامات المتزامن)
- G1 (التخلص من النفايات أولاً)
- ZGC (جامع القمامة Z)
- إبسيلون
- شيناندواه
- GenZGC (الجيل ZGC)
- جينشن (جيل شيناندواه)
- IBM Metronome (متوفر فقط في IBM OpenJDK)
- SAP (فقط في SAP OpenJDK)
- Azul C4 (جامع البيانات المضغوطة المتزامنة باستمرار) [ 8 ] (فقط في Azul Systems OpenJDK)
| إصدار | جامع البيانات المهملة الافتراضي | بطاقات هدايا متاحة |
|---|---|---|
| 6u14 | التسلسلي / المتوازي ( MP ) | التسلسلي، المتوازي، CMS ، G1 (E) |
| 7u4–8 | التسلسلي، المتوازي، CMS، G1 | |
| 9-10 | G1 | |
| 11 | التسلسلي، المتوازي، CMS، G1، إبسيلون (E) ، ZGC (E) | |
| 12-13 | مسلسل، متوازي، CMS، G1، إبسيلون (E) ، ZGC (E) ، شيناندواه (E) | |
| 14 | مسلسل، موازي، G1، إبسيلون (E) ، ZGC (E) ، شيناندواه (E) | |
| 15-20 | مسلسل، موازي، G1، إبسيلون (E) ، ZGC، شيناندواه | |
| 21-22 | مسلسل، متوازي، G1، إبسيلون (E) ، ZGC، شيناندواه، GenZGC (E) | |
| 23 | تسلسلي، متوازي، G1، Epsilon (E) ، ZGC، Shenandoah، GenZGC (ZGC الافتراضي) | |
| 24 | مسلسل، موازي، G1، إبسيلون (E) ، شيناندواه، GenZGC، GenShen (E) | |
| 25 | مسلسل، موازي، G1، إبسيلون (E) ، شيناندواه، جينزجك، جينشين | |
| (هـ) = تجريبي | ||
تتمحور فلسفة تصميم جافا حول افتراض وجود جامع قمامة. على عكس لغات مثل C++ و Rust ، لا يُمكن إدارة الذاكرة بشكل حتمي باستخدام deleteكلمة مفتاحية (كما هو الحال في C++). حتى إضافة مثل هذه الميزة غير ممكنة، بسبب غياب الملكية، باستثناء استخدام sun.misc.Unsafe أو java.lang.foreign لتخصيص/تحرير الذاكرة خارج كومة جافا. [ 9 ] [ 10 ] نظرًا لأن جافا تعتمد بشكل أساسي على تخصيص الذاكرة القائم على الكومة، تُخزَّن الكائنات كمراجع، وسيؤدي حذفها إلى مؤشرات معلقة .
Foo a = new Foo (); Foo b = a ;احذف a ؛ ثم اطبع b .بنية الآلة الافتراضية
تعمل آلة جافا الافتراضية (JVM) على أنواع بيانات محددة كما هو موضح في مواصفاتها. يمكن تقسيم أنواع البيانات [ 11 ] إلى أنواع أولية ( قيم عددية صحيحة وعشرية ) وأنواع مرجعية . يدعم النظام الأنواع 64 بت بشكل أصلي، لكنها تستهلك وحدتي تخزين في المتغيرات المحلية للإطار أو مكدس المعاملات، لأن كل وحدة 32 بت. جميع الأنواع و و و موسعة الإشارة (باستثناء التي موسعة الصفر ) وتُعامل كأعداد صحيحة 32 بت، تمامًا مثل الأنواع . تحتوي الأنواع الأصغر على عدد قليل من التعليمات الخاصة بالنوع للتحميل والتخزين وتحويل النوع. تُعامل كقيم 8 بت، حيث يمثل 0 القيمة و1 القيمة . (على الرغم من أن `a` يُعامل كنوع منذ أن أوضحت مواصفات آلة جافا الافتراضية، الإصدار الثاني، هذه المسألة، إلا أنه في الكود المُترجم والمُنفذ، لا يوجد فرق يُذكر بين `a` و`a` باستثناء تغيير الأسماء في توقيعات الدوال ونوع المصفوفات المنطقية. تُغير أسماء `a` في توقيعات الدوال إلى `a`، بينما تُغير أسماء `a` إلى `a` . تحمل المصفوفات المنطقية النوع ` a` ولكنها تستخدم 8 بتات لكل عنصر، ولا تمتلك آلة جافا الافتراضية قدرة مُدمجة لتجميع القيم المنطقية في مصفوفة بتات ، لذا باستثناء النوع `a`، فإنها تعمل وتتصرف بنفس طريقة المصفوفات. في جميع الاستخدامات الأخرى، يكون النوع `a` غير معروف فعليًا لآلة جافا الافتراضية لأن جميع التعليمات المُستخدمة للعمل على القيم المنطقية تُستخدم أيضًا للعمل على `a`.)longdoublebooleanbyteshortcharcharintbooleanbytefalsetruebooleanbooleanbytebooleanZbyteBboolean[]bytebooleanbyte
تحتوي آلة جافا الافتراضية (JVM) على كومة مُدارة بواسطة جمع البيانات المهملة لتخزين الكائنات والمصفوفات. أما التعليمات البرمجية والثوابت وبيانات الفئات الأخرى فتُخزن في "منطقة الأساليب". تُعد منطقة الأساليب منطقيًا جزءًا من الكومة، ولكن قد تتعامل بعض التطبيقات معها بشكل منفصل، وقد لا تقوم بجمع البيانات المهملة فيها، على سبيل المثال. لكل خيط من خيوط JVM أيضًا مكدس استدعاء خاص به (يُسمى "مكدس آلة جافا الافتراضية" للتوضيح)، والذي يخزن الإطارات . يُنشأ إطار جديد في كل مرة يُستدعى فيها أسلوب، ويُحذف الإطار عند انتهاء ذلك الأسلوب.
يُوفّر كل إطار "مكدس معاملات" ومصفوفة من "المتغيرات المحلية". يُستخدم مكدس المعاملات لإجراء العمليات الحسابية واستقبال القيمة المُعادة من الدالة المُستدعاة، بينما تؤدي المتغيرات المحلية نفس وظيفة المسجلات وتُستخدم أيضًا لتمرير وسائط الدوال. وبالتالي، فإنّ JVM هي آلة مكدس وآلة مسجلات في آنٍ واحد. عمليًا، يُلغي HotSpot جميع المكدسات باستثناء مكدس الخيط/الاستدعاء الأصلي حتى عند التشغيل في الوضع المُفسّر، لأنّ مُفسّر القوالب الخاص به يعمل تقنيًا كمُصرّف.
تستخدم آلة جافا الافتراضية (JVM) المراجع وفهارس المكدس/المصفوفات لمعالجة البيانات؛ فهي لا تستخدم عنونة البايت كما تفعل معظم الآلات المادية، لذا فهي لا تتناسب تمامًا مع التصنيف المعتاد للآلات 32 بت أو 64 بت . من ناحية ما، يمكن تصنيفها كآلة 32 بت، لأن هذا هو حجم أكبر قيمة تخزنها بشكل أصلي: عدد صحيح أو عدد عشري 32 بت، أو مرجع 32 بت. ولأن المرجع 32 بت، فإن كل برنامج يقتصر على 2^ 32 مرجعًا فريدًا كحد أقصى، وبالتالي 2^ 32 كائنًا كحد أقصى. مع ذلك، يمكن أن يتجاوز حجم كل كائن بايتًا واحدًا، وقد يكون كبيرًا جدًا ؛ فأكبر كائن ممكن هو مصفوفة longبطول 2^ 31 - 1، والتي ستستهلك 16 جيجابايت من الذاكرة، ويمكن أن يكون هناك 2^ 32 من هذه المصفوفات إذا توفرت ذاكرة كافية. ينتج عن هذا حدود عليا أقرب إلى آلة نموذجية 64 بت قابلة للعنونة بالبايت. يمكن تصميم تطبيق JVM ليعمل على معالج يستخدم أي عرض بت أصليًا، طالما أنه يُنفذ بشكل صحيح العمليات الحسابية للأعداد الصحيحة (8، 16، 32، و64 بت) والأعداد العشرية (32 و64 بت) التي يتطلبها JVM. وبحسب طريقة تنفيذ المراجع (المؤشرات الأصلية، أو المؤشرات المضغوطة، أو جدول التوجيه غير المباشر)، قد يحد ذلك من عدد الكائنات إلى أقل من الحد الأقصى النظري. يتمتع تطبيق JVM على منصة 64 بت بإمكانية الوصول إلى مساحة عناوين أكبر بكثير من نظيره على منصة 32 بت، مما يسمح بحجم كومة أكبر بكثير وزيادة في الحد الأقصى لعدد الخيوط، وهو أمر ضروري لأنواع معينة من التطبيقات الكبيرة؛ ومع ذلك، قد يكون هناك انخفاض في الأداء عند استخدام تطبيق 64 بت مقارنةً بتطبيق 32 بت.
لغات JVM
لغة JVM هي أي لغة ذات وظائف يمكن التعبير عنها في ملف فئة صالح، والذي يمكن استضافته بواسطة JVM. يحتوي ملف الفئة على تعليمات JVM ( رمز بايت JVM )، وجدول رموز، ومعلومات إضافية أخرى. تنسيق ملف الفئة هو تنسيق ثنائي مستقل عن الأجهزة ونظام التشغيل، ويُستخدم لتمثيل الفئات والواجهات المُجمّعة. [ 12 ]
توجد العديد من لغات JVM، منها لغات قديمة راسخة تم نقلها إلى JVM، ولغات أحدث بكثير تم تطويرها من الصفر. ولعلّ JRuby و Jython هما أشهر اللغات المنقولة من لغات قديمة، وهما Ruby و Python على التوالي. أما من بين اللغات الجديدة التي تم تطويرها من الصفر لتُترجم إلى بايت كود Java، فربما تكون Clojure و Groovy و Scala و Kotlin هي الأكثر شيوعًا. ومن أبرز سمات لغات JVM قابليتها للتشغيل البيني ، فهي متوافقة مع بعضها البعض، بحيث يمكن، على سبيل المثال، استخدام مكتبات Scala مع برامج Java والعكس صحيح. [ 13 ]
تُطبّق آلة جافا الافتراضية (JVM) في جافا 7 معيار JSR 292: دعم اللغات ذات الكتابة الديناميكية [ 14 ] على منصة جافا، وهي ميزة جديدة تدعم اللغات ذات الكتابة الديناميكية في آلة جافا الافتراضية. وقد طُوّرت هذه الميزة ضمن مشروع آلة دافنشي، الذي يهدف إلى توسيع نطاق آلة جافا الافتراضية لدعم لغات أخرى غير جافا. [ 15 ] [ 16 ]
مُحمِّل الفئات
تُعدّ الفئة إحدى الوحدات التنظيمية لرمز بايت JVM . يجب أن يكون تطبيق مُحمِّل الفئات قادرًا على التعرّف على أي شيء يتوافق مع تنسيق ملف فئة Java وتحميله . يحق لأي تطبيق التعرّف على أشكال ثنائية أخرى إلى جانب ملفات الفئات ، ولكن يجب عليه التعرّف على ملفات الفئات .
يقوم مُحمِّل الفئات بثلاثة أنشطة أساسية بهذا الترتيب الصارم:
- التحميل: يعثر على البيانات الثنائية لنوع معين ويستوردها
- الربط: يقوم بالتحقق والإعداد، و(اختياريًا) الحل
- التحقق: يضمن صحة النوع المستورد
- التحضير: تخصيص الذاكرة لمتغيرات الفئة وتهيئة الذاكرة بالقيم الافتراضية
- الحل: يحول المراجع الرمزية من النوع إلى مراجع مباشرة.
- التهيئة: تستدعي شيفرة جافا التي تقوم بتهيئة متغيرات الفئة إلى قيمها الابتدائية الصحيحة.
بشكل عام، هناك ثلاثة أنواع من محملات الفئات: محمل فئات التمهيد، ومحمل فئات الامتداد، ومحمل فئات النظام / التطبيق.
يجب أن يتضمن كل تطبيق لآلة جافا الافتراضية مُحمِّل فئات تمهيدي قادر على تحميل الفئات الموثوقة، بالإضافة إلى مُحمِّل فئات إضافي أو مُحمِّل فئات التطبيق. لا تُحدد مواصفات آلة جافا الافتراضية كيفية تحديد مُحمِّل الفئات لموقع الفئات.
تعليمات بايت كود
تحتوي آلة جافا الافتراضية (JVM) على تعليمات لمجموعات المهام التالية:
الهدف هو التوافق الثنائي. يحتاج كل نظام تشغيل مضيف إلى تطبيق خاص به لآلة جافا الافتراضية (JVM) وبيئة التشغيل. تفسر آلات جافا الافتراضية هذه الشفرة البايتية دلاليًا بنفس الطريقة، لكن التنفيذ الفعلي قد يختلف. والأكثر تعقيدًا من مجرد محاكاة الشفرة البايتية هو تنفيذ واجهة برمجة تطبيقات جافا الأساسية (API) بكفاءة وتوافق، والتي يجب ربطها بكل نظام تشغيل مضيف.
تعتمد هذه التعليمات على مجموعة من المعايير المشتركةأنواع البيانات المجردة بدلاً من أنواع البيانات الأصلية لأي بنية مجموعة تعليمات محددة .
مدقق رمز البايت
تتمثل إحدى الفلسفات الأساسية للغة جافا في أنها آمنة بطبيعتها، إذ لا يمكن لأي برنامج مستخدم أن يتسبب في تعطل الجهاز المضيف أو التدخل بشكل غير لائق في العمليات الأخرى عليه. كما أنه من الممكن حماية بعض الدوال وبنى البيانات التابعة لبرامج موثوقة من الوصول إليها أو تلفها بواسطة برامج غير موثوقة تعمل ضمن نفس بيئة جافا الافتراضية (JVM). علاوة على ذلك، لا يُسمح بحدوث أخطاء البرمجة الشائعة التي غالبًا ما تؤدي إلى تلف البيانات أو سلوك غير متوقع، مثل الوصول إلى عناصر خارج نطاق المصفوفة أو استخدام مؤشر غير مهيأ. وتتضافر عدة ميزات في جافا لتوفير هذه الحماية، بما في ذلك نموذج الفئات، وذاكرة الوصول العشوائي (الهيبو) المُدارة بواسطة جامع البيانات المهملة ، وأداة التحقق.
تقوم آلة جافا الافتراضية (JVM) بالتحقق من جميع التعليمات البرمجية الوسيطة قبل تنفيذها. ويتكون هذا التحقق بشكل أساسي من ثلاثة أنواع من الفحوصات:
- الفروع دائماً في مواقع صالحة
- يتم تهيئة البيانات دائمًا وتكون المراجع آمنة من حيث النوع دائمًا
- يخضع الوصول إلى البيانات والأساليب الخاصة أو الخاصة بالحزم لرقابة صارمة.
تُجرى عمليتا التحقق الأولى والثانية بشكل أساسي خلال خطوة التحقق التي تحدث عند تحميل فئة ما وتفعيلها للاستخدام. أما العملية الثالثة فتُجرى بشكل أساسي ديناميكيًا، عند وصول فئة أخرى إلى عناصر البيانات أو أساليب فئة ما لأول مرة.
لا يسمح المُدقِّق إلا ببعض تسلسلات البايت كود في البرامج الصحيحة، على سبيل المثال، لا يمكن لتعليمات القفز (التفرع) استهداف إلا تعليمة داخل نفس الدالة . علاوة على ذلك، يضمن المُدقِّق أن أي تعليمة معينة تعمل على موقع ثابت في المكدس، [ 17 ] مما يسمح لمُصرِّف JIT بتحويل عمليات الوصول إلى المكدس إلى عمليات وصول ثابتة إلى السجلات. لهذا السبب، فإن كون JVM بنية مكدس لا يعني بالضرورة انخفاضًا في سرعة المحاكاة على البنى القائمة على السجلات عند استخدام مُصرِّف JIT. في ظل بنية JVM المُدقَّقة، لا يُحدث مُصرِّف JIT أي فرق سواءً حصل على سجلات وهمية مُسماة أو مواقع مكدس وهمية يجب تخصيصها لسجلات البنية المستهدفة. في الواقع، يُميِّز التحقق من الكود JVM عن بنية المكدس التقليدية، التي تكون محاكاتها بكفاءة باستخدام مُصرِّف JIT أكثر تعقيدًا وعادةً ما يتم تنفيذها بواسطة مُفسِّر أبطأ. بالإضافة إلى ذلك، فإن المفسر المستخدم في JVM الافتراضي هو نوع خاص يُعرف باسم مفسر القوالب، والذي يترجم الشفرة البايتية مباشرةً إلى لغة الآلة الأصلية القائمة على السجلات، بدلاً من محاكاة المكدس كما في المفسرات التقليدية. [ 18 ] من نواحٍ عديدة، يمكن اعتبار مفسر HotSpot مُجمِّع JIT وليس مفسرًا حقيقيًا، مما يعني أن بنية المكدس التي تستهدفها الشفرة البايتية لا تُستخدم فعليًا في التنفيذ، بل هي مجرد مواصفات للتمثيل الوسيط الذي يمكن تنفيذه بكفاءة في بنية قائمة على السجلات. ومن الأمثلة الأخرى على بنية المكدس التي تُعد مجرد مواصفات ويتم تنفيذها في آلة افتراضية قائمة على السجلات، بيئة تشغيل اللغة المشتركة ( CLAN ). [ 19 ]
استخدمت المواصفات الأصلية لمدقق الشفرة البايتية لغة طبيعية كانت غير مكتملة أو غير دقيقة في بعض الجوانب. وقد بُذلت عدة محاولات لتحديد JVM كنظام رسمي. وبذلك، يُمكن تحليل أمان تطبيقات JVM الحالية بشكل أكثر شمولاً، ومنع الثغرات الأمنية المحتملة. كما سيُصبح من الممكن تحسين أداء JVM بتجاوز فحوصات الأمان غير الضرورية، إذا ثبت أن التطبيق قيد التشغيل آمن. [ 20 ]
تنفيذ آمن للتعليمات البرمجية عن بعد
تتيح بنية الآلة الافتراضية تحكمًا دقيقًا للغاية في الإجراءات المسموح بها للبرامج داخل الآلة. وتفترض هذه البنية أن البرنامج صحيح من الناحية الدلالية، أي أنه اجتاز بنجاح عملية التحقق من رمز البايت (الرسمي)، والتي تُنفذ بواسطة أداة، ربما خارج الآلة الافتراضية. صُمم هذا النظام للسماح بتنفيذ آمن لبرامج غير موثوقة من مصادر بعيدة، وهو نموذج تستخدمه تطبيقات جافا الصغيرة ، وغيرها من عمليات تنزيل البرامج الآمنة. بمجرد التحقق من رمز البايت، يعمل البرنامج الذي تم تنزيله في بيئة معزولة مقيدة ، مصممة لحماية المستخدم من البرامج الضارة أو التي تتصرف بشكل غير صحيح. بالإضافة إلى عملية التحقق من رمز البايت، يمكن للناشرين شراء شهادة لتوقيع التطبيقات الصغيرة رقميًا على أنها آمنة، مما يمنحهم الإذن لطلب خروج المستخدم من البيئة المعزولة والوصول إلى نظام الملفات المحلي، أو الحافظة ، أو تنفيذ برامج خارجية، أو الشبكة.
تم تقديم دليل رسمي على مدققي بايت كود من قبل صناعة Javacard (التطوير الرسمي لمدقق مضمن لبايت كود Java Card [ 21 ] ).
مترجم بايت كود ومترجم فوري
لكل بنية معمارية للأجهزة، يلزم وجود مترجم بايت كود جافا مختلف . عندما يمتلك جهاز كمبيوتر مترجم بايت كود جافا، فإنه يستطيع تشغيل أي برنامج بايت كود جافا، ويمكن تشغيل البرنامج نفسه على أي جهاز كمبيوتر آخر مزود بهذا المترجم.
عند تنفيذ بايت كود جافا بواسطة مترجم، يكون التنفيذ أبطأ دائمًا من تنفيذ البرنامج نفسه بعد ترجمته إلى لغة الآلة الأصلية. تُخفف هذه المشكلة باستخدام مترجمات JIT (الترجمة الفورية) لتنفيذ بايت كود جافا. إذ يقوم مترجم JIT بترجمة بايت كود جافا إلى لغة الآلة الأصلية أثناء تنفيذ البرنامج. وبذلك، يمكن تنفيذ الأجزاء المترجمة من البرنامج بسرعة أكبر بكثير من سرعة تنفيذها بعد الترجمة. تُطبق هذه التقنية على أجزاء البرنامج التي تُنفذ بشكل متكرر. وبهذه الطريقة، يُمكن لمترجم JIT تسريع وقت التنفيذ الإجمالي بشكل ملحوظ.
لا توجد بالضرورة علاقة بين لغة برمجة جافا ورمز جافا البرمجي. يمكن ترجمة برنامج مكتوب بلغة جافا مباشرةً إلى لغة الآلة الخاصة بجهاز كمبيوتر حقيقي، كما يمكن ترجمة البرامج المكتوبة بلغات أخرى غير جافا إلى رمز جافا البرمجي.
يُفترض أن يكون بايت كود جافا مستقلاً عن المنصة وآمناً. [ 22 ] بعض تطبيقات JVM لا تتضمن مترجماً، بل تتكون فقط من مُصرّف فوري. [ 23 ]
واجهة جافا الأصلية
واجهة جافا الأصلية (أو واجهة الأساليب الأصلية) هي إطار عمل برمجي لواجهة وظائف خارجية (غير جافا) يمكّن كود جافا الذي يعمل في آلة جافا الافتراضية (JVM) من استدعاء التطبيقات الأصلية (البرامج الخاصة بمنصة الأجهزة ونظام التشغيل ) والمكتبات المكتوبة بلغات أخرى مثل C و C++ والتجميع ، وأن يتم استدعاؤها من قبلها .
يقدم Java 22 واجهة برمجة التطبيقات للوظائف الخارجية والذاكرة، والتي يمكن اعتبارها خليفة لواجهة Java الأصلية.
يتم تمكين الأساليب الأصلية بواسطة JNI للتعامل مع المواقف التي لا يمكن فيها كتابة تطبيق بالكامل بلغة برمجة Java، على سبيل المثال عندما لا تدعم مكتبة فئات Java القياسية الميزات الخاصة بالمنصة أو مكتبة البرامج.
يُمكّن إطار عمل JNI الدوال الأصلية من استخدام كائنات جافا بنفس طريقة استخدام كود جافا لهذه الكائنات. إذ يُمكن للدالة الأصلية إنشاء كائنات جافا، ثم فحصها واستخدامها لتنفيذ مهامها. كما يُمكنها أيضًا فحص واستخدام الكائنات التي أنشأها كود تطبيق جافا.
يسمح JNI أيضًا بالوصول المباشر إلى كود التجميع، دون الحاجة إلى المرور عبر جسر C.[3] الوصول إلى تطبيقات Java من التجميع ممكن بنفس الطريقة.
JVM في متصفح الويب
في بداية عمر منصة جافا، تم تسويق آلة جافا الافتراضية (JVM) كتقنية ويب لإنشاء تطبيقات ويب غنية . اعتبارًا من عام 2018معظم متصفحات الويب وأنظمة التشغيل التي تتضمن متصفحات الويب لا تأتي مزودة بملحق جافا ، كما أنها لا تسمح بتثبيت أي ملحق غير فلاش من مصادر خارجية. تم إيقاف دعم ملحق متصفح جافا في JDK 9. [ 24 ]
صُممت إضافة NPAPI لمتصفح جافا لتمكين آلة جافا الافتراضية (JVM) من تشغيل تطبيقات جافا المصغّرة المُدمجة في صفحات HTML. في المتصفحات المُثبّت عليها هذه الإضافة، يُسمح للتطبيق المصغّر بالرسم ضمن منطقة مستطيلة مُخصصة له في الصفحة. ولأن الإضافة تتضمن JVM، فإن تطبيقات جافا المصغّرة لا تقتصر على لغة برمجة جافا؛ إذ يُمكن تشغيل أي لغة مُستهدفة لـ JVM ضمن الإضافة. تتيح مجموعة محدودة من واجهات برمجة التطبيقات (APIs) للتطبيقات المصغّرة الوصول إلى ميكروفون المستخدم أو تسريع الرسومات ثلاثية الأبعاد، مع العلم أنها لا تستطيع تعديل الصفحة خارج منطقتها المستطيلة. يعمل برنامج Adobe Flash Player ، وهو التقنية المُنافسة الرئيسية، بنفس الطريقة في هذا الصدد.
اعتبارًا من يونيو 2015وفقًا لـ W3Techs، انخفض استخدام تطبيقات جافا الصغيرة وسيلفرلايت إلى 0.1% لكل منهما لجميع مواقع الويب، بينما انخفض استخدام فلاش إلى 10.8%. [ 25 ]
آلات جافا سكريبت الافتراضية والمترجمات
منذ مايو 2016، يتيح JavaPoly للمستخدمين استيراد مكتبات Java دون تعديل، واستدعائها مباشرةً من JavaScript. يسمح JavaPoly للمواقع الإلكترونية باستخدام مكتبات Java دون تعديل، حتى لو لم يكن Java مثبتًا على جهاز المستخدم. [ 26 ]
التحويل إلى جافا سكريبت
مع استمرار تحسين سرعة تنفيذ جافا سكريبت، بالإضافة إلى تزايد استخدام الأجهزة المحمولة التي لا تدعم متصفحاتها الإضافات، تُبذل جهود لاستهداف هؤلاء المستخدمين من خلال تحويل الشيفرة المصدرية إلى جافا سكريبت. ويمكن تحويل الشيفرة المصدرية أو شيفرة JVM إلى جافا سكريبت.
تتيح عملية ترجمة بايت كود JVM، الموحد لجميع لغات JVM، إمكانية البناء على مترجم اللغة الحالي إلى بايت كود. ومن أبرز مترجمات بايت كود JVM إلى جافا سكريبت: TeaVM [ 27 ] ، والمترجم الموجود في Dragome Web SDK [ 28 ] ، وBck2Brwsr [ 29 ] ، وj2js-compiler [ 30 ] .
تشمل أبرز برامج تحويل اللغات من لغات JVM إلى جافا سكريبت برنامج تحويل جافا إلى جافا سكريبت الموجود في Google Web Toolkit ، وJ2CL، [ 31 ] وClojurescript (Clojure)، وGrooScript (Apache Groovy)، وScala.js (Scala)، وغيرها. [ 32 ]
انظر أيضاً
ملحوظات
مراجع
- ↑ "JEP 479: إزالة منفذ ويندوز 32 بت x86" . OpenJDK .
- ↑ "JEP 503: إزالة منفذ x86 ذي 32 بت" . OpenJDK .
- ↑ "JDK 26" .
- ↑ بيل فينرز، داخل آلة جافا الافتراضية، مؤرشف بتاريخ 25 يناير 2021 في أرشيف الإنترنت، الفصل 5
- ↑ "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 924" . Jcp.org. مؤرشف من الأصل بتاريخ 24 ديسمبر 2020. تم الاطلاع عليه بتاريخ 26 يونيو 2015 .
- ↑ "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 202" . Jcp.org. مؤرشف من الأصل بتاريخ 26 فبراير 2012. تم الاطلاع عليه بتاريخ 26 يونيو 2015 .
- ↑ مواصفات آلة جافا الافتراضية مؤرشفة في 2008-07-09 في Wayback Machine (الإصدار الأول مؤرشف في 2008-10-12 في Wayback Machine والإصدار الثاني مؤرشف في 2011-09-25 في Wayback Machine متاحان أيضًا عبر الإنترنت).
- ↑ تين، جيل؛ إيينجار، بالاجي؛ وولف، مايكل (2011). "C4: جامع الضغط المتزامن المستمر" (ملف PDF) . ISMM '11: وقائع الندوة الدولية لإدارة الذاكرة . doi : 10.1145/1993478 . ISBN 978-1-45030263-0تمت أرشفة الملف (PDF) من النسخة الأصلية بتاريخ 2017-08-09.
- ↑ بن إيفانز (4 مايو 2020). "الفئة غير الآمنة: غير آمنة بأي سرعة" . blogs.oracle.com . شركة أوراكل.
- ↑ "JEP 454: واجهة برمجة تطبيقات الوظائف الخارجية والذاكرة" . OpenJDK. 7 أبريل 2025.
- ↑ "الفصل الثاني: بنية آلة جافا الافتراضية" . مؤرشف من الأصل بتاريخ 15-09-2021 . تم الاطلاع عليه بتاريخ 15-09-2021 .
- ↑ "مواصفات آلة جافا الافتراضية: إصدار جافا SE 7" (ملف PDF) . Docs.oracle.com. مؤرشف (PDF) من الأصل بتاريخ 2021-02-04 . تم الاطلاع عليه بتاريخ 2015-06-26 .
- ↑ فريق العمل. "الأسئلة الشائعة - التوافق بين لغات جافا" . scala-lang.org . مؤرشف من الأصل بتاريخ 2020-08-09 . تم الاطلاع عليه بتاريخ 2015-11-18 .
- ↑ "برنامج عملية مجتمع جافا (SM) - طلبات مواصفات جافا (JSRs): تفاصيل JSR رقم 292" . Jcp.org. مؤرشف من الأصل بتاريخ 20 ديسمبر 2020. تم الاطلاع عليه بتاريخ 26 يونيو 2015 .
- ↑ "مشروع آلة دافنشي" . Openjdk.java.net. مؤرشف من الأصل بتاريخ 11 نوفمبر 2020. تم الاطلاع عليه بتاريخ 26 يونيو 2015 .
- ↑ "ميزة جديدة في JDK 7: دعم اللغات ذات الكتابة الديناميكية في آلة جافا الافتراضية" . Oracle.com. مؤرشف من الأصل بتاريخ 13 سبتمبر 2018. تم الاطلاع عليه بتاريخ 26 يونيو 2015 .
- ↑ "عملية التحقق" . مواصفات آلة جافا الافتراضية . صن مايكروسيستمز. 1999. مؤرشف من الأصل بتاريخ 21-03-2011 . تم الاطلاع عليه بتاريخ 31-05-2009 .
- ↑ "نظرة عامة على وقت تشغيل HotSpot - المفسر" . OpenJDK . مؤرشف من الأصل بتاريخ 21-05-2022 . تم الاطلاع عليه بتاريخ 24-05-2021 .
- ↑ "لماذا لا نجعل CLR قائمًا على السجلات؟ · المشكلة رقم 4775 · dotnet/runtime" . GitHub . مؤرشف من الأصل بتاريخ 20 أبريل 2023. تم الاطلاع عليه بتاريخ 24 مايو 2021 .
- ↑ فروند، ستيفن ن.؛ ميتشل، جون س. (1999). "إطار عمل رسمي للغة بايت كود جافا ومُدقِّقها". وقائع المؤتمر الرابع عشر لجمعية ACM SIGPLAN حول البرمجة كائنية التوجه، والأنظمة، واللغات، والتطبيقات - OOPSLA '99 . الصفحات 147-166 . CiteSeerX 10.1.1.2.4663 . doi : 10.1145/320384.320397 . ISBN 978-1581132380. S2CID 14302964 .
- ↑ كاسيت، لودوفيك؛ بوردي، ليليان؛ ريكيه، أنطوان (10 أبريل 2002). "التطوير الرسمي لمدقق مضمن لرمز بايت بطاقة جافا" (ملف PDF) . المعهد الوطني للبحوث في العلوم والتكنولوجيا الرقمية بجامعة كوت دازور ( Inria) . مؤرشف (ملف PDF) من الأصل في 3 أكتوبر 2022.
- ↑ ديفيد ج. إيك، مقدمة في البرمجة باستخدام جافا، مؤرشف في 11 أكتوبر 2014 على موقع Wayback Machine ، الطبعة السابعة، الإصدار 7.0، أغسطس 2014، القسم 1.3 "آلة جافا الافتراضية"
- ↑ مقدمة عن Oracle JRockit، مؤرشفة بتاريخ 2015-09-06 في Wayback Machine، الإصدار R28، صفحة 2. "فهم التجميع والتحسين في الوقت المناسب"
- ↑ "أوراكل تُوقف دعم إضافة متصفح جافا، وتستعد لزوالها" . آرس تكنيكا . 28 يناير 2016. مؤرشف من الأصل في 8 أبريل 2016. تم الاطلاع عليه في 15 أبريل 2016 .
- ↑ "الاتجاهات السنوية التاريخية في استخدام لغات البرمجة من جانب العميل، يونيو 2015" . W3techs.com . تم الاطلاع عليه بتاريخ 26-06-2015 .
- ↑ كريل، بول (13 مايو 2016). "JavaPoly.js يستورد كود جافا موجودًا ويستدعيه مباشرةً من جافا سكريبت" . إنفوورلد . مؤرشف من الأصل في 25 يوليو 2016. تم الاطلاع عليه في 18 يوليو 2016 .
- ↑ "الصفحة الرئيسية لمشروع TeaVM" . Teavm.org. مؤرشف من الأصل بتاريخ 27-06-2015 . تم الاطلاع عليه بتاريخ 26-06-2015 .
- ↑ "Dragome Web SDK" . Dragome.com. مؤرشف من الأصل بتاريخ 2015-08-01 . تم الاطلاع عليه بتاريخ 2015-06-26 .
- ↑ "Bck2Brwsr - APIDesign" . Wiki.apidesign.org. مؤرشف من الأصل بتاريخ 27-06-2015 . تم الاطلاع عليه بتاريخ 26-06-2015 .
- ↑ فولفغانغ كوهن (ديكاتور). مُجمِّع j2js . مؤرشف بتاريخ 29-09-2013 على موقع Wayback Machine GitHub
- ↑ "J2cl: تحويل جافا إلى جافا سكريبت لمترجم Closure | Hacker News" . news.ycombinator.com . مؤرشف من الأصل بتاريخ 2021-01-02 . تم الاطلاع عليه بتاريخ 2025-10-31 .
- ↑ "قائمة اللغات التي تُترجم إلى جافا سكريبت · ويكي jashkenas/coffeescript · جيت هاب" . Github.com. ١٩ يونيو ٢٠١٥. مؤرشف من الأصل في ٣١ يناير ٢٠٢٠. تم الاطلاع عليه في ٢٦ يونيو ٢٠١٥ .
- تتضمن التوضيحات والتعديلات على مواصفات آلة جافا الافتراضية، الإصدار الثاني، المؤرشفة بتاريخ 10 يناير 2006 في Wayback Machine، قائمة بالتغييرات التي ستُجرى لدعم J2SE 5.0 وJSR 45
- تحدد JSR 45، المؤرشفة بتاريخ 5 فبراير 2006 على موقع Wayback Machine ، تغييرات في تنسيق ملف الفئة لدعم تصحيح الأخطاء على مستوى المصدر للغات مثل صفحات خادم جافا (JSP) و SQLJ التي تُترجم إلى جافا
روابط خارجية
- نظرة معمقة على بدء تشغيل JVM
- أخبار وآراء من أعضاء فريق جافا في أوراكل
- ويكي OpenJDK
- مدونة توماس شتوف - مهندس JVM في شركة ريد هات
- عملية تجميع البيانات المهملة في جافا
- آلة جافا الافتراضية
- جافا (لغة برمجة)
- برنامج منصة جافا
- طلبات مواصفات جافا
- الآلات الافتراضية القائمة على المكدس
