Harsh Siberian JVM: مقابلة رائعة حول Excelsior JET

لقد كتبنا مؤخرًا عن الحيل التي ذهب إليها Alibaba لجعل الحياة مع OpenJDK أكثر قبولًا. كانت هناك تعليقات مثل "اتضح أنه بينما نعاني من جافا العاديين ، فإن الصينيين قد صنعوا بالفعل خاصة بهم". بابا ، بالطبع ، مثير للإعجاب - لكن لدى روسيا أيضًا مشاريعها الأساسية الخاصة ، حيث يصنعون أيضًا "جافا خاص".


في نوفوسيبيرسك ، منذ 18 عامًا ، كانوا يصنعون JVM الخاص بهم ، وقد تم كتابتهم بشكل مستقل تمامًا ويتطلبون أبعد من حدود روسيا. ليس مجرد نوع من شوكة HotSpot يفعل نفس الشيء ، ولكن أفضل قليلاً. تعد Excelsior JET مجموعة من الحلول التي تتيح لك القيام بأشياء مختلفة تمامًا من حيث تجميع AOT. "Pff ، AOT في GraalVM ،" يمكنك القول. لكن GraalVM لا يزال أمرًا استكشافيًا للغاية ، و JET هو حل مثبت للاستخدام في الإنتاج.


هذه مقابلة مع أحد مطوري Excelsior JET. آمل أن يكون الأمر ممتعًا بشكل خاص لكل من يريد اكتشاف أشياء جديدة يمكن إجراؤها باستخدام Java. أو الأشخاص الذين يرغبون في حياة المهندسين JVM وأنفسهم يريدون المشاركة في هذا.



في الخريف ، سافرت إلى أحد مؤتمرات Novosibirsk Java ، جلسنا مع إيفان أوغليانسكي dbg_nsk و Nikita Lipsky pjBooms (أحد مطوري JET) وسجلنا هذه المقابلة. يشارك Ivan في وقت تشغيل JET: GC ، تحميل الصف ، دعم تعدد العمليات ، التوصيف ، البرنامج المساعد لـ GDB. شارك Nikita ، أحد المبادرين في مشروع JET ، في البحث والتطوير لجميع مكونات المنتج تقريبًا من kernel إلى خصائص المنتج - OSGi على مستوى JVM ، Java Runtime Slim Down (وحدات Java في JET كانت بالفعل في 2007) ، اثنان من وحدات التحقق من الرمز الفرعي ، دعم التمهيد الربيع وهلم جرا.




أوليغ تشيروخين: هل يمكنك أن تخبر الأشخاص الجاهلين بمنتجك؟


نيكيتا ليبسكي: من المدهش ، بالطبع ، أننا كنا في السوق منذ 18 عامًا ، ونحن لا نعرف الكثير. نحن نفعل JVM غير عادية. غير معتاد في المراهنة على تجميع AOT ، أي نحاول تجميع جافا بايت كود في رمز الجهاز مقدما.


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


بالإضافة إلى الأداء ، يتمثل أحد الآثار الجانبية لتجميع شفرة الكود الثابتة في حماية تطبيقات Java من فك التشفير. لأنه بعد التحويل البرمجي لم يعد هناك رمز ثانوي متبقي ، يبقى رمز الجهاز فقط. من الصعب للغاية فك الشفرة في شفرة المصدر من شفرة جافا الثانوية. في الواقع ، مستحيل. أي أنه يمكن تفكيكها ، لكنك لن تلد أكواد المصدر. ولكن يمكن إنشاء شفرة مصدر Java من الرمز الثانوي حتى أسماء المتغيرات بسهولة ، وهناك العديد من الأدوات لذلك.


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


إيفان أوغليانسكي: عمومًا ، لا تحتاج إلى طلب تثبيت Java.


أوليغ: لا يزال هناك اعتماد على نظام التشغيل ، أليس كذلك؟


نيكيتا: صحيح. ينتقد الكثيرون أنه إذا قمت بالترجمة إلى رمز أصلي ، فإن شعارك "الكتابة مرة واحدة - ركض في أي مكان" يتوقف عن العمل. لكن هذا ليس كذلك. أخبرني دوريًا بذلك في تقاريري أن "الكتابة مرة واحدة" تبدو مثل "الكتابة مرة واحدة" وليس "الإنشاء مرة واحدة". أي أنه يمكنك إنشاء تطبيق Java الخاص بك على كل نظام أساسي ، وسيعمل في كل مكان.


أوليغ: توجيه في كل مكان ، في كل مكان؟


نيكيتا: أينما دعمت. لدينا حل متوافق مع جافا. إذا كتبت بلغة Java ، فستعمل حيث تعمل Java. وإذا كنت تستخدم المترجمة من قبلنا ، فأين ندعمها - Windows و Linux و Mac و x86 و amd64 و ARM32. ولكن حيثما لا ندعمها ، لا يزال بإمكانك استخدام Java العادي للتطبيقات الخاصة بك ، أي أن قابلية تطبيقات تطبيقات Java الخاصة بك بهذا المعنى لا تعاني.


أوليغ: هل هناك مثل هذه التصاميم التي يتم تنفيذها بشكل مختلف على منصات مختلفة؟ أجزاء من النظام الأساسي غير مطبقة بالكامل ، بعض المكتبات القياسية.


