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

From Vigyanwiki
No edit summary
(No difference)

Revision as of 15:51, 19 July 2023

Cuneiform
G18225.png
Cf screenshot.jpg
Paradigmfunctional, scientific workflow
द्वारा डिज़ाइन किया गयाJörgen Brandt
पहली प्रस्तुति2013
Stable release
3.0.4 / November 19, 2018 (2018-11-19)
टाइपिंग अनुशासनstatic, simple types
कार्यान्वयन भाषाErlang
ओएसLinux, Mac OS
लाइसेंसApache License 2.0
फ़ाइल नाम एक्सटेंशनएस.cfl
वेबसाइटcuneiform-lang.org
Influenced by
Swift (parallel scripting language)

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

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

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

बाहरी सॉफ़्टवेयर एकीकरण

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

वर्तमान में समर्थित बाह्य प्रोग्रामिंग लैंग्वेजएँ हैं:

AWK(ऑक) और gnuplot(गनप्लेट) के लिए बाह्य भाषा समर्थन नियोजित परिवर्धन है।

प्रणाली प्ररूप करें

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

आधार डेटा प्रकार

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

अभिलेख और प्रतिरूप मिलान

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

let r : <a1 : Str, a2 : Bool> =
  <a1 = "my string", a2 = true>;

अभिलेख् को प्रक्षेपण के माध्यम से या प्रतिरूप मिलान के माध्यम से अभिगम किया जा सकता है। नीचे दिया गया उदाहरण अभिलेख r से दो क्षेत्रों a1 और a2 निकालता है।

let a1 : Str = ( r|a1 );

let <a2 = a2 : Bool> = r;

सूचियाँ और सूची प्रसंस्करण

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

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

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

for/list रैकेट (प्रोग्रामिंग लैंग्वेज) में, mapcar सामान्य लिस्प में या zipwith एर्लांग (प्रोग्रामिंग लैंग्वेज) में)।

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

for x <- xs do
  process-one( arg1 = x )
  : File
end;

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

for x <- xs, y <- ys do
  process-two( arg1 = x, arg2 = y )
  : File
end;

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

  fold acc = 0, x <- xs do
    add( a = acc, b = x )
  end;

समानांतर निष्पादन

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

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

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

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

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

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

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

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

let r : <a : File, b : File> =
  &lt;a = f(), b = g()&gt;;

उदाहरण

एक हैलो-वर्ल्ड स्क्रिप्ट

def greet( person : Str ) -> <out : Str>
in Bash *{
  out="Hello $person"
}*

( greet( person = "world" )|out );

यह स्क्रिप्ट बैश में एक टास्क greet को परिभाषित करती है जो इसके स्ट्रिंग तर्क के साथ "Hello" जोड़ता है। फलन एकल स्ट्रिंग क्षेत्रों के साथ एक अभिलेख तैयार करता है। greet लागू करने पर, तर्क करने वाले person को स्ट्रिंग "world" से बांधने से अभिलेख <out = "Hello world"> बनता है। इस अभिलेख को इसके क्षेत्र में प्रक्षेपित करने से स्ट्रिंग "Hello world" का मूल्यांकन होता है।

बैश में किसी कार्य को परिभाषित करके कमांड लाइन उपकरण को एकीकृत किया जा सकता है:

def samtoolsSort( bam : File ) -> <sorted : File>
in Bash *{
  sorted=sorted.bam
  samtools sort -m 2G $bam -o $sorted
}*

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

रिलीज़ इतिहास

संस्करण उपस्थिति कार्यान्वयन भाषा वितरण मंच बाह्य भाषा
1.0.0 May 2014 जावा अपाचे हडूप बैश, कॉमन लिसप, जीएनयु बीन शैल, पर्ल, पाइथन, आर, स्काला
2.0.x Mar. 2015 जावा एच्टीकोंडोर, अपाचे हडूप बैश, बीन शैल, कॉमन लिसप, मैटलैब , जीएनयु बीन शैल, पर्ल, पाइथन, आर, स्काला
2.2.x Apr. 2016 एर्लांग एच्टीकोंडोर, अपाचे हडूप बैश, पर्ल, पाइथन, आर
3.0.x Feb. 2018 एर्लांग डिस्ट्रिब्यूटेड एर्लांग बैश, एर्लांग, जावा, मैटलैब , जीएनयु बीन शैल, पर्ल, पाइथन, आर, स्काला, Racket

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

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

