क्यूनिफॉर्म (प्रोग्रामिंग लैंग्वेज)

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

क्यूनिफॉर्म को वितरित एरलांग (प्रोग्रामिंग भाषा) में लागू किया गया है। यदि वितरित मोड में चलाया जाता है तो यह चमकीला  या सेफ (सॉफ्टवेयर)#CephFS (या किसी अन्य फाइल यूजरस्पेस में फाइलसिस्टम एकीकरण में एक फाइलसिस्टम, जैसे, Apache Hadoop#HDFS) जैसे POSIX-अनुपालक वितरित फ़ाइल सिस्टम को चलाता है। वैकल्पिक रूप से, क्यूनिफ़ॉर्म स्क्रिप्ट को HTCondor या Apache Hadoop के शीर्ष पर निष्पादित किया जा सकता है। क्यूनिफॉर्म पीटर केली के काम से प्रभावित है जो वैज्ञानिक वर्कफ़्लो निष्पादन के लिए एक मॉडल के रूप में कार्यात्मक प्रोग्रामिंग का प्रस्ताव करता है। इसमें, क्यूनिफ़ॉर्म स्विफ्ट (समानांतर स्क्रिप्टिंग भाषा) जैसी डेटाफ्लो प्रोग्रामिंग पर आधारित संबंधित वर्कफ़्लो भाषाओं से अलग है।

बाहरी सॉफ़्टवेयर एकीकरण
बाहरी उपकरण और लाइब्रेरी (उदाहरण के लिए, आर (प्रोग्रामिंग भाषा) या पायथन (प्रोग्रामिंग भाषा) लाइब्रेरी) एक विदेशी फ़ंक्शन इंटरफ़ेस के माध्यम से एकीकृत होते हैं। इसमें यह सदृश है, उदाहरण के लिए, KNIME जो स्निपेट नोड्स के माध्यम से बाहरी सॉफ़्टवेयर के उपयोग की अनुमति देता है, या Apache Taverna जो जावा (प्रोग्रामिंग भाषा) सॉफ़्टवेयर को एकीकृत करने के लिए बीनशेल सेवाएं प्रदान करता है। किसी कार्य को किसी विदेशी भाषा में परिभाषित करके किसी बाहरी टूल या लाइब्रेरी के एपीआई का उपयोग करना संभव है। इस तरह, किसी रैपर को लिखने या टूल को दोबारा लागू करने की आवश्यकता के बिना टूल को सीधे एकीकृत किया जा सकता है। वर्तमान में समर्थित विदेशी प्रोग्रामिंग भाषाएँ हैं:


 * बैश (यूनिक्स शेल)
 * अमृत (प्रोग्रामिंग भाषा)
 * एर्लांग (प्रोग्रामिंग भाषा)
 * जावा (प्रोग्रामिंग भाषा)
 * जावास्क्रिप्ट
 * मतलब
 * जीएनयू ऑक्टेव
 * पर्ल
 * पायथन (प्रोग्रामिंग भाषा)
 * आर (प्रोग्रामिंग भाषा)
 * रैकेट (प्रोग्रामिंग भाषा)

AWK और gnuplot के लिए विदेशी भाषा समर्थन नियोजित परिवर्धन है।

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

आधार डेटा प्रकार
आधार डेटा प्रकार के रूप में क्यूनिफॉर्म बूलियन्स, स्ट्रिंग्स और फ़ाइलें प्रदान करता है। इसमें, फ़ाइलों का उपयोग विदेशी कार्यों के बीच मनमाने प्रारूप में डेटा का आदान-प्रदान करने के लिए किया जाता है।

रिकॉर्ड और पैटर्न मिलान
क्यूनिफॉर्म यौगिक डेटा प्रकारों के रूप में रिकॉर्ड_(कंप्यूटर_साइंस)एस (स्ट्रक्चर) प्रदान करता है। नीचे दिया गया उदाहरण एक वेरिएबल की परिभाषा दिखाता है  दो क्षेत्रों के साथ एक रिकॉर्ड होना   और , पहला एक स्ट्रिंग है और दूसरा एक बूलियन है।

रिकॉर्ड्स को प्रक्षेपण के माध्यम से या पैटर्न मिलान के माध्यम से एक्सेस किया जा सकता है। नीचे दिया गया उदाहरण दो फ़ील्ड निकालता है  और   रिकॉर्ड से.

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

