[जवावच लाइव] एक पुल अनुरोध की कहानी। SubstrateVM में `os.version`

पिछली चाल सफल होने में एक साल बीत चुका है: एक पोस्ट के बजाय YouTube पर एक वीडियो प्रकाशित करने के लिए। "सिंगलटन के बारे में शर्मनाक बात" ने यूट्यूब पर 7k व्यूज हासिल किए और टेक्स्ट वर्जन में हैबर से दोगुने। पूरी तरह से जिद्दी अवस्था में लिखे गए लेख और प्राचीन बटन समझौते के बारे में बताने के लिए - यह एक सफलता का एक सा है।

आज मैं पूरी रात एक नई रिलीज स्थापित कर रहा हूं। इस बार विषय बहुत अधिक हाल का है: प्रायोगिक प्रौद्योगिकी के लिए प्रतिबद्ध का इतिहास - सबस्ट्रेट वीएम। लेकिन तप की डिग्री एक नए स्तर तक बढ़ गई है।



वास्तव में अपनी टिप्पणियों के लिए आगे देख! मैं आपको याद दिलाता हूं कि यदि आप वास्तव में इस पोस्ट में कुछ सुधार करना चाहते हैं, तो गीथूब पर फ़ाइल करना सबसे अच्छा है। मैं कहना चाहूंगा कि " नए चैनल को लाइक और सबस्क्राइब करें , लेकिन क्या इसके सभी रिलीज़ आपके जावा हब में होंगे?"

तकनीकी रूप से: वीडियो में अंत तक एक झलक दिखाई देती है। मैं सिर्फ एक असम्पीडित वीडियो लिखा था, और मेरे m2 ssd सिर्फ पाँच सौ गीगाबाइट आकार में जल्दी से बह निकला। और कोई अन्य हार्ड ड्राइव डेटा के ऐसे दबाव का सामना नहीं कर सकता है। इसलिए, मुझे आधे घंटे के लिए डिस्कनेक्ट करना पड़ा और पिछले कुछ मिनटों को रिकॉर्ड करने के लिए एक अतिरिक्त पचास गिग्स खोजने के लिए ऊब गया था। यह GoogleChrome द्वारा संकलित फ़ाइलों को हटाकर प्राप्त किया गया था। मैंने रिकॉर्डिंग के समय एफबी में रिकॉर्डिंग सॉफ्टवेयर के बारे में लिखा, बहुत दर्द हो रहा है।

तकनीकी रूप से दिलचस्प एक और: किसी कारण से YouTube ने मुझे लाइव स्ट्रीमिंग को अवरुद्ध कर दिया। इसी समय, खाते पर एक भी हड़ताल और कलंक नहीं है। चलो उम्मीद करते हैं कि यह सिर्फ एक जाम है, और 90 दिनों के बाद सब कुछ वापस आ जाएगा।

यह लेख ओरेकल के स्वामित्व वाले कोड से उद्धृत करेगा। आप अपने लिए इस कोड का उपयोग नहीं कर सकते (जब तक कि आप मूल लाइसेंस नहीं पढ़ते हैं, और यह इसे शर्तों के तहत अनुमति देता है, उदाहरण के लिए, जीपीएल)। यह कोई मजाक नहीं है। ओल्सो, मैंने चेतावनी दी।

Prikazka (और एक परी कथा आगे होगी)


कई लोगों ने पहले ही कहानियां सुनी हैं कि "जावा में नया जावा लिखा जाएगा" और आश्चर्य है कि यह कैसे हो सकता है। वहाँ एक परियोजना मेट्रोपोलिस नीति दस्तावेज़ और जॉन रोज से एक संबंधित पत्र है, लेकिन वहाँ सब कुछ बहुत अस्पष्ट है।

यह कुछ खौफनाक, खूनी जादू की तरह लगता है। उसी चीज़ में, जिसे आप अभी आज़मा सकते हैं, न कि केवल कोई जादू नहीं है, बल्कि जब आप इसके दाँत खटखटाते हैं तो सब कुछ एक फावड़े की पीठ की तरह बेवकूफ होता है। बेशक, कुछ बारीकियां हैं, लेकिन यह बहुत बाद में होगा।