संस्करण 1

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

निम्न उदाहरण स्क्रिप्ट एक 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

क्यूनिफॉर्म 2.0.3 के लिए स्विंग-आधारित संपादक और आरईपीएल

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

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

 deftask unzip( <out( File )> : zip( File ) ) in bash *{
  unzip -d dir $zip
  out=`ls dir | awk '{print "dir/" $0}'`
}*

deftask split( <out( File )> : 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 ) -> <fileLst : [File]>
in Bash *{
  tar xf $tar
  fileLst=`tar tf $tar`
}*

let hg38Tar : File =
  'hg38/hg38.tar';

let <fileLst = faLst : [File]> =
  untar( tar = hg38Tar );

faLst;

संदर्भ

  1. "Joergen7/Cuneiform". GitHub. 14 October 2021.
  2. Brandt, Jörgen; Bux, Marc N.; Leser, Ulf (2015). "Cuneiform: A functional language for large scale scientific data analysis" (PDF). Proceedings of the Workshops of the EDBT/ICDT. 1330: 17–26.
  3. "Scalable Multi-Language Data Analysis on Beam: The Cuneiform Experience by Jörgen Brandt". Erlang Central. Archived from the original on 2 October 2016. Retrieved 28 October 2016.
  4. Bux, Marc; Brandt, Jörgen; Lipka, Carsten; Hakimzadeh, Kamal; Dowling, Jim; Leser, Ulf (2015). "SAASFEE: scalable scientific workflow execution engine" (PDF). Proceedings of the VLDB Endowment. 8 (12): 1892–1895. doi:10.14778/2824032.2824094.
  5. Bessani, Alysson; Brandt, Jörgen; Bux, Marc; Cogo, Vinicius; Dimitrova, Lora; Dowling, Jim; Gholami, Ali; Hakimzadeh, Kamal; Hummel, Michael; Ismail, Mahmoud; Laure, Erwin; Leser, Ulf; Litton, Jan-Eric; Martinez, Roxanna; Niazi, Salman; Reichel, Jane; Zimmermann, Karin (2015). "Biobankcloud: a platform for the secure storage, sharing, and processing of large biomedical data sets" (PDF). The First International Workshop on Data Management and Analytics for Medicine and Healthcare (DMAH 2015).
  6. "Scalable Multi-Language Data Analysis on Beam: The Cuneiform Experience". Erlang-factory.com. Retrieved 28 October 2016.
  7. Kelly, Peter M.; Coddington, Paul D.; Wendelborn, Andrew L. (2009). "Lambda calculus as a workflow model". Concurrency and Computation: Practice and Experience. 21 (16): 1999–2017. doi:10.1002/cpe.1448. S2CID 10833434.
  8. Barseghian, Derik; Altintas, Ilkay; Jones, Matthew B.; Crawl, Daniel; Potter, Nathan; Gallagher, James; Cornillon, Peter; Schildhauer, Mark; Borer, Elizabeth T.; Seabloom, Eric W. (2010). "Workflows and extensions to the Kepler scientific workflow system to support environmental sensor data access and analysis" (PDF). Ecological Informatics. 5 (1): 42–50. doi:10.1016/j.ecoinf.2009.08.008. S2CID 16392118.
  9. Di Tommaso, Paolo; Chatzou, Maria; Floden, Evan W; Barja, Pablo Prieto; Palumbo, Emilio; Notredame, Cedric (2017). "Nextflow enables reproducible computational workflows". Nature Biotechnology. 35 (4): 316–319. doi:10.1038/nbt.3820. PMID 28398311. S2CID 9690740.
  10. "एर्लांग में एक कार्यात्मक वर्कफ़्लो भाषा कार्यान्वयन" (PDF). Retrieved 28 October 2016.
  11. Brandt, Jörgen; Reisig, Wolfgang; Leser, Ulf (2017). "Computation semantics of the functional scientific workflow language Cuneiform". Journal of Functional Programming. 27. doi:10.1017/S0956796817000119. S2CID 6128299.