🩰

Cloud Nativeな最先端言語 Ballerinaの紹介

2023/08/13に公開

楽しくエンジニアをやっていますyuya-morimotoです。
最近Ballerina言語というおそらくほとんどの人が触ったことがないプログラミング言語を使って開発していますので紹介させてください。
今回は細かい実装には触れず環境構築と特徴のみ紹介します。

https://ballerina.io/

Ballerinaとは

統合用に最適化されたオープンソースのクラウドネイティブプログラミング言語

  • 分散システム統合に向いている・クラウドネイティブに向いているプログラミング言語になります。
  • JVM上で動作します。
  • あまり知っている人も多くないので、多分カッコいいです。

開発環境構築

実際触ってみたい方はぜひ環境構築してみてください!

  1. Ballerinaインストール
  2. エディタセットアップ
    • VSCode推奨ですのでVSCodeのインストール
    • 拡張機能のインストール
  3. bal cli動作確認
    > bal version
    Ballerina 2201.7.1 (Swan Lake Update 7)
    Language specification 2023R1
    Update Tool 1.3.15
    

特徴

1. 型安全性と型推論

詳細説明は不要。みなさん大好き静的型付け言語です。

sample.bal
type DoorState record {|
    boolean open;
    boolean locked;
|};

function main() {
    DoorState state = {open: true, locked: false};
}

2. データ指向

Ballerinaはデータとイベントを処理するためのロジックをSQLに似た構文で指定することができます。多言語だとそういったライブラリもありますが標準搭載です。

sample.bal
from Sale s in sales
	// join
	join Book b in check loadBooks() on s.bookId equals b.id
	// where
	where s.qty >= minSales
	// order by
	order by s.qty descending
	// limit
	limit 'limit
	// select
	select b;

3. クラウドネイティブな機能

結構面白い機能ですが、他言語で開発する際はDockerfile・k8s構成ファイル等を独自で実装することが多いかと思います。
Ballerinaはビルドオプションにdocker, k8sそれぞれをサポートしており自動的にDockerfileやk8s構成ファイルを生成することができます。
※設定ファイルを使用してカスタマイズも可能です。

# Docker
bal build --cloud="docker"

# Kubernetes
bal build --cloud="k8s"

以下が生成されたDockerfileのサンプルです。見た感じ無駄なものは入っていないので生成されるDockerfileに大きく問題はないかと思います。

Dockerfile
# Auto Generated Dockerfile
FROM ballerina/jvm-runtime:1.0

