pkpy adalah juru bahasa Python 3.x yang ringan (~15K LOC) untuk skrip game, ditulis dalam C11.
Ini bertujuan untuk menjadi sebuah alternatif terhadap lua untuk skrip permainan, dengan sintaksis yang elegan, fitur-fitur canggih dan kinerja yang kompetitif. pkpy sangat mudah untuk disematkan melalui satu file header pocketpy.h
, tanpa ketergantungan eksternal.
Silakan lihat https://pocketpy.dev untuk detailnya dan coba sumber daya berikut.
pkpy harus bekerja pada platform apa pun dengan kompiler C11. Platform ini telah diuji secara resmi.
Anda memiliki dua opsi untuk mengintegrasikan pkpy ke dalam proyek Anda.
Unduh pocketpy.h
dan pocketpy.c
di halaman Rilis GitHub kami. Dan #include
dalam proyek Anda.
Kloning seluruh repositori sebagai submodul ke dalam proyek Anda. Di CMakelists.txt Anda, tambahkan baris berikut:
add_subdirectory (pocketpy)
target_link_libraries ( pocketpy)
Lihat CMakeLists.txt untuk detailnya.
Cabang main
dalam produksi aman digunakan jika lencana CI berwarna hijau.
Untuk mengompilasinya dengan proyek Anda, tanda berikut harus disetel:
--std=c11
bendera harus disetel/utf-8
harus disetelNDEBUG
harus ditentukan untuk versi rilis, atau Anda akan mendapatkan kinerja yang buruk Untuk build gabungan, jalankan python amalgamate.py
untuk menghasilkan pocketpy.c
dan pocketpy.h
di direktori amalgamated/
.
#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 ;
}
Nama | Contoh | Didukung |
---|---|---|
Jika Lain | if..else..elif | ✅ |
Lingkaran | for/while/break/continue | ✅ |
Fungsi | def f(x,*args,y=1): | ✅ |
Subkelas | class A(B): | ✅ |
Daftar | [1, 2, 'a'] | ✅ |
DaftarComp | [i for i in range(5)] | ✅ |
Mengiris | a[1:2], a[:2], a[1:] | ✅ |
Tupel | (1, 2, 'a') | ✅ |
Dikte | {'a': 1, 'b': 2} | ✅ |
F-String | f'value is {x}' | ✅ |
Membongkar | a, b = 1, 2 | ✅ |
Pembongkaran Bintang | a, *b = [1, 2, 3] | ✅ |
Pengecualian | raise/try..catch..finally | ✅ |
Kode Dinamis | eval()/exec() | ✅ |
Cerminan | hasattr()/getattr()/setattr() | ✅ |
Impor | import/from..import | ✅ |
Blok Konteks | with | ✅ |
Ketik Anotasi | def f(a:int, b:float=1) | ✅ |
Generator | yield i | ✅ |
Penghias | @cache | ✅ |
Saat ini, pkpy secepat cpython 3.9. Hasil kinerja untuk cpython 3.9 berlaku untuk pkpy.
Lihat https://pocketpy.dev/ Performance/ untuk detailnya.
Dan ini adalah hasil benchmark prima pada Intel i5-12400F, WSL (Ubuntu 20.04 LTS), yang secara kasar mencerminkan performa antara c++, lua, pkpy, dan cpython.
nama | versi | waktu | mengajukan |
---|---|---|---|
c++ | gnu++11 | 0.104s ■□□□□□□□□□□□□□□□ | benchmark/prime.cpp |
lua | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | benchmark/prime.lua |
pkpy | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | benchmark/prime.py |
cpython | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | benchmark/prime.py |
Keterangan | |
---|---|
TIC-80 | TIC-80 adalah komputer fantasi untuk membuat, memainkan, dan berbagi permainan kecil. |
py-js | Eksternal Python3 untuk Max / MSP. |
sabit | Crescent adalah mesin game pertarungan 2D dan beat-em-up lintas platform. |
orxpy | Ekstensi Python untuk mesin orx. |
CANopenTerm | Alat perangkat lunak sumber terbuka untuk jaringan dan perangkat CANopen CC. |
Kirimkan permintaan tarik untuk menambahkan proyek Anda di sini.
Segala jenis kontribusi dipersilakan.
Jika Anda merasa pkpy berguna, pertimbangkan untuk memberi bintang pada repositori ini (●'◡'●)
Anda dapat mensponsori proyek ini melalui cara berikut.
Sponsor Anda akan membantu kami mengembangkan pkpy secara terus menerus.
cpython
Implementasi resmi bahasa pemrograman Python.
byterun
Bahan pembelajaran yang luar biasa. Ini menggambarkan cara kerja mesin virtual Python.
Lisensi MIT