RandomThoughts

RandomThoughts

コマンドラインツールを書くための言語

Contents:
  1. F#
    1. F#の良いところ
    2. F#のいまいちなところ
  2. Kotlin NativeとScala Native
    1. Kotlin NativeとScala Nativeの違い
    2. 本当の問題はSingle Binaryなのか?

F#

以前F#で良いという結論を出したが、その辺の事から。FSharp

この時の印象はだいたい変わってないが、一応軽くまとめておく。

F#の良いところ

まぁまぁ良くてきている開発環境、書いてて気分の良い言語、豊富なライブラリ、型づけがしっかりしているのにreplベースの開発が出来るところ、セットアップがMacでもWindowsでも比較的簡単で良くサポートされている事、ドキュメントもまぁまぁ豊富な事(特に.NET側が豊富なのは良い)。

F#のいまいちなところ

友人に試してもらうのが難しい。世の中に広めたい時にもいまいちに思う。

まずsingle binaryで全部必要なものを含めると結構でかい。Create a single binary GUI tool with photino and F# on osx - なーんだ、ただの水たまりじゃないかでは30MBくらいになっている。

まぁその位いいじゃないか、という話もある。

golangとかpythonと比べると試してもらいづらい事情としては、環境を他人が持ってない、という事が大きい気がする。 golangとpythonならみんな持ってるので、githubをクローンして試すくらいならやってくれる場合もある。 一方で.NET Coreを入れるところから、となると、ちょっと試してもらう敷居は高い。

なんかこう、身近な人が試して反応がもらえないと、それ以上広めることは出来ないよなぁ、とは思っている。

Kotlin NativeとScala Native

GoFOのようなアイデアをちょっと実装してみるのになんか手頃な言語は無いかなぁ、と思って、KotlinNativeとかScalaNativeのページや動画を見てみる。 ScalaNative良いのでは?

以下はちょっと動画見た程度の認識なので間違いとかもあるかも。

Kotlin NativeとScala Nativeの違い

両者、single binaryで必要なものは全部静的リンクしても比較的小さい実行ファイルが出来る、という事では違いは無い。

Kotlin Nativeは標準ライブラリ的なものがついてこない。 普通にCのAPIを使う。イメージとしてはCへのトランスレーター+GCみたいな感覚。 その分、必要な事は全部出来る。でもポータビリティとかは無い。 なお、ポータブルなライブラリはいろいろあるので、これを揃えていくという思想。

Scala Nativeは標準ライブラリ的なものをScalaで再実装しているので、JVM上のScalaとかなりの部分互換性があるし、 他のプラットフォームでも同様で動くという点でポータブルでもある。

開発環境もKotlin Nativeはかなりの程度IntelliJが前提となっていて、 Scala NativeはVS Codeが主流(!)に見える。 Scala Nativeの方がライトウェイトな開発環境で良さそう。

ちゃんと試してないけど、Scala Nativeはビルドが遅く見える。 Kotlin Nativeはかなり早い。 普通にC#でコンソールアプリ書いているのと同じような感覚。

本当の問題はSingle Binaryなのか?

golangと比べるとF#は他人に使ってもらう敷居が高い。 当初はこれはシングルバイナリの時のランタイムの大きさの問題と思っていたが、 いざKotlin NativeやScala Nativeを前にしてみると、どうもそういう問題でも無い気はしてきた。

例えば今Kotlin Nativeで何かコマンドを作ったとして、それをgolangほど気楽に試してもらえる気はしない。 golangやpythonやnpmがすぐ試してもらえるのは、それがみんなの手元にあるからだよなぁ。

ようするにbrew化してあればF#でもいいんじゃないか?と思ってHomebrewのドキュメントをちょっと読んでいたところ、 dotnet coreがある事に気づく。 むしろシングルバイナリにしなくてもちゃんとbrewでインストール出来るようにしてあれば意外と十分なのではなかろうか。