لقد مر عام منذ أن نجحت الخدعة السابقة: نشر فيديو على موقع YouTube بدلاً من نشره.
حصل "الحديث المخزي عن المفرد" على 7 آلاف مشاهدة على YouTube ومرتين على حبري في النسخة النصية. لمقال مكتوب في حالة عنيدة تمامًا ويخبرنا عن الأكورديون القديم - هذا قليل من النجاح.
اليوم أقوم بتثبيت إصدار جديد طوال الليل. هذه المرة كان الموضوع أكثر حداثة: تاريخ الالتزام بالتكنولوجيا التجريبية - SubstrateVM. لكن درجة المثابرة ارتفعت إلى مستوى جديد.
أتطلع حقًا إلى تعليقاتك! أذكرك أنه إذا كنت تريد حقًا تحسين شيء ما في هذا المنشور ، فمن الأفضل أن تقدم
الملف على Github . أود أن أقول "أعجبني
في القناة الجديدة واشترك
فيها ، ولكن هل ستكون جميع إصداراتها في مركز جافا على أي حال؟"
من الناحية الفنية: يحتوي الفيديو على لصق واحد قريب من النهاية. لقد كتبت للتو مقطع فيديو غير مضغوط ، وسرعان ما تجاوز حجم ssd m2 الخاص بي والذي يبلغ حجمه خمسمائة غيغابايت فقط. ولا يمكن لأي محرك أقراص ثابت آخر تحمل مثل هذا الضغط من البيانات. لذلك ، اضطررت إلى قطع الاتصال لمدة نصف ساعة وشعرت بالملل للعثور على خمسين العربات الإضافية لتسجيل الدقائق القليلة الماضية. وقد تم ذلك عن طريق حذف الملفات
التي جمعتها GoogleChrome . كتبت عن برنامج التسجيل في FB
في وقت التسجيل ، هناك الكثير من الألم.
شيء آخر مثير للاهتمام من الناحية الفنية: حظر YouTube لسبب ما البث المباشر. في الوقت نفسه ، لا يوجد إضراب ووصم واحد على الحساب. دعونا نأمل أن يكون هذا مجرد دعامة ، وبعد 90 يومًا سيتم إرجاع كل شيء.
سيتم اقتباس هذه المقالة من رمز مملوك لشركة Oracle. لا يمكنك استخدام هذا الرمز لنفسك (ما لم تقرأ الترخيص الأصلي ، ويسمح به وفقًا لشروط ، على سبيل المثال ، GPL). هذه ليست مزحة. أولسو ، حذرت.
Prikazka (وسوف تكون حكاية خرافية في المقدمة)
لقد سمع الكثير بالفعل قصصًا تفيد بأن "Java الجديدة ستتم كتابتها بلغة Java" ويتساءلون كيف يمكن أن يكون ذلك. هناك وثيقة سياسة
مشروع متروبوليس ورسالة مقابلة من
جون روز ، ولكن كل شيء غامض جدًا هناك.
يبدو وكأنه نوع من السحر الزاحف الدموي. في نفس الشيء الذي يمكنك تجربته الآن ، ليس فقط ليس هناك سحر ، ولكن كل شيء غبي مثل ظهر المجرفة عندما تضرب أسنانها. بالطبع ، هناك بعض الفروق الدقيقة ، ولكن هذا سيكون يومًا ما لاحقًا.
سأعرضها على مثال قصة إرشادية واحدة حدثت في الصيف. كيف يكتبون مقال "كيف أمضيت الصيف" في المدارس.
لبدء ملاحظة صغيرة. المشروع الذي يقوم حاليًا بتجميع مسبق في Oracle Labs هو GraalVM. المكون الذي ، في الواقع ، يفعل nishtyaki ويحول رمز Java إلى ملف قابل للتنفيذ (إلى ملف قابل للتنفيذ) هو SubstrateVM أو SVM للاختصار. لا تخلط بين هذا والاختصار نفسه الذي يستخدمه علماء شياطين البيانات (آلة ناقل الدعم). هذا عن SVM ، كجزء أساسي ، سنتحدث أكثر.
بيان المشكلة
لذا ، "كيف قضيت الصيف." جلست في إجازة ، وقضيت F5 على
جيثوب الكأس وواجهت هذا :

يريد الشخص
os.version
لإعطاء القيمة الصحيحة.
حسنا تشو ، أردت إصلاح الخلل؟ قال الصبي - الصبي فعل.
سوف نتحقق مما إذا كان عميلنا يكذب.
public class Main { public static void main(String[] args) { System.out.println(System.getProperty("os.version")); } }
أولاً ، كيف يبدو العادم في جافا الحقيقية:
4.15.0-32-generic
. نعم ، هذا هو Ubuntu LTS Bionic الطازج.
حاول الآن أن تفعل الشيء نفسه على SVM:
$ ls Main.java $ javac -cp . Main.java $ ls Main.class Main.java $ native-image Main Build on Server(pid: 18438, port: 35415) classlist: 151.77 ms (cap): 1,662.32 ms setup: 1,880.78 ms error: Basic header file missing (<zlib.h>). Make sure libc and zlib headers are available on your system. Error: Processing image build request failed
حسنًا ، نعم. هذا لأنني صنعت جهازًا افتراضيًا جديدًا تمامًا خصيصًا للاختبار "النظيف".
$ sudo apt-get install zlib1g-dev libc6 libc6-dev $ native-image Main Build on Server(pid: 18438, port: 35415) classlist: 135.17 ms (cap): 877.34 ms setup: 1,253.49 ms (typeflow): 4,103.97 ms (objects): 1,441.97 ms (features): 41.74 ms analysis: 5,690.63 ms universe: 252.43 ms (parse): 1,024.49 ms (inline): 819.27 ms (compile): 4,243.15 ms compile: 6,356.02 ms image: 632.29 ms write: 236.99 ms [total]: 14,591.30 ms
يمكن أن تكون أرقام وقت التشغيل المطلقة مرعبة. ولكن ، أولاً ، هذا ما كان ينوي القيام به: يتم تطبيق تحسينات جسيمة للغاية هنا. وثانيًا ، هذه آلة افتراضية ضعيفة تريدها.
وأخيرًا ، لحظة الحقيقة:
$ ./main null
يبدو أن ضيفنا لم يكذب ، حقا لا يعمل.
النهج الأول: سرقة الخصائص من المضيف
ثم قمت بالبحث في
os.version
عن
os.version
ووجدت أن جميع هذه الخصائص موجودة في فئة
SystemPropertiesSupport
.
لن أكتب المسار الكامل للملف ، لأن القدرة على إنشاء المشاريع الصحيحة لـ IntelliJ IDEA و Eclipse مضمنة مباشرة في SVM. هذا رائع للغاية ولا يذكرنا على الإطلاق بالعذاب الذي يعاني منه OpenJDK في الغالب. دع IDE تفتح صفوفًا لنا. لذا:
public abstract class SystemPropertiesSupport { private static final String[] HOSTED_PROPERTIES = { "java.version", ImageInfo.PROPERTY_IMAGE_KIND_KEY, "line.separator", "path.separator", "file.separator", "os.arch", "os.name", "file.encoding", "sun.jnu.encoding", };
ثم ، دون تضمين رأسي على الإطلاق ،
ذهبت للتو
وأضفت متغيرًا آخر إلى هذه المجموعة:
"os.arch", "os.name", "os.version"
4.15.0-32-generic
، وأحصل على الخط المرغوب
4.15.0-32-generic
. مرحى!
ولكن هنا
4.15.0-32-generic
المشكلة: الآن على
كل جهاز يتم فيه تشغيل هذا الرمز ، فإنه يصدر دائمًا
4.15.0-32-generic
. حتى عندما تعيد
uname -a
النسخة السابقة من الدلو ، على Ubunt القديم.
يصبح من الواضح أن هذه المتغيرات تتم كتابتها إلى ملف المصدر في وقت التجميع.
وحقاً ، تحتاج إلى قراءة التعليقات بعناية:
private static final String[] HOSTED_PROPERTIES
يجب تطبيق طرق أخرى.
الاستنتاجات
- إذا كنت تريد أن تظهر خاصية نظام من "Java الرئيسية" في SVM ، فهذا بسيط للغاية. نكتب العقار المطلوب في المكان الصحيح ، هذا كل شيء.
- يمكنك العمل في IDE ، الذي يدعم Java و Python في نفس الوقت. على سبيل المثال ، في IntelliJ IDEA Ultimate مع Python plugin أو نفس الشيء في Eclipse.
النهج الثاني
إذا بحثت عن
SystemPropertiesSupport
SystemPropertiesSupport ، فإننا نجد شيئًا أكثر منطقية:
private final Map<String, Supplier<String>> lazyRuntimeValues;
من بين أمور أخرى ، لا يزال استخدام هذه الخصائص لا يمنع عملية بناء ملف قابل للتنفيذ. من الواضح أننا إذا
HOSTED_PROPERTIES
الكثير في
HOSTED_PROPERTIES
،
HOSTED_PROPERTIES
كل شيء.
تسجيل الممتلكات الكسولة يحدث بطريقة واضحة ، بالرجوع إلى طريقة إرجاع:
lazyRuntimeValues.put("user.name", this::userNameValue); lazyRuntimeValues.put("user.home", this::userHomeValue); lazyRuntimeValues.put("user.dir", this::userDirValue);
علاوة على ذلك ، كل هذه المراجع الطريقة هي واجهة ، ويتم تنفيذ نفس
this::userDirValue
لكل من المنصات المدعومة. في هذه الحالة ، هذه هي
PosixSystemPropertiesSupport
و
WindowsSystemPropertiesSupport
.
إذا خرجنا عن فضولنا لتطبيق Windows ، فسنرى الشيء المحزن:
@Override protected String userDirValue() { return "C:\\Users\\somebody"; }
كما ترى ، Windows غير مدعوم بعد :-) ومع ذلك ، فإن المشكلة الحقيقية هي أن جيل الملفات التنفيذية لـ Windows لم يكتمل بعد ، لذا فإن دعم هذه الأساليب سيكون في الواقع جهودًا غير ضرورية تمامًا.
أي أنك تحتاج إلى تنفيذ الطريقة التالية:
lazyRuntimeValues.put("os.version", this::osVersionValue);
ثم دعمه في واجهتين أو ثلاث واجهات متاحة.
ولكن ماذا أكتب هناك؟
الاستنتاجات
- إذا كنت ترغب في إضافة خاصية جديدة يتم حسابها في وقت التشغيل ، فهذه مسألة كتابة طريقة واحدة. قد تعتمد النتيجة على نظام التشغيل الحالي ، آلية التبديل تعمل بالفعل ولا تسأل.
القليل من علم الآثار
أول ما يتبادر إلى الذهن هو إلقاء نظرة خاطفة على تنفيذ في OpenJDK ولصق النسخ بوقاحة. القليل من الآثار والنهب لن يمنع المستكشف الشجاع!
لا تتردد في فتح أي مشروع Java في Idea ، اكتب
System.getProperty("os.version")
، وعن طريق ctrl + انقر على الانتقال إلى تنفيذ طريقة
getProperty()
. اتضح أن كل هذا بغباء يكمن في
Properties
.
يبدو ، فقط قم بنسخ ولصق المكان الذي تمتلئ فيه هذه
Properties
، والضحك بحماس ، اهرب إلى الفراغ. للأسف ، نواجه مشكلة:
private static native Properties initProperties(Properties props);
Noooooooooooooo.

لكن كل شيء بدأ بشكل جيد.
هل كان هناك صبي؟
كما نعلم ، فإن استخدام C ++ أمر سيء. هل يستخدم C ++ في SVM؟
فقط هكذا! حتى أن هناك حزمة خاصة لهذا:
src/com.oracle.svm.native
.
وفي هذه الحزمة ، الرعب ، الرعب ، يكمن ملف
getEnviron.c
بشيء من هذا القبيل:
extern char **environ; char **getEnviron() { return environ; }
حان الوقت للفوضى مع C ++
تعمق الآن قليلاً وافتح مصادر OpenJDK الكاملة.
إذا لم يكن لديه شخص بالفعل ، فيمكنك
البحث على الويب أو التنزيل. أحذركم ، أنهم يتأرجحون
من هنا ، لا يزالون بمساعدة Mercurial ، وسيستغرق الأمر حوالي نصف ساعة.
الملف الذي نحتاجه موجود في
src/java.base/share/native/libjava/System.c
.
هل لاحظت أن هذا هو المسار للملف وليس الاسم فقط؟ هذا صحيح ، يمكنك دفع فكرتك العصرية اللامعة الجديدة ، التي يتم شراؤها مقابل 200 دولار في السنة. يمكنك
تجربة CLion ، ولكن لتجنب الأضرار العقلية التي لا يمكن
علاجها ، من الأفضل أن تأخذ
Visual Studio Code فقط . لقد سلط الضوء بالفعل على شيء ما ، لكنه لا يزال لا يفهم ما رآه (لا يشطب كل شيء باللون الأحمر).
رواية قصيرة من
System.c
:
java_props_t *sprops = GetJavaProperties(env)
في المقابل ، يتم أخذها في
src/java.base/unix/native/libjava/java_props_md.c
.
كل منصة لها مثل هذا الملف الخاص بهم ، يتم التبديل من خلال
#define
.
وهنا تبدأ. هناك العديد من المنصات. يمكن تسجيل أي تجبير مثل AIX ، لأن GraalVM لا يدعمها رسميًا (على حد علمي ، تم التخطيط في GNU-Linux و macOS و Windows في البداية). يدعم غنو / لينكس وويندوز استخدام
<sys/utsname.h>
، الذي
<sys/utsname.h>
طرقًا مسبقًا للحصول على اسم وإصدار نظام التشغيل.
لكن macOS لديه
قطعة رهيبة من govnokod .
- اسم "Mac OS X" مصقول بداخله (على الرغم من أنه كان منذ فترة طويلة macOS) ؛
- ذلك يعتمد على نسخة makoshi. قبل الإصدار 10.9 ، لم يكن SDK يحتوي على وظيفة
operatingSystemVersion
، وكان عليك قراءة SystemVersion.plist
يدويًا ؛ - لهذا الطرح ، يستخدم ملحق ObjC شيئًا مثل هذا:
إذا كانت هناك في البداية فكرة لإعادة كتابة هذا يدويًا بأسلوب جيد ، فقد سرعان ما تحطمت إلى الواقع. ماذا لو كنت أعبث في مكان ما في غابة هذه المعكرونة من ifs ، فسوف يكسرها شخص ما ، وسيشنقونني في الساحة المركزية؟ حسنا nafig.
من الضروري نسخ ولصق.الاستنتاجات
- ليست هناك حاجة IDE ؛
- أي اتصال مع C ++ مؤلم وغير سار ولا يفهم من النظرة الأولى.
النسخ واللصق هو القاعدة؟
هذه مسألة مهمة تعتمد عليها كمية العذاب الإضافي. لم أكن أرغب حقًا في إعادة الكتابة يدويًا ، ولكن الوصول إلى المحكمة لانتهاك التراخيص أسوأ. لذلك ذهبت إلى جيثب وسألت كودروت ستانكو عن ذلك مباشرة. هذا ما
رد عليه :
»إعادة استخدام كود OpenJDK ، على سبيل المثال ، النسخ واللصق هو شيء عادي من وجهة نظر الترخيص. ومع ذلك ، هناك سبب وجيه لذلك. إذا كان من الممكن تنفيذ ميزة عن طريق إعادة استخدام كود JDK دون نسخها ، على سبيل المثال ، تصحيحها باستبدالها ، فستكون أفضل بكثير. "هذا يبدو وكأنه إذن رسمي للصق النسخ!
تحدثنا بشكل طبيعي ...
لقد بدأت في نقل هذه القطعة من التعليمات البرمجية ، ولكن واجهت كسولي. لاختبار macOS لإصدارات مختلفة ، تحتاج إلى العثور على واحد على الأقل مع 10.8 Mountain Lion. لدي جهازان من أجهزة Apple متاحان وواحد من صديق ، بالإضافة إلى أنه يمكنني نشره في برنامج VMWare التجريبي.
لكن الكسل. وهذا الكسل أنقذني.
ذهبت إلى
غرفة الدردشة وسألت كريس سيتون عن سلسلة الأدوات الأكثر ملاءمة للتجميع. أي إصدار من نظام التشغيل مدعوم ومترجم C ++ وما إلى ذلك.
ورداً على ذلك ، تلقى صمتًا مفاجئًا من الدردشة ورد كريس بأنه لم يفهم جوهر المشكلة.
استغرق الأمر بعض الوقت قبل أن يتمكن كريس من معرفة ما أردت القيام به ، وطلب منه
ألا يفعل ذلك مرة أخرى أبدًا .
هذا يفتقد حقًا فكرة SVM. SVM هو Java خالص ، ليس من المفترض أن يتم وضع التعليمات البرمجية فيه من OpenJDK. يمكنك قراءتها وتحويلها إلى Java ، ولكن لا أحد يريد كود C ++ من OpenJDK. هذا هو آخر شيء نريده.
مثال مكتبات الرياضيات لم يقنعه. كحد أدنى ، فهي مكتوبة بلغة C ، وسيعني إدراج C ++ ربط لغة جديدة تمامًا بقاعدة التعليمات البرمجية. وهذا هو فوفو.
ماذا تريد ان تفعل؟ اكتب في
نظام جافا .
وإذا كان لا يمكن تجنب مكالمات C / C ++ Platform SDK ، فيجب أن يكون هذا استدعاء نظام واحد ملفوف في C API. يتم سحب البيانات في Java ثم تتم كتابة منطق الأعمال بشكل صارم في Java ، حتى إذا كان Platform SDK يحتوي على طرق جاهزة جاهزة للقيام بذلك بشكل مختلف على جانب C ++.
تنهدت وبدأت في دراسة شفرة المصدر لفهم كيف يمكن القيام بذلك بشكل مختلف.
الاستنتاجات
- تحدث مع الأشخاص في الدردشة عن أي تفاصيل غامضة. يجيبون إذا كانت الأسئلة ليست غبية تماما. على الرغم من أن هذا المثال يوضح أن كريس جاهز لمناقشة القضايا الغبية ، حتى لو لم يوفر ذلك وقته شخصيًا ؛
- C ++ غير موجود في المشروع على الإطلاق. لا يوجد سبب للاعتقاد بأن شخصًا سيسمح له بسحبه تحت الأرض.
- بدلاً من ذلك ، تحتاج إلى الكتابة في System Java باستخدام C كحل أخير (على سبيل المثال ، عند استدعاء النظام الأساسي SDK).
عازف الكمان ليست هناك حاجة
عازف الكمان ليس هناك حاجة ، عزيزي. يأكل فقط الوقود الزائد.
ثم طغت مع بعض الحزن ، لأنظر هنا. إذا كان لدينا في Windows
<sys/utsname.h>
، ونأمل بغباء في إجابته - فهو سهل وبسيط.
ولكن إذا لم يكن موجودًا ، فما الذي يجب فعله؟
- استدعاء أوامر cmd المضمنة أو أدوات Windows؟ إصدار نص باللغة الروسية يحتاج إلى تحليل. هذا هو الجزء السفلي ، وقد لا يتزامن مع ما سيجيب عليه OpenJDK الحقيقي في هذا المكان.
- خذ من التسجيل؟ حتى هنا توجد فروق دقيقة ، على سبيل المثال ، عند التبديل من Windows 7 إلى 10 ، تغيرت طريقة تخزين الأرقام الرقمية في التسجيل ، وفي Windows 10 تحتاج إلى إما لصق اليدين من المكونات الرئيسية والثانوية ، أو ببساطة الإجابة على أنه Windows 10 برقم واحد. أي من هذه الأساليب أكثر صحة (لن تجعل مؤخرات المستخدمين تتوب) غير واضح.
لحسن الحظ ،
قُطعت معاناتي بسبب مسعى بول Woegerer ، الذي أصلح كل شيء.
من المثير للاهتمام ، في البداية تم إصلاح كل شيء في المعالج (توقف
os.version
عن إعطاء قيمة
null
في الاختبار) ، وعندها فقط لاحظت طلب سحب. المشكلة هي أن هذا الالتزام لم يتم وضع علامة عليه على github باعتباره pullrequest - إنه التزام بسيط مع نقش
PullRequest: graal/1885
في التعليق. الحقيقة هي أن الرجال في Oracle Labs لا يستخدمون Github ، بل يحتاجون إليه فقط للتفاعل مع الجهات الخارجية. كلنا لم نكن محظوظين بما يكفي للعمل في Oracle Labs نحتاج إلى الاشتراك في إشعارات الالتزامات الجديدة في المستودع وقراءتها جميعًا.
ولكن الآن يمكنك الاسترخاء ومعرفة كيفية تنفيذ هذه الميزة
بشكل صحيح .
دعونا نرى ما هو هذا الوحش ، نظام جافا.
كما قلت سابقًا ، كل شيء بسيط ، مثل ظهر المجرفة ، عندما يحاولون دق أسنانك. ومؤلمة أيضا. ألق نظرة على الاقتباس من البركة:
@Override protected String osVersionValue() { if (osVersionValue != null) { return osVersionValue; } CoreFoundation.CFDictionaryRef dict = CoreFoundation._CFCopyServerVersionDictionary(); if (dict.isNull()) { dict = CoreFoundation._CFCopySystemVersionDictionary(); } if (dict.isNull()) { return osVersionValue = "Unknown"; } CoreFoundation.CFStringRef dictKeyRef = DarwinCoreFoundationUtils.toCFStringRef("MacOSXProductVersion"); CoreFoundation.CFStringRef dictValue = CoreFoundation.CFDictionaryGetValue(dict, dictKeyRef); CoreFoundation.CFRelease(dictKeyRef); if (dictValue.isNull()) { dictKeyRef = DarwinCoreFoundationUtils.toCFStringRef("ProductVersion"); dictValue = CoreFoundation.CFDictionaryGetValue(dict, dictKeyRef); CoreFoundation.CFRelease(dictKeyRef); } if (dictValue.isNull()) { return osVersionValue = "Unknown"; } osVersionValue = DarwinCoreFoundationUtils.fromCFStringRef(dictValue); CoreFoundation.CFRelease(dictValue); return osVersionValue; }
وبعبارة أخرى ، نكتب بلغة جافا بكلمة ما نكتبه في C.
DarwinExecutableName
على كيفية كتابة
DarwinExecutableName
:
@Override public Object apply(Object[] args) { final CIntPointer sizePointer = StackValue.get(CIntPointer.class); sizePointer.write(0); if (DarwinDyld._NSGetExecutablePath(WordFactory.nullPointer(), sizePointer) != -1) { VMError.shouldNotReachHere("DarwinExecutableName.getExecutableName: Executable path length is 0?"); } final byte[] byteBuffer = new byte[sizePointer.read()]; try (PinnedObject pinnedBuffer = PinnedObject.create(byteBuffer)) { final CCharPointer bufferPointer = pinnedBuffer.addressOfArrayElement(0); if (DarwinDyld._NSGetExecutablePath(bufferPointer, sizePointer) == -1) { return null; } final String executableString = CTypeConversion.toJavaString(bufferPointer); final String result = realpath(executableString); return result; } }
كل هذه
CIntPointer
،
CCharPointer
،
PinnedObject
، ماذا.
لذوقي ، هذا غير مريح وقبيح. تحتاج إلى العمل يدويًا مع المؤشرات التي تشبه فئات Java. تحتاج إلى استدعاء
release
المناسب في الوقت المناسب حتى لا تتسرب الذاكرة.
ولكن إذا بدا لك أن هذه إجراءات
غير مبررة ، فيمكنك حينئذٍ أن تنظر مرة أخرى في
تنفيذ GC في .NET وأن تصاب بالهلع مما يؤدي إليه C ++ إذا لم تتوقف في الوقت المناسب. أذكرك أن هذا هو ملف CPP ضخم أكبر من ميغابايت. هناك
بعض أوصاف عمله ، ولكن من الواضح أنها غير كافية للفهم من قبل مساهم خارجي. الرمز أعلاه ، على الرغم من مظهره السيئ ، يمكن فهمه وتحليله تمامًا عن طريق التحليل الثابت لجافا.
أما عن جوهر الالتزام فلدي أسئلة له. وعلى الأقل لم يتم تنفيذ دعم Windows هناك. عندما يظهر برنامج ترميز لـ Windows ، سأحاول تولي هذه المهمة.
الاستنتاجات
- تحتاج إلى الكتابة في نظام جافا. الحمد ، استدعاء الخبز الحلو. لا توجد حتى الآن خيارات ؛
- اشترك في الإخطارات من المستودع على GitHub واقرأ التعهدات ، وإلا سوف يطير المستفيدون الرئيسيون المهمون ؛
- إن أمكن ، اسأل عن أي ميزة كبيرة لأولئك المسؤولين عن هذه المنطقة. هناك الكثير من الأشياء التي يتم تنفيذها ، لكنها ليست معروفة بعد لعامة الناس. هناك فرصة لاختراع دراجة ، وأسوأ بكثير من تلك التي صنعها الرجال من Oracle Labs ؛
- عند معالجة ميزة ، تأكد من إبلاغ الشخص المسؤول في جيثب. إذا لم يجيب - اكتب خطابًا ، فإن عناوين جميع أعضاء الفريق يسهل الوصول إليها.
الخاتمة
تنتهي هذه المعركة ، ولكن ليس الحرب على الإطلاق.
مقاتل ، انتظر بحساسية لمقالات جديدة حول حبري
وتناسب صفوفنا !
أريد أن أذكركم بأن أوليغ شلايف ، المبشر
الرسمي الوحيد لـ GraalVM من أوراكل ، سيأتي إلى
مؤتمر جوكر القادم . ليس فقط "المتحدث الروسي الوحيد" ، ولكن "المتحدث الوحيد بشكل عام". يشير عنوان التقرير (
"تجميع Java مسبقًا مع GraalVM" ) إلى أن SubstrateVM لا يمكن الاستغناء عنه.
بالمناسبة ، تم إصدار Oleg مؤخرًا سلاح الخدمة - حساب على
Habré ،
shelajev-oleg . لا توجد مشاركات حتى الآن ، ولكن يمكنك الإرسال على اسم المستخدم هذا.
يمكنك التحدث مع Oleg و Oleg في غرفة الدردشة الخاصة بنا في Telegram:
graalvm_ru . على عكس ishshuyev على Github ، يمكنك التواصل بأي شكل ، ولن يتم حظر أي شخص (
ولكن هذا ليس دقيقًا ).
أذكرك أيضًا أنه كل أسبوع ، جنبًا إلى جنب مع بودكاست Debriefing ، نقوم بإصدار Java Digest. على سبيل المثال ، كان هذا هو
الملخص الأخير . من وقت لآخر ، تتخطى الأخبار حول GraalVM هناك (في الواقع ، أنا لا أحول المشكلة بالكامل إلى بيان صحفي GraalVM لمجرد احترام الجمهور :-)
شكرا لك على قراءة هذا - ونراكم قريبا!