الكتابة المسمارية (لغة برمجة)
Cuneiform هي لغة برمجة مفتوحة المصدر لإدارة سير العمل في تحليل البيانات العلمية واسعة النطاق. [ 1 ] [ 2 ] وهي لغة برمجة وظيفية ذات كتابة ثابتة، تُعزز الحوسبة المتوازية . تتميز بواجهة وظائف خارجية متعددة الاستخدامات ، تُمكّن المستخدمين من دمج برامج من لغات برمجة خارجية متنوعة. على المستوى التنظيمي، توفر Cuneiform ميزات مثل التفرع الشرطي والاستدعاء الذاتي العام ، مما يجعلها لغة كاملة تورينج . في هذا السياق، تُعد Cuneiform محاولة لسد الفجوة بين أنظمة سير العمل العلمية مثل Taverna و KNIME و Galaxy ، ونماذج برمجة تحليل البيانات واسعة النطاق مثل MapReduce و Pig Latin، مع توفير عمومية لغة البرمجة الوظيفية.
تم تنفيذ Cuneiform بلغة Erlang الموزعة . عند تشغيلها في الوضع الموزع، فإنها تدعم نظام ملفات موزع متوافق مع معيار POSIX مثل Gluster أو Ceph (أو تكامل FUSE لنظام ملفات آخر، مثل HDFS ). بدلاً من ذلك، يمكن تنفيذ نصوص Cuneiform على HTCondor أو Hadoop . [ 3 ] [ 4 ] [ 5 ] [ 6 ]
تأثرت لغة Cuneiform بأعمال بيتر كيلي الذي اقترح البرمجة الوظيفية كنموذج لتنفيذ سير العمل العلمي. [ 7 ] [ 8 ] وفي هذا، تتميز Cuneiform عن لغات سير العمل الأخرى القائمة على برمجة تدفق البيانات مثل Swift . [ 9 ]
تكامل البرامج الخارجية
يتم دمج الأدوات والمكتبات الخارجية (مثل مكتبات R أو Python ) عبر واجهة وظائف خارجية . وهذا يشبه، على سبيل المثال، KNIME الذي يسمح باستخدام برامج خارجية من خلال عقد مقتطفات برمجية، أو Taverna الذي يوفر خدمات BeanShell لدمج برامج Java . من خلال تعريف مهمة بلغة أجنبية، يُمكن استخدام واجهة برمجة التطبيقات (API) لأداة أو مكتبة خارجية. وبهذه الطريقة، يُمكن دمج الأدوات مباشرةً دون الحاجة إلى كتابة غلاف برمجي أو إعادة تنفيذ الأداة. [ 10 ]
اللغات البرمجية الأجنبية المدعومة حاليًا هي:
من المخطط إضافة دعم اللغات الأجنبية لبرنامجي AWK و gnuplot .
نظام الكتابة
توفر لغة Cuneiform نظام أنواع بسيطًا يتم التحقق منه بشكل ثابت. [ 11 ] على الرغم من أن Cuneiform توفر القوائم كأنواع بيانات مركبة ، إلا أنها تتجاهل دوال الوصول التقليدية للقوائم (الرأس والذيل) لتجنب احتمالية حدوث أخطاء وقت التشغيل التي قد تنشأ عند الوصول إلى قائمة فارغة. بدلاً من ذلك، يتم الوصول إلى القوائم بطريقة شاملة أو غير شاملة من خلال عملية الربط أو الطي فقط. بالإضافة إلى ذلك، تتجاهل Cuneiform (على المستوى التنظيمي) العمليات الحسابية، مما يستبعد إمكانية القسمة على صفر. يسمح حذف أي عملية معرفة جزئيًا بضمان أن أخطاء وقت التشغيل يمكن أن تنشأ حصريًا في التعليمات البرمجية الخارجية.
أنواع البيانات الأساسية
توفر لغة Cuneiform أنواع البيانات الأساسية التالية: القيم المنطقية، والسلاسل النصية، والملفات. وتُستخدم الملفات هنا لتبادل البيانات بتنسيقات مختلفة بين الدوال الخارجية.
السجلات ومطابقة الأنماط
يُوفّر نظام Cuneiform السجلات (الهياكل) كأنواع بيانات مركبة. يُبيّن المثال أدناه تعريف متغير كسجل rيحتوي على حقلين a1، a2الأول نصي والثاني منطقي.
let r : < a1 : Str , a2 : Bool > = < a1 = "my string" , a2 = true >;يمكن الوصول إلى السجلات إما عن طريق الإسقاط أو عن طريق مطابقة الأنماط . يستخرج المثال أدناه الحقلين a1من a2السجل r.
let a1 : Str = ( r | a1 );let < a2 = a2 : Bool > = r ;القوائم ومعالجة القوائم
علاوة على ذلك، توفر لغة Cuneiform القوائم كأنواع بيانات مركبة. يوضح المثال أدناه تعريف متغير xsعبارة عن قائمة ملفات تحتوي على ثلاثة عناصر.
let xs : [ File ] = [ 'a.txt' , 'b.txt' , 'c.txt' : File ];يمكن معالجة القوائم باستخدام عاملي for و fold. هنا، يمكن إعطاء عامل for قوائم متعددة لمعالجة عناصر القائمة عنصرًا عنصرًا (على غرار for/listRacket أو Common Lisp أو Erlang ) .mapcarzipwith
يوضح المثال أدناه كيفية تطبيق عملية الربط على قائمة واحدة، والنتيجة هي قائمة ملفات.
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 أضف (أ = التسارع، ب = س) نهاية؛ التنفيذ المتوازي
لغة Cuneiform هي لغة وظيفية بحتة، أي أنها لا تدعم المراجع القابلة للتغيير . ونتيجة لذلك، يمكنها استخدام استقلالية المصطلحات الفرعية لتقسيم البرنامج إلى أجزاء قابلة للتوازي. يقوم مُجدول Cuneiform بتوزيع هذه الأجزاء على عُقد العمل. بالإضافة إلى ذلك، تستخدم Cuneiform استراتيجية تقييم "الاستدعاء بالاسم" لحساب القيم فقط إذا ساهمت في نتيجة الحساب. وأخيرًا، يتم تخزين تطبيقات الدوال الخارجية مؤقتًا لتسريع العمليات الحسابية التي تحتوي على نتائج مُشتقة مسبقًا.
على سبيل المثال، يسمح برنامج الكتابة المسمارية التالي بتشغيل التطبيقات fو gبالتوازي بينما hيعتمد على ولا يمكن تشغيله إلا عند انتهاء كل من fو .g
let output-of-f : File = f(); let output-of-g : File = g(); h( f = مخرج f, g = مخرج g );
يقوم برنامج الكتابة المسمارية التالي بإنشاء ثلاثة تطبيقات متوازية للدالة fعن طريق تطبيقها fعلى قائمة مكونة من ثلاثة عناصر:
let xs : [File] = ['a.txt', 'b.txt', 'c.txt' : ملف]؛ لكل x <- xs f( x = x ) : ملف نهاية؛
وبالمثل، فإن تطبيقات fو gمستقلة في بناء السجل r، وبالتالي يمكن تشغيلها بالتوازي:
let r : < a : File , b : File > = < a = f (), b = g () > ;أمثلة
برنامج "مرحباً بالعالم":
def greet ( person : Str ) -> < out : Str > in Bash * { out = "Hello $person" } *( تحية ( شخص = "عالم" ) | خارج );يُعرّف هذا النص البرمجي مهمةً greetفي Bash تُضيف قيمةً "Hello "إلى وسيطها النصي person. تُنتج الدالة سجلاً يحتوي على حقل نصي واحد out. يؤدي تطبيق greetربط الوسيط personبالنص إلى "world"إنتاج السجل <out = "Hello world">. يؤدي إسقاط هذا السجل على حقله إلى outتقييم النص "Hello world".
يمكن دمج أدوات سطر الأوامر عن طريق تحديد مهمة في Bash :
def samtoolsSort ( bam : File ) -> < sorted : File > in Bash * { sorted = sorted . bam samtools sort - m 2 G $bam - o $sorted } *في هذا المثال، يتم تعريف مهمة samtoolsSort. تستدعي هذه المهمة أداة SAMtools ، وتستهلك ملف إدخال بتنسيق BAM، وتنتج ملف إخراج مُرتب، بتنسيق BAM أيضًا.
سجل الإصدارات
| إصدار | مظهر | لغة التنفيذ | منصة التوزيع | اللغات الأجنبية |
|---|---|---|---|---|
| 1.0.0 | مايو 2014 | جافا | أباتشي هادوب | باش، كومون ليسب، جنو أوكتاف، بيرل، بايثون، آر، سكالا |
| 2.0.x | مارس 2015 | جافا | إتش تي كوندور ، أباتشي هادوب | باش، بين شيل، كومون ليسب، ماتلاب، جنو أوكتاف، بيرل، بايثون، آر، سكالا |
| 2.2.x | أبريل 2016 | إرلانغ | إتش تي كوندور ، أباتشي هادوب | باش، بيرل، بايثون، آر |
| 3.0.x | فبراير 2018 | إرلانغ | إرلانج الموزعة | باش، إرلانج، جافا، ماتلاب، جنو أوكتاف، بيرل، بايثون، آر، راكيت |
في أبريل 2016، تحولت لغة برمجة Cuneiform من Java إلى Erlang ، وفي فبراير 2018، تغيرت منصة التنفيذ الموزعة الرئيسية من Hadoop إلى Erlang الموزعة. بالإضافة إلى ذلك، تم الحفاظ على HTCondor كمنصة تنفيذ بديلة من 2015 إلى 2018.
تمت مراجعة الصيغة السطحية للكتابة المسمارية مرتين، كما يتضح من رقم الإصدار الرئيسي.
الإصدار 1
في مسودتها الأولى التي نُشرت في مايو 2014، كانت لغة Cuneiform وثيقة الصلة بلغة Make ، حيث كانت تُنشئ رسمًا بيانيًا ثابتًا لاعتمادية البيانات ، والذي كان المفسر يتنقل بين عناصره أثناء التنفيذ. وكان الاختلاف الرئيسي عن الإصدارات اللاحقة هو غياب الشروط، والاستدعاء الذاتي، والتحقق الثابت من النوع. وكانت الملفات تُميز عن السلاسل النصية بوضع علامات اقتباس مفردة بجانب قيم السلاسل النصية مع علامة المد (~) ~. وتم تقديم تعبير الاستعلام الخاص بالبرنامج النصي باستخدام targetالكلمة المفتاحية. وكانت لغة Bash هي اللغة الأجنبية الافتراضية. وكان تطبيق الدوال يتطلب استخدام applyصيغة تأخذ taskوسيطًا رئيسيًا كأول وسيط لها. وبعد عام، تم استبدال هذه الصيغة السطحية بنسخة مُبسطة ولكنها مشابهة.
يقوم البرنامج النصي التالي بتنزيل جينوم مرجعي من خادم FTP.
أعلن عن تنزيل الجينوم المرجعي؛ 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( المهمة: تنزيل-fa المسار: مسار الجينوم المرجعي المعرف: معرف الجينوم المرجعي ); الجينوم المرجعي المستهدف؛ الإصدار 2

