BoxLangに入門してみた

に公開

はじめに

記事の目的

最近、JVM上で動作する新しいプログラミング言語「BoxLang」を知ったので、その概要やインストール方法、基本的な使い方についてまとめます。
主に公式ドキュメントのGetting Startedセクションを参考に、入門者向けに解説します。

対象読者

  • 最近の新しい言語を知りたい方
  • JVM系の言語で新たな言語を開拓したい方

BoxLangに興味を持ったきっかけ

JJUGのナイトセミナーの通知で知りました。
ナイトセミナーには参加できなかったのですが内容自体に興味を持ちました。

BoxLangとは?

BoxLangの概要

BoxLangは「モダンなJVM上の動的言語」であり、Java完全互換・モジュール性・マルチランタイム対応・CFML互換を特徴とする新世代言語です。

どんな言語か

以下が特徴として挙げられています。

  • 動的言語: 型推論や自動キャストに対応し、実行時にメソッドやプロパティを追加・変更可能
  • 低冗長な文法: 簡潔で可読性の高い表現
  • スクリプト用途: エンタープライズアプリからクラウドLambdaまで幅広く対応
  • InvokeDynamic活用: 高速かつ予測可能な動的実行基盤
  • Java完全互換: Javaクラスやアノテーションを直接利用可能
  • 関数型サポート: クロージャや純粋関数を第一級オブジェクトとして扱える
  • イベント駆動: 内部イベントバスによる拡張性
  • モジュール化: 言語自体をモジュールで拡張可能
  • オープンソース: Apache 2ライセンスで公開、商用サポートあり
  • マルチプラットフォーム: JVM上はもちろん、iOS/Android/ブラウザ(WebAssembly)でも動作
  • スケジューラ: DSLでタスク管理可能
  • CFML互換: CFMLをBoxLangで実行・変換可能
  • 豊富なツール: VS Code拡張やデバッガを提供
  • 既存エコシステム活用: Java・CFMLのライブラリ、Maven CentralやForgeBoxの資産がそのまま利用可能

公式サイト・ドキュメント

BoxLangの特徴

マルチランタイム対応

https://boxlang.ortusbooks.com/getting-started/overview/multi-runtime
1つの言語で複数の実行環境をサポートします。現在の主な対応は以下の通りです。

ランタイム名 概要 ステータス
OS(Bare metal) 任意の OS 上で、Java が動作する環境での実行 Done
JSR-223 Java のスクリプトインターフェースを通じて動作 Done
MiniServer 純粋な Java 製の Web サーバ機構を持つランタイム Done
Servlet WAR Servlet ベースで WAR として配備可能 Done
CommandBox CommandBox 上で動く BoxLang エンジン Done
AWS Lambda BoxLang を AWS Lambda(サーバレス)で動作 Done
Docker BoxLang CLI、MiniServer、CommandBox を含む Docker イメージ Done
Azure Functions Microsoft Azure Functions 上での実行 In Progress
Google Cloud Functions Google Cloud Functions 上での実行 In Progress
Android Android デバイス上での実行 In Planning
iOS iOS 上での実行 In Planning
WebAssembly ブラウザ上で WebAssembly 化して実行 In Planning

Java・CFML互換

BoxLangはJavaとの互換性、CFML(ColdFusion Markup Language)をサポートしています。

  • Javaで書かれたクラスやライブラリをそのまま呼び出すことが可能
  • 既存Java資産を活かしつつBoxLangでの開発が可能となる

モダンな構文と拡張性

モダンな構文

  • セミコロン不要、型推論、シンプルな関数定義、クロージャやラムダ式のサポート
  • 関数型プログラミング対応
  • 動的なメタプログラミング

拡張性

  • モジュールシステム
  • イベント駆動設計
  • Java、CFML資産の活用
  • VS Code拡張やデバッガなどの開発ツール

オープンソース

  • Apache License2.0

インストール方法

ここから実際にインストールを行い、コードを書いていきます。

Quick Installerによる導入

ここではMacを想定したインストール方法になりますが以下のコマンドを実行します。

/bin/bash -c "$(curl -fsSL https://install.boxlang.io)"

