anti scroll

ブラウザと小説の新しい関係を模索する

TypeNovelをTypeScriptで書き直しました

TypeNovelは、制約と注釈の組み合わせによって、型付きの小説を記述するための言語です。

参考:プロとアマの小説の特徴を数値化して比較してみたらやっぱり差があったので、それを埋めるための型付き小説記述用言語 TypeNovel を公開した件について

これまでF#で開発してきたのですが、今後はTypeScriptで開発することになりました。

これによって、コンパイラのインストールは

npm install -g typenovel

で、完了します。

インストールが成功すると、/usr/local/bin/tncが使えるようになるはずです。

[foo@local] tnc --version
v1.0.0

書き直した理由

一言でいうと「TypeNovelReaderのファイルサイズが大きくなってしまうから」です。

F#のアプリケーションを配布するときには、.NETCoreのランタイムも一緒に配布しないといけないのですが、これが80Mbyte近くあります。

これを除外して、ファイルサイズを削減したかった、というのが主な理由です。

しかしMac/Linux用のバイナリを100Mb以下にする、という当初の目標は達成できませんでした…つまりGithub(100MBの制約がある)にはMac/Linux版をアップロードできません。

その他にも「コンパイラの配布が簡単になる」とか「メジャーな言語なので開発者を募りやすくなる」とかもありますが…

Fsharpの良かった点

  • パーサーが書きやすい

Fsharpの辛かった点

  • 開発者が少ない(ように感じる)
  • ドキュメントが少ない
  • paket周りの運用が少し面倒に感じた
  • ランタイムがでかい(80M前後)
  • プログラムの立ち上がりが少し遅い

TypeScriptの良い点

  • TypeNovelReaderのファイルサイズが減る(20Mbyte近く削減)
  • npmで簡単に配布できる(インストーラーを配布する必要がない)
  • 書ける人がたくさんいる

TypeScriptにして辛い点

  • Nearley(パーサー生成系)やMoo(字句解析機の生成系)などの優れたライブラリを使うことで軽減されるが、F#に比べるとパーサーを書くのは面倒くさい

変わった仕様について

  • コンパイルオプションの--release--minifyに変更されました。
  • --formatオプションを指定することで、出力フォーマットとして、htmlだけではなくtextも選べるようになりました。
  • tnconfig.jsonにおいて、warnXXX系のフラグは、compilerOptionsというフィールドで記述する仕様に変更されました。
// 変更前
{
  warnUndefinedConstraint: true,
  ...
}

// 変更後
{
  "compilerOptions": {
    warnUndefinedConstraint: true,
    ...
  }
}