सूचियों को फॉर और फोल्ड ऑपरेटरों के साथ संसाधित किया जा सकता है। इसमें, तत्व-वार सूची का उपभोग करने के लिए ऑपरेटर को कई सूचियाँ दी जा सकती हैं (समान)।  रैकेट (प्रोग्रामिंग भाषा) में,   सामान्य लिस्प में या   एर्लांग (प्रोग्रामिंग भाषा) में)।

नीचे दिया गया उदाहरण दिखाता है कि किसी एकल सूची को कैसे मैप किया जाए, परिणाम एक फ़ाइल सूची होगी।

नीचे दिया गया उदाहरण दिखाता है कि दो सूचियों को कैसे ज़िप किया जाए, जिसके परिणामस्वरूप फ़ाइल सूची भी बन जाएगी।

अंत में, फोल्ड ऑपरेटर का उपयोग करके सूचियों को एकत्रित किया जा सकता है। निम्नलिखित उदाहरण किसी सूची के तत्वों का सार प्रस्तुत करता है।

समानांतर निष्पादन
क्यूनिफ़ॉर्म एक विशुद्ध रूप से कार्यात्मक भाषा है, अर्थात, यह संदर्भ (कंप्यूटर विज्ञान) का समर्थन नहीं करती है। परिणामस्वरूप, यह किसी प्रोग्राम को समानांतर भागों में विभाजित करने के लिए सबटर्म-स्वतंत्रता का उपयोग कर सकता है। क्यूनिफ़ॉर्म अनुसूचक इन भागों को कार्यकर्ता नोड्स में वितरित करता है। इसके अलावा, क्यूनिफॉर्म मूल्यों की गणना करने के लिए एक मूल्यांकन रणनीति#कॉल बाय नेम|कॉल-बाय-नेम मूल्यांकन रणनीति का उपयोग करता है, यदि वे गणना परिणाम में योगदान करते हैं। अंत में, विदेशी फ़ंक्शन अनुप्रयोग उन गणनाओं को गति देने के लिए संस्मरण हैं जिनमें पहले से प्राप्त परिणाम शामिल हैं।

उदाहरण के लिए, निम्नलिखित क्यूनिफ़ॉर्म प्रोग्राम अनुप्रयोगों की अनुमति देता है  और   जबकि समानांतर में चलाने के लिए   निर्भर है और इसे तभी शुरू किया जा सकता है जब दोनों हों   और   समाप्त हो गया है।

let output-of-f : File = f; let output-of-g : File = g;

h( f = output-of-f, g = output-of-g );

निम्नलिखित क्यूनिफ़ॉर्म प्रोग्राम फ़ंक्शन के तीन समानांतर अनुप्रयोग बनाता है  मानचित्रण द्वारा   तीन-तत्व सूची पर:

let xs : [File] = ['a.txt', 'b.txt', 'c.txt' : File];

for x <- xs do f( x = x ) : File end;

इसी प्रकार, के अनुप्रयोग  और   अभिलेख के निर्माण में स्वतंत्र हैं   और, इस प्रकार, समानांतर में चलाया जा सकता है:

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

बैश (यूनिक्स शेल) में किसी कार्य को परिभाषित करके कमांड लाइन टूल को एकीकृत किया जा सकता है: इस उदाहरण में एक कार्य  परिभाषित किया गया। यह टूल SAMtools को कॉल करता है, एक इनपुट फ़ाइल का उपभोग करता है, BAM प्रारूप में, और एक क्रमबद्ध आउटपुट फ़ाइल का उत्पादन करता है, वह भी BAM प्रारूप में।

रिलीज़ इतिहास
अप्रैल 2016 में, क्यूनिफ़ॉर्म की कार्यान्वयन भाषा जावा (प्रोग्रामिंग भाषा) से एर्लांग (प्रोग्रामिंग भाषा) में बदल गई और, फरवरी 2018 में, इसका प्रमुख वितरित निष्पादन प्लेटफ़ॉर्म Hadoop से वितरित एर्लांग में बदल गया। इसके अतिरिक्त, 2015 से 2018 तक HTCondor को एक वैकल्पिक निष्पादन मंच के रूप में बनाए रखा गया था।

क्यूनिफॉर्म की सतह वाक्यविन्यास को दो बार संशोधित किया गया था, जैसा कि प्रमुख संस्करण संख्या में दर्शाया गया है।

