楔形文字(プログラミング言語)

楔形文字
パラダイム機能的科学的なワークフロー
デザイン:ヨルゲン・ブラント
初登場2013
安定版リリース
3.0.4 / 2018年11月19日 ( 2018-11-19 )
タイピングの規律静的、単純型
実装言語アーラン
OSLinuxMacOS
ライセンスApacheライセンス2.0
ファイル名拡張子.cfl
Webサイトcuneiform-lang.org
影響を受けた
Swift(並列スクリプト言語)

Cuneiformは、 大規模な科学的データ分析のためのオープンソースの ワークフロー言語です。 [1] [2]並列コンピューティングを促進する静的型付けの 関数型プログラミング言語です。汎用的な外部関数インターフェースを備えており、ユーザーは多くの外部プログラミング言語のソフトウェアを統合できます。組織レベルでは、Cuneiformは条件分岐一般的な再帰などの機能を提供し、チューリング完全です。この点で、Cuneiformは、関数型プログラミング言語の汎用性を提供しながら、 TavernaKNIMEGalaxyなどの科学的ワークフローシステムとMapReducePig Latinなどの大規模データ分析プログラミングモデルとの間のギャップを埋めようとする試みです

Cuneiformは分散Erlangで実装されています。分散モードで実行すると、GlusterCeph(あるいはHDFSなどの他のファイルシステムのFUSE統合)などのPOSIX準拠の分散ファイルシステムを駆動します。また、CuneiformスクリプトはHTCondorHadoop上で実行することもできます[3] [4] [5] [6]

Cuneiformは、科学的なワークフロー実行のモデルとして関数型プログラミングを提案したPeter Kellyの研究の影響を受けています。[7] [8]この点において、CuneiformはSwiftのようなデータフロープログラミングに基づく関連ワークフロー言語とは異なります[9]

外部ソフトウェア統合

外部ツールやライブラリ(RPythonライブラリなど)は、外部関数インターフェースを介して統合されます。これは、例えば、スニペットノードを介して外部ソフトウェアの利用を可能にするKNIMEや、 Javaソフトウェアとの統合にBeanShellサービスを提供するTavernaに似ています。タスクを外部言語で定義することで、外部ツールやライブラリのAPIを利用できます。これにより、ラッパーの作成やツールの再実装を必要とせずに、ツールを直接統合できます。[10]

現在サポートされている外国プログラミング言語は次のとおりです。

AWKおよびgnuplotの外国語サポートも追加される予定です。

型システム

Cuneiformは、シンプルで静的にチェックされた型システムを提供します。[11] Cuneiformはリストを複合データ型として提供しますが、空のリストにアクセスする際に発生する可能性のある実行時エラーを回避するため、従来のリストアクセサ(headとtail)を省略しています。代わりに、リストはマッピングまたは畳み込みのみによって、全か無かの方法でアクセスされます。さらに、Cuneiformは(組織レベルで)算術演算を省略しており、ゼロ除算の可能性を排除しています。部分的に定義された演算を省略することで、実行時エラーは外部コードでのみ発生することを保証できます。

基本データ型

Cuneiformは基本データ型として、ブール値、文字列、ファイルを提供します。ファイルは、外部関数間で任意の形式のデータを交換するために使用します。

レコードとパターンマッチング

Cuneiform はレコード(構造体)を複合データ型として提供します。以下の例は、 r2つのフィールド と を持つレコードa1変数の定義を示していますa2。最初のフィールドは文字列、2番目のフィールドはブール値です。

r : < a1 : Str a2 : Bool > = < a1 = "my string" a2 = true >とします。               

レコードには、射影またはパターンマッチングを介してアクセスできます。以下の例では、レコードから2つのフィールドa1とを抽出しますa2r

a1 : Str = ( r | a1 )とします。       < a2 = a2 : Bool > = rとします       

リストとリスト処理

xsさらに、Cuneiform は複合データ型としてリストを提供します。以下の例は、3つの要素を持つファイルリストである変数の定義を示しています。

xs : [ファイル] = [ 'a.txt' , 'b.txt' , 'c.txt' :ファイル]とします         

リストは for 演算子と fold 演算子で処理できます。ここで、 for 演算子には複数のリストを与え、リストの要素ごとに処理することができます(for/listRacket Common LispErlangと同様)。mapcarzipwith

以下の例は、単一のリストをマップして、結果をファイル リストにする方法を示しています。

for x <- xs do process - one ( arg1 = x ) :ファイルの終わり;           