إيفان: إنه يحدث ، لكنه ليس خاصًا بـ JET. يمكنك ، على سبيل المثال ، النظر إلى تطبيق AsynchronousFileChannel في JDK نفسه ، فهو مختلف تمامًا على أنظمة تشغيل Windows و Posix المختلفة ، وهو أمر منطقي. يتم تنفيذ بعض الأشياء فقط على بعض الأنظمة الأساسية ، ودعم SCTP (انظر sun.nio.ch.sctp.SctpChannelImpl على Windows) و SDP (انظر sun.net.sdp.SdpSupport). لا يوجد أي تناقض معين في هذا ، ولكن اتضح حقًا أن "الكتابة مرة واحدة ، ركض في أي مكان" ليس صحيحًا تمامًا.


التحدث على وجه التحديد حول تنفيذ JVM ، ثم على نظام تشغيل مختلف ، بالطبع ، يمكن أن يكون الفرق كبيرًا. ما حقيقة أنه في نظام التشغيل X في الخيط الرئيسي تحتاج إلى تشغيل حلقة أحداث Cocoa ، وبالتالي فإن الإطلاق هناك يختلف عن الباقي.


نيكيتا: ومع ذلك ، من الخارج ، بالنسبة للمستخدم ، كل شيء يبدو ويعمل بنفس الطريقة تقريبًا.


أوليغ: ماذا عن الأداء؟ هل هو نفسه على جميع المنصات؟


نيكيتا: هناك فرق. على سبيل المثال ، يعمل نظام ملفات Linux بشكل أفضل وأسرع من نظام ملفات Windows.


أوليغ: والانتقال بين المعالجات؟


نيكيتا: هذا نشاط ممتع! الفريق بأكمله يبدأ فجأة في الميناء. الترفيه عادة ما يكون لمدة ستة أشهر إلى سنة.


أوليغ: يحدث أن تبدأ بعض التعليمات البرمجية على منصة أخرى في التباطؤ أكثر؟


إيفان: قد يكون هذا بسبب حقيقة أننا ببساطة لم يكن لدينا وقت لصنع أو تكييف نوع من التحسين. عملت بشكل جيد على x86 ، ثم انتقلنا إلى AMD64 ، وفقط لم نتمكن من تكييفه. بسبب هذا ، يمكن أن يكون أبطأ.


مثال أداء آخر. يحتوي ARM على نموذج ذاكرة ضعيف ، تحتاج إلى وضع الكثير من الحواجز حتى يعمل كل شيء بشكل صحيح. كان لدينا AMD64 ، عملت بعض الأماكن ، والتفكير ، حرة ثم ، لأن هناك نموذج الذاكرة مختلفة. في ARM ، تحتاج إلى وضع المزيد من الحواجز ، ولكن هذا ليس مجانيًا.


أوليغ: دعونا نتحدث عن الموضوع الساخن الآن - "Java على الأجهزة المدمجة".
دعنا نقول أنا صنع طائرة تطير مع التحكم في Raspberry Pi. ما هي بعض المشاكل النموذجية التي يواجهها الشخص عندما يفعل هذا؟ وكيف يمكن لـ JET وعمومًا تجميع AOT المساعدة في هذه المسألة؟


نيكيتا: الطائرة على Raspberry Pi ، بالطبع ، موضوع مثير للاهتمام. لقد صنعنا ARM32 ، والآن JET على Raspberry Pi. لدينا عدد غير محدود من العملاء للوظائف المضمنة ، ولكن لا يوجد الكثير منهم للحديث عن مشاكلهم "المعتادة". على الرغم من أنهم يواجهون بعض المشكلات في Java ، إلا أنه ليس من الصعب تخمينها.


إيفان: ما هي مشاكل Java على Raspberry Pi؟ هناك مشكلة في استهلاك الذاكرة. إذا كنت في حاجة ماسة إليها ، فإن التطبيق وجهاز JVM يواجهان صعوبة في العيش على Raspberry Pi المسكين. بالإضافة إلى ذلك ، من المهم أن يكون لديك بداية سريعة على الأجهزة المدمجة حتى لا يتسارع التطبيق هناك لفترة طويلة. AOT يحل هاتين المشكلتين جيدًا ، لذلك نحن نعمل على تحسين الدعم المضمن. على وجه التحديد ، بخصوص Raspberry Pi ، تجدر الإشارة إلى Bellsoft ، التي تشارك الآن بنشاط في هذا مع HotSpot. جافا العادي موجود بالكامل هناك.


نيكيتا: بالإضافة إلى ذلك ، هناك القليل من الموارد على الأنظمة المدمجة ؛ وليس لدى مترجم JIT مكان للنشر. وفقا لذلك ، AOT تجميع في حد ذاته يسرع الأداء.


مرة أخرى ، لا يتم توصيل الأجهزة المدمجة بالشبكة ، على البطارية. لماذا توجد بطارية لبرنامج التحويل البرمجي JIT إذا كان يمكنك تجميع كل شيء مقدمًا؟


أوليغ: ما هي الميزات التي لديك؟ أنا أفهم أن JET هو نظام معقد كبير للغاية مع مجموعة من كل شيء. لديك تجميع AOT ، أي أنه يمكنك ترجمة ملف قابل للتنفيذ. ماذا بعد؟ ما هي بعض المكونات المثيرة للاهتمام التي تستحق الحديث عنها؟


إيفان: لدينا عدد من الميزات المتعلقة بالأداء.