मैं इसे एक शिक्षाप्रद कहानी के उदाहरण पर दिखाऊंगा जो गर्मियों में हुई थी। वे स्कूलों में "हाउ आई स्पेंट द समर" निबंध कैसे लिखते हैं।

एक छोटी सी टिप्पणी शुरू करने के लिए। वर्तमान में जो परियोजना ओरेकल लैब्स में अहेड-ऑफ-टाइम संकलन कर रही है, वह ग्रेवालम है। घटक, जो वास्तव में, निशिताकी करता है और जावा कोड को एक निष्पादन योग्य फ़ाइल (एक निष्पादन योग्य में) में बदल देता है, शॉर्ट के लिए SubstrateVM या SVM है। डेटा व्यंग्यकारों (समर्थन वेक्टर मशीन) द्वारा उपयोग किए जाने वाले उसी संक्षिप्त नाम के साथ इसे भ्रमित न करें। एसवीएम के बारे में, एक महत्वपूर्ण भाग के रूप में, हम आगे बात करेंगे।

समस्या का बयान


तो, "मैंने गर्मी कैसे बिताई।" मैं छुट्टी पर बैठा, ग्रिल गीथूब पर दो F5 बिताए और इस पार आया:



सही मान देने के os.version एक व्यक्ति os.version चाहता है।

ठीक है, मैं बग को ठीक करना चाहता था? लड़के ने कहा - लड़के ने किया।

यदि हमारा ग्राहक झूठ बोल रहा है तो हम जाँच करेंगे।

 public class Main { public static void main(String[] args) { System.out.println(System.getProperty("os.version")); } } 

सबसे पहले, वास्तविक जावा में निकास कैसा दिखता है: 4.15.0-32-generic । हां, यह ताजा उबंटू एलटीएस बायोनिक है।

अब 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 खोज की और पाया कि ये सभी गुण os.version वर्ग में हैं।

मैं फ़ाइल के लिए पूर्ण पथ नहीं लिखूंगा, क्योंकि IntelliJ IDEA और Eclipse के लिए सही प्रोजेक्ट बनाने की क्षमता सीधे SVM ​​में बनाई गई है। यह बहुत ही शांत है और उस पीड़ा की याद नहीं दिलाता है जिसका ज्यादातर ओपनजेडके को अनुभव करना पड़ता है। आइडीई को हमारे लिए कक्षाएं खोलने दें। तो:

 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 । यहां तक ​​कि जहां uname -a बाल्टी का पिछला संस्करण वापस देता है, पुराने Ubunt पर।

यह स्पष्ट हो जाता है कि ये चर संकलन के समय स्रोत फ़ाइल में लिखे गए हैं।
और वास्तव में, आपको टिप्पणियों को ध्यान से पढ़ने की आवश्यकता है:

 /** System properties that are taken from the VM hosting the image generator. */ private static final String[] HOSTED_PROPERTIES 

अन्य तरीकों को लागू करने की आवश्यकता है।

निष्कर्ष


  • यदि आप SVM में प्रदर्शित होने के लिए "मुख्य जावा" से सिस्टम गुण चाहते हैं, तो यह बहुत सरल है। हम वांछित संपत्ति को सही जगह पर लिखते हैं, बस।
  • आप आईडीई में काम कर सकते हैं, जो एक ही समय में जावा और पायथन का समर्थन करता है। उदाहरण के लिए, IntelliJ IDEA में एक पायथन प्लगइन के साथ अंतिम या ग्रहण में समान।

दूसरा तरीका


यदि आप SystemPropertiesSupport SystemPropertiesSupport माध्यम से अफवाह करते SystemPropertiesSupport , तो हमें एक बहुत अधिक उचित चीज़ मिलती है:

 /** System properties that are lazily computed at run time on first access. */ private final Map<String, Supplier<String>> lazyRuntimeValues; 

अन्य बातों के अलावा, इन गुणों का उपयोग अभी भी निष्पादन योग्य बनाने की प्रक्रिया को अवरुद्ध नहीं करता है। यह स्पष्ट है कि अगर हम 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

