مرحبا يا هبر!
لفترة طويلة كان لدي فكرة لمناقشة
GraalVM معك ، تأجيله حتى تم العثور على مقال اليوم ، موضوعه بجدية يتجاوز نطاق جهاز ظاهري معين. يحدد المؤلف مايك هيرن النموذج الكامل للتفاعل متعدد اللغات والبرمجة متعددة اللغات (البرمجة متعددة اللغات). التالي هو المثال الشهير للتحجيم العمودي ومقال طويل جدا تحت الخفض.

تتناول هذه المقالة طريقة مبتكرة لكتابة البرامج التي قد تصبح شائعة في المستقبل ، ولكن ربما لا تكون الآن. المقالة لديها رمز ، بصراحة!
في العصور القديمة ، أي في عام 2015 ، كتبت
لماذا ستكون Kotlin هي لغتي البرمجية التالية ، وفي عام 2016 كتبت عن
Graal and Truffle : مشروعان
بحثيان جذريان متصلان بالمجمعين ، ليس فقط تسريع عمل لغات مثل روبي. ، ولكن أيضا تجسد في الواقع تفاعلات سلس بين اللغات. في هذه المشروعات ، يتم استبدال المترجم الديناميكي (JIT) أو OpenJDK بأخرى جديدة لديها القدرة على تحويل المترجمين الشفويين إلى مترجمين JIT متطورين ... تلقائيًا.
بالعودة إلى هذه المواضيع في عام 2019 ، أود أن أبين لك ثلاثة أشياء:
- كيفية استخدام المكتبة الصغيرة التي كتبت لاستخدام وحدات NPM بسلاسة تقريبًا من رمز البرامج المكتوبة بلغة Java أو Kotlin.
- اشرح كل الأسباب الجيدة التي قد تحتاجها ، حتى لو كنت تعتقد أن JavaScript / Java هي أسوأ شيء في العالم ، وليس حساب زيت السمك.
- استكشف بإيجاز مفهوم العمارة العمودية التي تتنافس مع تصميم الخدمات الميكروية. يقع عند تقاطع أحدث إصدارات GraalVM و OpenJDK ، ويتطلب الأجهزة الأكثر تقدما.
استخدام NPMs من Java و Kotlin
سنتخذ ثلاث خطوات بسيطة فقط:
- خذ GraalVM . هذه مجموعة من التصحيحات ، التي بنيت على أعلى OpenJDK ، والتي ظهرت في الوقت المناسب: يمكنها تنفيذ جميع شفرة بايت JVM لديك.
- نأخذ مجموعة أدوات NodeJVM الخاصة بي من جيثب ونضيفها إلى طريقنا.
- استبدل
java
في سطر الأوامر بـ nodejvm
. هذا كل شئ!
حسنا حسنا. أعترف ، أنا هنا أرسم قليلاً وأبالغ فيها ، حتى نهاية المقال ، سيكون عليك تحمل مثل هذا الأسلوب. بالطبع ، كل شيء ليس بهذه البساطة على الإطلاق: عليك أن تأخذ الوحدة النمطية واستخدامها.
النظر في ما يبدو:

نموذج التعليمات البرمجية باستخدام NodeJVM
نلقي نظرة فاحصة على هذه الصورة. نعم ، هذا ما يبدو بالضبط: Kotlin مع سلسلة مدمجة متعددة الأسطر يحدث فيها الإكمال التلقائي لـ JavaScript ، وبعد ذلك يتم إجراء تحليل جافا سكريبت الثابت ، ويتم تمييز بناء الجملة بشكل صحيح. تعمل نفس العمليات من Java أو لغات أخرى لـ JVM التي يفهمها IntelliJ. للحصول على هذه الفرص ، تحتاج إلى النقر فوق رمز التبديل في إعدادات IDE (اقرأ الملف التمهيدي لـ NodeJVM لمعرفة كيفية القيام بذلك) ، ولكن ستعمل هذه الوظيفة تلقائيًا في وقت لاحق. إذا تمكن IntelliJ من معرفة ذلك عن طريق تحليل دفق البيانات الذي يجب أن يتم تمرير السلسلة الخاصة بك في النهاية إلى طرق
run
أو
eval
، فسيتم التعامل معها على أنها JS مضمن.
سوف أتحدث هنا عن واجهة برمجة التطبيقات لـ Kotlin ، حيث إنها أجمل قليلاً وأكثر ملاءمة من واجهة برمجة التطبيقات في Java العادية ، ولكن يمكن أيضًا إجراء كل ما أصفه من Java.
في الكود أعلاه ، انتبه إلى العديد من الميزات التالية:
- للوصول إلى JavaScript ، يجب عليك استخدام كتلة
nodejs {}
. والحقيقة هي أن جافا سكريبت JavaScript ذو ترابط واحد ، وبالتالي ، لتشغيل وحدات NPM التي تحتاج إليها "أدخل دفق العقدة". كتلة nodejs {}
تنفذ مثل هذا التزامن بالنسبة لنا ، بغض النظر عن سلسلة nodejs {}
نحن فيها. لذلك ، عليك أن تتذكر باستمرار: لتشغيل أي رمز JS ، من حيث المبدأ ، عليك أن تكون داخل هذه الكتلة. يمكنك إعادة إدخالها عدة مرات كما تشاء ، لذلك سيكون من الآمن استخدام هذه الكتلة في أي مكان نحتاج إليه. سيتم تنفيذ عمليات الاستدعاء JavaScript في مؤشر ترابط Node ، وبالتالي ، سيتم رفض الوصول إلى كتلة nodejs
كافة مؤشرات الترابط الأخرى ، لذلك إذا كنت تشعر بالقلق إزاء الأداء أو تقديم واجهة المستخدم الرسومية السلس ، ثم تجنب تنفيذ عمليات طويلة الأمد في عمليات الاسترجاعات. - بناء الجملة
var x by bind(SomeObject())
متاح فقط في كتلة nodejs
ويسمح لك بالاتصال بنفس المتغير في نطاق JavaScript العام. عندما تتغير x من Kotlin ، ستتغير في JS والعكس. أنا هنا ألحق كائن Java File
عادي بعالم JS. - تقوم
eval
بإرجاع ... ما نطلبه للعودة ، ولكن بطريقة الكتابة الثابتة. هذه هي وظيفة عامة ، وببساطة عن طريق تحديد نوع الكيان الذي نخصصه لها ، سنضمن أن eval يلقي كائن JavaScript تلقائيًا إلى فئة مطبوعة بشكل ثابت أو واجهة Java / Kotlin / Scala / etc. على الرغم من أن هذا لم يتم ذكره أعلاه بشكل صريح ، إلا أن MemoryUsage
عبارة عن نوع واجهة بسيط قمت بتعريفه ولديه heapTotal()
rss()
و heapTotal()
. إنهم يعينون إلى خصائص JavaScript التي تحمل نفس الاسم ، ويطبقونها على ما تحصل عليه من Node API process.memoryUsage()
. وبالتالي يمكن تحويل معظم أنواع JS إلى أنواع Java "طبيعية" ؛ الوثائق التفصيلية لكيفية عملها متاحة على موقع GraalVM. يمكن تخزين الكائنات الناتجة في أي مكان ، ولكن يجب إجراء الطريقة التي nodejs
كتلة nodejs
. - يمكن أيضًا اعتبار كائنات جافا سكريبت JavaScript تعيينات بسيطة لسلسلة إلى كائن ، والتي تتوافق بطبيعتها بطرق عديدة. بدوره ، يمكن إعادة تعيينات مثل هذه السلسلة إلى كائن إلى شيء مكتوب أقوى ، والذي يمكن رؤيته بوضوح في رد الاتصال. استخدم العرض التقديمي الذي تفضله.
- يمكنك استخدام
require
وسوف تبحث عن وحدات في أدلة node_modules
بالطريقة المعتادة.
يستخدم مقتطف الشفرة أعلاه بروتوكول
DAT ، الذي يسمح لك بالاتصال بشبكة نظير إلى نظير تشبه BitTorrent ، ثم ابحث عن أقرانهم الذين لديهم الملف المطلوب. أستخدم DAT كمثال ، نظرًا لأنه (أ) لا مركزي وبالتالي فهو فريد بشكل فريد و (ب) للخير أو للأسوأ ، يتم كتابة مرجع التنفيذ في JavaScript. هذا ليس برنامجًا يمكنني الكتابة بالكامل دون استخدام JS في أي وقت معقول.
يمكن القيام بذلك أيضًا من Java:
import net.plan99.nodejs.NodeJS; public class Demo { public static void main(String[] args) { int result = NodeJS.runJS(() -> NodeJS.eval("return 2 + 3 + 4").asInt() ); System.out.println(result); } }
لا توفر لك واجهة برمجة تطبيقات جافا واجهة ربط متغيرة ممتعة وصوت تلقائي مثل واجهة برمجة تطبيقات Kotlin ، لكنها سهلة الاستخدام. نوضح هنا كيف نقوم بتحويل النتيجة إلى نوع صحيح Java (
int
) وإعادته "من" دفق Node: في هذه الحالة ،
لا يعد دفق Java الرئيسي هو
نفسه دفق NodeJS ، لكننا نتبادل هذه التدفقات بسلاسة تامة.
NodeJVM عبارة عن غلاف صغير جدًا جدًا أعلى
GraalVM . يضيف مقدارًا ضئيلًا من التعليمات البرمجية ، لذلك لا تقلق من أنه قد يتوقف عن دعمه أو يختفي: 99.99٪ من كل العمل الشاق في هذه الحالة يقوم به فريق GraalVM.
فيما يلي بعض الأفكار الواضحة لاقتراح التحسينات:
- السماح لوحدات JS باستيراد وحدات Java بواسطة تنسيق Maven.
- لصياغة بعض "أفضل الممارسات" من أجل javisation من وحدات NPM. على سبيل المثال ، هل يمكن أن يحتوي ملف JAR على دليل node_modules (باختصار: لا ، نظرًا لأن NodeJS ما زال ينظم الملف I / O بطريقته الخاصة ولا يعرف شيئًا عن الكود البريدية ، طويلًا: نعم ، إذا حاولت جاهدة).
- المزيد من اللغات: لا تحتاج Python و Ruby إلى "الغراء" لمزامنة الخيط المطلوب في NodeJS ، لذلك يمكنك فقط استخدام واجهة برمجة تطبيقات GraalVM Polyglot API العادية. ولكن سيجد مستخدمو Kotlin أن أساليب الصب / التمديد وواجهات برمجة التطبيقات لمتغيرات الربط ستكون لطيفة في أي لغة.
- دعم ويندوز.
- المكوّن الإضافي للعرض بحيث يمكن للبرامج أن تحتوي على قوائم تبعية في مجموعة مختلطة من اللغات
- التكامل مع أداة
native-image
، ما يسمى SubstrateVM. لذلك إذا كنت لا تحتاج إلى الأداء الكامل لبرنامج HotSpot في وقت التشغيل ، يمكنك توفير ثنائيات صغيرة مرتبطة بشكل ثابت بأسلوب Golang. - ربما نوع من المحول لتحويل TypeScript إلى Java ، بحيث يمكنك استخدام definitelyTyped وسرعان ما يغرق في العالم الثابت.
بقع هي موضع ترحيب.
لماذا تحتاج هذا؟
ربما كنت تفكر بالفعل: "Wow ، JavaScript ، لقد طورناها الآن ، في حالة حب متبادل واحترام وتناغم متبادلين!"