لقد تحدثت مؤخرًا عن PGO ، وهي ميزة جديدة نسبيًا. لدينا ملف تعريف مضمن مباشرةً في JVM ، فضلاً عن مجموعة من التحسينات استنادًا إلى الملف الشخصي الذي يجمعه. بعد إعادة الترجمة استنادًا إلى الملف الشخصي ، نحصل غالبًا على زيادة خطيرة في الأداء. الحقيقة هي أن معلومات الأداء تضاف إلى تحليلاتنا الثابتة القوية والتحسينات. إنها طريقة هجينة قليلاً للاستفادة بشكل أفضل من تجميع JIT و AOT.


لدينا اثنين من الميزات الرائعة لتسريع إطلاق أسرع. الأول هو عندما تنظر إلى الترتيب الذي يتم به اختراق صفحات الذاكرة في البداية ، يمكنك ببساطة مراقبتها وربط الملف القابل للتنفيذ وفقًا لذلك.


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


إيفان: هذه هي ميزات البقالة الفردية.


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


بالإضافة إلى الميزات المتعلقة بالأداء ، هناك عدد من ميزات المنتج التي تجعل JET أكثر سهولة في الاستخدام.


على سبيل المثال ، يمكننا حزم توزيعات Windows على سبيل المثال. مرة واحدة - وحصلت على المثبت ويندوز. يمكنك توزيع تطبيقات Java كتطبيقات أصلية حقيقية. هناك الكثير. على سبيل المثال ، هناك مشكلة قياسية في برامج التحويل البرمجي AOT و Java عندما يستخدم أحد التطبيقات برامج تحميل الفئة الخاصة به. إذا كان لديك محمل صف خاص بك ، فليس من الواضح ما هي الفئات التي سنجمعها AOT؟ لأن هناك منطق القرار بين الطبقات يمكن أن يكون أي شيء. وفقًا لذلك ، لا يعمل مترجم Java AOT واحد ، باستثناء برنامجنا ، مع لوادر فئة غير قياسية. لدينا دعم خاص في AOT لبعض فئات التطبيقات ، حيث نعرف كيفية عمل اللوادر المخصصة ، وكيف يتم حل الروابط بين الفئات. على سبيل المثال ، لدينا دعم لـ Eclipse RCP وهناك عملاء يقومون بكتابة تطبيقات سطح المكتب على Eclipse RCP ويقومون بالتجميع معنا. هناك دعم ل Tomcat ، وتستخدم أيضا لوادر مخصصة هناك. يمكنك تجميع تطبيقات Tomcat معنا. كما أصدرنا مؤخرًا إصدار Spring Boot JET خارج الصندوق.


أوليغ: أي خادم هناك "أدناه"؟


نيكيتا: كل ما تريد. الذي يدعم Spring Boot سيعمل مع هذا. Tomcat ، Undertow ، جيتي ، Webflux.


إيفان: هنا ، من الضروري الإشارة إلى أنه بالنسبة إلى Jetty ، لا يوجد لدينا دعم من برامج تحميل الفئة المخصصة.


نيكيتا: جيتي ، كخادم ويب مستقل ، يحتوي على أداة تحميل مخصصة. ولكن هناك شيء مثل Jetty Embedded ، والذي يمكن أن يعمل بدون برامج تحميل مخصصة. يعمل Jetty Embedded بهدوء على Excelsior JET. داخل Spring Boot ، ستعمل Jetty في الإصدار التالي ، مثل أي خوادم أخرى يدعمها Spring Boot.



أوليغ: في الواقع ، واجهة المستخدم مع JET هي javac و Java ، أو أي شيء آخر؟


إيفان: رقم للمستخدم ، لدينا العديد من الخيارات لاستخدام JET. أولاً ، هذا هو واجهة المستخدم الرسومية التي يخترق فيها المستخدم جميع الميزات ، وبعد ذلك يضغط على زر ويجمع تطبيقه. عندما يريد إجراء بعض المثبتات حتى يتمكن المستخدم من تثبيت التطبيق ، يقوم مرة أخرى بالضغط على الأزرار. ولكن هذا النهج قديم بعض الشيء (تم تطوير واجهة المستخدم الرسومية في عام 2003) ، لذلك لدينا الآن Nikita تطوير وتطوير مكونات إضافية لـ Maven و Gradle ، والتي هي أكثر ملاءمة ومألوفة للمستخدمين الحديثين.


نيكيتا: استبدل سبعة خطوط في pom.xml أو build.gradle ، قل mvn mvn jet:build ، ولديك نقانق على الخرج.


أوليغ: والآن الجميع يحب دوكر وكوبرنيتيس كثيراً ، هل يمكنك البناء من أجلهم؟


نيكيتا: عامل الميناء هو الموضوع التالي. لدينا مثل هذه المعلمة - التعبئة في الإضافات Maven / Gradle. يمكنني إضافة تطبيقات التعبئة والتغليف ل Docker.


إيفان: هذا لا يزال العمل جاريا. لكن بشكل عام ، جربنا التطبيقات المترجمة من JET لتشغيلها على Docker.


نيكيتا: إنه يعمل. بدون جافا. عاريا لينكس ، عصا التطبيق المترجمة JET هناك ، ويبدأ.


أوليغ: ومع عبوة عامل الميناء ، ماذا سيكون الناتج؟ لدفع حاوية أو ملف تنفيذي بيديك في ملف Docker؟


