この記事はGWアドベントカレンダーの「なにか新しいことにチャレンジするカレンダー」の5/6記事です。
APIを策定し、SDKを作る側になると、どの言語に対応するかという悩みが出てきます。
SDKを作る労力は最小限にしたいので、できればどれか一つの言語で作ったらそれを他の言語に自動変換したいですよね。
自動変換できる!!とまでは行かないものの、結構惜しいところまで出来てるんじゃないかなというライブラリをまとめてみました。
※どのライブラリも惜しい!もう一歩! というところで、完全に自動変換は難しそうでした。9割自動変換→のこり1割手動で治す みたいなやり方であればうまくいきそうです。
JavaScript -> TypeScript
Javascriptの6割の人はTypeScriptも使ったことがある・・・みたいな話もありますが、旧いライブラリはまだJavaScriptですよね。移行コストが掛かるから移行できない・・という場合、自動変換が使えたら便利かもしれません
とりあえずJavaScriptからTypeScriptに変換するのは、こちらのライブラリが便利でした。
JavaScriptのASTを分解して、TypeScriptを構築し直しています。TypeScriptのコンパイルの逆ですね。型は周りから推測して〜みたいなことが書いてありますが、ほぼ役に立たず、全部anyです。
でもとりあえず動きそうだよ!ってところまでは変換してくれます。(※動くわけではないです。エラーが一部でました)
ASTは慣れればそんなに難しくないので、自分のプロジェクトに合わせて一部スタマイズみたいなこともかんたんです。
JavaScript <-> Python
JavaScriptとTypeScriptはゆっても同じ言語でしょ?という声も聞こえてきますが、JavaScriptとPythonなら完全に別言語ですね。
これにはjiphyが良さそうでした
中身までは読めてないですが、これもおそらくASTを構築して変換してると思います。変換できる構文一覧が載ってるのもポイント高いです。
この一覧に載ってるレベルのプログラムであれば問題なく動きますが、ちょっと悲しいのがclassに対応していないところ。
Jiphy does not implement stdlib components, classes, etc. It's SYNTAX ONLY.
classが対応していないので、ほんとに小さめのプログラムで使うか、もしくはあとでclassのところを直して上げる必要が出てきます。
TypeScript -> Java, Python, C#
いろんな言語に対応していてすごいのがjsii
https://github.com/aws/jsii
これまでの変換はあくまでプログラム内容の変換でしたが、こいつはちょっと仕組みが違います。バックグラウンドで必ずTypeScript(というかnode.js)が動いて、それのインターフェースをJava, Python, C#に変換するよ というものです。
Pythonの関数を呼び出してると思ったら裏で動いてるnode.jsの関数にパススルーされてた! みたいなものです。
バックグラウンドで動く言語が1つなので、バグ遭遇率は低そうですよね。
結構画期的な仕組みで、惜しいところまで言ってるのですが、
メモリを多く食ったり、インターフェースの引数に使える型が限定的(そこは動的に言語変換されるため)だったりというデメリットもあります。
あと、なにより問題だったのは、これ専用にプロジェクトを作り出してないと、あとから対応するのが難しいってのがあります。
jsiiが定める言語仕様に沿ってプログラムを作らないといけないんですね。
例えば、
- 各言語の制約を全部引き受けるようなプログラムの書き方が必要
(pythonだけ欲しくてもjavaの制約もc#の制約も受ける) - 命名規則が決まってる 例:getXXX() は禁止 switchはC#の予約語なので使用禁止など
- コールバックとか、TypeScript特有の書き方は禁止
-
default export
,export =
は禁止(おそらく名前がつかなくなるから)
などなど。
でも、最初から視野に入れて動くのであればなかなかに良いライブラリです
まとめ
言語変換ライブラリ3つ試してみました。
どれも惜しい!って所まで来てるので、あと1〜2年もしたら完全なものができてるといいなぁと高望みしてます。