Skip to main content

tranp (TRANspiler on Python)

test codecov MIT License

概要

  • 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

シンボル解析ツール

$ 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)

Source distribution for tranp 0.9.14
File Size Uploaded
tranp-0.9.14.tar.gz 202.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tranp 0.9.14
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.9.14 This release

2 release files

0.9.9

2 release files

0.9.8

2 release files

0.9.7

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page