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

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

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

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

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

वर्तमान में समर्थित विदेशी प्रोग्रामिंग भाषाएँ हैं:


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

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

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

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

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

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

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

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

रैकेट (प्रोग्रामिंग भाषा) में,  सामान्य लिस्प में या   एर्लांग (प्रोग्रामिंग भाषा) में)।

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

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

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

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

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

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 सर्वर से एक संदर्भ जीनोम डाउनलोड करती है। declare download-ref-genome;

deftask download-fa( fa : ~path ~id ) *{ wget $path/$id.fa.gz    gunzip $id.fa.gz     mv $id.fa $fa }* ref-genome-path = ~' ftp://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes' ; ref-genome-id = ~'chr22'; ref-genome = apply(    task : download-fa     path : ref-genome-path     id : ref-genome-id ); target ref-genome;

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

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

<पूर्व> डिफ़टास्क अनज़िप (<आउट (फ़ाइल)>: ज़िप (फ़ाइल)) बैश में * { deftask unzip(  : zip( File ) ) in bash *{

unzip -d dir $zip out=`ls dir | awk '{print "dir/" $0}'` }* deftask split(  : file( File ) ) in bash *{ split -l 1024 $file txt out=txt* }* sotu = "sotu/stateoftheunion1790-2014.txt.zip"; fileLst = split( file: unzip( zip: sotu ) ); fileLst;

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

निम्न स्क्रिप्ट एक फ़ाइल को अनटार्स करती है जिसके परिणामस्वरूप एक फ़ाइल सूची बनती है। def untar( tar : File ) -> 

in Bash *{ tar xf $tar fileLst=`tar tf $tar` }* let hg38Tar : File = 'hg38/hg38.tar'; let  = untar( tar = hg38Tar ); faLst;