Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scala CLIでスクリプトを書くときはビルドサーバが立たないようにすると良い(かも)

Scala CLIはScalaの便利コマンドラインツールで、スクリプト実行やREPL、パッケージングなどをやってくれる。今回はスクリプティングの話。

blog.3qe.us

Scala CLIはビルドサーバを起動する

Scalaはコンパイル型の言語であり、JVMでコンパイラが動作するという特性上、毎回最初からコンパイルを行うとパフォーマンス上のオーバーヘッドが生じる。必要な処理が最初から走るし、JITが動いていないし、最適化もかかっていないからだ。

このため、Scala関連のツールキットは、起動時に自動的にビルドサーバを起動し、以降はBuild Server Protocolというのを使ってそのサーバと交信してコンパイルやその結果を受け取る、という挙動をすることが多い。

% cat code.scala.sc
//> using scala 3.5.2
println("hello, scala cli!")

% scala-cli code.scala.sc
Compiling project (Scala 3.5.2, JVM (17))
Compiled project (Scala 3.5.2, JVM (17))
hello, scala cli!

% jps
712651 BloopServer
1083639 Jps

これにより、二度目以降のコンパイルと実行はパフォーマンスが向上し、開発者体験が良くなる、という仕掛けになっている。

ビルドサーバのリソース

しかし、開発をしているならともかく、仕上がったものをただ実行したいだけ、という場合にはこの機能は無駄だ。ビルドサーバなので数百MiBオーダーくらいのメモリを食うし、特に何もしないだけでこれが常駐するのは困る。

ビルドサーバが起動しないようにする

もちろんこの問題はScala CLI側でも認識されていて、特定の場所にオプションを指定することでビルドサーバが起動しないようにできる。代わりにコンパイルパフォーマンスが犠牲になるので、開発が終わってあとは実行するだけ、というときに使うと良さそう。

コマンドラインオプションを指定する

最も素朴には、scala-cli--server=falseをつけることでビルドサーバの起動を抑止できる。

scala-cli.virtuslab.org

% scala-cli --server=false code.scala.sc

スクリプト中で指定する

もしくは、スクリプト自体にshebangを添加させるという方法も使える:

#!/usr/bin/env -S scala-cli --server=false
//> using scala 3.5.2
println("hello, scala cli!")
% chmod u+x code.scala.sc
% ./code.scala.sc
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?