BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Concurnas - 並列およびGPUコンピューティングのための新しいJVM言語

Concurnas - 並列およびGPUコンピューティングのための新しいJVM言語

原文(投稿日:2020/05/26)へのリンク

Concurnasは、並行分散システムの構築を目的として設計された、オープンソースのJVMプログラミング言語だ。オブジェクト指向、関数型、リアクティブなプログラム構造を特徴とし、静的に型付けされている。

マルチスレッドの複雑性を隠蔽する簡潔な構文、GPUコンピューティングのネイティブサポート、ベクトル化(vectorization)、行列などのデータ構造を供えたConcurnasは、マシンラーニングアプリケーションやハイパフォーマンスな並行アプリケーションの開発を可能にする言語である。JavaやScalaなど、他のJVM言語との相互互換性も持っており、バージョン1.8から最新のGAリリース14までのOracle JDKとOpenJDKをサポートする。

作者でConcurnas Ltd.の創業者でもあるJason Tatton氏に、言語とその設計判断、将来について話を聞いた。

InfoQ: 新しいプログラミング言語を作ろうと思った動機は何でしたか?

Jason: この仕事を始めた当初、私は投資銀行のチームに所属して、投資モデルや高頻度取引(high frequency trading)用のシステムを開発していました。毎日の作業で解決する技術的な問題は、おもに高信頼性でスケーラブル、ハイパフォーマンスな分散並行システムの構築に関わるものでした。その作業の中で、現在一般的なほとんどの言語(JavaやC++)の抱える、共有可能な可変状態(shared mutable state)モデルのスレッドとロックに関わる並行性の問題が、並外れた才能を持つ世界レベルのエンジニアでさえも理解の難しいものだ、ということに気付いたのです。"もっとうまく解決する方法があるはずだ"、と思いました。そこで2017年に仕事を辞めて、この問題の解決に着手しました。そこから、並行プログラミングをもっと簡単にするプログラミング言語として、Concurnasが生まれたのです。 

InfoQ: LLVMなどではなく、JVMを選択したのはなぜですか?

Jason: この分野では、ランタイム/仮想マシン(LLVMやJVMのように)とホスト言語の両面で、たくさんのイノベーションがあります。新たな言語と仮想マシンを同時に開発するというのは大事業です。特に小規模なチームが厳しいスケジュールで開発する場合には、現実問題として、どちらか一方に重点を置かざるを得ません。

Concurnasは言語に重点を置くことを決めたので、残った問題は、どのランタイムを選択するのかという判断でした。パフォーマンスに関しては、LLVMとJVMに大差はありません。最終的には2つの理由で、JVMを選択しました。(1) 最もポピュラーで、広く使用されている仮想マシンであること — ほとんどの企業がJavaを使用しているので、JVMのユースケースはすでに確立しています。(2) JavaやScala、Kotlinといった、JVM言語で記述された既存の企業スケールのコードが大量に存在すること。これらの言語にはいずれも、理解や使用の容易な並行モデルの提供と、その活用が強く求められているのです。
ConcurnasをJVM上に実装することで、これら既存のJVM言語コードのすべてから、その機能を利用することが可能になります。Java標準ライブラリにもアクセス可能なので、言語をサポートするためにスクラッチから開発する必要はありません。

InfoQ: "Concurnas"という名前はどこから来たのでしょう?

Jason: Concurnasは並行プログラミングが誰でも簡単にできる言語を目標として設計されたので、当初は"並行(Concurrent)"の意味で"Concur"と読んでいました。その後、響きがいいという理由から"-nas"を付けて、"Concurnas"になったのです。

InfoQ: 一般的な傾向として、C、Rust、Goはおもにシステムプログラミングに、Java、Python、C#などの言語はアプリケーションプログラミングに使われています。Concurnasはどちらに分類されるのでしょうか?

Jason: Concurnasは並行、並列、分散コンピューティングといった問題を解決するために設計されています。Concurnasが解決するのに適した種類の問題は、システム分野とアプリケーション分野の両方のプログラミング領域に存在します。現在研究中の分野のひとつは、よりRustライクなメモリ管理モデルを採用することです。低レベルなメモリ管理が必要なユーザに手段を提供すると同時に、必要な場合にはConcurnasの持つガベージコレクションを伴う自動メモリ管理の既存機能も利用可能にしたいと思っています。

InfoQ: Concurnasはマシンラーニングアルゴリズムの記述にも向いているのでしょうか?

Jason: JVMとJava言語は素晴らしいパフォーマンスを備えていますが、MLアプリケーションにはあまり使用されていません。これは残念なことです。この原因は、Java言語の冗長性にあると思います。Concurnasはそのような問題の多くを解決する上に、その並行性モデルとGPUサポートの充実度 — いずれもMLアプリケーションにとって大きなメリットになります — からも、優れた候補のひとつであると言えます。

さらに私たちは、自動微分(automatic differentiation)の言語レベルでのサポートを加えることを検討しています。これが実現すれば、Concurnasは、AppleのSwiftに続いて、言語レベルでこの機能をサポートする2番目の言語になります。MLアルゴリズムの実装や、金融関連でデリバティブ計算に従事するユーザにとって、これは大きなメリットになるでしょう。