अगर हम विंडोज के कार्यान्वयन के लिए उत्सुकता से बाहर जाते हैं, तो हम दुख की बात देखेंगे:

 @Override protected String userDirValue() { return "C:\\Users\\somebody"; } 

जैसा कि आप देख सकते हैं, विंडोज अभी तक :-) का समर्थन नहीं करता है, हालांकि, वास्तविक समस्या यह है कि विंडोज के लिए निष्पादनयोग्य की पीढ़ी अभी तक पूरी नहीं हुई है, इसलिए इन तरीकों का समर्थन करना वास्तव में पूरी तरह से अनावश्यक प्रयास होंगे।

अर्थात्, आपको निम्नलिखित विधि को लागू करने की आवश्यकता है:

 lazyRuntimeValues.put("os.version", this::osVersionValue); 

और फिर दो या तीन उपलब्ध इंटरफेस में इसका समर्थन करें।

लेकिन वहाँ क्या लिखना है?

निष्कर्ष


  • यदि आप एक नई संपत्ति जोड़ना चाहते हैं जो रनटाइम में गणना की जाती है, तो यह एक विधि लिखने का मामला है। परिणाम वर्तमान ऑपरेटिंग सिस्टम पर निर्भर हो सकता है, स्विचिंग तंत्र पहले से ही काम कर रहा है और पूछ नहीं रहा है।

थोड़ा सा पुरातत्व


पहली बात जो दिमाग में आती है, वह OpenJDK में एक कार्यान्वयन और ब्रेज़ेनली कॉपी-पेस्ट को देखना है। थोड़ी सी पुरातत्व और लूटपाट कभी भी एक बहादुर खोजकर्ता को नहीं रोकेगी!

आइडिया में किसी भी जावा परियोजना को खोलने के लिए स्वतंत्र महसूस करें, System.getProperty("os.version") , और ctrl + द्वारा System.getProperty("os.version") getProperty() विधि के कार्यान्वयन पर जाएं। यह पता चला है कि यह सब मूर्खतापूर्ण Properties में निहित है।

ऐसा लगता है, बस उस जगह को कॉपी-पेस्ट करें जहां ये Properties भरे हैं, और हंसी से उड़ते हुए, शून्य में भाग जाते हैं। दुर्भाग्य से, हम एक समस्या के पार आते हैं:

 private static native Properties initProperties(Properties props); 

Noooooooooooooo।



लेकिन यह सब इतनी अच्छी तरह से शुरू हुआ।

क्या कोई लड़का था?


जैसा कि हम जानते हैं, C ++ का उपयोग करना बुरा है। क्या SV में C ++ का उपयोग किया जाता है?

बस ऐसे ही! इसके लिए एक विशेष पैकेज भी है: src/com.oracle.svm.native

और इस पैकेज में, डरावनी-डरावनी, कुछ इस तरह के साथ getEnviron.c फ़ाइल निहित है:

 extern char **environ; char **getEnviron() { return environ; } 

यह C ++ के साथ खिलवाड़ करने का समय है


अब थोड़ा गहरा गोता लगाएँ और पूर्ण OpenJDK स्रोतों को खोलें।

यदि किसी के पास पहले से नहीं है, तो आप वेब पर देख सकते हैं या डाउनलोड कर सकते हैं। मैं आपको चेतावनी देता हूं, वे यहां से झूल रहे हैं , अभी भी मर्क्यूरियल की मदद से, और अभी भी लगभग आधा घंटा लगेगा।

हमें जो फ़ाइल चाहिए वह src/java.base/share/native/libjava/System.c

ध्यान दिया कि यह फ़ाइल का मार्ग है, और केवल नाम का नहीं? यह सही है, आप अपने नए चमकदार फैशनेबल आइडिया को शॉव कर सकते हैं, जो $ 200 प्रति वर्ष के लिए खरीदा जाता है। आप CLION आज़मा सकते हैं, लेकिन अपरिवर्तनीय मानसिक क्षति से बचने के लिए, केवल विज़ुअल स्टूडियो कोड लेना बेहतर है। वह पहले से ही कुछ पर प्रकाश डालता है, लेकिन फिर भी समझ में नहीं आता है कि उसने क्या देखा (वह लाल रंग में सब कुछ पार नहीं करता है)।

System.c की संक्षिप्त रीटेलिंग:

 java_props_t *sprops = GetJavaProperties(env); PUTPROP(props, "os.version", sprops->os_version); 

बदले में, उन्हें src/java.base/unix/native/libjava/java_props_md.c
प्रत्येक प्लेटफ़ॉर्म की अपनी ऐसी फ़ाइल होती है, वे #define माध्यम से स्विच करते हैं।

और यहीं से शुरू होता है। कई मंच हैं। AIX जैसी किसी भी नेक्रोफिलिया को रन किया जा सकता है, क्योंकि GraalVM आधिकारिक तौर पर इसका समर्थन नहीं करता है (जहाँ तक मुझे पता है, शुरुआत में GNU-Linux, macOS और Windows की योजना है)। जीएनयू / लिनक्स और विंडोज <sys/utsname.h> के उपयोग का समर्थन करते हैं, जिसमें ऑपरेटिंग सिस्टम का नाम और संस्करण प्राप्त करने के लिए पूर्वनिर्धारित तरीके हैं।

लेकिन macOS में गोवनोकॉड का एक भयानक टुकड़ा है

  • नाम "मैक ओएस एक्स" इसमें हार्डकॉकेट है (हालांकि यह लंबे समय से मैकओएस है);
  • यह makoshi के संस्करण पर निर्भर करता है। 10.9 से पहले, SDK के पास operatingSystemVersion फ़ंक्शन नहीं था, और आपको SystemVersion.plist हाथ से पढ़ना था;
  • इस घटाव के लिए, यह इस तरह से ObjC एक्सटेंशन का उपयोग करता है:

 // Fallback if running on pre-10.9 Mac OS if (osVersionCStr == NULL) { NSDictionary *version = [NSDictionary dictionaryWithContentsOfFile : @"/System/Library/CoreServices/SystemVersion.plist"]; if (version != NULL) { NSString *nsVerStr = [version objectForKey : @"ProductVersion"]; if (nsVerStr != NULL) { osVersionCStr = strdup([nsVerStr UTF8String]); } } } 

यदि शुरू में इसे अच्छी शैली में मैन्युअल रूप से फिर से लिखने का विचार था, तो यह जल्दी से वास्तविकता में दुर्घटनाग्रस्त हो गया। क्या होगा अगर मैं इस नूडल्स के जंगल में इफ़्स से कहीं गड़बड़ कर रहा हूं, कोई इसे तोड़ देगा, और वे मुझे केंद्रीय वर्ग में लटकाएंगे? अच्छी तरह से nafig। कॉपी-पेस्ट करना आवश्यक है।

निष्कर्ष


  • आईडीई की जरूरत नहीं है;
  • सी ++ के साथ कोई भी संचार दर्दनाक, अप्रिय, पहली नजर में समझ में नहीं आता है।

कॉपी-पेस्ट आदर्श है?


यह एक महत्वपूर्ण मुद्दा है जिस पर आगे की पीड़ा की मात्रा निर्भर है। मैं वास्तव में मैन्युअल रूप से लिखना नहीं चाहता, लेकिन लाइसेंस का उल्लंघन करने के लिए अदालत में जाना और भी बुरा है। इसलिए मैं गितुब गया और सीधे कोड्राक स्टैंचू से इसके बारे में पूछा। यहाँ वह जवाब दिया है :

»OpenJDK कोड का पुन: उपयोग करना, उदाहरण के लिए, लाइसेंस के दृष्टिकोण से कॉपी-पेस्ट एक सामान्य बात है। हालाँकि, इसका एक बहुत अच्छा कारण है। अगर एक फीचर को बिना कॉपी किए JDK कोड का उपयोग करके लागू किया जा सकता है, उदाहरण के लिए, इसे प्रतिस्थापन के साथ पैच करना, तो यह बहुत बेहतर होगा। "

यह आधिकारिक कॉपी-पेस्ट अनुमति की तरह लगता है!

हमने सामान्य रूप से बात की ...