以下の例は、結果もファイル リストとなる 2 つのリストを zip 圧縮する方法を示しています。

for x <- xs , y <- ys do process - two ( arg1 = x , arg2 = y ) :ファイル終了;                 

最後に、リストは fold 演算子を使って集計できます。次の例では、リストの要素を合計します。

 acc = 0 を折り畳む、x <- xs を実行する 加算(a = acc, b = x) 終わり;

並列実行

Cuneiformは純粋関数型言語です。つまり、可変参照をサポートしていません。そのため、部分項独立性を利用してプログラムを並列化可能な部分に分割することができます。Cuneiformスケジューラはこれらの部分をワーカーノードに分配します。さらに、CuneiformはCall-by-Name評価戦略を用いて、計算結果に寄与する値のみを計算します。最後に、外部関数適用はメモ化され、以前に導出された結果を含む計算を高速化します。

たとえば、次の楔形文字プログラムではf、 とのアプリケーションをg並行して実行できますが、 は依存しており、と のh両方が終了した場合にのみ開始できますfg

let output-of-f : File = f();g の出力: File = g();h( f = f の出力、 g = g の出力 );

次の楔形文字プログラムは、3 つの要素のリストにfマッピングすることによって、関数の 3 つの並列アプリケーションを作成します。f

let xs : [ファイル] = ['a.txt', 'b.txt', 'c.txt' : ファイル];x <- xs の場合、 f(x = x)  : ファイル終わり;

f同様に、およびの適用はgレコードの構築において独立しておりr、したがって並列に実行できます。

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

hello-world スクリプト:

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

このスクリプトは、文字列引数 の先頭に追加するgreetBashタスクを定義します。この関数は、単一の文字列フィールドを持つレコードを生成します。 を適用し、引数を文字列にバインドすることで、レコードが生成されます。このレコードをフィールドに投影することで、文字列 が評価されます"Hello "personoutgreetperson"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 } *                   

この例では、タスクが定義されています。このタスクはSAMtoolssamtoolsSortツールを呼び出し、BAM 形式の入力ファイルを受け取り、同じく BAM 形式のソートされた出力ファイルを生成します。

リリース履歴

バージョン外観実装言語配信プラットフォーム外国語
1.0.02014年5月ジャワアパッチハドゥープBash、Common Lisp、GNU Octave、Perl、Python、R、Scala
2.0.x2015年3月ジャワHTCondorApache HadoopBash、BeanShell、Common Lisp、MATLAB、GNU Octave、Perl、Python、R、Scala
2.2.x2016年4月アーランHTCondorApache Hadoopバッシュ、Perl、Python、R
3.0.x2018年2月アーラン分散ErlangBash、Erlang、Java、MATLAB、GNU Octave、Perl、Python、R、Racket

2016年4月、Cuneiformの実装言語はJavaからErlangに変更され、2018年2月には主要な分散実行プラットフォームがHadoopから分散Erlangに変更されました。さらに、2015年から2018年にかけては、代替実行プラットフォームとしてHTCondorが保守されていました。

Cuneiform の表面構文は、メジャー バージョン番号に反映されているように、2 回改訂されました。

バージョン1

2014年5月に公開された最初のドラフトでは、Cuneiformは、インタープリタが実行中に走査する静的データ依存グラフを構築するという点でMakeと密接に関連していました。後のバージョンとの主な違いは、条件文、再帰、静的型チェックが存在しないことでした。ファイルは、シングルクォートで囲まれた文字列値をチルダで並べることで文字列と区別されました。スクリプトのクエリ式はキーワード で導入されました。デフォルトの外国語はbashでした。関数適用は、最初のキーワード引数としてを取るフォームを使用して実行する必要がありました。1年後、この表面的な構文は、合理化されながらも類似したバージョンに置き換えられました。~targetapplytask

次のサンプル スクリプトは、FTP サーバーから参照ゲノムをダウンロードします。

download-ref-genome を宣言します。deftask ダウンロード-fa( fa : ~path ~id ) *{ wget $path/$id.fa.gz ガンジップ $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 パス: ref-genome-path id : ref-genome-id);ターゲットref-genome;

バージョン2

Cuneiform 2.0.3 用の Swing ベースのエディターと REPL