# With automatic Java 21  installation
curl -fsSL https://install.boxlang.io | bash -s -- --with-jre

以下で確認を行います。

$boxlang --version
Ortus BoxLang™ v1.4.0+42
BoxLang™ ID: 4d54f12c955771e95b58f218b69904bf
Codename: Jericho
Built On: 2025-08-02 12:07:00
Copyright Ortus Solutions, Corp™
https://boxlang.io

必要な前提条件

以下が必須要件になるようです。

  • Java21以上
  • unzipコマンド
  • jqコマンド
    上記は自動でインストールされるようですが、マニュアルインストールを選択したときなど必要に応じて用意することが必要になるケースがあるかもしれません。

BoxLang Version Manager(BVM)

Box Lang Version Manager(BVM)はBoxLangのバージョン管理ツールです。
Node.jsのnvm、Javaのjenvのような複数バージョンのBoxLangを切り替えて利用することができます。

プロジェうとごとに異なるBoxLangバージョンを利用する場合や新旧の動作検証をしたい場合に便利となります。
https://boxlang.ortusbooks.com/getting-started/installation/boxlang-version-manager-bvm

基本的な使い方

REPLの起動

REPLが利用できます。

# REPLを起動
$boxlang
██████   ██████  ██   ██ ██       █████  ███    ██  ██████ 
██   ██ ██    ██  ██ ██  ██      ██   ██ ████   ██ ██      
██████  ██    ██   ███   ██      ███████ ██ ██  ██ ██   ███
██   ██ ██    ██  ██ ██  ██      ██   ██ ██  ██ ██ ██    ██
██████   ██████  ██   ██ ███████ ██   ██ ██   ████  ██████ 

Enter an expression, then hit enter
Press Ctrl-C to exit

BoxLang> 1 + 1
2

BoxLangの構文