نيكيتا: الآن تكتب فقط ملف Docker الخاص بـ JET - هذه ثلاثة أسطر. علاوة على ذلك ، كل شيء يعمل من خلال أدوات دوكر العادية.


ألعب مع خدمات microservices الآن. أنا جمعها مع JET ، تشغيلها ، يكتشفون بعضهم البعض ، والتواصل. لم يكن على JVM أن تفعل أي شيء من أجل هذا.


أوليغ: الآن أطلقت جميع أنواع مزودي الخدمات السحابية أشياء مثل Amazon Lambda ، وظائف Google Cloud ، هل يمكنني استخدامها هناك؟


نيكيتا: أعتقد أننا بحاجة إلى الذهاب إلى مقدمي كل هذه الأمور ونقول إنك إذا استخدمتنا ، ستعمل كل ما تبذلونه من الخراف بشكل أسرع. ولكن هذا لا يزال مجرد فكرة.


أوليغ: لذلك سوف يعملون بشكل أسرع!


نيكيتا: نعم ، على الأرجح ، يجب القيام بالمزيد من العمل في هذا الاتجاه.


أوليغ: أرى مشكلة في وقت تجميع lambda. ما هو وقت تجميعك؟


إيفان: إنه موجود ، وهذه مشكلة لا يفكر فيها مستخدمو JVMs العاديون مع JITs. عادةً ، بعد كل شيء ، كيف - قمت بتشغيل التطبيق ، وهو يعمل (وإن كان ببطء في البداية بسبب التجميع). وهنا تأتي خطوة منفصلة لتجميع AOT للتطبيق بأكمله. هذا يمكن أن يكون حساسًا ، لذلك نحن نعمل على تسريع هذه المرحلة. على سبيل المثال ، لدينا إعادة تجميع تدريجية عندما تتم إعادة ترجمة الأجزاء التي تم تغييرها فقط من التطبيق. نحن نسميها إعادة تجميع ذكية. لقد فعلنا هذا فقط في الفترة البكر الأخيرة مع Nikita ، لقد تم إقراننا.


نيكيتا: هناك بعض المشكلات في Java ومع إعادة التحويل الذكي ، على سبيل المثال ، التبعيات الدائرية داخل تطبيقات Java - فهي موجودة في كل مكان.


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


نيكيتا: في الواقع ، تفعل نفس الشيء الذي تقوم به JIT عندما تتخذ قرارًا بشأن إلغاء التحسين ، ولكن فقط في برنامج التحويل البرمجي AOT. الحل فقط لن يكون حول إزالة القيود ، ولكن حول إعادة التجميع.


أوليغ: حول سرعة التجميع الذكي. إذا أخذت "Hello، World" ، قم بتجميعها ، ثم غيّر الحرفين في كلمة "Hello" ...


نيكيتا: إنه يجمع بسرعة.


أوليغ: أقصد ، ليس دقيقة؟


نيكيتا: ثانية.


إيفان: ولكن لا يزال يعتمد على ما إذا كنا ندرج فئات النظام الأساسي في الملف القابل للتنفيذ.


أوليغ: وما هو ممكن بدون هذا؟


نيكيتا: نعم ، بشكل افتراضي ، يتم نشر نظامنا الأساسي في عدة ملفات DLL. لقد طبقنا Jigsaw في البداية :-) أي أننا شاهدنا فصول Java SE على المكونات منذ وقت طويل جدًا ، في حوالي 90 عامًا أو نحو ذلك.


إيفان: النقطة المهمة هي أن فئات وقت التشغيل بالإضافة إلى النظام الأساسي لدينا - كلها يتم تجميعها مسبقًا من قبلنا ، ونعم - مقسمة إلى DLL. عند تشغيل التطبيق المترجم بواسطة JET ، يتم تقديم وقت التشغيل والنظام الأساسي بأكمله في شكل ملفات DLL هذه. هذا هو ، نتيجة لذلك ، يبدو كما يلي: يمكنك أخذ "Hello، world"، compile، أنت تقوم حقًا بتصنيف فئة واحدة. يحدث هذا في بضع ثوان.


نيكيتا: في 4 ثوان ، إذا كان في العالم ؛ في بضع ثوان ، إن لم يكن في العالمية. "Global" عند الارتباط: يتم تجميع جميع فئات النظام الأساسي في كود أصلي في ملف قابل للتنفيذ كبير واحد.


أوليغ: هل يمكنني القيام ببعض إعادة التحميل الساخنة؟


نيكيتا: رقم


أوليغ: لا؟ الحزن. ولكن سيكون من الممكن إنشاء DLL واحد ، وربطه مرة أخرى ثم ...


نيكيتا: نظرًا لأن لدينا JIT (بالمناسبة ، نعم ، لدينا JIT أيضًا!) ، ثم يمكنك بالطبع تحميل أو إلغاء تحميل أو إعادة تحميل أجزاء من التعليمات البرمجية. على سبيل المثال ، كل التعليمات البرمجية التي تعمل من خلال JIT لدينا هي في نفس OSGI - يمكنك إعادة تحميلها إذا كنت تريد. ولكن فيما يلي إعادة التحميل السريعة التي لدى HotSpot ، عندما تجلس في مصحح الأخطاء وتغيير الرمز أثناء الطيران ، لا نفعل ذلك. هذا لا يمكن أن يتم دون فقدان الأداء.