मैंने इस कोड के टुकड़े को पोर्ट करना शुरू कर दिया, लेकिन अपने आलस्य में भाग गया। विभिन्न संस्करणों के लिए macOS का परीक्षण करने के लिए, आपको नेक्रोफिलिक 10.8 माउंटेन शेर के साथ कम से कम एक खोजने की आवश्यकता है। मेरे पास मेरे दो ऐप्पल डिवाइस उपलब्ध हैं और एक दोस्त से है, साथ ही मैं इसे कुछ ट्रायल वीएमवेयर के लिए तैनात कर सकता हूं।

लेकिन आलस्य। और इस आलस्य ने मुझे बचा लिया।

मैं चैट रूम में गया और क्रिस सीटोन से पूछा कि कौन सा टूलकिन असेंबली के लिए सबसे उपयुक्त है। ओएस का कौन सा संस्करण समर्थित है, सी ++ संकलक, और इसी तरह।

जवाब में, उन्हें चैट से एक आश्चर्यजनक चुप्पी मिली और क्रिस ने जवाब दिया कि वह इस मुद्दे का सार नहीं समझते हैं।

इससे पहले कि मैं क्या करना चाहता था, यह पता लगा सकता हूं और उसे फिर कभी ऐसा न करने के लिए कहा।
यह वास्तव में एसवीएम का विचार याद कर रहा है। SVM शुद्ध जावा है, इसे OpenJDK से कोड में रखना नहीं चाहिए। आप इसे पढ़ सकते हैं, इसे जावा में बदल सकते हैं, लेकिन कोई भी OpenJDK से C ++ कोड नहीं चाहता है। यही आखिरी चीज है जो हम चाहते हैं।

गणित के पुस्तकालयों के उदाहरण ने उन्हें आश्वस्त नहीं किया। कम से कम, वे सी में लिखे गए हैं, और सी ++ को शामिल करने का मतलब कोड आधार के लिए पूरी तरह से नई भाषा को जोड़ना होगा। और एक जो कि फूफाफू है।

आपको क्या करने की आवश्यकता है? सिस्टम जावा में लिखें।

और यदि C / C ++ प्लेटफ़ॉर्म SDK पर कॉल से बचा नहीं जा सकता है, तो यह C API में लिपटे कुछ सिंगल सिस्टम कॉल होना चाहिए। जावा में डेटा खींचा जाता है और फिर जावा में व्यावसायिक तर्क को सख्ती से लिखा जाता है, भले ही प्लेटफ़ॉर्म एसडीके में सी ++ की तरफ से इसे अलग तरीके से करने के लिए सुविधाजनक तैयार तरीके हों।

मैंने यह समझा और स्रोत कोड का अध्ययन करना शुरू किया कि यह कैसे अलग तरीके से किया जा सकता है।

निष्कर्ष


  • किसी भी अस्पष्ट विवरण के बारे में चैट में लोगों से बात करें। वे जवाब देते हैं यदि प्रश्न पूरी तरह से बेवकूफ नहीं हैं। यद्यपि यह उदाहरण दिखाता है कि क्रिस मूर्खतापूर्ण मुद्दों पर चर्चा करने के लिए तैयार है, भले ही यह व्यक्तिगत रूप से अपना समय न बचाता हो;
  • C ++ प्रोजेक्ट में बिल्कुल भी मौजूद नहीं है। यह मानने का कोई कारण नहीं है कि कोई उसे फर्श के नीचे खींचने देगा;
  • इसके बजाय, आपको सिस्टम को अंतिम उपाय के रूप में सी का उपयोग करके जावा में लिखना होगा (उदाहरण के लिए, प्लेटफॉर्म एसडीके को कॉल करते समय)।

वायलिन वादक की जरूरत नहीं है


वायलिन वादक की जरूरत नहीं है, प्रिय। वह केवल अतिरिक्त ईंधन खाता है।

तब मैं कुछ उदासी से अभिभूत था, क्योंकि यहाँ देखो। अगर विंडोज पर हमारे पास <sys/utsname.h> , और हम <sys/utsname.h> उसके जवाब की उम्मीद करते हैं - यह आसान और सरल है।