BoxLangには以下のファイルの種類があります。
(参考:https://boxlang.ortusbooks.com/boxlang-language/syntax)

  • .bx
    • Classes
  • .bxs
    • Scripts
  • .bxm
    • Templating

スクリプト/クラスの実行

上述した.bx、.bxsを実際に実行していきます。
ここでは慣習にしたがってHello Worldをしていきます。

.bx

class {
    function main(args = []) {
        println("Hello, World!")
    }
}

上記を実行してみます。

$boxlang Hello.bx
Hello, World!

.bxs

// 1行だけ
println("Hello, World!")

上記を実行してみます。

boxlang hello.bxs
Hello, World!

MiniServerによるWebアプリ起動

BoxLangにはMiniServerという軽量なWebサーバが標準で用意されています。
よってWebアプリやAPIをBoxlangのみでローカルで立ち上げて動作確認をすることができます。
(参考:https://boxlang.ortusbooks.com/getting-started/running-boxlang/miniserver)

基本的な使い方

以下のコマンドを実行することで使い始めることができます。

$boxlang-miniserver
  - No webroot specified, using current directory: /Users/setohiroyuki/work/hello-boxlang
+ Starting BoxLang Server...
  - Web Root: /Users/setohiroyuki/work/hello-boxlang
  - Host: 0.0.0.0
  - Port: 8080
  - Debug: null
  - Config Path: null
  - Server Home: null
  - Health Check: false
  - Health Check Secure: false
+ Starting BoxLang Runtime...
  - BoxLang Version: 1.4.0+42 (Built On: 2025-08-02 12:07:00)
  - Runtime Started in 438ms
+ Security protection enabled - blocking access to hidden files (starting with .)
+ WebSocket Server started
+ BoxLang MiniServer started in 616ms at: http://localhost:8080
Press Ctrl+C to stop the server.

localhostの8080が立ち上がっているようなのでブラウザを使ってアクセスすると以下のようになっていました。
alt text

サンプルコードで学ぶBoxLang

変数・関数・クロージャ

変数

  • varで宣言
    • varをつけないこともできる
  • 型の定義は不要

上記を以下のように試します。

class {
    function main() {
        variableSample()
    }

    private function variableSample() {
        // varで宣言
        var a = 10
        var b = 20
        // varで宣言なし
        c = a + b
        println(c)
    }
}

以下実行した結果です。

$boxlang VariableSample.bx
30

以上のようにvarをつけてもつけなくても宣言できました。
また変数に値を設定するときに型の宣言はせずに利用できています。

関数

  • functionを付ける
  • 戻り値を返す場合はreturnを付ける
  • 引数にデフォルト値を付けることができる
  • 引数の型ヒントを付けることができる

上記を使ってコードを書くと以下のようになります。

class {
    function main() {
        var result = add(5, 7)
        println(result)

        var resultWithTypeHint = addWithTypeHint(10, 15)
        println(resultWithTypeHint)
    }
    // 引数の型ヒントなし
    function add(x, y) {
        return x + y
    }
    // 引数の型ヒントと必須の設定、そしてデフォルト値の設定
    function addWithTypeHint(required numeric x, numeric y = 0) {
        return x + y
    }
}

配列・マップ・ラムダ式

  • 配列
    • 配列は'[]'で定義
    • 要素の追加、削除、高階関数(map,filter,eachなど)が使える
  • マップ
    • {}で定義
    • キーと値のペアで管理
  • ラムダ式
    • (引数) = 式で無名関数(ラムダ)を定義

配列は以下のようになります。

class {
    function main() {
        var numbers = [1, 2, 3];                 // 配列は [] でリテラル生成
        numbers.append(4);                       // 要素追加
        numbers.deleteAt(2);                     // 要素削除 (0 ベース: 2 → 値 3)

        var doubled = numbers.map((n) => n * 2); // map で各要素を 2 倍
        var evenOnly = numbers.filter((n) => n % 2 == 0); // filter で偶数のみ

        numbers.each((value, index) => { 
            println("index #index#: #value#"); // each で全要素を処理
        });
    }
}

出力結果は以下の通りです。

index 1: 1
index 2: 3
index 3: 4

マップは以下のようになります。

class {
    function main() {
        var user = { name: "Ada", role: "Engineer" };   // マップは {} で作成
        user.email = "ada@example.com";                 // ドット or ブラケットで追加/更新
        user.delete("role");                            // キー削除

        var uppercaseKeys = user.map((key, value) => {  // map でキー・値にアクセス
            return key.toUpperCase() & ": " & value;
        });

        user.each((key, value) => {
            println("#key# => #value#");           // each で全ペア走査
        });
        uppercaseKeys.each((key, value) => {
            println("#key# => #value#");
        });
    }
}

出力結果は以下の通りです。

email => ada@example.com
name => Ada
email => EMAIL: ada@example.com
name => NAME: Ada

ラムダは以下のようになります。

class {
    function main() {
        var increment = (x) => x + 1; // ラムダ (無名関数)
        var result = increment(41);
        println(result); // 42
    }
}

出力結果は以下の通りです。

42

学習リソース

公式ドキュメント・チュートリアル

https://boxlang.ortusbooks.com/
公式サイトには、言語の概要からインストール/実践チュートリアル、ランタイム設定、CI/CD連携までを解説したドキュメントが用意されています。
例えば「Getting Started/Overview」では、BoxLang の設計方針(動的型付け、JVM 完全互換、複数ランタイム対応)やモジュール/ツール体系について説明されています。

Playground(Try BoxLang)

以下でPlaygroundが用意されているので、ローカル環境を用意せずに試すことができます。
https://try.boxlang.io/
※shareもできるようになっているので共有も便利そうです。

まとめ・感想

触ってみた印象

スクリプト言語と静的型付け言語の中間のような感覚を持ちました。
型定義をせずに書く、もしくは型を定義する書き方ができるので柔軟な書き方ができそうです。
一方でチームで書く際はどのように書くかというルール付けが必要かと思いました。

大規模なコードベースになる部分では型を書いていくというルールにし、簡単なツールなど、さっと書きたいときは型定義せずに書くという
ような都度方針を決定していく感じが考えられそうです。

また今回触れていない機能も多くあるのでこちらについても触っていきたいと思います。

GitHubで編集を提案

Discussion