أوليغ: في مرحلة التطوير ، الأداء ليس مهمًا جدًا.


نيكيتا: في مرحلة التطوير ، تستخدم HotSpot ، ولا تحتاج إلى أي شيء آخر. نحن حل متوافق مع جافا. إذا كنت تستخدم HotSpot واستخدمت إعادة التحميل السريع في تصحيح الأخطاء ، فكل شيء على ما يرام. تصحيح الأخطاء ، JET المترجمة ، وكل شيء يعمل مثل على HotSpot. يجب أن يكون مثل هذا. عادة مثل ذلك. إذا لم يكن كذلك ، تكتب لدعم ، ونحن نفهم.


أوليغ: وماذا عن تصحيح الأخطاء في JET؟ JVM TI؟ كم هو كل شيء معتمد؟


إيفان: إحدى القيم الأساسية لاستخدام JET هي الأمان. لن يكون الرمز المخصص متاحًا لأي شخص. لأنه يتم تجميع كل شيء إلى الأم. هناك بعض التناقضات مع هذا ، هل ندعم JVM TI؟ إذا دعمنا ، فهذا يعني أن أي مطور مطور يعرف كيف يعمل JVM TI سيكون قادرًا على الوصول إلى أي شيء بسرعة. نحن لا ندعم JVM TI الآن.


نيكيتا: هذا عنصر مواصفات اختياري. قد تكون مدعومة من قبل منفذي النظام الأساسي ، وقد لا تكون مدعومة.


إيفان: هناك العديد من الأسباب. إنه اختياري وينتهك الأمان ، مما يعني أن المستخدمين لن يقولوا "شكرًا" لنا. وانها في الداخل هي نقطة ساخنة جدا. منذ وقت ليس ببعيد ، دعم رجالنا JVM TI كمشروع تجريبي ، وصلوا إلى مرحلة معينة ، ولكن طوال الوقت واجهوا حقيقة أنه كان يركز بشدة على HotSpot. من حيث المبدأ ، هذا ممكن ، لكن ما مهمة العمل التي سيتم حلها؟


نيكيتا: بعد أن كسبت أموالًا على HotSpot ، لكنك لم تكسب أموالًا على متن طائرة - هذه ليست مشكلتك. هذه مشكلتنا


أوليغ: حصلت عليه. هل لديك أي ميزات إضافية ، والتي
ليس في HotSpot ، ولكن هل لديك واحدة ، وأنها تتطلب التحكم المباشر؟ التي أود تصحيحها ، قم بتصنيفها.


نيكيتا: ميزة واحدة بالضبط. لدينا امتداد رسمي للنظام الأساسي يسمى Windows Services ، أي أنه يمكنك ترجمة تطبيقات Java في شكل خدمات Windows الحقيقية التي سيتم مراقبتها من خلال أدوات Windows القياسية لخدمات Windows وما إلى ذلك. في هذه الحالة ، يتعين عليك التقاط JAR الخاص بنا من أجل تجميع مثل هذه التطبيقات.


أوليغ: هذه ليست المشكلة الأكبر.


نيكيتا: الواجهة بسيطة جدًا لهذه الخدمات. وللتصحيح ، يمكنك استخدام طرق بدء تشغيل التطبيق الخاص بك ليس كخدمة Windows ، ولكن من خلال main. نوع من تصحيح الأخطاء الخاص بالخدمة ، لا أعرف ما إذا كانت هناك حاجة لذلك.



أوليغ: افترض أن مطورًا جديدًا سبق له العمل في HotSpot يريد تطوير شيء ما باستخدام JET ، هل يحتاج إلى تعلم شيء ما ، لفهم شيء بشكل عام عن الحياة أو عن JET؟


إيفان: إنه يحتاج إلى نسخ سبعة أسطر إلى pom.xml ، إذا تم استخدام Maven ، ثم قم بتشغيل jet: build ، وإذا كان JET على الجهاز ، فسيتم تجميع تطبيق Java في ملف قابل للتنفيذ. الفكرة هي أنها بسيطة ، لا تفعل أي شيء خاص ، بل تأخذها فقط ، وتحصل على ملف قابل للتنفيذ ، وهذا كل شيء.


نيكيتا: إما أن تعرف سطر الأوامر الذي يتم تشغيل التطبيق الخاص بك به ، ثم تضع سطر الأوامر هذا في واجهة المستخدم الرسومية الخاصة بنا ، فسيتم اكتشافه. يمكنك إعطاء الأمر build ، يمكنك الحصول على الملف القابل للتنفيذ ، هذا كل شيء.


إيفان: الأمر بسيط للغاية ، لا تحتاج إلى اختراع أي شيء جديد. كيف تعمل نقطة الاتصال AOT ، أوضحت أنت بنفسك في التقرير أنك بحاجة إلى الحصول على قائمة بجميع الأساليب في ملف ، ولفه ، وتحويله - لا نحتاج إلى القيام بأي شيء مثل هذا. ما عليك سوى أن تأخذ خط التشغيل على HotSpot ، الصقه في واجهة المستخدم الرسومية الخاصة ، أو أضف قطعة صغيرة إلى pom.xml ، ثم ابتهج بعد قليل (لأنه لا يزال تجميع AOT) ، ستحصل على ملف exe ، والتي يمكن تشغيلها.


أوليغ: هل أحتاج إلى تعلم العمل مع GC؟


