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

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

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

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

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

वर्तमान में समर्थित फोरीगन प्रोग्रामिंग लैंग्वेज हैं:


 * बैश (Bash)
 * अमृत (Elixir)
 * एर्लांग (Erlang)
 * जावा (JAVA)
 * जावास्क्रिप्ट(Javascript)
 * मैटलैब(MATLAB)
 * जीएनयू ऑक्टेव(Gnu Octave)
 * पर्ल(Perl)
 * पायथन (Python)
 * आर (R)
 * रैकेट (Racket)

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 में, इसका प्रमुख डिस्ट्रिब्यूटेड निष्पादन प्लेटफ़ॉर्म हडूप से डिस्ट्रिब्यूटेड एर्लांग में बदल गया। इसके अतिरिक्त, 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 में प्रारम्भ की गई थी।

निम्न स्क्रिप्ट एक ज़िप्पड(Zipped) फ़ाइल को विघटित करती है और इसे समान आकार के विभाजनों में विभाजित करती है। 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;