tranp (TRANspiler on Python)
概要
- Pythonで実装されたトランスパイルフレームワーク
- 入力言語のソースコードからAST(※1)を生成・解析し、テンプレート(※2)を介して出力言語のソースコードを出力するCLIツール
- ※1: ASTの生成はLarkを利用(自由に変更可能)
- ※2: テンプレートエンジンはJinja2を利用(自由に変更可能)
特徴
- 入力・出力言語共に自由に選択できる設計(※1)
- テンプレート(※2)を変更することで、コア実装を改変することなくレンダリング内容を自由に改変可能
- 難読化されない可読なソースコードを生成
- 型注釈の解析と型推論の組み合わせによる型の補完に対応
- トランスパイルのリアルタイム変換(REPL)が可能
- シンボル解析・AST解析のツールを付属
- ※1: 現状はPythonからC++への変換のみ実装。新しい組み合わせは個別に実装が必要であり、決して容易ではない点に注意
必須要件
動作環境
- 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.13
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.13.tar.gz | 201.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tranp-0.9.13-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 510.8 kB
Release files / tranp-0.9.13.tar.gz
| Download URL | tranp-0.9.13.tar.gz |
|---|---|
| Size | 201.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
895eaa09fcc0804402c1a2e9925938ec583fb91b569adaa1795e714f52d37939
|
|
BLAKE2b-256 checksum How to use checksums |
c66ad96417101f4a402becc2328e0d760814c9e6396d12da6c064c8d81d2a1e9
|
| 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.13-py3-none-any.whl
| Download URL | tranp-0.9.13-py3-none-any.whl |
|---|---|
| Size | 309.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc723c7628bcbb4450e8f19774a98df041ae5f76d13b366fbad6bd9bf06fdf11
|
|
BLAKE2b-256 checksum How to use checksums |
59196c97ebd887f6a1e569ec7ba467cebffd0b6e6f59b944fcb5b4cdf90e70ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.2
|