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

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

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

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

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

निम्न स्क्रिप्ट एक ज़िप्पड(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;