ما هي بعض الاختلافات الأساسية/المعمارية بين الحزمة و JVM؟

StackOverflow https://stackoverflow.com/questions/2276370

سؤال

ما هي بعض الفرق الأساسي/المعماري بين الحزمة و JVM؟

  1. نعم أعرف: تم بناء أحدهم في الأصل حول جافا والآخر مبني حول إرلانج
  2. أنا أفهم JVM (إلى حد ما) وأريد مقارنة هياكلها
  3. على سبيل المثال ، أعلم أن JVM لديه GC عالمي واحد وأن Beam لديه واحد لكل عملية
هل كانت مفيدة؟

المحلول

بادئ ذي بدء ، Beam هو جهاز تسجيل ، وليس آلة مكدس. مثل WAM for Prolog ، فإنه يستخدم "مسجون X" وهي سجلات طبيعية (يتم تنفيذها كصفيف في C) ، و "y-registers" وهي أسماء للفتحات في سجل تنشيط الوظائف المحلية ("إطار المكالمة") على المكدس. لا توجد تعليمات معالجة المكدس.

ثانياً ، هناك تعليمات لتخصيص بعض الكلمات الإضافية من ذاكرة الكومة ، لتهيئة tuples وهياكل البيانات الأخرى على الكومة ، لاختيار عناصر من tuples ، إلخ. تفاصيل تخصيص الذاكرة والتهيئة الأساسية.

لدى الحزمة تعليمات لتقليل "عداد التخفيض" للعملية وتحديد ما إذا كان الوقت قد حان للإنتاج للسماح لعملية أخرى. JVM من ناحية أخرى لديه تعليمات التزامن للمواضيع.

أحد الاختلافات المهمة هو أن شعاع لديه تعليمات استدعاء الذيل ، والتي تفتقر إليها JVM.

أخيرًا ، بالنسبة لكل من Beam و JVM ، فإن مجموعة التعليمات المستخدمة في ملفات الكائنات ليست سوى تنسيق نقل. يقوم محاكي Beam بإعادة كتابة التعليمات من الملف إلى إصدار داخلي مع العديد من إرشادات الحالة الخاصة المحسّنة (التي يمكن أن تتغير من إصدار إلى آخر). بدلاً من ذلك ، يمكنك تجميع الكود الأصلي. معظم JVMs تفعل نفس الشيء.

نصائح أخرى

بعض النقاط الأخرى المثيرة للاهتمام هي:

  1. العمليات هي مواطنين شعاع ويتم إدارته من قبل VM نفسه بينما JVM ينفصل إدارتها إلى نظام التشغيل. يتيح هذا للحزمة إدارة (إنشاء وحذف ومفتاح السياق ، ...) بسرعة كبيرة ، وبالتالي ، أن تكون قادرة على إدارة مئات الآلاف من العمليات مقابل بضع مئات من خيوط Java على جهاز معقول.

  2. على شعاع ، تعتمد الاتصالات بين العمليات على تبادل الرسائل الذي يلغي معظم الحالات إن لم يكن جميعها قد تؤدي إلى حالة سباق. على Java ، تحتاج إلى مزامنة الخيوط التي تكون صعبة وعرضة للخشب.

  3. إحدى النقاط المهمة هي أن جمع القمامة يتم على أساس كل عملية في الحزمة بينما تكون عملية عالمية في JVM. التأثير هو أن GC على JVM قد تجمد VM بأكمله لبعض الثواني بينما على شعاع كل عملية يجب أن تعطي بعض عمليات تنفيذها (تخفيضات) إلى GC دون تأثير على العمليات الأخرى.

في الآونة الأخيرة ، مثل بعض المكتبات الجديدة vertx (لا أعرف حقًا عكا لكنني أعتقد أن هذا هو الحال) بالنسبة إلى لغات JVM بدأت في تنفيذ سلوكيات عملية مماثلة لمحاولة حل المشكلات 1. و 2. أعتقد أنه لا يمكن حل مشكلة GC بمكتبة مع مكتبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top