ظلّت المسودة الثانية لبنية Cuneiform السطحية، التي نُشرت لأول مرة في مارس 2015، قيد الاستخدام لثلاث سنوات، متجاوزةً بذلك الانتقال من Java إلى Erlang كلغة تنفيذ لـ Cuneiform. يختلف التقييم عن الأساليب السابقة في أن المفسر يُختزل تعبير الاستعلام بدلاً من اجتياز رسم بياني ثابت. خلال فترة استخدام البنية السطحية، جرى تبسيط المفسر وإضفاء الطابع الرسمي عليه، مما أدى إلى أول مواصفات لدلالات Cuneiform. تضمنت البنية عبارات شرطية. مع ذلك، تم ترميز القيم المنطقية كقوائم، حيث تُعاد القائمة الفارغة كقيمة منطقية خاطئة، والقائمة غير الفارغة كقيمة منطقية صحيحة. أُضيفت خاصية الاستدعاء الذاتي لاحقًا كنتيجة ثانوية للتبسيط الرسمي. مع ذلك، لم يُقدّم التحقق من النوع الثابت إلا في الإصدار 3.
يقوم البرنامج النصي التالي بفك ضغط ملف مضغوط وتقسيمه إلى أقسام متساوية الحجم.
deftask unzip( <out( File )> : zip( File ) ) in bash *{ فك ضغط الملف $zip out=`ls dir | awk '{print "dir/" $0}'` }* deftask split( <out( File )> : file( File ) ) in bash *{ split -l 1024 $file txt الناتج = نص* }* sotu = "sotu/stateoftheunion1790-2014.txt.zip"; fileLst = split( file: unzip( zip: sotu ) ); fileLst; الإصدار 3
تُعدّ النسخة الحالية من بنية Cuneiform السطحية، مقارنةً بالمسودات السابقة، محاولةً لتقليص الفجوة مع لغات البرمجة الوظيفية الشائعة. وتتميز بنظام أنواع بسيط يتم التحقق منه بشكل ثابت، وتُضيف السجلات إلى جانب القوائم كنوع ثانٍ من هياكل البيانات المركبة . أما القيم المنطقية فهي نوع بيانات أساسي منفصل.
يقوم البرنامج النصي التالي بفك ضغط ملف، مما ينتج عنه قائمة بالملفات.
def untar( tar : File ) -> <fileLst : [File]> في Bash *{ tar xf $star fileLst=`tar tf $tar` }* let hg38Tar : File = 'hg38/hg38.tar'; دع <fileLst = faLst : [File]> = untar( tar = hg38Tar ); faLst; مراجع
- ↑ "Joergen7/Cuneiform" . GitHub . 14 أكتوبر 2021.
- ↑ براندت، يورغن؛ بوكس، مارك ن.؛ ليسر، أولف (2015). "الكتابة المسمارية: لغة وظيفية لتحليل البيانات العلمية واسعة النطاق" (ملف PDF) . وقائع ورش عمل EDBT/ICDT . 1330 : 17-26 .
- ↑ "تحليل البيانات متعدد اللغات القابل للتوسع على منصة Beam: تجربة الكتابة المسمارية بقلم يورغن براندت" . إرلانج سنترال . مؤرشف من الأصل في 2 أكتوبر 2016. تم الاطلاع عليه في 28 أكتوبر 2016 .
- ↑ بوكس، مارك؛ براندت، يورغن؛ ليبكا، كارستن؛ حكيم زاده، كمال؛ داولينغ، جيم؛ ليسر، أولف (2015). "SAASFEE: محرك تنفيذ سير العمل العلمي القابل للتوسع" (ملف PDF) . وقائع مؤسسة VLDB . 8 (12): 1892-1895 . doi : 10.14778/2824032.2824094 .
- ↑ بيساني، أليسون؛ براندت، يورغن؛ بوكس، مارك؛ كوغو، فينيسيوس؛ ديميتروفا، لورا؛ داولينغ، جيم؛ غلامي، علي؛ حكيم زاده، كمال؛ هوميل، مايكل؛ إسماعيل، محمود؛ لور، إروين؛ ليسر، أولف؛ ليتون، جان-إريك؛ مارتينيز، روكسانا؛ نيازي، سلمان؛ رايشل، جين؛ زيمرمان، كارين (2015). "Biobankcloud: منصة للتخزين الآمن ومشاركة ومعالجة مجموعات البيانات الطبية الحيوية الضخمة" (ملف PDF) . ورشة العمل الدولية الأولى حول إدارة البيانات وتحليلها في الطب والرعاية الصحية (DMAH 2015) .
- ↑ "تحليل البيانات متعدد اللغات القابل للتوسع على منصة Beam: تجربة الكتابة المسمارية" . Erlang-factory.com . تم الاطلاع عليه بتاريخ 28 أكتوبر 2016 .
- ↑ كيلي، بيتر م.؛ كودينغتون، بول د.؛ ويندلبورن، أندرو ل. (2009). "حساب لامدا كنموذج لسير العمل". التزامن والحوسبة: الممارسة والتجربة . 21 (16): 1999-2017 . doi : 10.1002/cpe.1448 . S2CID 10833434 .
- ↑ بارسيغيان، ديريك؛ ألتينتاس، إيلكاي؛ جونز، ماثيو ب.؛ كرول، دانيال؛ بوتر، ناثان؛ غالاغر، جيمس؛ كورنيلون، بيتر؛ شيلدهاور، مارك؛ بورر، إليزابيث ت.؛ سيبلوم، إريك و. (2010). "سير العمل وامتدادات نظام سير العمل العلمي كيبلر لدعم الوصول إلى بيانات المستشعرات البيئية وتحليلها" (ملف PDF) . المعلوماتية البيئية . 5 (1): 42-50 . doi : 10.1016/j.ecoinf.2009.08.008 . S2CID 16392118 .
- ^ دي توماسو، باولو. شاتسو، ماريا؛ فلودين ، إيفان دبليو . بارجا، بابلو برييتو؛ بالومبو، إميليو؛ نوتردام ، سيدريك (2017). “يتيح Nextflow سير العمل الحسابي القابل للتكرار”. التكنولوجيا الحيوية الطبيعية . 35 (4): 316-319 . دوى : 10.1038/nbt.3820 . بميد 28398311 . S2CID 9690740 .
- ↑ "تطبيق لغة سير العمل الوظيفي في إرلانج" (ملف PDF) . تم الاطلاع عليه بتاريخ 28 أكتوبر 2016 .
- ↑ براندت، يورغن؛ رايزيغ، فولفغانغ؛ ليسر، أولف ( 2017). "دلالات الحوسبة للغة سير العمل العلمي الوظيفي Cuneiform". مجلة البرمجة الوظيفية . 27. doi : 10.1017/S0956796817000119 . S2CID 6128299 .
- لغات البرمجة
- لغات سير العمل
- اللغات الوظيفية
- لغات البرمجة النصية
- أدوات برمجة لينكس
- أباتشي هادوب
- لغات البرمجة ذات الكتابة الثابتة
- برامج مجانية متعددة المنصات
- برنامج يستخدم ترخيص أباتشي