InfoQ: Concurnasの機能の中で、一番満足しているものは何ですか?

Jason: 最近のグラフィックカードにあるGPUは、大規模な並列計算において汎用的に活用することが可能です。GPUを利用するアルゴリズムが、通常のシングルコアCPUベースのアルゴリズムに比較して、100倍に及ぶ計算速度の改善を実現することも珍しくはありません。さらに、この計算をFLOPS当たりで考えれば、CPUベースの実装よりも大幅な消費電力の削減とコスト低減が可能になります。これまでは、汎用目的でGPUを活用するためにはC/C++を学ぶ必要があったため、多くの人たちにとって大きな障害になっていました。Concurnasは、充実したGPUサポートを言語自体に組み込んでいるので、慣用的な普通のConcurnasコードを記述して、それを直接GPU上で動作させることが可能です。最初にC/C++を学ぶ必要はありません。

この機能の提供は、2つの理由から非常に満足できるものです。(1) 計算の環境コストの低減が懸案事項である場合は、GPUコンピューティングに大きな効果が期待できます。言語レベルのサポートの提供は、GPUハードウェアの活用してそのメリットを享受するための門を開くことになるのです。技術的レベルでは、CoucurnasのGPUコンピューティングコンポーネントは、その大部分がConcurnas言語コード自体で記述されているのです!
これを実現するには、Cocurnas言語コンパイラをコンパイルするというブートストラップにおいて、技術的に興味深い課題がいくつかありましたが、"製品を自分たち自身で使用する(eat your own dog food)"という原則を守る上では重要なことでした。

InfoQ: Concurnasでは並行コンピューティングをどのように実現しているのでしょうか?内部的に同期プリミティブやスレッドを使用しているのですか?

Jason: Concurnasが公開している中核的な並行プリミティブはアイソレート(isolate)です。アイソレートは計算処理を並行して行う軽量スレッドです。Concurnasのコードはすべて、アイソレートの中で実行されます。アイソレート同士で、直接的にメモリを共有することはできません。依存データは生成時にアイソレート内にコピーされます。これによって予想外の状態共有を回避して、スケーラビリティを阻害するような、非決定的なプログラムの動作を防止しているのです。アイソレート間の通信はrefという特殊なオブジェクトを使用して、コントロールされた形で実現されています。refのサポートはConcurnas自体の型システムによって行われます。

生のスレッドを使用する場合、起動できるスレッドの数はJVMの制限によって決められますが、アイソレートでは、マシンがアクセス可能なメモリ量だけが制限になります。つまりアイソレートは、生のスレッドよりもはるかにスケーラビリティが高いのです。実行に関しては、アイソレートは多重化されて、継続(continuation)として協調的に動作します。他のアイソレートからのデータを待つため、処理の継続が不可能なポイントに到達したアイソレートは、その基盤となっている生のスレッドの実行を明け渡します。それによってスレッドは、別のアイソレートを実行可能になるのです。実行するマシンがシングルコアでもマルチコアでも、並行動作の基本的なモデルは同じです。

このモデルの副次的な効果として、リアクティブプログラミングのパラダイムを実現するためにrefを使用することができる、というものがあります。変化に反応して、ひとつないし多数の受信refに変化をトリガするか、refそのものを返す特別なアイソレートを(everyonchangeキーワード、あるいは相当するコンパクトなConcurnas構文を使って)定義することによって、私たち自身で処理のリアクティブグラフを構築することが可能になるのです。これは並行性の問題を解決する方法としては自然なものです。

InfoQ: Cocurnasは実運用でも使用可能でしょうか?

Jason: Cocurnasは2017年に開発が始められて、最初のプロダクションリリースがMITライセンスのオープンソースとしてリリースされたのは2019年12月でした。Concurnasは現在、Concurnas Ltd.が所有する実用レベルのプロダクトです。要請があれば、あらゆる規模の企業に対して、コマーシャルサービスの提供が可能です。インターネット上で利用可能な、言語関連の無償のコミュニティリソースも多くなっています。

InfoQ: 今後5年間の見通しについて教えてください。

Jason: 3年前にConcurnasを始めてから、多くのことが実現しました。今後5年、10年、30年とコミュニティが成長を続けていく中で、どんなことが実現できるのか、とても楽しみです!直近については、先程も述べたように、言語に自動微分を組み込むことを検討しています。これ以外では、大規模なデータセットを操作するためのオフヒープメモリ管理(off heap memory management)の改善や、GPUコンピューティングインターフェースの改良をしたいと思っています。最終的には、Jupyter notebookやVS Code、IntelliJ、Eclipseなどを対象に、IDEサポート形式での開発者ツールサポートを提供する予定です。

私たちはコミュニティを非常に重視して、フィードバックを歓迎すると同時に、この言語を積極的に使用しているユーザのニーズに応えていくことを約束しています。最後に、読者のみなさんがプログラム言語Concurnasに何を希望するのかをお聞きしたいと思います。Concurnas Webサイトで紹介している方法のいずれかで、私たちに連絡をください。

 

この記事に星をつける

おすすめ度
スタイル

BT