# جراعل في إم

جراعل في إم (بالإنجليزية: GraalVM)‏ عبارة عن عدة تطوير Java (JDK) مكتوبة بلغة Java. يستند توزيع GraalVM مفتوح المصدر ل GraalVM على OpenJDK ، ويعتمد التوزيع المؤسسي على Oracle JDK. بالإضافة إلى ترجمة في الوقت المناسب (JIT) ، يمكن لـ GraalVM ترجمة تطبيق Java مسبقًا. يسمح هذا بتهيئة أسرع، وأداء أكبر في وقت التشغيل، وتقليل استهلاك الموارد، ولكن الملف القابل للتنفيذ الناتج لا يمكن تشغيله إلا على النظام الأساسي الذي تم ترجمته من أجله. ويوفر لغات برمجة إضافية وأوضاع التنفيذ. تم توزيع الإصدار الأول الجاهز للإنتاج، GraalVM 19.0، في مايو 2019. أحدث إصدار هو GraalVM لـ JDK 21، والذي أصبح متاحًا في سبتمبر 2023.
تشمل الفروق الرئيسية بين GraalVM وJDK الأساسي ما يلي:
* مترجم Graal ، مترجم في الوقت المناسب (JIT) .
* GraalVM Native Image هي تقنية لترجمة تطبيقات Java مسبقًا.
* إطار تنفيذ لغة Truffle و GraalVM SDK، وهو إطار عمل يستند إلى Java ومجموعة من واجهات برمجة التطبيقات لتطوير أوقات تشغيل لغة عالية الأداء.
* GraalVM Polyglot API ، واجهة برمجة تطبيقات لتضمين كود لغة الضيف في تطبيق مضيف يستند إلى Java.
* JavaScript Runtime، وقت تشغيل JavaScript متوافق مع ECMAScript 2023، بالإضافة إلى Node.js.
* LLVM Runtime هو وقت تشغيل لتنفيذ اللغات التي يمكن تحويلها إلى كود بت LLVM.

## الأهداف

* لتحسين أداء اللغات المستندة إلى آلة جافا الافتراضية (JVM) لتتناسب مع اللغات الأصلية.
* لتقليل وقت بدء تشغيل التطبيقات المستندة إلى JVM عن طريق ترجمتها مسبقًا.
* لتمكين تكامل GraalVM في قاعدة بيانات Oracle وOpenJDK وAndroid/iOS والتضمينات المخصصة المماثلة.
* لتمكين تضمين رمز لغة الضيف في تطبيق مضيف يستند إلى JVM .
* لتمكين المزج بين التعليمات البرمجية من أي لغة برمجة في تطبيق واحد، ويطلق عليه "تطبيق متعدد اللغات".

## تاريخ

تعود جذور GraalVM إلى مشروع Maxine Virtual Machine في مختبرات Sun Microsystems (المعروفة الآن باسم Oracle Labs ). كان الهدف من المشروع هو كتابة آلة جافا الافتراضية بلغة جافا نفسها لتجنب مشاكل التطوير بلغة ++C، وخاصة تنظيم الذاكرة اليدوي، والاستفادة من التحسينات الفوقية الدائرية . قام المشروع بتغيير تركيزه إلى المترجم وربطه بوقت تشغيل HotSpot قدر الإمكان. تم بدء تشغيل مترجم GraalVM، Graal، عن طريق التحويل اليدوي للتعليمات البرمجية الخاصة بمترجم عميل HotSpot (المسمى "C1") إلى Java، ليحل محل المترجم Maxine السابق.
تم تضمين Graal في إصدارات JDK المستندة إلى HotSpot مثل OpenJDK من Java SE 9 إلى 15، لتوفير ترجمة تجريبي مسبقًا. الUseJVMCICompilerكما مكّن خيار أيضًا استخدام Graal كبديل لمترجم الخادم (المسمى "C2"). تمت إزالة الخيار في Java SE 16 للتخلص من الجهد المكرر للحفاظ على إصدار في JDK وإصدار GraalVM المستقل. يتم توفير وظيفة مماثلة لإنشاء ملف قابل للتنفيذ أصلي من تطبيق Java بواسطة أداة الصورة الأصلية لإصدارات GraalVM المستقلة. تقوم الأداة بمعالجة فئات تطبيق Java وبيانات التعريف الأخرى لإنشاء نسخة ثنائية لنظام تشغيل وبنية محددة. ويمكن استخدامها لإنشاء ملف قابل للتنفيذ أصلي أو مكتبة مشتركة أصلية.

## الإصدارات

يتوفر GraalVM كـ Oracle GraalVM بموجب ترخيص الشروط والأحكام المجانية لـ GraalVM (GFTC)، حيث يمكن الوصول إلى Oracle GraalVM Enterprise Edition من خلال قبول "اتفاقية ترخيص OTN Oracle GraalVM Enterprise Edition بما في ذلك ترخيص الإصدارات الأولى من Oracle GraalVM" أو كإصدار مجتمعي مع ترخيص مفتوح المصدر. أعلنت شركة Oracle Corporation عن إطلاق Oracle GraalVM Enterprise Edition في 8 مايو 2019، و Oracle GraalVM في 13 يونيو 2023، حيث تقدم ترخيصًا جديدًا لشروط وأحكام GraalVM المجانية (GFTC). يمكن أن يحل GraalVM محل JDK الافتراضي على منصات Linux و macOS على وحدات المعالجة المركزية x64 و AArch64، وعلى منصة Windows x64. جدول الإصدار موجود في مركز مساعدة Oracle وموقع GraalVM على الويب.

## المكونات

يتم شحن المبرمج GraalVM، Graal، مع مكونات آلة جافا الافتراضية العادية ( OpenJDK ). يتم تضمين مكونات إضافية في GraalVM لتمكين أوضاع التنفيذ الجديدة ( GraalVM Native Image ) أو لغات البرمجة ( LLVM runtime ، GraalVM JavaScript كبديل محتمل لمحرك Nashorn المهمل، و TRegex كمحرك تعبير عادي ).

### مترجم GraalVM

مترجم GraalVM، Graal، هو مترجم Java (JIT) حديث. يكمل أو يستبدل المترجمين الموجودين (C1/C2 في HotSpot ). على النقيض من تلك المترجمات الموجودة، تمت كتابة Graal بطريقة معيارية وقابلة للصيانة وقابلة للتوسيع في Java نفسها. تم إصداره بموجب الإصدار 2 من GPL مع استثناء classpath .

### الصورة الأصلية GraalVM

GraalVM Native Image هي تقنية ترجمة متقدمة تنتج ثنائيات قابلة للتنفيذ لملفات الفئة. تم إصدارها كتقنية متبناة في وقت مبكر، مما يعني أنها جاهزة للإنتاج ولكنها قد تتضمن تحديثات غير متوافقة مع الإصدارات المستقبلية.
تدعم هذه الوظيفة اللغات المستندة إلى JVM، ولكن يمكنها اختياريًا تشغيل لغات ديناميكية تم تطويرها على GraalVM مع إطار عمل Truffle. لا يتم تشغيل الملف القابل للتنفيذ على JVM ويستخدم مكونات وقت التشغيل الضرورية مثل جدولة مؤشرات الترابط أو GC من جهاز افتراضي صغير مخصص يسمى Substrate VM. نظرًا لأن الملف الثنائي الأصلي الناتج يتضمن فئات التطبيق وتبعيات JDK والمكتبات بالفعل، فإن وقت بدء التشغيل والتنفيذ يقل بشكل كبير.
يتم دعم GraalVM Native Image رسميًا من قبل Fn وGluon وHelidon و Micronaut وPicocli و Quarkus و Vert.x و Spring Boot Java.
في سبتمبر 2016، وضعت أوراكل خططًا تفصيلية لإضافة الترجمة في وقت مبكر إلى OpenJDK باستخدام مترجم GraalVM لـ Java SE 9 . هذا الاقتراح، الذي تم تتبعه بواسطة JEP 295: الترجمة المسبقة ، تم تضمينه في Java SE 9. تمت إضافة الاستخدام التجريبي لـ GraalVM كمترجم فوري لمنصة Linux x64 لـ Java SE 10 .
في إصدارات Java SE من 9 إلى 15، يقوم الأمر jaotc بإنشاء ملف قابل للتنفيذ. تتيح علامة -XX:+EnableJVMCIProduct التجريبية استخدام برنامج التحويل البرمجي Graal JIT. تتوفر هذه الوظيفة منذ في مكون الصورة الأصلية لإصدارات GraalVM المستقلة.

### إطار تنفيذ لغة Truffle

بالاشتراك مع GraalVM، طوّرت مختبرات أوراكل مترجمًا لغويًا لشجرة نحو مجرد (AST) يسمى "Truffle" والذي سيمكنها من تنفيذ اللغات على GraalVM تم تطبيق العديد من اللغات في Truffle، بما في ذلك مترجم لغة C الذي يدعي أنه بنفس سرعة لغةGC و Clang .
تم إصدار إطار عمل Truffle والجزء التابع له، GraalVM SDK، بموجب الرخصة العالمية المتساهلة، الإصدار 1.0، لتشجيع استخدام إطار العمل للمشاريع التي لا تريد أن تكون ملزمة بحقوق النشر أو الحقوق الأم الأخرى.

### دعم الأدوات القائمة على الأجهزة

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

## تضمين اللغات

ميزة أخرى لـ GraalVM هي إمكانية تضمين التعليمات البرمجية من لغة الضيف في Java وكتابة تطبيقات "متعددة اللغات". يمكن للمطور أن يدمج JavaScript أو Python أو غيرها من اللغات المدعومة داخل التعليمات البرمجية المصدرية لـ Java، مما يمنحه المزايا المميزة لتلك اللغات. يقوم تطبيق Java المضيف ولغة الضيف بتمرير البيانات ذهابًا وإيابًا في نفس مساحة الذاكرة. هذا ممكن بفضل إطار تنفيذ لغة Truffle Language Framework وواجهة برمجة تطبيقات GraalVM Polyglot. فيما يلي مثال لكيفية استدعاء دالة محددة في بايثون من جافا:
تزيد دالة بايثون من وحدة القيمة المقدمة ثم تعيدها إلى اللغة المضيفة. من لغة جافا، ولأغراض أمنية، نسأل أولًا ما إذا كان يمكن تنفيذ الدالة المتغيرة عبر استدعاء canExecute ، ثم نستدعي الدالة باستدعاء execute( ). . يمكنك العثور على المزيد من الأمثلة في الوثائق المرجعية الخاصة بتضمين اللغات .

## دعم اللغة ووقت التشغيل

تمت كتابة GraalVM في نظام Java البيئي ومن أجله. يمكنه تشغيل التطبيقات المكتوبة بجميع اللغات التي تتوافق مع Java bytecode ، على سبيل المثال، Java و Scala وKotlin والمزيد. استنادًا إلى إطار تنفيذ لغة Truffle، تم تصميم اللغات الإضافية للاستخدام مع GraalVM:
* GraalJS: وقت تشغيل JavaScript متوافق مع ECMAScript 2023، مع دعم Node.js
* GraalPy: تطبيق لغة بايثون 3
* GraalVM LLVM Runtime ( Sulong ): تنفيذ مترجم رمز البت LLVM
* GraalWasm: تطبيق WebAssembly
* TruffleRuby: تطبيق لغة روبي مع دعم أولي لـ Ruby on Rails
* FastR: تطبيق لغة R
يمكن تنفيذ دعم لغات إضافية من قبل مستخدمي GraalVM. بعض تطبيقات لغات الطرف الثالث البارزة هي grCuda، SOMns، TruffleSqueak، وYona.

## تبني

يُستخدم GraalVM في سيناريوهات صناعية مختلفة:
* Disney : تستخدم تقنية Native Image لتقليل وقت البدء البارد لبعض خدمات AWS الصغيرة .
* Facebook : يستخدم GraalVM لتسريع أعباء عمل Apache Spark مما يقلل من بصمة الذاكرة واستخدام وحدة المعالجة المركزية.
* تويتر : تسريع بعض الخدمات المصغرة للمنصة.
* جولدمان ساكس : أعاد البنك الاستثماري الدولي كتابة لغة البرمجة الداخلية الخاصة به Slang عبر إطار عمل Truffle.