जूलिया, इस बिंदु पर (मई 2019, v1.2 के साथ जूलिया v1.1 बाहर आने के लिए) वैज्ञानिक कंप्यूटिंग के लिए काफी परिपक्व है। V1.0 रिलीज ने वार्षिक रूप से कोड टूटने का संकेत दिया । इसके साथ, बहुत सारे वैज्ञानिक कंप्यूटिंग पुस्तकालयों को बिना किसी व्यवधान के बढ़ने का समय मिला है। जूलिया पैकेज का व्यापक अवलोकन pkg.julialang.org पर पाया जा सकता है ।
कोर वैज्ञानिक कंप्यूटिंग के लिए, DifferentialEquations.jl अंतर समीकरण (ODEs, SDES, DAEs, DDEs, गिलेस्पी सिमुलेशन, आदि), के लिए पुस्तकालय Flux.jl तंत्रिका नेटवर्क के लिए, और कूद गणितीय प्रोग्रामिंग (अनुकूलन के लिए पुस्तकालय: रैखिक, द्विघात, मिश्रित पूर्णांक, आदि प्रोग्रामिंग) वैज्ञानिक कंप्यूटिंग पारिस्थितिकी तंत्र के तीन कोने हैं। ईपीआईआरके इंटीग्रेटर्स , रनगे - कुट्टा - निस्ट्रॉम , स्टिफ / डिफरेंशियल- अलजेबेरिक डिफरेंशियल डिफरेंशियल डिफरेंशियल डिफरेंशियल इक्वेशन डिफरेंशियल डिफरेंशियल जैसी बड़ी डेवलपमेंट टीम को लागू करने के साथ विशेष रूप से डिफरेंशियल इक्वेशन लाइब्रेरी अन्य भाषाओं में आपको और अधिक विकसित होती है। , औरअनुकूली समय कठोर स्टोकेस्टिक अंतर समीकरण इंटीग्रेटर्स, समीपस्थ संवेदनशीलता विश्लेषण , रासायनिक प्रतिक्रिया डीएसएल , मैट्रिक्स-मुक्त न्यूटन-क्रायलोव, और पूर्ण (डेटा ट्रांसफर फ्री) जीपीयू संगतता जैसी अन्य अच्छाइयों का एक गुच्छा , तंत्रिका अंतर समीकरणों के प्रशिक्षण के साथ, सभी के साथ। शानदार बेंचमार्क परिणाम (अस्वीकरण: मैं प्रमुख डेवलपर हूं)।
परिपक्व जूलिया इकोसिस्टम के बारे में जो बात थोड़ी दिमाग़ी है, वह है इसकी रचनाशीलता। अनिवार्य रूप से, जब कोई व्यक्ति किसी भिन्न लायब्रेरी फ़ंक्शन को जैसा कि डिफरेंशियल ईक्शंस .jl में बनाता है, तो आप किसी भी AbstractArray / नंबर प्रकार का उपयोग करके मक्खी पर नया कोड उत्पन्न कर सकते हैं। उदाहरण के लिए, त्रुटि प्रसार ( मेजरमेंट.ज्ल ) के लिए एक पुस्तकालय है और जब आप इसे ओडीई सॉल्वर में चिपकाते हैं, तो यह स्वचालित रूप से ओडीई सॉल्वर का एक नया संस्करण संकलित करता है जो पैरामीटर नमूने के बिना त्रुटि प्रसार करता है । इस वजह से, आपको कुछ ऐसी सुविधाएँ नहीं मिल सकती हैं जो कि दस्तावेजित हैं क्योंकि सुविधाओं के लिए कोड स्वयं उत्पन्न करता है, और इसलिए आपको पुस्तकालय संरचना के बारे में अधिक सोचने की आवश्यकता है।
उन तरीकों में से एक जहां रचना सबसे उपयोगी है, रैखिक बीजगणित में है। उदाहरण के लिए ODE सॉल्वर्स आपको निर्दिष्ट करने की अनुमति देता है jac_prototype
, जिससे आप इसे जैकबियन के लिए प्रकार देते हैं जो आंतरिक रूप से उपयोग किया जाएगा। बेशक, लिनेराएल्जेब्रा मानक पुस्तकालय में चीजें हैं जैसे Symmetric
और Tridiagonal
आप यहां उपयोग कर सकते हैं, लेकिन टाइप जेनेरिक एल्गोरिदम में रचना की उपयोगिता को देखते हुए, लोगों ने अब तक जाकर पूरे सरणी प्रकार के पुस्तकालयों का निर्माण किया है। BandedMatrices.jl और BlockBandedMatrices.jl ऐसी लाइब्रेरी हैं, जो बैंडेड मैट्रिक्स प्रकार को परिभाषित करती हैं lu
, जिनमें फास्ट ओवरलोड होते हैं, जो उन्हें आंशिक अंतर समीकरणों की प्रणालियों के कठोर एमओएल विवेक के समाधान में तेजी लाने का एक अच्छा तरीका बनाते हैं।PDMats.jlसकारात्मक-निश्चित मैट्रिक्स के विनिर्देश के लिए अनुमति देता है। Elemental.jl आपको एक वितरित विरल जैकबियन को परिभाषित करने की अनुमति देता है। CuArrays.jl GPU पर सरणियों को परिभाषित करता है। आदि।
फिर आपके पास आपके सभी प्रकार के नंबर हैं। Unitful.jl संकलन समय पर यूनिट की जाँच करता है, इसलिए यह एक ओवरहेड-फ्री यूनिट्स लाइब्रेरी है। DoubleFloats.jl Quadmath.jl और ArbFloats.jl के साथ एक उच्च उच्च परिशुद्धता पुस्तकालय है । फॉरवर्डडिफ़.एलएल फ़ॉरवर्ड-मोड स्वचालित भेदभाव के लिए एक पुस्तकालय है जो दोहरी संख्या अंकगणित का उपयोग करता है। और मैं इनकी सूची जारी रख सकता हूं। और हाँ, आप उन्हें पर्याप्त रूप से सामान्य जूलिया लाइब्रेरी में विभेदित कर सकते हैं जैसे कि डिफरेंशियल ईक्शन्स.ज्ल। यहां तक कि कुछ ऐसा ApproxFun.jlजो बीजीय वस्तुओं के रूप में कार्य करता है (चेबफुन की तरह) इस जेनेरिक प्रणाली के साथ काम करता है, जिससे पीडीई के विनिर्देशन एक फ़ंक्शन स्थान में स्केल पर ODEs के रूप में होते हैं।
कंपोजिबिलिटी के फायदे और जिस तरह से जेनेरिक जूलिया फंक्शंस पर नए और कुशल कोड बनाने के लिए उपयोग किया जा सकता है, उसे देखते हुए, शुद्ध जूलिया में मुख्य वैज्ञानिक कंप्यूटिंग कार्यक्षमता के कार्यान्वयन को प्राप्त करने के लिए बहुत काम किया गया है। Optim.jl nonlinear अनुकूलन के लिए, NLsolve.jl nonlinear प्रणालियों को सुलझाने के लिए, IterativeSolvers.jl रैखिक प्रणालियों और eigensystems की पुनरावृत्ति समाधानकर्ताओं के लिए, BlackBoxOptim.jl ब्लैक बॉक्स अनुकूलन, आदि यहां तक कि तंत्रिका नेटवर्क पुस्तकालय के लिए Flux.jl सिर्फ CuArrays उपयोग करता है। jl की GPU क्षमताओं के लिए कोड का jl का स्वचालित संकलन। डिफेक्यूफ्लक्स.ज्ल में न्यूरल डिफरेंशियल इक्वेशन जैसी चीजों को बनाने वाली यह रचना मुख्य थी। Turing.jl जैसी संभावित प्रोग्रामिंग भाषाएं भी अब काफी परिपक्व हो गई हैं और एक ही अंतर्निहित टूलिंग का उपयोग करती हैं।
चूँकि जूलिया की लाइब्रेरियाँ मौलिक रूप से कोड जनरेशन टूल्स पर आधारित होती हैं, इसलिए इसमें कोई आश्चर्य नहीं होना चाहिए कि कोड जनरेशन के आसपास बहुत सारे टूलिंग हैं। जूलिया की प्रसारण प्रणाली मक्खी पर लगे हुए गुठली उत्पन्न करती है जो ऊपर वर्णित सुविधाओं का एक बहुत कुछ देने के लिए सरणी प्रकारों द्वारा अतिभारित हैं । CUDAnative.jl जूलिया कोड को GPU गुठली में संकलित करने की अनुमति देता है। ModelingToolkit.jl गणितीय कोड को बदलने के लिए एक प्रतीकात्मक प्रणाली में स्वचालित रूप से डी-शर्करा एएसटी को हटा देता है। Cassette.jlआपको संकलन समय से पहले अपने फ़ंक्शन को बदलने के लिए नियमों का उपयोग करके किसी और के मौजूदा फ़ंक्शन को "ओवरडब" करने की अनुमति देता है (उदाहरण के लिए: अपने सभी सरणी आवंटन को स्थिर सरणी आवंटन में बदल दें और जीपीयू में संचालन स्थानांतरित करें)। यह अधिक उन्नत टूलींग है (मुझे उम्मीद नहीं है कि कंपाइलर का प्रत्यक्ष नियंत्रण लेने के लिए हर कोई वैज्ञानिक कंप्यूटिंग कर रहा है), लेकिन यह है कि अगली पीढ़ी के टूलींग का एक बहुत कुछ बनाया जा रहा है (या इसके बजाय, कैसे विशेषताएं खुद लिख रही हैं)।
समानता के लिए, मैंने जीपीयू का उल्लेख किया है, और जूलिया ने अंतर्निहित मल्टीथ्रेडिंग और वितरित कंप्यूटिंग का निर्माण किया है । जूलिया की मल्टीथ्रेडिंग बहुत जल्द एक समानांतर-कार्य रनटाइम (PARTR) आर्किटेक्चर का उपयोग करेगी जो नेस्टेड मल्टीड्रेडिंग के स्वचालित शेड्यूलिंग के लिए अनुमति देता है । यदि आप MPI का उपयोग करना चाहते हैं, तो आप MPI.jl का उपयोग कर सकते हैं । और फिर, निश्चित रूप से, इसका उपयोग करने का सबसे आसान तरीका सिर्फ अपने कार्यों में समानता का उपयोग करने के लिए एक AbstractArray प्रकार सेटअप का उपयोग करना है।
जूलिया में बुनियादी अंतर्निहित पारिस्थितिकी तंत्र भी है जो आप वैज्ञानिक अनुप्रयोगों के लिए उपयोग किए जाने वाले सामान्य उद्देश्य की भाषा की अपेक्षा करेंगे। यह है जूनो आईडीई एक साथ breakpoints के साथ निर्मित डिबगर , यह है Plots.jl भूखंडों के सभी प्रकार बनाने के लिए। बहुत सारे विशिष्ट उपकरण अच्छे हैं, जैसे कि Revise.jl एक फ़ाइल को सहेजते समय स्वचालित रूप से आपके फ़ंक्शन / लाइब्रेरी को अपडेट करता है। आपके पास अपने DataFrames.jl , सांख्यिकी पुस्तकालय , आदि हैं। सबसे अच्छी पुस्तकालयों में से एक वास्तव में वितरण है ।jl जो आपको वितरण के लिए एल्गोरिदम जेनेरिक लिखने देता है (उदाहरण के लिए:rand(dist)
जो भी वितरण पारित किया गया था, उसकी एक यादृच्छिक संख्या लेता है, और इसमें एकतरफा और बहुभिन्नरूपी वितरण का भार होता है (और निश्चित रूप से प्रेषण समय पर होता है, यह सब वितरण के लिए विशिष्ट फ़ंक्शन को हार्डकोड करने के रूप में तेज़ होता है)। डेटा हैंडलिंग टूलिंग , वेब सर्वर आदि का एक गुच्छा है , जिसे आप नाम देते हैं। इस बिंदु पर यह काफी परिपक्व है कि अगर कोई बुनियादी वैज्ञानिक चीज है और आप इसके अस्तित्व की उम्मीद करेंगे, तो आप इसे केवल .jl या जूलिया के साथ Google करेंगे और यह दिखाई देगा।
फिर क्षितिज पर ध्यान रखने के लिए कुछ चीजें हैं। PackageCompiler जूलिया पुस्तकालयों से बायनेरिज़ का निर्माण करना चाह रहा है, और इसमें पहले से ही कुछ सफलताएं हैं लेकिन अधिक विकास की आवश्यकता है। Makie.jl सहभागिता के साथ GPU- त्वरित प्लॉटिंग के लिए एक पूरी लाइब्रेरी है, और इसे अभी भी कुछ और काम करने की आवश्यकता है लेकिन यह वास्तव में जूलिया में मुख्य प्लॉटिंग लाइब्रेरी बनना चाहता है। Zygote.jl एक स्रोत-से-स्रोत स्वचालित भेदभाव लाइब्रेरी है, जिसमें अनुरेखण-आधारित AD (फ़्लक्स ट्रैकर, PyTorch, जैक्स) के प्रदर्शन के मुद्दे नहीं हैं, और यह सभी शुद्ध जूलरी कोड पर काम करना चाहता है। आदि।
अंत में, आप बहुत सारे स्थानों में बहुत सारे आंदोलन पा सकते हैं, लेकिन अधिकांश क्षेत्रों में पहले से ही एक ठोस परिपक्व पुस्तकालय है। यह अब ऐसी जगह पर नहीं है जहां आप पूछते हैं कि "क्या इसे अपनाया जाएगा?": जूलिया को पर्याप्त लोगों (लाखों डाउनलोड) द्वारा अपनाया गया है कि अच्छे के लिए चारों ओर रहने की गति है। यह वास्तव में एक अच्छा समुदाय है, इसलिए यदि आप कभी भी हवा को शूट करना चाहते हैं और समानांतर कंप्यूटिंग या संख्यात्मक अंतर समीकरणों के बारे में बात करते हैं, तो इसके लिए सबसे अच्छे चैट रूम में से कुछ जूलियांग स्लैक में हैं । चाहे वह एक भाषा हो जिसे आपको सीखना चाहिए एक व्यक्तिगत प्रश्न है, और क्या यह आपके प्रोजेक्ट के लिए सही भाषा है एक तकनीकी प्रश्न है, और वे भिन्न हैं। लेकिन क्या यह एक ऐसी भाषा है जो परिपक्व हो गई है और डेवलपर्स के एक बड़े संगत समूह का समर्थन है? यह एक सकारात्मक हाँ लगता है।