GraalVM native compilation works really well. Many projects will compile to native out of the box. Many more with a bit of reflection config that's autogenerated. The native executables are slim, statically linked so they "just work", and startup instantly as one would expect.
Scala is now a great choice for CLI tools.
What's the size of hello_world.exe?
Not that slim.
$ \cat hellogo.go
package main
import "fmt"
func main() {
fmt.Println("hello")
}
$ go build hellogo.go
$ \cat hellonim.nim
echo "hello"
$ nim c hellonim.nim
...
$ ll
total 2.2M
-rwxr-xr-x 1 kbd staff 2.1M Apr 11 20:55 hellogo*
-rw-r--r-- 1 kbd staff 66 Apr 11 20:42 hellogo.go
-rwxr-xr-x 1 kbd staff 87K Apr 11 20:55 hellonim*
-rw-r--r-- 1 kbd staff 13 Apr 11 20:29 hellonim.nim
Keep in mind these are the default compilation settings.Last I looked (a couple of months ago) the executable produced linked dynamically but there was a flag to link statically.
I'm hoping in the future the native-image friction can be lowered, but as of now it's not trivial like other languages.
If I remember correctly you have to redistribute some .dll (VC something) file alongside your .exe on Windows since fresh Windows installations don't have the .dll. Did that change?