التفاعل المتحمس المثالي
من الممكن أن تكون أقرب إلى وجهة النظر هذه:

جافا سكريبت وجافا ليست لغات فقط. هذه ثقافات ، وليس هناك ما هو حلو للمطورين مثل الحروب الثقافية!
هذا هو السبب في أنه يتعين عليك على الأقل وضع إشارة مرجعية على هذه الصفحة للرجوع إليها مستقبلاً ، حتى إذا كنت ترغب فقط في الحصول على السلاح بمجرد التفكير في $ OTHER_LANG في غزو النظام البيئي الثمين:
- إذا كنت مطور جافا في المقام الأول ، يمكنك الآن الوصول إلى وحدات جافا سكريبت الفريدة التي قد لا يكون لها ما يعادلها في JVM (على سبيل المثال ، بروتوكول DAT). يمكنك أن تعشقها أو تكرهها ، ولكن تظل الحقيقة: كثير من الناس يكتبون وحدات NPM مفتوحة المصدر ، وبعض هذه الوحدات جيدة جدًا. يمكنك أيضًا إعادة استخدام الكود الذي يتم تشغيله على واجهات الويب لديك دون الحاجة إلى نقل اللغات. إذا كنت تعمل مع قاعدة رموز موروثة في NodeJS ، والتي ترغب في الانتقال إليها تدريجياً إلى Java ، فسيتم تبسيط هذا العمل بشكل مفاجئ.
- إذا كنت مطور جافا سكريبت في المقام الأول ، يمكنك الآن الوصول بسهولة إلى مكتبات JVM الفريدة ، والتي قد لا تحتوي في JavaScript على معادل مباشر (مثل Lucene أو Chronicle Map ) أو قد لا تقدم إلا نظائرها غير موثقة توثيقًا أو غير ناضجة أو أقل إنتاجية . إذا كنت تريد الاستغناء عن HTML في مشروعك التالي ، فيمكنك استكشاف إطار عمل واجهة المستخدم الرسومية لشخص أبيض . يمكنك أيضًا الوصول إلى العديد من اللغات الأخرى ، على سبيل المثال ، يمكن مشاركة كائنات Ruby و R. JVM بين موظفي NodeJS ، مع الاستفادة من تعدد مؤشرات الترابط في الذاكرة المشتركة ، إذا كان من الممكن استخدام هذه الفرصة وفقًا لملف التعريف الخاص بك. وإذا كنت تعمل مع قاعدة موروثة من تعليمات Java البرمجية التي ترغب في الانتقال تدريجياً إلى NodeJS ، فسيتم تبسيط هذا العمل بشكل مفاجئ إلى حد كبير.
- إذا كنت تتعلم جميع اللغات في وقت واحد ، فيمكنك القيام بلغات متعددة اللغات. مبرمجو Polyglot ليسوا كراهية ، بل على العكس ، يمكنهم تكوين صداقات مع أفضل كود متاح ، بغض النظر عن الثقافة التي تأتي منها. إنهم مثل طلاب النهضة الذين درسوا اللغة الإنجليزية والفرنسية اللاتينية على الفور ... كل هذه اللغات هي لغة واحدة لهم. وهي تمزج بين مكتبات Java و Kotlin و JavaScript و Scala و Python و Ruby و Lisp و R و Rust و Smalltalk و C / C ++ وحتى FORTRAN ، حيث تم دمج عدد صحيح بحت في أعلى GraalVM.
- أخيرًا ، إذا كنت مستخدمًا سعيدًا لـ NodeJS ، ولا تزعجك لغات أخرى على الإطلاق ، فقد لا تزال ترغب في تجربة GraalVM.
يعتمد NodeJS على V8 ، وهو جهاز افتراضي مصمم لاستخدام البرامج النصية القصيرة ذات الخيوط المفردة التي تعمل على أجهزة الكمبيوتر والهواتف الذكية. هذا هو بالضبط ما تموله Google ، لكن V8 يستخدم أيضًا على الخوادم. تم تحسين OpenJDK لعقود على الخوادم. تحتوي أحدث الإصدارات على
ZGC و
Shenandoah ، جامعي القمامة اللذان يسمحان بأقل قدر من الكمون ، وهي الأدوات التي تسمح لك باستهلاك تيرابايت من الذاكرة ، مع بضع ميلي ثانية فقط من الإيقاف المؤقت. لذلك ، قد تكون قادرًا على خفض التكاليف باستخدام
البنية التحتية وأدوات GraalVM الممتازة ، حتى دون التخلي عن اللغة
الأحادية .