نيكيتا: نعم ، لدينا GC لدينا ، نحتاج إلى ضبطها بطريقة مختلفة ، وليس كما هو الحال في HotSpot. لدينا عدد قليل جدا من الأقلام العامة.


أوليغ: هل هناك قلم "ليعمل" أو "لا يفعل"؟


إيفان: هناك مثل هذا القلم. يوجد قلم "set Xmx" ، وهناك قلم "ضبط عدد العمال" ... الكثير من الأقلام ، لكن لماذا تحتاج إلى معرفتهم؟ إذا حدث شيء غير متوقع لك - الكتابة.


بالطبع ، لدينا الكثير من الأشياء لتكوين GC. يمكننا ضبط جيل الشباب ، يمكننا تكرار وصول GC. يتم ضبط كل هذا ، ولكن هذه ليست خيارات مقبولة بشكل عام. نحن نتفهم أن الناس يعرفون -Xmx ونشيرهم ، لذلك نقوم بتحليله. هناك بعض الخيارات المقبولة بشكل عام والتي تعمل مع JET ، ولكن بشكل عام ، كل شيء مختلف.


نيكيتا: لدينا أيضًا خيار عام يسمح لك بتعيين مقدار ما تسمح لـ GC بقضاء بعض الوقت على طلبك.


أوليغ: النسبة المئوية؟


نيكيتا: في أعشار المئة. أدركنا أن الاهتمام أكثر من اللازم ، وقح.


إيفان: إذا كنت تنفق الفائدة على القيادة العامة ، فهناك شيء خاطئ معك.


أوليغ: وهنا كل هؤلاء الأشخاص من شركات يقومون بكل ما يفعلونه خلال ساعات العمل - ويفتحون نسخة مطبوعة من أعمال GC مع الجدول الزمني والتأمل. هل يمكنك التأمل؟


نيكيتا: لدينا أشخاص مميزون داخل الشركة يتأملون.


إيفان: لدينا تنسيق السجل الخاص بنا ، لذلك من غير المحتمل أن يفهم الناس شيئًا منه. ومع ذلك ، أنت لا تعرف أبدا؟ إذا نظروا إليه لفترة طويلة ، ربما يمكنهم فهمه. كل شيء مكتوب هناك. ولكن ، على الأرجح ، من الأفضل أن ترسل إلينا ، وسوف نتأمل.


أوليغ: ولكن بالطبع ، سوف تفعل ذلك مقابل المال ، ولكن يمكنك البحث عن الهدية الترويجية بنفسك.


نيكيتا: إذا كنت عميلنا ، فأنت تحصل على الدعم ، ونحن نفعل ذلك ، بالطبع ، كجزء من الدعم.


إيفان: ولكن إذا كان لديك أي مشكلة واضحة ، فيمكننا القول دون دعم.


أوليغ: إذا كان هذا هو نوع من الأخطاء؟


نيكيتا: إذا كان خطأ ، بالطبع ، نحن نقبل من الجميع ودائما. هذا ليس كذلك ، "حتى تقوم بالشراء ، لن نصلح الأخطاء". إذا كان خطأ ، ثم نحن إصلاحه. بشكل عام ، يحب المستخدمون دعمنا. عادة ما يقولون أنها ذات جودة عالية للغاية ، وأنهم لم يروا أي شيء مثل ذلك في أي مكان. ربما الحقيقة هي أننا نحن في الدعم ، بالتناوب بدوره.


أوليغ: من هم أنفسهم؟


نيكيتا: المطورين ، JVM المهندسين.


أوليغ: كم مرة؟


نيكيتا: التردد مختلف. عادة نجلس بالتناوب لمدة أسبوعين. ولكن إذا كنت مضطرًا إلى إنتاج مكبرات صوت في عدد معين من الأيام ، فستحصل في تلك اللحظة على حصانة من الدعم حتى تتمكن من التركيز على هذه المهمة.


إيفان: من الناحية النظرية ، يجب على الجميع فعل ذلك بدوره. ولكن في بعض الأحيان يأخذ شخص ما الجرعة الثانية ويدعم لمدة شهر أو أكثر ، وليس أسبوعين. أنا شخصياً أحب أن أؤيد ذلك ، لكن إذا قمت بذلك لفترة طويلة ، فإنك تنسى قليلاً ما تفعله في الحياة ، لأنك تبدأ في الرد على الرسائل فقط. لكنك ما زلت تريد نقانق JVM. لذلك ، بعد بعض الوقت تحتاج إلى العودة.


أوليغ: ولديك تسلسل هرمي ، كم عدد مستويات الإدارة؟ 20 او اكثر؟


نيكيتا: ما أنت ، نحن فقط 10 أشخاص في فريق.


إيفان: 15 مع الطلاب.


أوليغ: أعني أن السلطات متورطة في هذا أم مجرد النظر؟


نيكيتا: حول الرؤساء. بالطبع ، هناك شخص رئيسي ، وهناك العديد من القادة المحليين.


أوليغ: هل لكل شخص منطقته الخاصة؟


نيكيتا: شخص يتولى مهمة كبيرة ويديرها. انها تدور أيضا. يمكنك أن تأخذ مهمة كبيرة وتؤدي مرة واحدة ، وفي المرة القادمة سوف تقودك.


إيفان: بشكل عام ، ليس لدينا تسلسل هرمي كبير. لدينا مستوى واحد من الرؤساء. وحول النظر من فوق - بالتأكيد لا. في بعض الأحيان ، يفترض رؤساءنا تقديم الدعم بشكل بطولي إذا كان الإصدار قريبًا.