LABEL maintainer="dev@ballerina.io"
COPY auth-native-2.9.0.jar /home/ballerina/jars/ 
COPY ballerina-auth-2.9.0.jar /home/ballerina/jars/ 
COPY ballerina-cache-3.6.0.jar /home/ballerina/jars/ 
COPY ballerina-cloud-2.9.0.jar /home/ballerina/jars/ 
COPY ballerina-constraint-1.3.0.jar /home/ballerina/jars/ 
COPY ballerina-crypto-2.4.0.jar /home/ballerina/jars/ 
COPY ballerina-file-1.8.1.jar /home/ballerina/jars/ 
COPY ballerina-http-2.9.2.jar /home/ballerina/jars/ 
COPY ballerina-http.httpscerr-2.9.2.jar /home/ballerina/jars/ 
COPY ballerina-io-1.5.0.jar /home/ballerina/jars/ 
COPY ballerina-jwt-2.9.0.jar /home/ballerina/jars/ 
COPY ballerina-log-2.8.1.jar /home/ballerina/jars/ 
COPY ballerina-mime-2.8.0.jar /home/ballerina/jars/ 
COPY ballerina-oauth2-2.9.0.jar /home/ballerina/jars/ 
COPY ballerina-observe-1.1.0.jar /home/ballerina/jars/ 
COPY ballerina-observe.mockextension-1.1.0.jar /home/ballerina/jars/ 
COPY ballerina-os-1.7.0.jar /home/ballerina/jars/ 
COPY ballerina-rt-2201.7.1.jar /home/ballerina/jars/ 
COPY ballerina-task-2.4.0.jar /home/ballerina/jars/ 
COPY ballerina-time-2.3.0.jar /home/ballerina/jars/ 
COPY ballerina-url-2.3.0.jar /home/ballerina/jars/ 
COPY ballerinai-observe-0.0.0.jar /home/ballerina/jars/ 
COPY bcpkix-jdk15on-1.69.jar /home/ballerina/jars/ 
COPY bcprov-jdk15on-1.69.jar /home/ballerina/jars/ 
COPY cache-native-3.6.0.jar /home/ballerina/jars/ 
COPY commons-pool-1.5.6.wso2v1.jar /home/ballerina/jars/ 
COPY constraint-native-1.3.0.jar /home/ballerina/jars/ 
COPY crypto-native-2.4.0.jar /home/ballerina/jars/ 
COPY file-native-1.8.1.jar /home/ballerina/jars/ 
COPY http-native-2.9.2.jar /home/ballerina/jars/ 
COPY io-native-1.5.0.jar /home/ballerina/jars/ 
COPY jakarta.activation-1.2.2.jar /home/ballerina/jars/ 
COPY jboss-marshalling-2.0.5.Final.jar /home/ballerina/jars/ 
COPY jwt-native-2.9.0.jar /home/ballerina/jars/ 
COPY log-native-2.8.1.jar /home/ballerina/jars/ 
COPY lz4-1.3.0.jar /home/ballerina/jars/ 
COPY mime-native-2.8.0.jar /home/ballerina/jars/ 
COPY mimepull-1.9.11.jar /home/ballerina/jars/ 
COPY netty-buffer-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-codec-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-codec-http-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-codec-http2-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-codec-socks-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-common-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-handler-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-handler-proxy-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-resolver-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final-linux-aarch_64.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final-linux-x86_64.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final-osx-aarch_64.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final-osx-x86_64.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final-windows-x86_64.jar /home/ballerina/jars/ 
COPY netty-tcnative-boringssl-static-2.0.61.Final.jar /home/ballerina/jars/ 
COPY netty-tcnative-classes-2.0.61.Final.jar /home/ballerina/jars/ 
COPY netty-transport-4.1.94.Final.jar /home/ballerina/jars/ 
COPY netty-transport-native-unix-common-4.1.94.Final.jar /home/ballerina/jars/ 
COPY oauth2-native-2.9.0.jar /home/ballerina/jars/ 
COPY observe-internal-native-1.1.0.jar /home/ballerina/jars/ 
COPY observe-native-1.1.0.jar /home/ballerina/jars/ 
COPY opentelemetry-sdk-common-1.0.0.jar /home/ballerina/jars/ 
COPY opentelemetry-sdk-testing-1.0.0.jar /home/ballerina/jars/ 
COPY opentelemetry-sdk-trace-1.0.0.jar /home/ballerina/jars/ 
COPY opentelemetry-semconv-1.0.0-alpha.jar /home/ballerina/jars/ 
COPY org.wso2.transport.local-file-system-6.0.55.jar /home/ballerina/jars/ 
COPY os-native-1.7.0.jar /home/ballerina/jars/ 
COPY os-test-utils-1.7.0.jar /home/ballerina/jars/ 
COPY protobuf-java-3.20.3.jar /home/ballerina/jars/ 
COPY quartz-2.3.2.jar /home/ballerina/jars/ 
COPY task-native-2.4.0.jar /home/ballerina/jars/ 
COPY time-native-2.3.0.jar /home/ballerina/jars/ 
COPY url-native-2.3.0.jar /home/ballerina/jars/ 
COPY zero_hack-svg_parser-1.0.0.jar /home/ballerina/jars/ 
COPY zero_hack-svg_parser-17315150311338878158-observability-symbols.jar /home/ballerina/jars/ 
RUN addgroup troupe \
    && adduser -S -s /bin/bash -g 'ballerina' -G troupe -D ballerina \
    && apk add --update --no-cache bash \
    && rm -rf /var/cache/apk/*

WORKDIR /home/ballerina


USER ballerina

CMD java -Xdiag -cp "zero_hack-svg_parser-1.0.0.jar:jars/*" 'zero_hack.svg_parser.1.$_init'

4. シーケンスビジュアライズ機能

少しわかりにくいですが、以下のようなコードを書いた場合にVisualize機能を使用するとロジックが可視化されます。

多少の慣れは必要ですが、ドキュメント不要?かもしれません。

sample.bal
public function execute(
            string query,
            map<anydata>? variables = (),
            string? operationName = (),
            map<string|string[]>? headers = ()
    ) returns graphql:GenericResponseWithErrors|record {|anydata...;|}|json|graphql:ClientError {

        // gen variables
        map<anydata> clonedVariables;
        if variables is () {
            clonedVariables = {[REQUEST_VARIABLE_USERNAME_KEY] : githubUsername};
        } else {
            clonedVariables = variables.clone();
            clonedVariables[REQUEST_VARIABLE_USERNAME_KEY] = githubUsername;
        }

        // gen headers
        map<string|string[]> clonedHeaders;
        if headers is () {
            clonedHeaders = {[REQUEST_HEADER_AUTHORIZATION_KEY] : string `bearer ${githubPersonalAccessToken}`};
        } else {
            clonedHeaders = headers.clone();
            clonedHeaders[REQUEST_HEADER_AUTHORIZATION_KEY] = string `bearer ${githubPersonalAccessToken}`;
        }

        record {|anydata...;|}|graphql:ClientError result = githubClient->execute(query, clonedVariables, operationName, clonedHeaders);

        return result;
    };

シーケンス図

4. 拡張性

個人的にPackageを開発して公開しやすいと感じました。
ちなみにBallerina Centralに公開します。
公開してみたPackage

最後に

これだけ聞いてじゃあ使おうってなる方はおそらく少ないかと思いますが、こういう言語もあるんだってことを知ってあげてください🙇

ちなみにBallerinaタグはZennでは初になるので1号です!

日本でのコミュニティは無い?のかと思いますので海外のコミュニティやOSSのコードを読んでの勉強になります。Ballerinaやってみたい!って方は一緒に頑張りましょう!

Discussion