آلة دافنشي

كانت آلة دافنشي ، والتي تسمى أيضًا الآلة الافتراضية متعددة اللغات ، مشروعًا لشركة صن مايكروسيستمز يهدف إلى وضع نموذج أولي لتوسيع آلة جافا الافتراضية (JVM) لإضافة دعم للغات الديناميكية .

كان من الممكن بالفعل تشغيل اللغات الديناميكية على منصة JVM، ولكن الهدف هو تسهيل تطبيقات اللغات الديناميكية الجديدة وتحسين أدائها. كان هذا المشروع بمثابة التطبيق المرجعي لمعيار JSR 292 ( دعم اللغات ذات الكتابة الديناميكية على منصة جافا ). [ 1 ]

تاريخ

قبل إصدار Java 7، لم تكن آلة Java الافتراضية تدعم اللغات ذات الكتابة الديناميكية بشكل مدمج :

JSR 292 ( دعم اللغات ذات الكتابة الديناميكية على منصة جافا ) [ 1 ] يقترح ما يلي:

  • أضف تعليمات جديدة invokedynamicعلى مستوى JVM، للسماح باستدعاء الأساليب بالاعتماد على فحص النوع الديناميكي ، [ 3 ] [ 4 ] [ 5 ]
  • القدرة على تغيير الفئات والأساليب ديناميكيًا أثناء التشغيل في بيئة الإنتاج.

بعد نجاح تطبيق JRuby في جافا ، انطلق مشروع Da Vinci في نهاية يناير 2008. [ 6 ] وكان من المخطط إضافة الإمكانيات التي جُرِّبت في Da Vinci إلى جافا 7. ويهدف المشروع إلى إنشاء نموذج أولي لـ JSR، بالإضافة إلى امتدادات أخرى ذات أولوية أقل. [ 7 ] أُعلن عن أول نموذج أولي عامل، طُوِّر كتحديث لـ OpenJDK ، وأُتيح في نهاية أغسطس 2008. [ 8 ] [ 9 ] [ 10 ]

منذ ذلك الحين، نجح فريق JRuby في دمج الاستدعاء الديناميكي في قاعدة بياناتهم. تم تضمين الاستدعاء الديناميكي مع الإصدار 1.1.5 وسيتم تعطيله على أجهزة JVM التي لا تحتوي على invokedynamicهذه الإمكانيات. [ 11 ]

ومنذ ذلك الحين، تم دمج المشروع في قاعدة بيانات JDK 7 [ 12 ] ثم تم دمجه في إصدار Java 7 .

بنيان

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

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

لا يقتصر الأمر على استهلاك هذا القدر الكبير من الذاكرة فحسب، بل يملأ أيضًا منطقة ذاكرة تُسمى Metaspace (الجيل الدائم قبل Java 8)، وهي جزء من الكومة التي تستخدمها آلة جافا الافتراضية (JVM) لتخزين معلومات حول الفئات . نادرًا ما تُجمع البيانات المهملة من الذاكرة المستخدمة في هذه المنطقة لأنها تخزن بيانات غير قابلة للتغيير في سياق برامج جافا؛ ولهذا السبب، لا تستطيع تطبيقات اللغات الديناميكية تجميع سوى جزء صغير من البرامج النصية. [ 13 ]

يقترح القرار المشترك رقم 292 ما يلي:

  • توفير آلية تسمح بتحميل فئة موجودة وتعديلها، مما ينتج عنه فئة جديدة بتلك التعديلات ولكنها تشارك بقية هيكلها وبياناتها، وبالتالي لا تشغل مساحة التوليد الدائم .
  • توفير رمز البايت الجديد invokedynamicالذي يسمح لآلة جافا الافتراضية بتحسين استدعاءات هذا النوع. [ 3 ]

انظر أيضاً

مراجع

  1. 1 2 انظر JSR 292
  2. ناتر، تشارلز (2007-01-03). "InvokeDynamic: هل هو مفيد حقًا؟" . تم الاسترجاع في 2008-02-06 .
  3. 1 2 إد أورت (يوليو 2009). "ميزة جديدة في JDK 7: دعم اللغات ذات الكتابة الديناميكية في آلة جافا الافتراضية" . تم الاسترجاع في 26 يوليو 2009 .
  4. جيف فريزن (16 ديسمبر 2014). "كيفية استدعاء Invokedynamic" . جافا وورلد . تم الاسترجاع في 10 يونيو 2020 .
  5. ^ رافائيل وينترهالتر (2015/03/02). "تفكيك الاستدعاء الديناميكي" . dzone.com . تم الاسترجاع 2020-06-10 .
  6. كريل، بول (31 يناير 2008). "آلة دافنشي من صن توسع نطاق تغطية JVM" . مؤرشف من الأصل في 28 مارس 2009. تم الاطلاع عليه في 6 فبراير 2008 .
  7. "المشاريع الفرعية والتحقيقات" . صن مايكروسيستمز . 2007. تم الاطلاع عليه بتاريخ 2008-02-06 .
  8. روز، جون (26 أغسطس/آب 2008). "يوم عالمي سعيد لـ Invokedynamic!" . مؤرشف من الأصل في 3 سبتمبر/أيلول 2008. تم الاطلاع عليه في 3 سبتمبر/أيلول 2008 .
  9. روز، جون (2008-09-02). "يوم عالمي سعيد لـ Invokedynamic!" . تم الاسترجاع في 2008-09-07 .
  10. لوريمر، آر جيه (1 سبتمبر 2008). "تشغيل الاستدعاء الديناميكي على OpenJDK" . infoq.com . تم الاطلاع عليه بتاريخ 3 سبتمبر 2008 .
  11. ناتر، تشارلز (11-09-2008). "تجربة أولية مع InvokeDynamic" . تم الاطلاع عليه بتاريخ 13-09-2008 . لقد نجحتُ في دمج InvokeDynamic مباشرةً في عملية الإرسال الخاصة بـ JRuby! يا له من حماس! الكود موجود بالفعل في النسخة الرئيسية من JRuby، وسيُرفق مع JRuby 1.1.5 (مع أنه سيتم تعطيله بالطبع على أجهزة JVM التي لا تدعم InvokeDynamic).
  12. روز، جون (22 أبريل 2009). "التقدم: indy.patch -> JDK7" . تم الاطلاع عليه بتاريخ 30 أبريل 2009. تم إدخال غالبية ملف indy.patch إلى جهاز JDK7 الظاهري في مستودع التكامل الخاص بمجموعة العمل، اليوم حوالي الساعة 4:00 صباحًا بتوقيت المحيط الهادئ الصيفي.
  13. ناتر، تشارلز (11-09-2008). "لمحة أولى عن InvokeDynamic" . تم الاسترجاع في 06-02-2008 . السر الخفي في العديد من تطبيقات JVM، بما في ذلك Hotspot، هو وجود كومة منفصلة (أو جيل منفصل من الكومة) تُستخدم لأنواع خاصة من البيانات مثل تعريفات الفئات، وبيانات تعريف الفئات، وأحيانًا رمز البايت أو التعليمات البرمجية الأصلية المُترجمة في الوقت الفعلي. ولا يمكن أن يكون لها اسم أكثر إثارة للرعب: الجيل الدائم. باستثناء حالات نادرة، لا يتم جمع الكائنات المحملة في PermGen بواسطة جامع البيانات المهملة (لأنها من المفترض أن تكون دائمة، هل فهمت؟) وإذا لم يتم استخدامها بحذر شديد، فسوف تمتلئ (...)