Help us understand the problem. What is going on with this article?

TypeScript/JavaScript/Pythonの自動言語変換の話

この記事はGWアドベントカレンダー「なにか新しいことにチャレンジするカレンダー」の5/6記事です。


APIを策定し、SDKを作る側になると、どの言語に対応するかという悩みが出てきます。
SDKを作る労力は最小限にしたいので、できればどれか一つの言語で作ったらそれを他の言語に自動変換したいですよね。

自動変換できる!!とまでは行かないものの、結構惜しいところまで出来てるんじゃないかなというライブラリをまとめてみました。

※どのライブラリも惜しい!もう一歩! というところで、完全に自動変換は難しそうでした。9割自動変換→のこり1割手動で治す みたいなやり方であればうまくいきそうです。

JavaScript -> TypeScript

Javascriptの6割の人はTypeScriptも使ったことがある・・・みたいな話もありますが、旧いライブラリはまだJavaScriptですよね。移行コストが掛かるから移行できない・・という場合、自動変換が使えたら便利かもしれません

とりあえずJavaScriptからTypeScriptに変換するのは、こちらのライブラリが便利でした。

https://github.com/gregjacobs/js-to-ts-converter

JavaScriptのASTを分解して、TypeScriptを構築し直しています。TypeScriptのコンパイルの逆ですね。型は周りから推測して〜みたいなことが書いてありますが、ほぼ役に立たず、全部anyです。
でもとりあえず動きそうだよ!ってところまでは変換してくれます。(※動くわけではないです。エラーが一部でました)

ASTは慣れればそんなに難しくないので、自分のプロジェクトに合わせて一部スタマイズみたいなこともかんたんです。

JavaScript <-> Python

JavaScriptとTypeScriptはゆっても同じ言語でしょ?という声も聞こえてきますが、JavaScriptとPythonなら完全に別言語ですね。

これにはjiphyが良さそうでした

https://github.com/timothycrosley/jiphy

中身までは読めてないですが、これもおそらくASTを構築して変換してると思います。変換できる構文一覧が載ってるのもポイント高いです。

スクリーンショット 2020-05-06 20.00.44.png

この一覧に載ってるレベルのプログラムであれば問題なく動きますが、ちょっと悲しいのが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年もしたら完全なものができてるといいなぁと高望みしてます。

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした