BT

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

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Ballerina - クラウド時代のプログラマのためのオープンソースのJVM言語およびプラットフォーム

Ballerina - クラウド時代のプログラマのためのオープンソースのJVM言語およびプラットフォーム

原文(投稿日:2020/01/29)へのリンク

オープンソーステクノロジ企業のWSO2がBallerina 1.1.0をリリースした新機能として、新しいBallerina Tool、VSCodeとIntelliJ IDEAを対象としたIDEサポートの強化、実行時型チェックのパフォーマンス向上、map、array、recordの生成とアクセスなどを備える。

ネットワーク分散アプリケーションを書くことを目的とした、新しいオープンソースのプログラミング言語であるBallerinaは、Scala、Groovy、Clojureなど、Java以外のJVM言語の新たなプレーヤだ。2019年にリリースされたBallerina 1.0は、WSO2がエンタープライズサービスバス(ESB)を改良する活動の中で開発を決断した、同社独自のプログラミング言語である。

当初は独自の仮想マシン実装を目指していたが、パフォーマンス上のボトルネックという問題があった。BVM(Ballerina Virtual Machine)と呼ばれていたその仮想マシンは、Balleriaコンパイラの生成するBVMバイトコードを解釈することで、Balleriaプログラムを実行する。Ballerinaの開発チームは最終的に、Javaで独自に実装したBVMは運用レベルに達していないと判断して、バージョン1.0のリリースより、JVMをターゲットとするコンパイラの採用を決定したのだった。

クラウド時代の開発者のプラットフォームとして、Ballerinaでは、ネットワークを言語の重要な機能として積極的に取り入れており、クライアントオブジェクトやサービス、リソース関数やリスナなど、基本部分の抽象化を導入している。これにより、分散コンピューティングに対する誤った認識を覆すような、レジリエントでセキュア、かつパフォーマンスに優れたネットワークアプリケーションの開発が可能になる。

WSO2で開発関連のシニアディレクタを務めるLakmal Warusawithana氏が、Ballerinaについて説明してくれた。

InfoQ: Ballerinaを開発しようと考えたきっかけは何でしたか?

Warusawithana: WSO2は"よりよいインテグレーション"というビジョンの下で設立されました。私たちのチームはこれまで、数千のインテグレーションプロジェクトとともに作業しています。ESB(Enterprise Service Bus)は、DSL(Domain-specific Language)を使って、インテグレーションをシンプルにするように設計されています。メディエータやエンドポイント、プロキシサービスのようなESBが高レベルの抽象化は、意味のあるグラフィカルなビューによるエンタープライズインテグレーションのソリューション開発を支援します。これは、JavaやJavaScript、Node.jsといったプログラム言語で記述されたソリューションでは不可能なことです。

15年以上におよぶ当社の経験の中には、複雑すぎてDSLでは記述不可能なシナリオがいくつもありました。このような場合、最終的にはJavaによるエクステンション記述という形式を取ることになります。実際の作業としては、DSLコンフィギュレーションとJavaエクステンションを組み合わせて複雑なソリューションを記述する、ということになるのですが、この方法はGUIベースのインテグレーションプロジェクトのもつアドバンテージを損ないます。ESBのグラフィカルインターフェースから見て、Java拡張機能はブラックボックスであるからです。

このことがビルドやデプロイメント、デバッグといったソフトウェア開発プロセスの多くの面において、新たな複雑性を生み出すことになるのです。ESBはそもそも、モノリシックなESBがエンタープライズインテグレーション全体をコントロールするという、集中型のアーキテクチャでうまく動作するように設計されているのですが、これは現在のマイクロサービスアーキテクチャではアンチパターンである上に、エンタープライズインテグレーションプロジェクトのアジリティやDevOpsにも悪い影響を与えます。

このような制限が、Ballerinaを開発する理由になりました。最終的な目標は、プログラミング言語として期待される汎用的な機能に加えて、クラウドネイティブ性とミドルウェア抽象化を含めることにより、エンタープライズインテグレーションをよりシンプルで、よりアジャイルで、DevOpsフレンドリなものにするために、プログラミング言語とプラットフォームを一貫した設計で開発することです。

InfoQ: Ballerinaが分散コンピューティングに対する誤った認識にどう立ち向かおうとしているのか、説明をお願いします。

