プログラミング
Choral: Javaのためのコレオグラフィックプログラミング
Choral: Choreographic Programming for Java (choral-lang.org)
要約
Choralは、分散システム間の協調を定義するマルチパーティプロトコルであるコレオグラフィーをプログラミングするための言語です。Javaとの互換性を持ち、Choralコンパイラはコレオグラフィーを各ロールのJavaライブラリに変換します。これにより、開発者は分散システムの通信の不整合を防ぎ、生産性を向上させることができます。
全文翻訳
コレオグラフィックプログラミング言語
インストール
学習
記事
ソースを見る
Choralはコレオグラフィーをプログラミングするための言語です。コレオグラフィーとは、アリス、ボブなどの役割が共同で何かを行うためにどのように連携するかを定義するマルチパーティプロトコルです。Choralを使用すると、分散認証プロトコル、暗号プロトコル、ビジネスプロセス、並列アルゴリズム、または並行・分散システムのあらゆるプロトコルをプログラミングできます。
Choralコンパイラは、ボタンを押すだけで、コレオグラフィーを各役割のためのライブラリに変換します。開発者はこれらのライブラリを使用して、プログラム(クライアントやサービスなど)がコレオグラフィーに正しく従うようにすることができます。Choralの考え方をご覧ください。
Choralは、ライブラリがコレオグラフィーの準拠した実装であることを保証し、生産性を向上させ、互換性のない通信実装の記述を防ぎます。Choralの利点をご覧ください。
ChoralはJavaと相互運用可能であり、将来的には他の言語もサポートするように拡張する予定です。Choralは3つの方法でJavaと互換性があります。構文はJavaの直接的な拡張です(Javaを知っていれば、Choralはすぐそこです)。ChoralコードでJavaライブラリを再利用できます。Choralによって生成されたライブラリは純粋なJavaで、APIを制御でき、Javaプロジェクト内で直接使用できます。
現時点では、Choralはプロトタイプです。この言語は進行中の研究プロジェクトの一部であり(「概要」ページを参照)、将来のリリースでは後方互換性が変更される可能性があります。しかし、Choralは早期採用や教育ですでに利用可能です。興味のある方は、ご自身で試して、私たちにご連絡ください!
5歳児にもわかるように説明してください!
問題
分散システムをプログラミングするのは頭痛の種です。なぜなら、副作用を介して相互作用する複数のプログラムを正しく調整する方法を考え出す必要があり、それらを(チャネル経由での送受信など)手動で制御する必要があるからです。もし間違いを犯した場合、何がうまくいかなかったのかを見つけるのはさらに困難です。なぜなら、プログラムの並行実行中に発生する(そしてうまくいかなくなる)可能性のあるすべての通信シーケンスを把握する必要があるからです。テストは地獄です。多くの分散コンポーネントの統合、モックなどが必要になります。
Choral
Choralは、分散システムが従うべき全体の調整(プロトコル)を単一のプログラムとして記述できるため、これらの頭痛の種を軽減します。ChoralはJavaプログラマーにもフレンドリーです(C++、C#、Kotlin、Swiftなどにも近いです)。なぜなら、新しい種類の(高階)型で構文を拡張し、「クライアントがサービスにこれを通信し、次にサービスがログインプロバイダーにそれを通信し、次に[...]」のようなことを表現できるからです。
実際には、Choralは通信の実装に使用される頭痛の種となる副作用を型安全な抽象化でラップするため、実装のハイレベルな詳細に集中できます。プログラムの調整方法の説明と実際のそれとの間に不整合を導入した場合、例えば参加者でデータを期待しているのに通信を忘れた場合、Choralコンパイラはエラーを報告し、解決を支援します。さらに、ChoralにはChoralUnitというテストツールが付属しており、単体テストのシンプルさで統合テストを記述するのに役立ち、分散システムでの実行時(統合)テストを代行します。
本質的に、通常のプレーンなシーケンシャルプログラムのシンプルさでプログラミングできますが、強力な正しさの保証を備えた分散システムを、分散制御で得ることができます。これにより、より高い信頼性でそれらを使用または配布できます。また、異なるChoral(コンパイル済み)プログラムを確実に合成して、異なるプロトコルを混在させ、必要なトポロジーを構築することもできます。
言語
Choralプログラムがどのように見えるかをちらっと見たいだけであれば、「アリス、ボブ、キャロルが会議に行く」にジャンプして、後で詳細に戻ることができます。
Choralはオブジェクト指向言語ですが、ひねりがあります。Choralオブジェクトの型はT@(R1, ..., Rn)の形式です。ここで、Tは通常のインターフェースであり、R1, ..., Rnはオブジェクトを共同で実装する役割です。(技術的には、Choralデータ型は役割でパラメータ化された高階型であり、コレオグラフィーやマルチティアプログラミングのために以前に開発されたアイデアを一般化します。これについては、このページの最後に詳しく説明します。)
データ型に役割を組み込むことで、分布が型レベルで明らかになります。例えば、2つの役割であるアリスとボブで並列にhelloメッセージを印刷する簡単なプログラムを記述できます。
class Hellos@(Alice, Bob) {
// アリスとボブの2つの役割に分散されたオブジェクトのクラス
public static void main() {
System@Alice.out("Hello from Alice"@Alice); // アリスで "Hello from Alice" を印刷
System@Bob.out("Hello from Bob"@Bob); // ボブで "Hello from Bob" を印刷
}
}
クラスHellosはあまり面白くありません。なぜなら、アリスとボブは相互作用しないからです。相互作用は、データをある役割から別の役割に「移動」できるメソッドを呼び出すことによって達成されます。インターフェースSymChannelのcomメソッドなどがそうです。以下にこのインターフェースの簡略化されたビューを示します。チャネルのドキュメントで詳細をご覧ください。
// 2つの役割AとB間の双方向通信チャネル
interface SymChannel@(A, B) {
public void <T> T@B com(T@A mesg); // Aで型Tのデータが与えられた場合、Bで型Tのデータを返す
/* より多くのメソッドがありますが、ここでは省略 */
}
Choralはミドルウェアを固定しません。コレオグラフィーの型を満たす限り、独自の通信実装や既存のJavaコードをChoralで使用できます。Choralの型システムは、コレオグラフィーの通信要件(チャネルトポロジー、転送可能なデータの型など)を明示的に指定することを強制します。チャネルを使用すると、次の例で見られるように、より興味深いコレオグラフィーを記述できます。
アリス、ボブ、キャロルが会議に行く
アリスはボブに、キャロルも交えてあるトピックで会議を開けないか尋ねます。ボブはまずキャロルが行けるかどうかを知りたいので、彼女に尋ねます。彼女が行けるなら、彼は自分自身を検討します。最終的に、アリスはボブから会議が開催できるかどうかという最終結果を知る必要があります。このプロトコルを以下のクラスとして定義できます。ChoralはF#からフォワードチェイニング演算子>>を借用していることに注意してください。以下では、式>> object::method は object.method(expression) を意味します。
class MeetingVote@(Alice, Bob, Carol) {
public static Boolean@Alice run(
SymChannel@(Alice, Bob)<Object> chAB, // オブジェクトを転送できるアリスとボブ間の双方向チャネル
SymChannel@(Bob, Carol)<Object> chBC, // ボブとキャロル間のオブジェクトを転送できる双方向チャネル
String@Alice topic, // 会議のためのアリスのトピック
Predicate@Bob<String> bobsPredicate, // ボブが行けるかどうかを判断する述語
Predicate@Carol<String> carolsPredicate // キャロルが行けるかどうかを判断する述語
) {
String@Bob x = topic >> chAB<String>::com; // アリスのトピックがボブに通信される
Boolean@Bob carolsChoice = x // ボブのトピックのコピー..
>> chBC<String>::com // ..がキャロルに通信される
>> carolsPredicate::test // 次にキャロルが行きたいかどうかを判断する..
>> chBC<Boolean>::com; // ..そしてその結果をボブに通信する。
// 今、ボブはキャロルが行く場合にのみ行くことを検討し、その決定をアリスに通信する。
return (carolsChoice && bobsPredicate.test(x)) >> chAB<Boolean>::com;
}
}
開発方法論(または:Choralがすること)
Choralの開発方法論
Choralは、コレオグラフィーの正しい実装をJavaライブラリとして生成するように設計されています。Choralの開発方法論(上の図)では、システムが従うべき意図された調整はChoralコレオグラフィーとして記述されます。次に、Choralコンパイラはコレオグラフィーで定義された各役割のJavaライブラリを生成します。最後に、プログラマーはこれらのライブラリを、各システム参加者(サービス、クライアント、アクターなど)の独自のローカル実装で使用できます。例えば、与えられた