Python JIT高速化 PyPy, RPython, Numba, Cython, Julia

Python JIT高速化 PyPy, RPython, Numba, Cython, Julia

Python と高速化、コンパイラに関する情報

PyPy – Wikipedia

PyPyはJITコンパイル機能を持っており、実行時に(必要に応じて)コードを機械語にコンパイルして効率的に実行させる能力を持つ。

RPythonについて軽く – κeenのHappy Hacκing Blog

PyPy

    Python処理系の1つ。 JITをすることでかなり高速に動作。

RPython

    言語仕様はPythonのサブセット

    Cに変換できる程に制限したサブセットでPython風に書ける小さな言語処理系記述DSL程度

RubyのJIT処理系を目指して作られたTopazもこのRPythonで書かれた

pythonの高速化手法の処理時間を比較してみました

Python vs PyPy vs Numba vs Cython vs Julia

numbaがpypyよりも高速で比較的扱いやすい

ドメイン特化言語(DSL)

ドメイン固有言語 – Wikipedia

特定のタスク向けに設計されたコンピュータ言語

APIを公開しているDSLは、他のプログラミング言語から呼び出してライブラリのように使うことができる。

機能を拡張され続けた結果チューリング完全になってしまうDSLもある。つまり計算理論的には汎用のプログラミング言語と同等になってしまったということでありが、珍しいことではない。

プログラム言語論

ドメイン特化言語 (Domain Specific Language, DSL)

    特定の問題領域 (数値計算、数式処理、データベース利用,推論、グ ラフィクス etc.) に特化した言語。

汎用言語の役割と DSL の役割は相補的 (どちらか一方だけでは、すべて のニーズに対応できない)

命令型プログラミングはどこに行くのか – Think IT(シンクイット)

DSLは、いきなり汎用言語でプログラムを書くのではなく、まずは汎用言語で専用言語を構築し、その専用言語でプログラムを書くという、ボトムアップな開発方法論

Lispは、LISt Processingという名前通り、リストでプログラムを記述するため、プログラム自体をリスト操作で変換できるという特徴があります。Lispコミュニティでは、プログラムを直接書くのではなく、実行したいプログラムを生成するプログラムを書く、メタプログラミングという技法が多用されてきました。

第一二村射影(第1二村射影 二村の第 1 射影)

部分評価 – Wikipedia

部分評価(partial evaluation)は,プログラムを一部の入力値に関してのみ評 価し,より効率的なプログラムを生成するプログラム変換であり,様々な場面で 用いられている.1970年代に二村氏によって発表された

当時二村はLispのマニュアルを読んでコンパイラを実装する仕事に取り組んでいた。インタプリタがあればそこからコンパイラを生成することができるのではないか、というのが最初の発想だった。

二村射影 (ふたむら しゃえい Futamura projection)

部分評価の特筆すべき例として、二村良彦が1971年に辿りついた概念

第1二村射影

なんらかのプログラミング言語 X のインタプリタ I、その言語で書かれたプログラム p があるとすると、α(I, p) の出力 Ip は、p を I で実行した場合と同じ結果となるプログラムである。すなわちプログラミング言語 X のコンパイラで p をコンパイルしたものと同等である。

第2二村射影

α(α, I) = αI について考える。αI(p) = Ip なので、αI はプログラミング言語 X のコンパイラである。

第3二村射影

α(α, α) = αα について考える。αα(I) = αI なので、αα はあるプログラミング言語のインタプリタを入力とし、その言語のコンパイラを出力する、コンパイラジェネレータである。

二村 良彦(ふたむら よしひこ、1942年 – )

二村良彦 – Wikipedia

日本の計算機科学者。専門はアルゴリズム、計算理論、プログラム自動生成など。

よく知らない Graal-Truffle についてわかっているふりをして書く

動的なプログラミング言語の高速化の辛さ

バイトコードインタプリタという実行方式が考案された. これは,プログラムをまずバイトコードと呼ばれる命令列に変換し,その命令列を逐次実行するというものである

実行時プロファイリングとJITコンパイル

アイデアは以下のようなものである.

* プログラムのある個所を一度実行したとき,そこで現れた変数(レジスタでも何でもよいが)のもつデータの性質は, 次に同じところを実行したときも同じ性質を持っている可能性が高い

* データの性質がどのようなものかを予想できるのであれば(時々外れるにしても),予想ができた時点でそれに特化した コードを生成してこれを実行した方が,全体でみると高速になる

第1二村射影

現実にそのようなシステムが存在しないことからわかるように,これを完全に行うことは現実的に不可能である (できたとしても実行バイナリが爆発的に大きくなる). しかし,Hot なコードだけ部分的に,ならば可能である.

Graal/Truffle

第1二村射影を現実的な範囲で実現したのが Graal/Truffle

Graal は,Oracle が開発している JIT コンパイラ,

Truffle は高速な言語処理系を開発するためのフレームワーク

Next Post

Roblox Game Engine で作られた Realistic Games

木 5月 26 , 2022
Roblox Game Engine で作られた Realistic Games