pkpy هو مترجم Python 3.x خفيف الوزن (~ 15K LOC) للبرمجة النصية للألعاب، مكتوب بلغة C11.
ويهدف إلى أن يكون بديلاً لـ lua في البرمجة النصية للألعاب، مع بناء جملة أنيق وميزات قوية وأداء تنافسي. من السهل للغاية تضمين ملف pkpy عبر ملف ذو رأس واحد، pocketpy.h
، بدون تبعيات خارجية.
يرجى الاطلاع على https://pocketpy.dev للحصول على التفاصيل وتجربة الموارد التالية.
يجب أن يعمل pkpy على أي نظام أساسي باستخدام مترجم C11. تم اختبار هذه المنصات رسميًا.
لديك خياران لدمج pkpy في مشروعك.
قم بتنزيل pocketpy.h
و pocketpy.c
على صفحة إصدار GitHub الخاصة بنا. و #include
تضمينها في مشروعك.
انسخ المستودع بأكمله كوحدة فرعية في مشروعك، في ملف CMakelists.txt، أضف الأسطر التالية:
add_subdirectory (pocketpy)
target_link_libraries ( pocketpy)
راجع CMakeLists.txt للحصول على التفاصيل.
من الآمن استخدام الفرع main
في الإنتاج إذا كانت شارة CI باللون الأخضر.
لتجميعها مع مشروعك، يجب تعيين هذه العلامات:
--std=c11
يجب تعيين العلامة/utf-8
NDEBUG
لبناء الإصدار، وإلا فسوف تحصل على أداء ضعيف بالنسبة للبناء المدمج، قم بتشغيل python amalgamate.py
لإنشاء pocketpy.c
و pocketpy.h
في الدليل 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 ;
}
اسم | مثال | المدعومة |
---|---|---|
إذا كان آخر | if..else..elif | ✅ |
حلقة | for/while/break/continue | ✅ |
وظيفة | def f(x,*args,y=1): | ✅ |
فئة فرعية | class A(B): | ✅ |
قائمة | [1, 2, 'a'] | ✅ |
ListComp | [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/performance/ للحصول على التفاصيل.
وهذه هي نتائج المعيار الأولي على Intel i5-12400F، WSL (Ubuntu 20.04 LTS)، والذي يعكس تقريبًا الأداء بين c++، وlua، وpkpy، وcpython.
اسم | إصدار | وقت | ملف |
---|---|---|---|
ج ++ | جنو++11 | 0.104s ■□□□□□□□□□□□□□□□ | المعايير/primes.cpp |
لوا | 5.3.3 | 1.576s ■■■■■■■■■□□□□□□□ | المعايير/primes.lua |
com.pkpy | 1.2.7 | 2.385s ■■■■■■■■■■■■■□□□ | المعايير/primes.py |
com.cpython | 3.8.10 | 2.871s ■■■■■■■■■■■■■■■■ | المعايير/primes.py |
وصف | |
---|---|
تيك-80 | TIC-80 هو كمبيوتر خيالي لصنع الألعاب الصغيرة ولعبها ومشاركتها. |
py-js | عناصر Python3 الخارجية لـ Max/MSP. |
الهلال | Crescent عبارة عن محرك ألعاب ثنائي الأبعاد للقتال والتغلب على الأنظمة الأساسية. |
com.orxpy | امتداد بايثون لمحرك أوركس. |
CANopenTerm | أداة برمجية مفتوحة المصدر لشبكات وأجهزة CANopen CC. |
أرسل طلب سحب لإضافة مشروعك هنا.
جميع أنواع المساهمات هي موضع ترحيب.
إذا وجدت أن pkpy مفيد، ففكر في وضع نجمة على هذا المستودع (●'◡'●)
يمكنك رعاية هذا المشروع عبر هذه الطرق.
رعايتك ستساعدنا على تطوير pkpy بشكل مستمر.
com.cpython
التنفيذ الرسمي للغة البرمجة بايثون.
byterun
مادة تعليمية ممتازة. إنه يوضح كيفية عمل آلة بايثون الافتراضية.
رخصة معهد ماساتشوستس للتكنولوجيا