Cuneiform (язык программирования) - Cuneiform (programming language)

Клинопись
G18225.png
Cf screenshot.jpg
Парадигмафункциональный, научный рабочий процесс
РазработаноЙорген Брандт
Впервые появился2013
Стабильный выпуск
3.0.4 / 19 ноября 2018 г. (2018-11-19)
Печатная дисциплинапростые типы
Язык реализацииErlang
Операционные системыLinux, Mac OS
ЛицензияЛицензия Apache 2.0
Расширения имени файла.cfl
Интернет сайтклинопись.org
Под влиянием
Быстрый

Клинопись является Открытый исходный код язык рабочего процесса для масштабного анализа научных данных.[1][2]Это статически типизированный функциональный язык программирования продвижение параллельные вычисления. Отличается универсальным интерфейс внешней функции позволяя пользователям интегрировать программное обеспечение из многих внешних языков программирования. На организационном уровне Cuneiform предоставляет такие возможности, как условное ветвление и общая рекурсия делая это Полный по Тьюрингу. Таким образом, клинопись - это попытка сократить разрыв между системами научного рабочего процесса, такими как Таверна, KNIME, или же Галактика и модели программирования крупномасштабного анализа данных, такие как Уменьшение карты или же Свинья на латыни предлагая универсальность функционального языка программирования.

Клинопись реализована в распределенных Erlang. При работе в распределенном режиме он управляет POSIX -совместимая распределенная файловая система, например Gluster или же Ceph (или ПРЕДОХРАНИТЕЛЬ интеграция какой-либо другой файловой системы, например, HDFS ). В качестве альтернативы скрипты клинописи могут выполняться поверх HTCondor или же Hadoop.[3][4][5][6]

На клинопись повлияла работа Питера Келли, который предлагает функциональное программирование в качестве модели для выполнения научного рабочего процесса.[7][8]В этом Cuneiform отличается от родственных языков рабочего процесса на основе программирование потока данных подобно Быстрый.[9]

Интеграция внешнего программного обеспечения

Внешние инструменты и библиотеки (например, р или же Python библиотеки) интегрированы через интерфейс внешней функции. В этом он похож, например, на KNIME что позволяет использовать внешнее программное обеспечение через узлы сниппета, или Таверна который предлагает BeanShell услуги по интеграции Ява программного обеспечения. Определив задачу на иностранном языке, можно использовать API внешнего инструмента или библиотеки. Таким образом, инструменты могут быть интегрированы напрямую без необходимости написания оболочки или повторной реализации инструмента.[10]

В настоящее время поддерживаются следующие иностранные языки программирования:

Поддержка иностранных языков для AWK и гнуплот планируются дополнения.

Тип Система

Cuneiform представляет собой простую систему шрифтов со статической проверкой.[11] Хотя Cuneiform предоставляет списки как составные типы данных он опускает традиционные средства доступа к списку (начало и конец), чтобы избежать ошибок времени выполнения, которые могут возникнуть при доступе к пустому списку. Вместо этого доступ к спискам осуществляется по принципу «все или ничего» путем только сопоставления или сворачивания по ним. Кроме того, Cuneiform опускает (на организационном уровне) арифметику, что исключает возможность деления на ноль. Пропуск любой частично определенной операции позволяет гарантировать, что ошибки времени выполнения могут возникать исключительно во внешнем коде.

Базовые типы данных

В качестве базовых типов данных Cuneiform предоставляет логические значения, строки и файлы. Здесь файлы используются для обмена данными в произвольном формате между внешними функциями.

Записи и сопоставление с образцом

Клинопись обеспечивает записи (структуры) как составные типы данных. В приведенном ниже примере показано определение переменной. р запись с двумя полями а1 и а2, первая из которых является строкой, а вторая - логическим значением.

let r:  = ;

Доступ к записям можно получить либо через проекцию, либо через сопоставление с образцом. В приведенном ниже примере извлекаются два поля а1 и а2 из записи р.

пусть a1: Str = (r | a1); пусть  = r;

Списки и обработка списков

Кроме того, Cuneiform предоставляет списки как составные типы данных. В приведенном ниже примере показано определение переменной. хз список файлов с тремя элементами.

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

Списки можно обрабатывать с помощью операторов for и fold. Здесь оператору for может быть предоставлено несколько списков для поэлементного использования списка (аналогично для / list в Ракетка, mapcar в Common Lisp или же zipwith в Erlang ).

В приведенном ниже примере показано, как сопоставить один список, в результате чего получается список файлов.

для x <- xs do process-one (arg1 = x): Fileend;

В приведенном ниже примере показано, как заархивировать два списка, в результате чего также будет список файлов.