संस्करण 1
मई 2014 में प्रकाशित अपने पहले ड्राफ्ट में, क्यूनिफ़ॉर्म मेक (सॉफ़्टवेयर) से निकटता से संबंधित था, जिसमें उसने एक स्थिर डेटा निर्भरता ग्राफ़ का निर्माण किया था जिसे दुभाषिया ने निष्पादन के दौरान ट्रेस किया था। बाद के संस्करणों में मुख्य अंतर सशर्त, पुनरावर्तन, या स्थैतिक प्रकार की जाँच की कमी थी। टिल्ड के साथ एकल-उद्धृत स्ट्रिंग मानों को जोड़कर फ़ाइलों को स्ट्रिंग्स से अलग किया गया था. स्क्रिप्ट की क्वेरी अभिव्यक्ति को इसके साथ पेश किया गया था  कीवर्ड. बैश डिफ़ॉल्ट विदेशी भाषा थी. फ़ंक्शन एप्लिकेशन को एक का उपयोग करके निष्पादित किया जाना था  रूप जो लिया   इसके पहले कीवर्ड तर्क के रूप में। एक साल बाद, इस सतह सिंटैक्स को एक सुव्यवस्थित लेकिन समान संस्करण द्वारा बदल दिया गया।

निम्न उदाहरण स्क्रिप्ट एक FTP सर्वर से एक संदर्भ जीनोम डाउनलोड करती है।

 डाउनलोड-रेफ-जीनोम घोषित करें;

डेफ़टास्क डाउनलोड-एफए (एफए: ~ पथ ~ आईडी) * { wget $path/$id.fa.gz   गनज़िप $id.fa.gz    एमवी $id.fa $fa }*

रेफरी-जीनोम-पथ = ~'ftp://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes'; रेफरी-जीनोम-आईडी = ~'chr22';

रेफरी-जीनोम = लागू करें(   कार्य : डाउनलोड-एफए    पथ: रेफरी-जीनोम-पथ    आईडी: रेफरी-जीनोम-आईडी );

लक्ष्य रेफरी-जीनोम; 

संस्करण 2
क्यूनिफॉर्म सतह वाक्यविन्यास का दूसरा मसौदा, पहली बार मार्च 2015 में प्रकाशित हुआ, क्यूनिफॉर्म की कार्यान्वयन भाषा के रूप में जावा से एरलांग में संक्रमण के बाद तीन वर्षों तक उपयोग में रहा। मूल्यांकन पहले के तरीकों से अलग है जिसमें दुभाषिया एक स्थिर ग्राफ़ को पार करने के बजाय एक क्वेरी अभिव्यक्ति को कम कर देता है। जिस समय सतही वाक्यविन्यास उपयोग में रहा, उस दौरान दुभाषिया को औपचारिक रूप दिया गया और सरलीकृत किया गया, जिसके परिणामस्वरूप क्यूनिफॉर्म के शब्दार्थ का पहला विवरण सामने आया। वाक्यविन्यास में सशर्त विशेषताएँ थीं। हालाँकि, बूलियन्स को सूचियों के रूप में एन्कोड किया गया था, खाली सूची को बूलियन गलत के रूप में और गैर-रिक्त सूची को बूलियन सत्य के रूप में पुनर्चक्रित किया गया था। पुनरावर्तन को बाद में औपचारिकता के उपोत्पाद के रूप में जोड़ा गया। हालाँकि, स्थैतिक प्रकार की जाँच केवल संस्करण 3 में शुरू की गई थी।

निम्न स्क्रिप्ट एक ज़िपित फ़ाइल को विघटित करती है और इसे समान आकार के विभाजनों में विभाजित करती है।

 डिफ़टास्क अनज़िप (<आउट (फ़ाइल)>: ज़िप (फ़ाइल)) बैश में * { अनज़िप -d dir $zip आउट=`एलएस डीआईआर | awk '{print dir/ $0}'` }*

डेफ़टास्क स्प्लिट (<आउट (फ़ाइल)>: फ़ाइल (फ़ाइल)) बैश में * { स्प्लिट -एल 1024 $फ़ाइल txt आउट=txt* }*

sotu = sotu/stateoftheunion1790-2014.txt.zip; फ़ाइलएलएसटी = विभाजित(फ़ाइल: अनज़िप(ज़िप: सोटू));

फ़ाइलLst; 

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

निम्न स्क्रिप्ट एक फ़ाइल को अनटार्स करती है जिसके परिणामस्वरूप एक फ़ाइल सूची बनती है।

 def untar( tar : File ) ->  बैश में *{ टार एक्सएफ $टार फ़ाइलएलएसटी=`टार टीएफ $टार` }*

चलो hg38Tar : फ़ाइल = 'hg38/hg38.tar';

चलो  = अनटार(टार = hg38टार);

faLst; 