buildflow というツールを開発しているので buildflow
というタグをつけて何回かに分けてブログを書きます。
この記事では buildflow でなぜ Tengo を採用しているのかについて説明します。
Tengo に関しては https://techblog.szksh.cloud/buildflow-1/ でも多少触れています。
なぜ Tengo を採用しているのかに関しては
- なぜスクリプト言語を採用しているのか
- なぜ他の言語ではなく Tengo なのか
の 2 つの観点で話します。
なぜスクリプト言語を採用しているのか
逆にスクリプト言語を採用しない方法としては、 YAML などで独自 DSL のようなものを定義する方法があります。 DSL と言うと大げさかもしれませんが、 AND, OR, NOT といった論理を YAML のようなデータ記述言語で表現しようと思うとそんな感じになると思います。
この方法は扱いたいロジックが単純なものに限られるのであれば問題ないですが、 より柔軟なロジックを表現したいとなった場合に、無理があります。
- どうやって表現すればいいのか自分で考えないといけない
- どう頑張っても独自ルールになるため、ユーザーにとって直感的とは言えない
- 正しく実装しないといけない
- 仕様をドキュメント化しないといけない
一方、 Go では幾つかのスクリプト言語がサードパーティのライブラリとして実装されており、 buildflow のようなツールに組み込むことが出来ます。
https://github.com/avelino/awesome-go#embeddable-scripting-languages
これらを活用すれば上記の問題は解決できるうえに、非常に柔軟にロジックを実装できます(勿論言語によりますが)。
なぜ他の言語ではなく Tengo なのか
単純に https://github.com/avelino/awesome-go#embeddable-scripting-languages で紹介されているライブラリの中で一番要件にマッチしてそうだったからです。 といっても全てをちゃんとチェックしたわけではありませんが。 Lua とかもあるのでそれでも良かったかもですが、自分は Lua を全然知りません。 あとちゃんとバージョンニングされていたのも理由の一つです。 Tengo より人気のある言語もありましたが、バージョニングされてないという理由で見送ったりしました。
実は Tengo の前に他の言語 antonmedv/expr を採用していたのですが、途中で表現力が足りてないので移行しました。 github-comment でも antonmedv/expr は使ってますし、便利ではあるのですが、 変数が宣言できず、基本ワンライナーで書くしかないので無理だなと判断しました。
https://github.com/suzuki-shunsuke/buildflow/issues/20
buildflow でスクリプト言語に求めているもの
buildflow における Tengo の用途はあくまでロジックの記述、シェルスクリプトでは扱いにくい map 等の操作です。 Tengo で外部コマンドを呼び出したりとかファイルを読み書きしたりとかそういうことは考えていません (てっきりそういうことが出来ない言語なのかと当初思っていましたが、できるようですね)。
Tengo は Python や Ruby, Go といった言語に比べれば言語仕様がコンパクトであり、 よく知らなくてもなんとなく読めるし、簡単にかけると思っています。
また、 Tengo ではテキスト処理などに使える標準ライブラリが提供されています(これがないと辛かったけど、あるので十分)。
なので今の所 Tengo で十分だと考えています。 Tengo よりリッチな言語があったとしても、今の所あまり移行するモチベーションはありません。
Tengo に関する不満
Tengo に関する不満を挙げると以下のようなものがあります。
- やはり認知度が低い
- linter などがない
- 各種 editor で syntax highlight がない(issue はある) https://github.com/d5/tengo/issues/146
情報が少ないのに関しては、言語仕様がシンプルなので個人的には今の所困ってません(公式ドキュメント読めば分かる
Tengo script の実行、 Test
よく知らない言語であれば、試しに実行してみたり、ちゃんとテストを書いたりしたいですよね。
実行に関しては公式の方でツールがあったりします。
テストに関しては簡単なツールを別に作りました https://github.com/suzuki-shunsuke/tengo-tester 従来シェルスクリプトでこういうロジックを実装しても「動けばいい」程度に考えていてテストは書かないことが多かったですが、 ロジックだけを Tengo のスクリプトとして切り出し、テストツールも用意することでちゃんとテストを書くようになることを期待しています。