для x <- xs, y <- ys выполните процесс два (arg1 = x, arg2 = y): Fileend;

Наконец, списки можно агрегировать с помощью оператора свертки. В следующем примере суммируются элементы списка.

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

Параллельное исполнение

Клинопись - чисто функциональный язык, т. Е. Не поддерживает изменяемые ссылки. Как следствие, он может использовать независимость от субтермингов для разделения программы на параллелизуемые части. Планировщик Cuneiform распределяет эти части по рабочим узлам. Кроме того, Cuneiform использует Стратегия оценки вызова по имени для вычисления значений, только если они вносят вклад в результат вычисления. Наконец, приложения с внешними функциями памятный для ускорения вычислений, содержащих полученные ранее результаты.

Например, следующая программа Cuneiform позволяет применять ж и грамм работать параллельно, пока час является зависимым и может быть запущен только тогда, когда оба ж и грамм закончены.

let output-of-f: File = f (); let output-of-g: File = g (); h (f = вывод-of-f, g = output-of-g);

Следующая программа Cuneiform создает три параллельных приложения функции ж путем сопоставления ж над списком из трех элементов:

let xs: [File] = ['a.txt', 'b.txt', 'c.txt': File]; для x <- xs do f (x = x): Fileend;

Точно так же приложения ж и грамм независимы в построении записи р и, таким образом, может выполняться параллельно:

пусть r:  = ;

Примеры

Скрипт приветствия:

def greet (person: Str) ->  в Bash * {out = "Hello $ person"} * (greet (person = "world") | out);

Этот скрипт определяет задачу приветствовать в Баш что предшествует "Привет " к его строковому аргументу человек.Функция производит запись с одним строковым полем. из.Применение приветствовать, связывая аргумент человек к строке "Мир" производит запись <out = "Hello world">. Проецирование этой записи на свое поле из оценивает строку "Привет, мир".

Инструменты командной строки могут быть интегрированы путем определения задачи в Баш:

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

В этом примере задача samtoolsSort определен. Он вызывает инструмент SAMtools, используя входной файл в формате BAM и создавая отсортированный выходной файл, также в формате BAM.

История выпуска

ВерсияВнешностьЯзык реализацииПлатформа распространенияИностранные языки
1.0.0Май 2014 г.ЯваApache HadoopBash, Common Lisp, GNU Octave, Perl, Python, R, Scala
2.0.xМарт 2015 г.ЯваHTCondor, Apache HadoopBash, BeanShell, Common Lisp, MATLAB, GNU Octave, Perl, Python, R, Scala
2.2.xАпрель 2016 г.ErlangHTCondor, Apache HadoopБаш, Perl, Python, R
3.0.xФевраль 2018 г.ErlangРаспределенный ErlangBash, Erlang, Java, MATLAB, GNU Octave, Perl, Python, R, Racket

В апреле 2016 года язык реализации Cuneiform изменился с Ява к Erlang а в феврале 2018 года его основная платформа распределенного выполнения изменилась с Hadoop на распределенный Erlang. Дополнительно с 2015 по 2018 гг. HTCondor поддерживалась в качестве альтернативной исполнительной платформы.

Поверхностный синтаксис Cuneiform был пересмотрен дважды, что отражено в номере основной версии.

Версия 1

В своем первом проекте, опубликованном в мае 2014 г., Cuneiform была тесно связана с Делать в том, что он построил статический граф зависимостей данных, который интерпретатор проходил во время выполнения. Основным отличием от более поздних версий было отсутствие условных выражений, рекурсии или проверки статического типа. Файлы отличались от строк путем сопоставления строковых значений в одинарных кавычках с тильдой. ~. Выражение запроса скрипта было введено с цель ключевое слово. Баш был иностранным языком по умолчанию. Приложение функции должно было выполняться с использованием подать заявление форма, которая приняла задача в качестве первого аргумента ключевого слова. Год спустя этот поверхностный синтаксис был заменен упрощенной, но похожей версией.

Следующий пример сценария загружает эталонный геном с FTP-сервера.

объявить 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); целевой ref-геном;

Версия 2

Редактор на основе Swing и REPL для Cuneiform 2.0.3

Второй проект синтаксиса поверхности Cuneiform, впервые опубликованный в марте 2015 года, оставался в использовании в течение трех лет, пережив переход от Java к Erlang в качестве языка реализации Cuneiform. Оценка отличается от более ранних подходов тем, что интерпретатор сокращает выражение запроса вместо обхода статического графа. В то время как поверхностный синтаксис оставался в использовании, интерпретатор был формализован и упрощен, что привело к первой спецификации семантики Cuneiform. В синтаксисе использовались условные выражения. Однако логические значения кодировались как списки, в которых пустой список использовался как логическое ложное, а непустой список - как логическое истинное. Рекурсия была добавлена ​​позже как побочный продукт формализации. Однако проверка статического типа была введена только в версии 3.