عرض الكومة التي تحتوي على كائنات روبي

مقاييس وحدة المعالجة المركزية المتاحة من خلال HTTP

تشخيصات الخبراء العميقة للغاية التي توضح كيفية تحسين الكود
العمارة العمودية
نأتي إلى الموضوع الأخير الذي أود مناقشته في هذه المقالة.
أحيانًا أقول لشخص ما كل ما ذكر أعلاه ، لكنهم
يجيبونني : "
هذا شيء عظيم ، لكن ألا تقدم لنا كل هذه الخدمات المصغرة كل هذا؟ ما هي الضجة كلها بسبب؟ من الصعب أن أدرك لماذا أحب البرمجة متعددة اللغات كثيرًا ، ولكن الأمر يبدو لي أن بنية الخدمات المصغرة تحتاج إلى منافسة صحية.
أولاً ، نعم ، في بعض الأحيان تحتاج إلى قيادة العديد من الخدمات على مجموعة متنوعة من الخوادم التي تحتاج إلى التفاعل. عملت لمدة تزيد عن 7 سنوات في Google ، تعاملت يوميًا مع أوركسترا الحاويات Borg. كتبت "خدمات microservices" ، على الرغم من أننا لم نسميها ، وقد استهلكتها. خلاف ذلك ، لم تكن هناك طريقة للتكيف ، لأن أعباء العمل لدينا تتطلب مشاركة الآلاف من الآلات!
ومع ذلك ، في مثل هذه البنيات ، يتعين عليك دفع ثمن باهظ:
- التسلسل. ينتج عن ذلك على الفور انخفاض في الإنتاجية ، ولكن الأهم من ذلك ، يتطلب منك دائمًا محاذاة بنية البيانات المحسنة جزئيًا على الأقل ، وتحويلها إلى أشجار بسيطة. عند اللجوء إلى JSON ، ستفقد القدرة على القيام بأشياء بسيطة ، على سبيل المثال ، لديك العديد من الكائنات الصغيرة التي تشير إلى العديد من الكائنات الكبيرة (لتجنب التكرار ، يجب عليك استخدام فهارسك الخاصة).
- الإصدارات. هذا معقد. لا تقوم الجامعات في الغالب بتدريس هذا الانضباط الصعب ولكن اليومي من مجال هندسة البرمجيات وحتى لو كنت تعتقد أنك فهمت تمامًا الفرق بين التوافق المباشر والخلفي ، حتى لو كنت متأكدًا من أنك تفهم ماهية المتداول متعدد المراحل ، هل يمكنك أن تضمن أن كل هذا سوف يفهمه الشخص الذي سيحل محلك؟ هل تقوم بإجراء اختبار التكامل بشكل صحيح لمجموعات مختلفة من الإصدارات التي قد تتطور أثناء بدء التشغيل غير الذري؟ في البنى الموزعة ، رأيت العديد من الكوارث الحقيقية التي تتلخص في حقيقة أن النسخ ضلت.
- التماسك . من السهل جدًا تنفيذ العمليات الذرية داخل نفس الخادم. من الصعب للغاية ضمان أن يرى المستخدمون في أي موقف صورة ثابتة تمامًا عند مشاركة العديد من الأجهزة في النظام ، خاصةً في حالة حدوث تبادل للبيانات بينهم. هذا هو السبب في أن محركات قاعدة البيانات العلائقية ، تاريخياً ، لا يمكنها التباهي بالتوسع الجيد. اسمحوا لي أن أخبركم: لقد قضى أفضل مهندسي Google عقودًا في محاولة تبسيط البرمجة الموزعة لفرقهم ، محاولين بنائها بحيث تبدو أكثر شبهاً بال التقليدية.
- إعادة التنفيذ . نظرًا لأن مكالمات الإجراء عن بُعد باهظة الثمن ، فلن تجري العديد من هذه المكالمات ، ولا يتبقى شيء لحل بعض المشاكل ولكن إعادة تنفيذ الشفرة. قامت Google بإنشاء بعض المكتبات للعمل مع عدة لغات في وقت واحد ، وهي مصممة لإجراء مكالمات إلى الإجراءات عن بُعد ؛ هناك أيضًا مواقف يجب فيها إعادة كتابة هذا الرمز من البداية.
إذن ما البديل؟
ببساطة ، الكثير من الحديد. قد تبدو هذه الطريقة جدًا سخيفًا ، لكن ضع في اعتبارك أن تكلفة الأجهزة آخذة في التناقص باستمرار ، وأن العديد من أعباء العمل لا تُسمى "عالمية عالمية" ، وأن تخلفك عن ما يجب أن تنفقه قد يفشلك.
فيما يلي
قائمة أسعار جديدة نسبيًا من جهة تصنيع كندية واحدة:

تبلغ تكلفة آلة الأسلحة الأربعين التي تيرابايت من ذاكرة الوصول العشوائي وحوالي تيرابايت على القرص الصلب حوالي 6 آلاف دولار اليوم. تخيل كم من الوقت لحياة المشروع بأكملها سوف يضطر فريقك إلى حل مشاكل الأنظمة الموزعة ، وكم سيكلفك ذلك.
نعم ، ولكن ليست جميع شركات اليوم عالمية على شبكة الإنترنت؟
باختصار ، لا.
العالم مليء بالشركات التي ينطبق عليها ما يلي:
- وهي تعمل في أسواق مستقرة.
- يكسبون من خلال بيع الأشياء.
- وبالتالي ، فإن قاعدة عملائها تتراوح من عشرات الآلاف إلى عشرات الملايين من الأشخاص ، ولكن ليس بالمليارات.
- ترتبط مجموعات البيانات الخاصة بهم عادةً بعملائهم ومنتجاتهم.
وخير مثال على هذه الشركة هو البنك. البنوك لا تواجه "النمو المفرط" ، لا تصبح "الفيروسية". نموذج نموها معتدلة ويمكن التنبؤ به ، إذا كان من المفترض على الإطلاق أن لديهم نوعًا من النمو (البنوك إقليمية وتعمل عادةً في الأسواق المشبعة). تبلغ قاعدة عملاء أكبر بنك في الولايات المتحدة حوالي 50 مليون مستخدم ، وبالطبع لا تتضاعف كل ستة أشهر. في هذه الحالة ، لا يكون الموقف على الإطلاق كما هو الحال مع Instagram. لذلك ، هل من الغريب أن الجهاز المركزي لا يزال يعتمد على نظام بنكي نموذجي؟ بالطبع ، ينطبق الشيء نفسه على شركات الخدمات اللوجستية وشركات التصنيع ، إلخ. هذا هو الخبز والزبدة في اقتصادنا.
في مثل هذه الأعمال ، من الممكن تمامًا تلبية احتياجات كل تطبيق محدد مرتبط بها بموارد جهاز واحد كبير فقط. نعم هناك ، حتى بعض المواقع العامة اليوم تناسب جهاز واحد. في عام 2015 ، ألقى Maciej Tseglovsky محاضرة مثيرة للاهتمام حول "
الأزمة مع مواقع السمنة " وأشار إلى أن موقعه الخاص مع خدمة إشارة مرجعية كان مربحًا ، ولكن منافسه نشر نفس الموقع على AWS - وخسر ، فقط بسبب التكاليف المختلفة المعدات والافتراضات المختلفة حول التعقيد. في دراسة حول مقارنة
القياس الرأسي والأفقي ، تبين أن PlentyOfFish يعمل على حوالي خادم واحد تقريبًا (تاريخ المقالة من 2009 ، بحيث يمكنك تجاهل أسعار المعدات المدرجة هناك). يقوم المؤلف ببعض العمليات الحسابية ويظهر أن خادم واحد ليس غبيًا كما قد يبدو. أخيرًا ، إذا كنت تفكر في Hadoop و Big Data ، اقرأ
مقالة Microsoft البحثية لعام 2013 ، والتي توضح أن العديد من أعباء عمل Hadoop من Microsoft و Yahoo و Facebook تعمل فعليًا بشكل أسرع وأكثر كفاءة على جهاز واحد كبير ، بدلاً من مجموعة. وهكذا كان قبل 6 سنوات! من المحتمل أنه منذ ذلك الحين أصبح التركيز لصالح القياس الرأسي أكثر وضوحًا.
ومع ذلك ، فإن الوفورات الحقيقية ليست مرتبطة بالمعدات على الإطلاق ، ولكن مع تحسين وقت العمل الباهظ التكلفة للمهندسين ، الذي يتم إنفاقه على إنشاء مجموعة من الخدمات المصغرة التي يجب زيادتها أفقياً مع إدارة مرنة للطلب. تعتبر هذه الطريقة في الهندسة محفوفة بالمخاطر وتستغرق وقتًا طويلاً ، حتى لو كنت تستخدم أحدث الألعاب المتوفرة في السحابة. يمكنك أن تفقد SQL ، ومعاملات SOLID ، والتوصيف الموحد ، وستفقد بالتأكيد معلومات مثل تتبع مكدس النظام المشترك. ستختفي أمان الكتابة في كل مرة تتجاوز فيها الخادم. ستتلقى مكالمات إلى الوظائف التي قد تنقضي مهلها ، الحمل الزائد المرتبط بالتجميع الديناميكي ، فشل الضغط غير المتوقع للظهر ، محركات التنسيق المعقدة بتنسيقات التكوين الهائلة ، ... أوه ، الذكريات التي غمرتها المياه حقًا. كان من المثير للاهتمام العمل مع كل هذا عندما كان لدي بنية Google الخاصة وميزانية هندسية كثيفة تحت تصرفي ، لكن اليوم سأغامر بتكرار هذا فقط إذا لم يكن لدي خيار آخر.
وفقًا للتجربة ، من المستحيل العمل مع خوادم كبيرة جدًا تعمل على جمع القمامة - الشيء هو أن جمع القمامة في حد ذاته كان تكنولوجيا متطورة جدًا ، وبالتالي ظل هذا الموضوع أكاديميًا بحتًا. في أي حال ، كان عليك أن تقود عدة خوادم في وقت واحد. , ZGC Shenandoah, , 80 – . , -, – , .
, ? – , ? – : , , … .
استنتاج
NodeJVM – , GraalVM. NPM Java/Kotlin, JS , Kotlin JavaScript, JS , V8.
, JS Java, Java JS .
, 4 , – – , . .