نيكيتا: الرؤساء شخص واحد ، اسمه فيتالي ميكيف.


أوليغ: هل يمكنك رؤيته في مكان ما؟ في المؤتمرات أو في مكان آخر؟


نيكيتا: بشكل عام ، بدأت خطباتي في المؤتمرات بحقيقة أن عيد القديس بطرسبرغ جاء إلينا في نوفوسيبيرسك ، وقد نظمه بيلوكريلوف من أوراكل ، وهو الآن في بيلسوفت. سأل عما إذا كنا نود التحدث ، ثم أداؤنا مع فيتالي. ثم اقترحت أن يواصل أداءه معًا ، لكنه قرر أنه لم يعد يريد ذلك.


أوليغ: وما نوع التقرير؟


نيكيتا: "قصة JVM واحدة في الصور . "


إيفان: أتذكر هذا التقرير ، ثم كنت إما متدربًا أو توقفت عن كوني أحدهم. وما زلت أعتقد أن هذا أحد أفضل التقارير التي رأيتها.


نيكيتا: ربما كان "التأثير الأول" عندما تقوم بالأداء لأول مرة في حياتك ، أنت تضغط جيدًا بالطاقة.


أوليغ: عمّا تتحدث؟


نيكيتا: تحدثوا معًا حول JET من البداية إلى النهاية لمدة 20 دقيقة.


أوليغ: لشخصين ، فقط 20 دقيقة؟ عادة ، عندما يكون هناك عدة أشخاص ، يزداد وقت التقرير فقط.


نيكيتا: تحدثنا بقوة وحيوية عن جميع الموضوعات الرئيسية.


أوليغ: فانيا ، هل أثر هذا على قرارك حول ما يجب القيام به بعد ذلك؟ هل تعمل لدى الشركة؟


إيفان: يمكن أن يكون!


أوليغ: إنه عادة ما يسأل الناس عادة لماذا تحضر المؤتمرات والعروض التقديمية ولماذا تستمع إلى شيء ما ، إذا كان يمكنك استخدام جوجل.


نيكيتا: بالطبع ، في رأيي ، حضور مؤتمر مفيد للغاية. عندما يكون لديك اتصال مباشر ، ومشاركة مباشرة ، فليس ما تراه على الإطلاق على YouTube. من المهم أن تكون مشاركًا مباشرًا وليس مشاركًا فعليًا. أنت على اتصال مع المصدر. الفرق هو نفسه عن حضور حفلة موسيقية حية أو الاستماع إليها على تسجيل. ربما أكبر ، لأنك تستطيع أن تتحدث إلى الفنان المفضل لديك بعد الحفل؟ لكن في المؤتمر يمكنك أن تجد المتحدث الذي تحتاجه وتطلب منه كل ما تحتاجه - لا توجد مشاكل.


إيفان: بالمناسبة ، فيما يتعلق بقرار "البقاء في الشركة" ، هذه قصة مختلفة. لدينا نظام توظيف فريد إلى حد ما للموظفين / المتدربين. نأخذ متدربين لمدة 2-3 دورات ، عادة من أعضاء هيئة التدريس أو من قسم الفيزياء. إن المتدربين غارقون للغاية في الموضوع ، ويساعدهم المنسقون على فهم مختلف آليات VM وتفاصيل التنفيذ ، إلخ. - يكلف الكثير.


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


أوليغ: وأنت لست خائفًا من تسرب المعلومات من المتدربين ، ثم سيصفون كل ذلك علنًا في دبلوم؟


نيكيتا: هذه ليست مشكلة ، لأننا نخشى حدوث تسرب في الخارج ، وخاصة أن أحدا لن يقرأ الروسية - هذه هي الحماية والتشويش :-)


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


أوليغ: وكيف تبحث عن الشهادات التي تنطوي على إكسيلسيور؟


نيكيتا: تعال إلى مكتب العميد واطلب قراءة هذه الشهادة.


إيفان: لدينا قائمة بالدبلومات التي تم الدفاع عنها بنجاح على موقعنا ، ولكن لدينا أسماء فقط ، دون روابط. وليس لدينا من نجح في الدفاع عنها.


أوليغ: إما يموتون أو يدافعون عن أنفسهم.


إيفان: إنه! لدينا متوسط ​​درجة 5.0 الخريجين ، وهناك أولئك الذين ببساطة لا يذهبون إلى دبلوم.


أوليغ: في هذا التدريب ، مصنع المهندسين JVM ، أخبرنا ما هي مراحل أن تصبح جدي؟ عندما يعطونك طائرة خفيفة ، متى يمكنك البدء في التلويح بها؟


نيكيتا: سريع جدا. الآن أصبح الشباب مؤلمًا بسرعة جدي ، أنا فخور بهم.


إيفان: بالمناسبة ، كان نيكيتا أول أمين لي عندما كنت متدربة. فيما يتعلق بالتدريب الداخلي: أولاً ، تمر بمجموعة مختارة: تقوم بحل المشكلات ، وتحدث إلى مقابلة أو أكثر. إذا كان كل شيء على ما يرام ، فأنت تصبح متدرب. في البداية ، تقرأ مقالات علمية حول موضوعات ذات صلة على الأرجح بشهادتك المستقبلية ، أو مجرد موضوعات JVM باللغة الإنجليزية للحصول على السياق. تقرأ ، اكتب مقالًا عنها ، واشرح ما يحدث هناك. إنها صعبة للغاية عليه. كان بعض العلماء يحسدون على مثل هذا التدقيق وتصحيح المقالات. اتضح مقالات كاملة باللغة الروسية. بعد ذلك ، حان الوقت لكتابة الشفرة ، ويتم التعرف عليك ببطء على جوهر الموضوع - كيف يعمل كل شيء.


