BoxLangを触ってみる

この記事の目次
ビジネスイノベーション統括本部ITディベロップメント第2統括部のM.Tです。
9月に入りましたがまだまだ暑くて残暑が厳しい季節です。
体調管理には気を付けてください。
突然ですがJava界隈で「BoxLang」という言語が話題になっていました。
2025年5月に最初の安定版となるv1.0.0がリリースされたようです。
若いですね。ひよっこですね。
2025年9月現在、v1.5.0がLatestバージョンになっています。
BoxLangについてCopilotに聞いてみました。
BoxLangって何なの?
BoxLangは、Ortus Solutionsが開発したJVMベースのモダンなスクリプト言語です。ColdFusionの代替としても注目されており、軽量かつ高機能な開発環境を提供します。
BoxLangの特徴を教えて
- マルチプラットフォーム対応
Windows、macOS、Linux、Docker、サーバーレス(AWS Lambdaなど)、WebAssembly、Android/iOSなど、幅広い環境で動作可能 - Javaとの高い互換性
Javaライブラリをそのまま利用でき、既存のJava資産を活かした開発が可能 - モダンで柔軟な構文
PythonやRuby、Goなどの言語の良いところを取り入れた直感的で表現力の高い構文 - 軽量で高速
ランタイムサイズはわずか6MB。
モジュール構造で必要な機能だけを取り込めるため、効率的な開発が可能 - ColdFusionとの互換性
既存のCFMLコードを変更なしで実行可能。ColdFusionやLuceeからの移行がスムーズ - 開発ツールが充実
VSCode対応IDE拡張、CLIツール(CommandBox)、バージョン管理ツール(BVM)など、開発を支援するツールが豊富
うん、良いことしか言わないですね。
主要言語の良いとこ取りなのであれば最強言語と言えるのでは?
そこまで言うんだったら実際に触ってみましょう。
BoxLangをインストールしてみる
Window環境でインストールしてみました。
JVMで実行される言語なのでJREが必要です。
もちろん普段からJava開発している民はJDKが入っていると思うのでインストール不要です。
ただしJRE 21が必要なのでレガシーバージョンで開発している方は大変ですね。
PowerShellを管理者として実行後、以下のコマンドを実行してJRE 21をインストールします。
powershell -NoExit -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://downloads.ortussolutions.com/ortussolutions/boxlang-quick-installer/helpers/install-jre.ps1'))"
インストールが完了したら以下のコマンドを実行してBoxLangをインストールします。
powershell -NoExit -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://install-windows.boxlang.io'))"
途中でCommandBoxをインストールするか聞かれます。CLIを利用する場合は「Y」を入力します。
Would you like to install CommandBox? [Y/n]:Y
PATHを追加するか聞かれるので「Y」を入力します。
Would you like to automatically add c:\boxlang\bin to your PATH? [Y/n]:Y
無事にインストールが完了しました。
簡単ですね。
BoxLangを実行してみる
REPLを起動してみます。
C:\Users\user>boxlang
?????? ?????? ?? ?? ?? ????? ??? ?? ??????
?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ??
?????? ?? ?? ??? ?? ??????? ?? ?? ?? ?? ???
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?????? ?????? ?? ?? ??????? ?? ?? ?? ???? ??????
Enter an expression, then hit enter
Press Ctrl-C to exit
???
めっちゃ文字化けしてると思いきや「BOXLANG」と表現されてます
シンプル足し算
BoxLang> 2+2
4
日付フォーマット
BoxLang> dateFormat( now(), "full" )
2025年9月4日木曜日
変数代入
BoxLang> a=3
3
BoxLang> b=5
5
BoxLang> a+b
8
文字列反転
BoxLang> str = "BOXLANG"
BOXLANG
BoxLang> str.reverse()
GNALXOB
配列
BoxLang> nums = [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
BoxLang> nums.map(n -> n * 2)
[2, 4, 6, 8, 10]
BoxLang> nums.filter(n -> n % 2 == 0)
[2, 4]
みんな大好きハローワールド
BoxLang> println( "Hello World!" )
Hello World!
プログラム構造を知る
BoxLang は次の 3 種類のファイルで記述できます。
- スクリプト(*.bxs、または互換モードでは *.cfs)
- テンプレート(*.bxm、または互換モードでは *.cfm)
- クラス(*.bx または互換モードでは *.cfc)
Classes have a .bx extension and can be executed via the CLI if they have a main() method by convention.
(クラスは.bx拡張子を持ち、慣例としてmain()メソッドを持つ場合、CLI経由で実行可能です。)
スクリプトファイルを実行してみます。
拡張子*.bxがmain()メソッドを持つBoxLangクラスのようなのでファイルを用意します。
class {
function main( args = [ ] ) {
println( "Hola from my task! #now()#" );
println( "The passed args are: " );
println( args );
}
}
絶対パスを指定してファイルを実行します。
C:\Users\user>boxlang C:\Users\user\Desktop\task.bx 毎日 暑くて 汗だくだく
Hola from my task! {ts '2025-09-04 19:44:31'}
The passed args are:
[
毎日,
暑くて,
汗だくだく
]
実行できました。
お父さんのジョークスクリプト
公式ドキュメントにあったジョークスクリプトを最後に紹介します。
Thanks to our evangelist Raymond Camden, we have a cool dad joke script you can find in our
私たちの伝道師 Raymond Camden のおかげで、デモで見つけられるクールなお父さんジョークのスクリプトができました
class {
variables.apiURL = "https://icanhazdadjoke.com/";
/**
* The first argument is a term to search dad jokes on, if not provided, a random dad joke will be fetched.
* Example: boxlang DadJoke.bx dad
* Example: boxlang DadJoke.bx
*/
function main( args = [ ] ) {
// Use elvis operator to check if a term was passed, else, use an empty string
var term = ( args[ 1 ] ?: "" ).trim( );
if ( !term.isEmpty( ) ) {
apiURL &= "search?term=" & term.urlEncodedFormat( );
}
println( "Getting dad joke for term [#term#], please wait..." );
bx:http url=apiURL result="result" {
bx:httpparam type="header" name="Accept" value="application/json";
}
var data = JSONDeserialize( result.fileContent );
// possible none were found, use safe navigation operator
if ( data?.results?.len( ) == 0 ) {
println( "No jokes found for term: #term#" );
return cliExit( );
}
// If we searched for a term, we need to get a random joke from the results, otherwise, just .joke
var joke = term.isEmpty( ) ? data.joke : data.results[ randRange( 1, data.results.len( ) ) ].joke;
println( joke );
}
}
実行してみました。
C:\Users\user>boxlang C:\Users\user\Desktop\DadJoke.bx
Getting dad joke for term [], please wait...
Why can't your nose be 12 inches long? Because then it'd be a foot!
Why can't your nose be 12 inches long? Because then it'd be a foot!
なぜ君の鼻は12インチ(約30cm)も長くなれないんだ?だってそうなったら1フィート(約30cm)になっちゃうからさ!
ちょっと理解できなかったのでCopilotに聞いてみました。
このジョークは 英語の「foot(フィート)」という単語の二重の意味を利用した言葉遊び(ダジャレ)です。
「12インチ」=「1フィート」(長さの単位)
「foot」=「足」(体の部位)
つまり、「鼻が12インチ(約30cm)になったら、それは“1フィート”になる」というのは、
「鼻が“足”になっちゃうよ!」
という言葉のひっかけになっていて、意味が変わってしまうのが面白いポイントです。
うん、面白いですね(チョットムズカシイ)
まとめ
今回はインストールからの簡単なスクリプト実行まで体験してみました。
構文は分かりやすくて初学者でもすんなり入り込める言語のような印象です。
まだまだ生まれたての言語ということですが、Javaとの互換性があるので今後大きく伸びていく可能性を秘めいています。
コミュニティも盛り上がっていけば近い将来普通に使われる言語かもしれません。
今回はこんな言語もあるんだよっていうのだけでも覚えていってもらえれば光栄です。
※本記事は2025年10月時点の情報です。