Следующий сценарий распаковывает заархивированный файл и разбивает его на разделы одинакового размера.

deftask unzip (: zip (File)) в bash * {unzip -d dir $ zip out = `ls dir | awk '{print "dir /" $ 0}' `} * deftask split (: file (File)) в bash * {split -l 1024 $ file txt out = txt *} * sotu =" sotu /stateoftheunion1790-2014.txt.zip";fileLst = split (файл: распаковать (zip: sotu)); fileLst;


Версия 3

Текущая версия поверхностного синтаксиса Cuneiform, по сравнению с более ранними проектами, является попыткой сократить разрыв с основными языками функционального программирования. Он имеет простую, статически проверяемую систему типов и вводит записи в дополнение к спискам в качестве второго типа составной структуры данных. Логические значения - это отдельный базовый тип данных.

Следующий сценарий распаковывает файл, создавая список файлов.

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

Рекомендации

  1. ^ https://github.com/joergen7/cuneiform
  2. ^ Брандт, Йорген; Bux, Marc N .; Лезер, Ульф (2015). «Клинопись: функциональный язык для крупномасштабного анализа научных данных» (PDF). Материалы семинаров EDBT / ICDT. 1330: 17–26.
  3. ^ "Масштабируемый многоязычный анализ данных на луче: опыт клинописи Йоргена Брандта". Erlang Central. Архивировано из оригинал 2 октября 2016 г.. Получено 28 октября 2016.
  4. ^ Букс, Марк; Брандт, Йорген; Липка, Карстен; Хакимзаде, Камаль; Даулинг, Джим; Лезер, Ульф (2015). «SAASFEE: масштабируемый механизм выполнения научного рабочего процесса» (PDF). Труды эндаумента VLDB. 8 (12): 1892–1895. Дои:10.14778/2824032.2824094.
  5. ^ Бессани, Алиссон; Брандт, Йорген; Букс, Марк; Кого, Виниций; Димитрова, Лора; Даулинг, Джим; Голами, Али; Хакимзаде, Камаль; Хаммел, Майкл; Исмаил, Махмуд; Лауре, Эрвин; Лезер, Ульф; Литтон, Ян-Эрик; Мартинес, Роксанна; Ниази, Салман; Райхель, Джейн; Циммерманн, Карин (2015). «Biobankcloud: платформа для безопасного хранения, обмена и обработки больших наборов биомедицинских данных» (PDF). Первый международный семинар по управлению данными и аналитике для медицины и здравоохранения (DMAH 2015).
  6. ^ «Масштабируемый многоязычный анализ данных на луче: опыт клинописи». Erlang-factory.com. Получено 28 октября 2016.
  7. ^ Келли, Питер М .; Коддингтон, Пол Д .; Венделборн, Эндрю Л. (2009). «Лямбда-исчисление как модель рабочего процесса». Параллелизм и вычисления: практика и опыт. 21 (16): 1999–2017. Дои:10.1002 / cpe.1448.
  8. ^ Барсегян, Дерик; Алтинтас, Илкай; Джонс, Мэтью Б.; Ползать, Дэниел; Поттер, Натан; Галлахер, Джеймс; Корнильон, Питер; Шильдхауэр, Марк; Бурер, Элизабет Т .; Сиблум, Эрик В. (2010). «Рабочие процессы и расширения системы научных рабочих процессов Kepler для поддержки доступа к данным датчиков окружающей среды и их анализа» (PDF). Экологическая информатика. 5 (1): 42–50. Дои:10.1016 / j.ecoinf.2009.08.008.
  9. ^ Ди Томмазо, Паоло; Чатзу, Мария; Флоден, Эван В. Барха, Пабло Прието; Паламбо, Эмилио; Notredame, Седрик (2017). «Nextflow обеспечивает воспроизводимые вычислительные рабочие процессы». Природа Биотехнологии. 35 (4): 316–319. Дои:10.1038 / nbt.3820.
  10. ^ «Реализация функционального языка рабочих процессов в Erlang» (PDF). Получено 28 октября 2016.
  11. ^ Брандт, Йорген; Рейзиг, Вольфганг; Лезер, Ульф (2017). «Вычислительная семантика функционального языка рабочего процесса Cuneiform». Журнал функционального программирования. 27. Дои:10.1017 / S0956796817000119.