लेकिन अगर वह वहां नहीं है, तो क्या किया जाएगा?

  • Cmd में निर्मित कमांड या विंडोज यूटिलिटीज को कॉल करें? रूसी में पाठ जारी करना जिसे पार्स करने की आवश्यकता है। यह बहुत नीचे है, और यह इस बात से मेल नहीं खा सकता है कि असली OpenJDK इस जगह पर क्या जवाब देगा।
  • रजिस्ट्री से लें? यहां तक ​​कि यहां भी बारीकियां हैं, उदाहरण के लिए, विंडोज 7 से 10 पर स्विच करते समय, रजिस्ट्री में डिजिटल नंबर को संग्रहीत करने की विधि बदल गई, और विंडोज 10 में आपको या तो प्रमुख और मामूली घटकों से हाथों को गोंद करने की आवश्यकता है, या बस जवाब दें कि यह एक अंक के लिए विंडोज 10 है। इनमें से कौन सी विधि अधिक सही है (उपयोगकर्ताओं के गधे पश्चाताप नहीं करेंगे) स्पष्ट नहीं है।

सौभाग्य से, मेरी पीड़ा पॉल वोगर की खोज से बाधित हुई , जिसने यह सब तय किया।

दिलचस्प बात यह है कि पहली बार में विज़ार्ड में सब कुछ ठीक हो गया था ( os.version ने परीक्षण में os.version बंद कर दिया था), और उसके बाद ही मैंने एक पुलक्रेस्ट पर ध्यान दिया। समस्या यह है कि इस कमेंट को गिथब पर एक पुलक्रेक के रूप में चिह्नित नहीं किया गया है - यह टिप्पणी में शिलालेख PullRequest: graal/1885 साथ एक सरल प्रतिबद्ध है। तथ्य यह है कि ओरेकल लैब्स के दोस्तों ने गितूब का उपयोग नहीं किया है, उन्हें केवल बाहरी कमिटर्स के साथ बातचीत करने की आवश्यकता है। हम सभी जो ओरेकल लैब्स में काम करने के लिए भाग्यशाली नहीं थे, उन्हें रिपॉजिटरी में नए कमिट की सूचनाओं की सदस्यता लेने और उन सभी को पढ़ने की आवश्यकता है।

लेकिन अब आप आराम कर सकते हैं और देख सकते हैं कि इस सुविधा को सही तरीके से कैसे लागू किया जाए।

आइए देखें कि यह किस तरह का जानवर है, सिस्टम जावा।