نيكيتا: وهذا حيث ينتهي العلم.


إيفان: ليس بالضرورة!


نيكيتا: إنه لأمر مخز ، في بداية الصفر قمنا بنشر مقالات أخذناها إلى مجلات ACM.


إيفان: حسنًا ، نحن نفعلها الآن ، ما هي المشكلة؟


نيكيتا: ما كان مقالنا الأخير في مجلة ACM؟


إيفان: إذن في ACM ، لم نحاول! الآن نحن نقوم بالتدوين - إنه نفس الشيء ، فقط الأشخاص يقرؤونه. هذا نشاط مشابه.


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


أوليغ: على سبيل المثال ، كتابة تعليق.


إيفان: رقم وظيفة حقيقية. يجب على الطالب تقديم أول مساهمة حقيقية حتى يظل في المنتج. , - , . , -, — . , . , JVM-.


: ? ? - , , - ? ?


: , . - — - , , , , , , JVM. , , , . , : « !». .


: JET?


: , JVM .


: - , JET — JET. , - , : baseline-. , . , , JET .


: ?


: , . , .


: - , baseline .


: , baseline JIT. , JIT , . , baseline. . - , baseline, .


: - UI-? .


: . . Windows.


: , . , Mac.


: Android ?


: . , Android Linux-, Linux . Linux Android . - . .


: ?


: ? رقم


: Android Native SDK. DLL .


: , - , . SO- - , , Linux, , , . Java Android, , SO-, Java Dalvik . 90 , , -.


: iOS ?


: . Android, iOS. , , .


: , 15 .


: iOS . , .


: , .


: ?


: , — .


: . ?


: — JVM, JVM — , , , , , — , . , . . GC - , , . , , , .


: , , , . , , . GDB .


: , . , .. , .. managed- Java/Scala, ( ) IDEA, . — GDB .


: , , unit- , !


: . . , , , . JVM. -, . , : , - « - ( ) . ».


, , — , JVM.


: ?


: .


: . . Spring Boot , JET , .


: , - . , , , — . , JIT, . , .


: JIT — , ?


: , .


: , - , .


: , ? , -, , .


: , , - -. - , , . , . , - . issue-, , . , , .


, . , — , -. , . check-in , 1.5-2 .


: Visual Source Safe, check-in. VSS , check-in . VSS, check-in .


: , JET, JVM , . 1.5-2 . JET, , . - , , , — . ? . .


: JET Scala?


: Scala.


JET Scala, JET-. JET- . , . , Scala-, scalac, …


: check-in Java- , , , .


: - , C++ ?


: , . , , .


: JVM- — , - , . — . , , , — , . , . « ». . , , , :-) — . , GC, - - . , - , , . , - . .


: , ?


: . , . , . QA-, — , . , .


: ?


: , . , , . , . C GC . , , - . , GC - — . - . ? ?


: , .


: , -, . . , — . . - .


: , , , .


: , - ?


: - , .


: JIT?


: JIT . assert, , -, , . .


: , . JCK . - JCK, , . , . UI-, GUI-, JET. - . , GitHub JET-. JET- . QA- , .


: , ? , , ?


: QA Lead — -. QA, . , . , , . , .


: , QA ? , QA-, , — , , . , , - -.


: , . , , , - . , QA Lead , . JVM-, , .


: ? - , QA- , — ?


: JCK, Oracle. Oracle , . - . JCK, - , , , .


: , JCK?


: Oracle. , JVM, - , Oracle.


: . , Open JDK, JCK.


: - , , - , — , . , , - Oracle. , , Oracle .


: ?


: . , - , «value add». JCK, Java, . JCK , — .


: ! , OpenJDK, ?


: . , 70 . , JCK, , , . , , JET , HotSpot . .


: ? .


: Oracle JVM. . « JVM» Joker.


: ?


: , . JVM. : JVM- , , , . , .


: , JCK ?


: , . mailing list, (Alex Buckley), , Java/JVM-, JVM Specification 12.


: JCK .


: JCK, Sun . , — .


: — , ?


: , . . , , CORBA. , - , . 6 , CORBA . , , HotSpot, , , .


: , — ?


: . CORBA , . Swing . JCK Swing, , . .


: « JCK».


: , , JCK . .


: ?


: , , , , , .


: , .


: - , . , . .


: , ?


: , .


: . , . : , . , JCK, Java.


, . - .


: — . , , — . , - . , . , .


: - , ? ?


: — . , - - , - - . Java - ! , GC. — — , .


: , , . (, JVM ). , ? لكن لا شيء. , - - , . JVM , . , .


Java . , , — . Loom Metropolis, Java. - JVM, , , , , . Loom , , . . , — .


. , Java — , 5-6 Java- JPoint . , Java- (Simon Ritter, Rafael Winterhalter). , Call for Papers 31 . . , YouTube. JPoint!

Source: https://habr.com/ru/post/ar437180/


All Articles