Cuneiform のサーフェス構文の第2版は、2015年3月に初公開され、Cuneiform の実装言語が Java から Erlang に移行した後も3年間使用され続けました。評価は、インタープリタが静的グラフを走査するのではなく、クエリ式を簡約する点で、以前のアプローチとは異なります。サーフェス構文が使用されていた間に、インタープリタは形式化され簡素化され、Cuneiform のセマンティクスの最初の仕様が生まれました。構文には条件文が採用されていました。ただし、ブール値はリストとしてエンコードされ、空のリストはブール値の偽、空でないリストはブール値の真として再利用されました。再帰は形式化の副産物として後に追加されました。ただし、静的型チェックはバージョン3で初めて導入されました。

次のスクリプトは、圧縮されたファイルを解凍し、均等なサイズのパーティションに分割します。

deftask unzip( <out( File )> : zip( File ) ) in bash *{ 解凍 -d ディレクトリ $zip out=`ls dir | awk '{print "dir/" $0}'`}*deftask split( <out( File )> : file( File ) ) in bash *{ 分割 -l 1024 $file txt 出力=txt*}*sotu = "sotu/stateoftheunion1790-2014.txt.zip";fileLst = split( ファイル: unzip( zip: sotu ) );ファイルリスト;


バージョン3

Cuneiform の表層構文の現在のバージョンは、以前の草案と比較すると、主流の関数型プログラミング言語とのギャップを埋めようとする試みです。シンプルで静的にチェックされる型システムを備え、リストに加えてレコードを複合データ構造の2つ目のタイプとして導入しています。ブール値は独立した基本データ型です。

次のスクリプトは、ファイルを untar してファイル リストを生成します。

def untar( tar : ファイル ) -> <fileLst : [ファイル]>Bashでは*{ タール xf $タール fileLst=`tar tf $tar`}*hg38Tar: ファイル = 'hg38/hg38.tar';let <fileLst = faLst : [ファイル]> = untar( tar = hg38Tar );ファルスト;

参考文献

  1. ^ “Joergen7/Cuneiform”. GitHub . 2021年10月14日.
  2. ^ Brandt, Jörgen; Bux, Marc N.; Leser, Ulf (2015). 「Cuneiform: 大規模科学データ分析のための関数型言語」(PDF) . EDBT/ICDTワークショップ議事録. 1330 : 17–26 .
  3. ^ 「Beamによるスケーラブルな多言語データ分析:楔形文字体験」(Jörgen Brandt著)Erlang Central . 2016年10月2日時点のオリジナルよりアーカイブ。 2016年10月28日閲覧
  4. ^ Bux, Marc; Brandt, Jörgen; Lipka, Carsten; Hakimzadeh, Kamal; Dowling, Jim; Leser, Ulf (2015). 「SAASFEE: スケーラブルな科学ワークフロー実行エンジン」(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). 「バイオバンククラウド:大規模バイオメディカルデータセットの安全な保管、共有、処理のためのプラットフォーム」(PDF)医療とヘルスケアのためのデータ管理と分析に関する第1回国際ワークショップ(DMAH 2015)
  6. ^ 「Beamによるスケーラブルな多言語データ分析:楔形文字の体験」Erlang-factory.com . 2016年10月28日閲覧
  7. ^ Kelly, Peter M.; Coddington, Paul D.; Wendelborn, Andrew L. (2009). 「ワークフローモデルとしてのラムダ計算」.並行性と計算:実践と経験. 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). 「環境センサーデータへのアクセスと分析を支援するKepler科学ワークフローシステムのワークフローと拡張」(PDF) . Ecological Informatics . 5 (1): 42– 50. doi :10.1016/j.ecoinf.2009.08.008. S2CID  16392118.
  9. ^ ディ・トンマーゾ、パオロ;チャッツォ、マリア。フローデン、エヴァン・W;バルハ、パブロ・プリエト。パルンボ、エミリオ。ノートルダム、セドリック(2017)。 「Nextflow は再現可能な計算ワークフローを可能にします。」ネイチャーバイオテクノロジー35 (4): 316–319 .土井:10.1038/nbt.3820。PMID  28398311。S2CID 9690740  。
  10. ^ 「Erlangによる関数型ワークフロー言語の実装」(PDF) . 2016年10月28日閲覧
  11. ^ Brandt, Jörgen; Reisig, Wolfgang; Leser, Ulf ( 2017). 「関数型科学ワークフロー言語Cuneiformの計算セマンティクス」. Journal of Functional Programming . 27. doi :10.1017/S0956796817000119. S2CID  6128299.
「https://en.wikipedia.org/w/index.php?title=Cuneiform_(programming_language)&oldid=1323979684」より取得