tranp (TRANspiler on Python)
概要
- Pythonで実装されたトランスパイルフレームワーク
- 入力言語のソースコードからAST(※1)を生成・解析し、テンプレート(※2)を介して出力言語のソースコードを出力するCLIツール
※1: ASTの生成はLarkを利用(自由に変更可能)
※2: テンプレートエンジンはJinja2を利用(自由に変更可能)
特徴
- 入力・出力言語共に自由に選択できる設計(※1)
- テンプレートを変更することで、コア実装を改変することなくレンダリング内容を自由に改変可能
- 難読化されない可読なソースコードを生成
- 型注釈の解析と型推論の組み合わせによる型の補完に対応
- トランスパイルのリアルタイム変換(REPL)が可能
- シンボル解析・AST解析のツールを付属
※1: 現状はPythonからC++への変換のみ実装。新しい組み合わせは個別に実装が必要であり、決して容易ではない点に注意
処理速度
- キャッシュ済みの状態で約300ファイルを約40秒で変換 (平均0.13秒/1ファイル)
- 実運用では差分更新となるため、およそ1秒程度で変換が完了 (同時更新するファイル数により増減)
必須要件
動作環境
- Linux
- Unix系(MacOSなど)
- Windows ※1
※1: WindowsではREPLが使用不可 (WSL/Git Bash等の互換環境を使用すれば可能)
インストール
$ pip install tranp
トランスパイル (Python to C++)
リアルタイム変換
-itオプションを指定して実行することでREPLが起動
$ tranp -it
- Pythonコードを入力した後、空行を入力するとトランスパイル結果がレンダリング
==========
Code here. Type `exit` to quit:
a = 1
==========
Result:
----------
// @tranp.meta: {"version":"0.9.n","module":{"hash":"dummy","path":"__main__"},"transpiler":{"version":"0.9.n","module":"tranp.app.implements.cpp.transpiler.py2cpp.Py2Cpp"}}
#pragma once
int a = 1;
- 再びPythonコードを入力することで、繰り返し結果を確認することが可能
==========
Code here. Type `exit` to quit:
def main() -> int:
return 1
==========
Result:
----------
// @tranp.meta: {"version":"0.9.n","module":{"hash":"dummy","path":"__main__"},"transpiler":{"version":"0.9.n","module":"tranp.app.implements.cpp.transpiler.py2cpp.Py2Cpp"}}
#pragma once
/** main */
int main() {
return 1;
}
exitのみ入力するとREPLが終了 (またはCtrl + C)
==========
Code here. Type `exit` to quit:
exit
Quit
一括変換
-cオプションでコンフィグを指定することで、設定に従って一括変換を行う- チュートリアルで順を追って解説
$ tranp -c path/to/config.yml
チュートリアル
- 以下の様な構成のプロジェクトを用意
app/
sub.py
main.py
config.yml
# app/main.py
from app.sub import hello
def main() -> int:
hello()
return 1
# app/sub.py
def hello() -> None:
print('hello world!')
# config.yml
grammar: ${tranp_dir}/data/grammar.lark
trans_mapping: ${tranp_dir}/data/i18n.yml
template_dirs:
- ${tranp_dir}/data/cpp/template
input_globs:
- app/**/*.py
exclude_patterns: []
output_dirs:
- ./
output_language: cpp:h
env:
transpiler:
include_dirs:
- app/
view:
immutable_param_types:
- std::string
- std::vector
- std::map
- std::function
- トランスパイルを実行
$ tranp -c config.yml
- トランスパイル後の配置
app/
sub.py
sub.h <- NEW!
main.py
main.h <- NEW!
config.yml
- トランスパイル結果
// @tranp.meta: {"version":"0.9.n","module":{"hash":"6012cab9fec85852b56d7b7b8deb6bd9","path":"app.main"},"transpiler":{"version":"0.9.n","module":"tranp.app.implements.cpp.transpiler.py2cpp.Py2Cpp"}}
#pragma once
#include "sub.h"
/** main */
int main() {
hello();
return 1;
}
// @tranp.meta: {"version":"0.9.n","module":{"hash":"96178f75f71ca63c3102afc3e041a5af","path":"app.sub"},"transpiler":{"version":"0.9.n","module":"tranp.app.implements.cpp.transpiler.py2cpp.Py2Cpp"}}
#pragma once
/** hello */
void hello() {
printf("hello world!");
}
解析ツール
AST解析ツール
astコマンドを指定して実行するとREPLが起動- ※終了方法はトランスパイラーと同様
$ tranp ast
- Pythonコードを入力することでASTがレンダリング
- ※出力結果はLarkのASTに依存
==========
Code here. Type `exit` to quit:
a = 1
==========
AST
----------
file_input
assign
assign_namelist
var
name 2
number 1
シンボル解析ツール
analyzeコマンドを指定して実行するとREPLが起動- 詳細はドキュメントのシンボル解析ツールで解説
$ tranp analyze
ドキュメント
互換性
- 本プロジェクトは実験的なプロジェクトであり、作者自身の課題を解決するために開発しています
- 事前の告知なく破壊的な仕様変更を行う可能性があり、バージョン毎の動作・互換性を保証するものではない旨、予めご理解ください
- 継続的な利用にあたってはバージョンを固定することを推奨します
ライセンス
- MIT
- tranpを用いて生成したトランスパイル後のソースコードに関してはライセンスに含まれません
Metadata
Release files for tranp 0.9.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tranp-0.9.14.tar.gz | 202.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tranp-0.9.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 511.9 kB
Release files / tranp-0.9.14.tar.gz
| Download URL | tranp-0.9.14.tar.gz |
|---|---|
| Size | 202.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2a505bec7056e7a9d926944c37ff4fa39fb238d6981df348442f260b9aacb1e4
|
|
BLAKE2b-256 checksum How to use checksums |
4d7f4be118d324c8881ff184d683289bd5050fe1edd6eb5b6d65815950341b48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|
Release files / tranp-0.9.14-py3-none-any.whl
| Download URL | tranp-0.9.14-py3-none-any.whl |
|---|---|
| Size | 309.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4fd72d27b23f853054b5857686bce2cf83dc6ade6266d664512ed2094b626c1f
|
|
BLAKE2b-256 checksum How to use checksums |
f17587dfacd2c8bb2dcadf7bddb4c84d3fcac924a44c34c998691b84980500f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|