Warusawithana: マイクロサービスアーキテクチャの登場によって、アプリケーションは、数多くの小さなプログラムを使用して開発されるようになりました。これらのプログラムは、おもにインテグレーションマイクロサービスで、ネットワークを越えて互いに通信し、アプリケーション機能を提供します。開発者はまず、これら小さなアプリケーションによる分散コンピューティングに関わるすべての誤解に対処しなくてはなりません。

例えば、このようなサービスは一般的に、シグナルを受信するまでネットワーク要求を待機する、明示的なループを記述することで実装されますが、Ballerinaでサービスを記述する場合には、言語の提供する構造を使用するだけでよいのです。エンドポイントやリスナ、サービス、リモートメソッドといったネットワークの抽象化が言語の中心的言語構造になっているので、多数の小さなサービスの扱うには非常に便利です。

Ballerinaサービスには、アプリケーションロジックを実装可能な複数のリソースメソッドがあります。サービスはリスナオブジェクトと連動することが可能で、ネットワークとサービスとのインターフェースをリスナオブジェクトが提供します。リスナオブジェクトは、所定のプロトコルに従ってリモートプロセスからのメッセージを受信し、それをアタッチされているサービスのリソースメソッド呼び出しに変換します。標準のリスナオブジェクトでは、HTTP/HTTPS、HTTP2、gRPC、WebSocketなどのプロトコルがサポートされています。

もうひとつの重要な抽象化が、クライアントオブジェクトの一部であるリモートメソッドです。Ballerinaのリモートメソッドは、非リモートメソッドとは異なるシンタックスを使って起動されます。リモートメソッドを呼び出すことで、クライアントオブジェクトで定義されたプロトコルを使ってメッセージが送信されるのです。メソッドの戻り値は、プロトコルの応答に対応します。リモートメソッド呼び出しはネットワーク越しで行われるため、ネットワークの不安定性を考慮したさまざまなレジリエントテクニックを使ってコードを実装する必要がありますが、BallerinaのHTTPクライアントオブジェクトには、サーキットブレーカやロード・バランシング、フェールオーバ、リトライ、タイムアウトといったレジリエントテクニックが標準で実装されています。

Ballerinaでは、ネットワークをアプリケーションコードから隠蔽しようとはしていません。XMLやJSON、テーブル、ストリームといったネットワークデータ形式を言語に組み込む方法を採用しているのです。これは、ネットワークが本質的に信頼性の低いものである以上、エラーはネットワークプログラミングの不可欠な部分である、という考え方に基いています。Ballerinaのアプローチでは、エラーは例外としてスローされるのではなく、明示的にチェックされます。設計面から、エラーを無視することを非常に難しくしているのです。

分散システムは、さまざまなコンポーネントでデータを共有することによって動作します。すべてのコミュニケーションがネットワークを越えて行われるので、ネットワーク・セキュリティの持つ役割は重要です。Ballerinaでは、トランスポートレベルのセキュリティを実装するための組み込みライブラリと、データ保護のための暗号化ライブラリが提供されています。

さらにBarellinaは、テイント解析機能(taint analyzer)を組み込みでコンパイラに備えています。テイント解析は、ユーザ入力によって変更可能な値を回避することにより、セキュリティを向上する手段です。適切にチェックされないユーザ入力には、すべてにおいて危険性を持っています。テイント解析機構を持つBallerinaコンパイラは、汚染された(tainted)データがプログラム内を伝搬する様子を監視して、信頼性の低い(汚染された)データを特定することが可能です。信頼性の低いデータがセキュリティの重要なパラメータに渡されると、コンパイルエラーとして報告されます。テイントチェックはコンパイル中に行われるので、プログラムを再設計して、危険な入力の周りに防護壁を建てることが可能になるのです。

これまで開発者は、単にプログラムを書いて、ビルドし、実行するだけでしたが、今日では、コンテナ内にパッケージングしたり、そのコンテナをより大規模なデプロイメント(Kubernetes)の一部にしたり、あるいはそれをサーバレス環境やサービスメッシュにデプロイしたりすることで、実行方法やマシン上にバイナリとして展開する方法(多くは仮想マシン)にも考えを巡らせなくてはならなくなりました。ですが、こういったデプロイメントの選択肢は、開発者のプログラミングエクスペリエンスには含まれていません。開発者は自身の実行環境の範囲内で、正しく動作するコードを書かなくてはならないのです。これをプログラミングの問題から除くのは、よいことではありません。

Ballerinaはコードからクラウドへの移行に特化すると同時に、ユニークな開発者エクスペリエンスを提供します。Ballerinaのコンパイラは、ソースコード内に定義されたアノテーションを読み込んで、DockerfilesやDockerイメージ、KubernetesのYAMLファイル、サーバレス関数など、さまざまなクラウドにコードをデプロイするためのアーティファクトを生成することができます。

InfoQ: プログラムのシーケンス図というコンセプトについて、説明をお願いします。シーケンス図に基いたコードを書くという、単なる方法に過ぎないのでしょうか、あるいは、シーケンス図からソースコードを生成したり、ソースコードからシーケンス図をエクスポートすることが可能なのでしょうか?

Warusawithana: 私たちは、15年以上にわたって数千に及ぶユーザのインテグレーションプロジェクトに従事した経験から、シーケンス図がサービスのインタラクション方法を視覚的に表現する最良の方法だと考えています。これがBallerina言語で並列性とネットワーク通信を抽象化する構文や意味論を設計する上での基本となっています。つまり、シーケンス図と密接に関係しているのです。さらにこれは、Ballerinaの文法によるコードのテキスト的表現とシーケンス図としての視覚的表現との間の、双方向のマッピングでもあります。Ballerina IDEプラグイン(例えばVSCodeプラグイン)では、ソースコードからシーケンス図を動的に生成することが可能です。生成されたシーケンス図には、その機能の並列処理やネットワーク通信に関連する側面がすべて示されています。

InfoQ: 新しい言語にBallerinaという名前を選んだのはなぜでしょう、何か重要な意味があるのでしょうか?

Warusawithana: プロジェクトの初期には適当な名前が見つかっていなかったので、NEL(New ESB Language)というコードネームを使用していました。2つのメールスレッドで100を越えるメールが名前の提案をしていたのですが、ひとつの名前に絞ることができなかったのです。"Ballerina"という名前は、開発チームのリードエンジニアであるManuranga Pereraが最初に提案したものです。エンタープライズインテグレーションとコンポーネントのインタラクションにバレー(ballet)の調和や振り付けに通じるものがある、という意味があります。

InfoQ: Ballerinaの将来的な見通しについて教えてください。

Warusawithana: Ballerinaは短期的なプロジェクトではありません。ほぼすべてのミドルウェアをプログラミング言語に組み込むという、壮大なプランを立てているのです。現在のリリースはjBallerina実装をベースとして、Javaバイトコードを出力するコンパイラと言語ライブラリ、標準ライブラリを提供しているのですが、直接ネイティブコードにコンパイルする実装を計画中で、このためにLLVMを使用する方向で検討を開始しています。

短期的な目標としては、2020年内に以下の機能を追加したいと考えています。

  • 言語組み込む形式のクエリ
  • ストリーミングクエリ
  • テーブルのコンセプト改善
  • データベース統合の改善
  • Balleriaプログラム間での分散トランザクションを含むトランザクション
  • ロッキング
  • データフロー形式のデータマッピング

InfoQ: 現在のあなたの責務を教えてください。つまり、日々の業務として何をしているのでしょうか?

Warusawithana: 現在の役職では、Ballerinaコミュニティに関わる啓蒙と開発者との関係構築をおもに行っています。時間のほとんどをBallerinaに関連する啓蒙的なプレゼンテーションや講演、記事の執筆、エコシステムの構築に当てています。以前はBallerinaの仕様や設計、おもにDockerやKubernetesとの統合に関するアーキテクチャなどにコントリビュートしていました。

Ballerinaを始めるには

Ballerinaアプリケーションには、終了するプロセスとして実行するためのmain()と、非終了型プロセスをホストするserviceという2つのエントリポイントがある。

それぞれのエントリポイントの使用方法をデモンストレートした短いサンプルを含むGitHubリポジトリが、入門用に用意されている。その他にも、さまざまな再利用可能なモジュールが提供されている。

IntelliJ IDEAVSCode用のBallerinaプラグインも開発者用に提供されている。

リソース

この記事に星をつける

おすすめ度
スタイル

BT