जैसा कि मैंने पहले कहा, सब कुछ सरल है, जैसे एक फावड़ा की पीठ, जब वे आपके दांत बाहर खटखटाने की कोशिश करते हैं। और बस दर्द के रूप में। पूल से बोली पर एक नज़र डालें:

 @Override protected String osVersionValue() { if (osVersionValue != null) { return osVersionValue; } /* On OSX Java returns the ProductVersion instead of kernel release info. */ 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 कैसे लिखा DarwinExecutableName है:

  @Override public Object apply(Object[] args) { /* Find out how long the executable path is. */ 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?"); } /* Allocate a correctly-sized buffer and ask again. */ 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) { /* Failure to find executable path. */ return null; } final String executableString = CTypeConversion.toJavaString(bufferPointer); final String result = realpath(executableString); return result; } } 

ये सभी CIntPointer , CCharPointer , PinnedObject , क्या।

मेरे स्वाद के लिए, यह असुविधाजनक और बदसूरत है। आपको जावा कक्षाओं की तरह दिखने वाले पॉइंटर्स के साथ मैन्युअल रूप से काम करने की आवश्यकता है। आपको समय में उपयुक्त release को कॉल करने की आवश्यकता है ताकि मेमोरी लीक न हो।

लेकिन अगर यह आपको लगता है कि ये अनुचित उपाय हैं, तो आप फिर से .NET में GC के कार्यान्वयन को देख सकते हैं और C ++ की ओर से भयभीत हो सकते हैं यदि आप समय पर नहीं रुकते हैं। मैं आपको याद दिलाता हूं कि यह एक विशाल सीपीपी फ़ाइल है जो मेगाबाइट से बड़ी है। उनके काम के कुछ वर्णन हैं, लेकिन वे बाहरी योगदानकर्ता द्वारा समझने के लिए स्पष्ट रूप से अपर्याप्त हैं। उपरोक्त कोड, यद्यपि गंदा दिख रहा है, जावा के लिए स्थैतिक विश्लेषण के माध्यम से काफी समझ में आता है और इसका विश्लेषण किया जाता है।

कमिट के सार के रूप में, मेरे पास उसके लिए प्रश्न हैं। और कम से कम विंडोज समर्थन वहां लागू नहीं किया गया है। जब विंडोज के लिए एक कोडजन दिखाई देता है, तो मैं इस कार्य को लेने की कोशिश करूंगा।

निष्कर्ष


  • सिस्टम जावा में लिखने की आवश्यकता है। प्रशंसा करो, मीठी रोटी कहो। अभी भी कोई विकल्प नहीं हैं;
  • GitHub पर रिपॉजिटरी की सूचनाओं के लिए सदस्यता लें और कमिट पढ़ें, अन्यथा महत्वपूर्ण PR द्वारा उड़ान भरी जाएगी;
  • यदि संभव हो, तो इस क्षेत्र के लिए जिम्मेदार लोगों की किसी भी बड़ी विशेषता के बारे में पूछें। बहुत सी चीजें लागू हैं, लेकिन वे अभी तक आम जनता के लिए ज्ञात नहीं हैं। एक साइकिल का आविष्कार करने का मौका है, और ओरेकल लैब्स के लोगों द्वारा बनाई गई तुलना में बहुत खराब है;
  • एक सुविधा से निपटने के दौरान, गीथूब में जिम्मेदार व्यक्ति को सूचित करना सुनिश्चित करें। यदि वह जवाब नहीं देता है - एक पत्र लिखें, तो टीम के सभी सदस्यों के पते आसानी से गुगुल हो जाते हैं।

उपसंहार


यह लड़ाई समाप्त होती है, लेकिन युद्ध बिल्कुल नहीं।

लड़ाकू, संवेदनशील रूप से हैबे पर नए लेखों की प्रतीक्षा करें और हमारे रैंक में फिट हों !

मैं आपको याद दिलाना चाहता हूं कि ओरेकल से एकमात्र आधिकारिक ग्रेवालम इंजीलवादी ओलेग श्लाव, अगले जोकर सम्मेलन में आएंगे। न केवल "केवल रूसी स्पीकर," लेकिन "सामान्य रूप से एकमात्र।" रिपोर्ट का शीर्षक ( "GraalVM के साथ जावा के आगे-आगे संकलन" ) यह संकेत देता है कि SubstrateVM बिना नहीं रह सकता है।

वैसे, ओलेग को हाल ही में एक सेवा हथियार जारी किया गया था - हैबे , शेलजदेव-ऑलेग पर एक खाता। अभी तक वहाँ कोई पोस्ट नहीं हैं, लेकिन आप इस उपयोगकर्ता नाम पर डाल सकते हैं।

आप टेलीग्राम में हमारे चैट रूम-चैट में ओलेग और ओलेग के साथ बात कर सकते हैं: @graalvm_ru । गितुब पर इश्शुयेव के विपरीत, आप किसी भी रूप में संवाद कर सकते हैं, और किसी को भी प्रतिबंधित नहीं किया जाएगा ( लेकिन यह सटीक नहीं है )।

मैं आपको यह भी याद दिलाता हूं कि हर हफ्ते, डेब्रीडिंग पॉडकास्ट के साथ, हम जावा डाइजेस्ट की रिलीज बनाते हैं। उदाहरण के लिए, यह अंतिम पाचन था । समय-समय पर, वहाँ GraalVM के बारे में खबरें आती हैं (वास्तव में, मैं पूरे मामले को एक GraalVM समाचार रिलीज़ में दर्शकों के सम्मान के कारण नहीं मोड़ता हूं :-)

इसे पढ़ने के लिए धन्यवाद - और जल्द ही मिलते हैं!

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


All Articles