pkpy は、C11 で書かれた、ゲーム スクリプト用の軽量 (~15K LOC) Python 3.x インタープリタです。
これは、洗練された構文、強力な機能、および競争力のあるパフォーマンスを備えた、ゲーム スクリプト用の lua の代替となることを目指しています。 pkpy は、外部依存関係がなく、単一のヘッダー ファイルpocketpy.h
を介して非常に簡単に埋め込むことができます。
詳細については https://pocketpy.dev を参照し、次のリソースをお試しください。
pkpy は、C11 コンパイラを備えた任意のプラットフォームで動作するはずです。これらのプラットフォームは正式にテストされています。
pkpy をプロジェクトに統合するには 2 つのオプションがあります。
GitHub リリース ページからpocketpy.h
とpocketpy.c
をダウンロードします。そしてそれをプロジェクトに#include
。
リポジトリ全体をサブモジュールとしてプロジェクトにクローンし、CMakelists.txt に次の行を追加します。
add_subdirectory (pocketpy)
target_link_libraries ( pocketpy)
詳細については、CMakeLists.txt を参照してください。
CI バッジが緑色の場合は、本番環境でmain
ブランチを安全に使用できます。
プロジェクトでコンパイルするには、次のフラグを設定する必要があります。
--std=c11
フラグを設定する必要があります/utf-8
フラグを設定する必要がありますNDEBUG
マクロはリリース ビルド用に定義する必要があります。そうしないと、パフォーマンスが低下します。統合ビルドの場合は、 python amalgamate.py
を実行して、 amalgamated/
ディレクトリにpocketpy.c
とpocketpy.h
生成します。
#include "pocketpy.h"
#include
static bool int_add ( int argc , py_Ref argv ) {
PY_CHECK_ARGC ( 2 );
PY_CHECK_ARG_TYPE ( 0 , tp_int );
PY_CHECK_ARG_TYPE ( 1 , tp_int );
py_i64 a = py_toint ( py_arg ( 0 ));
py_i64 b = py_toint ( py_arg ( 1 ));
py_newint ( py_retval (), a + b );
return true;
}
int main () {
// Initialize pocketpy
py_initialize ();
// Hello world!
bool ok = py_exec ( "print('Hello world!')" , "" , EXEC_MODE , NULL );
if (! ok ) goto __ERROR;
// Create a list: [1, 2, 3]
py_Ref r0 = py_getreg ( 0 );
py_newlistn ( r0 , 3 );
py_newint ( py_list_getitem ( r0 , 0 ), 1 );
py_newint ( py_list_getitem ( r0 , 1 ), 2 );
py_newint ( py_list_getitem ( r0 , 2 ), 3 );
// Eval the sum of the list
py_Ref f_sum = py_getbuiltin ( py_name ( "sum" ));
py_push ( f_sum );
py_pushnil ();
py_push ( r0 );
ok = py_vectorcall ( 1 , 0 );
if (! ok ) goto __ERROR;
printf ( "Sum of the list: %dn" , ( int ) py_toint ( py_retval ())); // 6
// Bind native `int_add` as a global variable
py_newnativefunc ( r0 , int_add );
py_setglobal ( py_name ( "add" ), r0 );
// Call `add` in python
ok = py_exec ( "add(3, 7)" , "" , EVAL_MODE , NULL );
if (! ok ) goto __ERROR;
py_i64 res = py_toint ( py_retval ());
printf ( "Sum of 2 variables: %dn" , ( int ) res ); // 10
py_finalize ();
return 0 ;
__ERROR:
py_printexc ();
py_finalize ();
return 1 ;
}
名前 | 例 | サポートされています |
---|---|---|
それ以外の場合 | if..else..elif | ✅ |
ループ | for/while/break/continue | ✅ |
関数 | def f(x,*args,y=1): | ✅ |
サブクラス | class A(B): | ✅ |
リスト | [1, 2, 'a'] | ✅ |
リストコンプ | [i for i in range(5)] | ✅ |
スライス | a[1:2], a[:2], a[1:] | ✅ |
タプル | (1, 2, 'a') | ✅ |
辞書 | {'a': 1, 'b': 2} | ✅ |
Fストリング | f'value is {x}' | ✅ |
開梱 | a, b = 1, 2 | ✅ |
スターアンパッキング | a, *b = [1, 2, 3] | ✅ |
例外 | raise/try..catch..finally | ✅ |
動的コード | eval()/exec() | ✅ |
反射 | hasattr()/getattr()/setattr() | ✅ |
輸入 | import/from..import | ✅ |
コンテキストブロック | with | ✅ |
型の注釈 | def f(a:int, b:float=1) | ✅ |
ジェネレータ | yield i | ✅ |
デコレータ | @cache | ✅ |
現在、pkpy は cpython 3.9 と同じくらい高速です。 cpython 3.9 のパフォーマンス結果は pkpy にも適用されます。
詳細については、https://pocketpy.dev/パフォーマンス/を参照してください。
これらは Intel i5-12400F、WSL (Ubuntu 20.04 LTS) でのプライム ベンチマークの結果であり、c++、lua、pkpy、cpython 間のパフォーマンスを大まかに反映しています。
名前 | バージョン | 時間 | ファイル |
---|---|---|---|
C++ | gnu++11 | 0.104s ■□□□□□□□□□□□□□□□ | ベンチマーク/primes.cpp |
ルア | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | ベンチマーク/primes.lua |
PKPY | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | ベンチマーク/primes.py |
cpython | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | ベンチマーク/primes.py |
説明 | |
---|---|
TIC-80 | TIC-80 は、小さなゲームを作成、プレイ、共有するためのファンタジー コンピューターです。 |
py-js | Max / MSP の Python3 外部。 |
三日月 | Crescent は、クロスプラットフォームの 2D 格闘および格闘ゲーム エンジンです。 |
orxpy | orx エンジン用の Python 拡張機能。 |
CANopenTerm | CANopen CC ネットワークおよびデバイス用のオープンソース ソフトウェア ツール。 |
ここにプルリクエストを送信してプロジェクトを追加してください。
あらゆる種類の貢献を歓迎します。
pkpy が役立つと思われる場合は、このリポジトリにスターを付けることを検討してください (●'◡'●)
次の方法でこのプロジェクトのスポンサーになることができます。
あなたのスポンサーは pkpy の継続的な開発に役立ちます。
cpython
Python プログラミング言語の公式実装。
バイテルン
優れた学習教材です。 Python の仮想マシンがどのように動作するかを示しています。
MITライセンス