لینک کوتاه مطلب : https://hsgar.com/?p=6469

پایتون در واقع قابل حمل است

به‌روزرسانی (27-07-2022) : این پست یک فایل اجرایی اثبات مفهوم پایتون (2.7.18 و 3.6.14) را توضیح می دهد که بر روی آن ساخته شده است. جهان وطنی Libc، که به آن اجازه می دهد تا بر روی شش سیستم عامل مختلف (لینوکس، مک، ویندوز، NetBSD، FreeBSD، OpenBSD) اجرا شود. بیش از یک سال از زمانی که این را جمع کردم می گذرد و اکنون Python3.6 و مجموعه آزمایشی آن بخشی از Libc monorepo جهان وطنی. کارهای زیادی برای بهبود انجام شده است python.com بیش از وانیلی Python3.6 – سفارشی
sys.meta_path ورود برای بارگذاری سریعتر، کاهش سایز از
unicodedata، آ cosmo ماژول برای چیزهای خاص Cosmopolitan، بازسازی سیستم ساخت و آزمایش پایتون، یک تجربه عالی REPL، پورت‌های پشتیبان پایتون 3.7 و بسیاری موارد دیگر! بنابراین برخی از جزئیات این پست وبلاگ احتمالا قدیمی هستند. تاریخچه APE Python را بررسی کنید
اینجا، آن را از طریق Cosmopolitan monorepo بسازید، یا دانلود کنید python.com از جانب
اینجا. من همچنین سعی می کنم نسخه های جدیدتر پایتون و برخی بسته های معروف پایتون مانند numpy را پورت کنم.

در ماه فوریه، با استفاده از Lua 5.4 کنار هم قرار دادم جهان وطنی Libc به عنوان یک اثبات سریع مفهوم، و این منجر به وجود Lua 5.4 شد
فروخته شده به عنوان بخشی از مخزن Cosmopolitan در Github، همراه با بسیاری از پیشرفت های جالب دیگر. بسیار هیجان انگیز است که پروژه های C شناخته شده را با استفاده از Cosmopolitan جمع آوری کنید. پاداش قابل حمل انگیزه بزرگی است، و من می‌توانم طراحی، سبک کدنویسی و سیستم ساخت پایگاه‌های کد با کیفیت بالا را مشاهده کنم.

با این حال، برنامه اولیه من با Cosmopolitan کامپایل Lua نبود، بلکه کامپایل پایتون بود. از فوریه، سعی کردم بفهمم Cosmopolitan چگونه کار می‌کند، کد مخزن را می‌خوانم و گهگاهی PR ارسال می‌کنم، و در نهایت یک نسخه قابل حمل Python 2.7.18 (و 3.6.14) را دارم.) – می توانید آن را از مخزن بسازید اینجا. مانند Lua 5.4 محکم نیست زیرا در حال حاضر تنها یک سوم از تست های رگرسیون را پشت سر می گذارد، اما بیشتر قسمت ها در آنجا هستند. به عنوان مثال، در اینجا یک GIF نشان می دهد که ساده است برنامه وب فلاسک در حال اجرا از طریق python.com بوزینه.

بسیار کند است، اما کار می کند (بر روی Debian Linux و Windows 10 تست شده است) و جای زیادی برای پیشرفت وجود دارد. این پست انواع تغییراتی را که برای به کار انداختن پایتون انجام دادم شرح می دهد.

کامپایل کردن پایتون

پایتون 2.7.18 از طریق configure اصطلاح: تربل الف را فراهم می کند configure پوسته اسکریپت که تست های سازگاری لازم را برای سیستم میزبان/کامپایلر اجرا می کند. که سپس Makefile را برای ساخت واقعی ایجاد می کند و پر می کند pyconfig.h با لازم #defineمربوط به ویژگی های موجود در سیستم میزبان است.

هدرهای ساختگی مانند Lua اضافه کردم و a نوشتم superconfigure اسکریپت که فراخوانی کرد configure با پرچم های جهان وطنی
ادغام، مانند زیر:

./configure --disable-shared 
    --without-threads --disable-ipv6 
    CFLAGS="$COSMO_CFLAGS" 
    LDFLAGS="$COSMO_LDFLAGS" 
    LIBS="cosmopolitan.a"
make -j4

این کار ساخت را شروع کرد، اما تقریباً هر فایل منبعی شکایت هایی در مورد اعلام مجدد توابع داشت. به عنوان مثال، Makefile این را فرض کرد sinh در دسترس نبود و به اشتباه در دسترس بود #define HAVE_SINH 0، که باعث شد از پیاده سازی پشتیبان پایتون استفاده کند.

معلوم می شود که CFLAGS ارائه شده برای ادغام جهان وطنی درگیری با AC_CHECK_FUNC، که چیست configure از اسکریپت ها برای بررسی اینکه آیا میزبان عملکرد خاصی را ارائه می دهد استفاده می شود. در آن زمان، ساده ترین راه حل، ویرایش آن بود AC_CHECK_FUNC قسمتی از configure اسکریپت برای اینکه آن را خوب بازی کند، و فقط کار کرد.

پس از آن، رفع خطاهای باقی مانده عمدتاً ساده بود: چند مورد را اضافه کنید
#defines یا #undefبرای جلوگیری از از دست رفتن توابع، اطمینان حاصل کنید که Makefile پیوند را به درستی انجام داده است، برای تداخل نام ها پیدا و جایگزین کنید.، و غیره.

اجرای مفسر پایه

من سعی کردم اجرا کنم python.com APE در فهرست ساخت، و بدون مشکل کار می کرد. اما وقتی فایل اجرایی را به جایی منتقل می‌کردم، مفسر راه‌اندازی می‌شد و سپس با مشکل خارج می‌شد unable to import site: پایتون بررسی می کند site.py که در sys.path در هنگام راه اندازی، که زمینه واردات بقیه کتابخانه استاندارد را تنظیم می کند (مثلاً مواردی مانند سیستم عامل APE برای آنها
os.py). در حال دویدن python.com -S مشکل را برطرف کردو بعداً چند مسیر پوشه نسبی را به آن اضافه کردم sys.path به طوری که پایتون بتواند در هنگام راه اندازی آنجا را جستجو کند.

یک مسئله آزاردهنده که با آن مواجه شدم python.com REPL در لینوکس بود که باید فشار می دادم Return دو بار که می خواستم یک خط خالی به REPL وارد کنم. با دویدن python.com -u من متوجه شدم که این مربوط به بافر ورودی و
setvbuf: مفسر از انتخاب Cosmopolitan برای بافر کردن IO پیروی می کرد، بنابراین من چند خط اضافه کردم تا به طور پیش فرض از ورودی بدون بافر استفاده کنم.

وقتی سعی کردم python.com -S در ویندوز، مفسر شروع می‌شود، اما هر خطی که در REPL وارد می‌کنم یک خطای نحوی ایجاد می‌کند. فکر کردم این هم مربوط به setvbuf، اما این به دلیل ویندوز بود cmd.exe CRLF را ارسال می کند در فشار دادن Return، و مفسر فقط LF را انتظار دارد، بنابراین CR به عنوان نحو نادرست خوانده شد. تغییر منطق تجزیه کننده ساده بود.

افزودن ماژول های استاندارد کتابخانه

زمانی که Makefile ساختن را تمام کرد python، بلافاصله سعی می کند a را فراخوانی کند
setup.py برای ساخت پسوندهای C برای کتابخانه استاندارد. این خیلی احمقانه بود: setup.py سعی می کند دسته ای از اشیاء مشترک را به مفسر بسازد و پیوند دهد حتی اگر یک ساخت ثابت را مشخص کرده ام (--disable-shared). متوجه شدم که این کار را بعد از دیدن یک ساخت موفق روی صفحه انجام می دهد، به دنبال سیل (unable to link/no dlopen/Rdynamic specified but also static) خطاها

یک راه خوب برای کامپایل کردن پسوندهای C در پایتون به صورت ایستا وجود دارد: از طریق
Modules/Setup. این فایل از یک دستور ساده برای تعیین پسوندها و الزامات آنها پیروی می کند تا بتوانید پسوندها را قبل از کامپایل setup.py نامیده میشود.

*static*

# <name of extension> <source files in Modules folder> <includes> <links> -DSOME_FLAG
math mathmodule.c _math.c # -lm
array arraymodule.c

صدا زدن make پس از تغییر Modules/Setup Makefile را با دستور العمل های لازم برای پسوندهای مشخص شده بازسازی می کند. می توانید در مورد آن بخوانید
Modules/Setup اینجا. یکی از جنبه های ناخوشایند این است که نحو در آن باشد Modules/Setup اشتباه است، Makefile اشتباه خواهد بود، بنابراین نمی توانید اجرا کنید make
حتی بعد از اینکه خطا را برطرف کردید.

من توانستم ماژول های زیادی را با استفاده از APE کامپایل کنم Modules/Setup: ماژول های پایه مانند cPickle، zlib و غیره، ماژول هایی که به کتابخانه های خارجی مانند _sqlite، _bz2، readline، _ctypes و غیره و حتی
بسته های خارجی که به پسوندهای ساده C، مانند
greenlet. همه چیز در نوشتن دستور العمل صحیح خلاصه می شود
Modules/Setup، اطمینان از در دسترس بودن کتابخانه های ثابت لازم و بررسی اینکه کد چسب در اطراف واردات به درستی کار می کند.

آخرین مزاحمت با فایل های stdlib پایتون این بود که من مجبور شدم پوشه حاوی آنها را در کنار آن کپی کنم. python.com، اما این مشکل حل شد زیرا Cosmopolitan به APE اجازه می دهد تا به عنوان یک فایل ZIP معتبر استفاده شود. من فقط زیپ کردم
Lib/ به APE، اضافه python.com خود به عنوان ورودی در sys.path، و پایتون zipimport بسته بندی بقیه را اداره کرد

استفاده كردن pip و بسته های خارجی

پس از جمع آوری بیشتر بسته های استاندارد کتابخانه، هنوز نتوانستم آن را دریافت کنم
ensurepip برای کار، زیرا بر روی موضوعات و استاندارد متکی بود threading
ماژول در پایتون فقط یک را افزایش می دهد ImportError اگر نتوانست آن را پیدا کند
_thread پسوند C. رفع مشکل در stdlib وجود داشت: یک ماژول به نام وجود دارد _dummy_thread، که تقلب می کند _thread به طوری که threading شکایت نمی کند. بعد از این تونستم بدوم ensurepip برای نصب
pip و setuptools که در Lib/site-packages.

با این حال، در حال اجرا python.com -m pip install کار نمی کند زیرا Python APE در حال حاضر از SSL پشتیبانی نمی کند. سعی کردم ارائه کنم http://pypi.org/simple
به عنوان URL فهرست اما pip قاطعانه به من اجازه نداد راهم را بگیرم.

من نمی خواستم بفهمم چگونه می توان پشتیبانی SSL را به APE اضافه کرد (من انتظار دارم که این امکان وجود داشته باشد)، بنابراین من فقط تقلب کردم و بسته ها را به صورت دستی دانلود کردم. ترتیب اضافه کردن بسته ها به این صورت عمل می کند:

mkdir -p Lib/site-packages

# specify python version to pip if necessary
/usr/bin/python2 -m pip download flask -t .

# wheels are just ZIPs, use unzip if pip complains
./python.com -m pip install flask*.whl -t ./Lib/site-packages

zip -qr ./python.com ./Lib/site-packages/
rm -rf ./*.whl ./Lib/site-packages/

./python.com -m flask --version

البته، اگر می‌خواهید پسوندهای C را اضافه کنید، باید APE را دوباره کامپایل کنید.

یادداشت های پایانی

کار کردن یک برنامه کاربردی در Linux/Windows/MacOS واقعاً راحت است، اما تکنیک‌هایی که من دیده‌ام/استفاده کرده‌ام همگی دارای معاوضه‌هایی هستند: یا برای توسعه‌دهنده از نظر طراحی، آزمایش و ایمنی/سازگاری، یا برای کاربر در شرایط اندازه و عملکرد برنامه

Cosmopolitan Libc با برخی معاوضه ها نیز همراه است (کامپایل استاتیک، پایگاه های کد C، بدون چند رشته ای)به روز رسانی 2022-07-27:، بدون چند رشته ای هنوز، پر کردن API pthreads کمی طول می کشد))، اما فکر می کنم شگفت انگیز است که می توانم یک پیام ارسال کنم. python.com قابل اجرا با حجم چند مگابایت به عنوان یک فایل فشرده برای شخصی، از او بخواهید آن را بدون نگرانی در مورد سیستم عامل اجرا کند و یک برنامه وب ساده با یک Backend برای آنها فراهم کنید که حتی بدون اتصال به اینترنت نیز کار می کند.

این موفقیت آمیز python.com آزمایش بسیاری از مسیرهای جالب را باز می کند:

  • آیا امکان تنظیم عملکرد python.com بوزینه؟ من انتظار ندارم که به جایی نزدیک شود redbean، اما برخی بهبودهای سرعت خوب خواهد بود زیرا چارچوب های وب پایتون ایجاد شده و استفاده از آن آسان است.

  • آیا فضایی برای یک سیستم ساخت سفارشی برای تولید یک فایل تکی با اندازه بهینه وجود دارد؟ python.com برنامه وب APE؟ دیدیم که می‌توان افزونه‌های C و حتی بسته‌های معمولی را به فایل اجرایی اضافه کرد zip. اگر یک وابستگی حل کننده وجود داشته باشد که واردات stdlib را محاسبه کند، که سپس a را تولید می کند Modules/Setup یا چند اسکریپت ساخت مشابه برای کامپایل پسوندها و افزودن تنها کتابخانه های لازم، عالی خواهد بود. (27/07/2022:
    اکنون Monorepo Cosmopolitan می‌سازد python.com از طریق a
    Makefile، وابستگی های واردات را در زمان پیوند بررسی می کند، مجموعه آزمایشی پایتون را اجرا می کند و همه فایل ها را به فروشگاه ZIP داخلی APE آماده برای استفاده اضافه می کند.

  • با توجه به بسته‌های پایتون با پسوندهای C، فرآیند ساخت برای افزودن آنها به APE بسیار دشوار است (2022-07-27 افزودن پسوندهای C به APE اکنون به دلیل مونورپو Cosmopolitan بسیار زیباتر است.
    این) به دلیل تمام تغییرات دستی درگیر. آیا راهی برای اصلاح خودکار واردات، یا بهتر از آن، کامپایل پسوندهای Python C به عنوان کتابخانه های مشترک با Cosmopolitan وجود دارد؟

  • من موفق به کامپایل Lua، QuickJS، و اکنون Python2.7 و
    پایتون 3.6. آیا زبان های دوستدار وب وجود دارند که از ساخت Cosmopolitan بهره بیشتری ببرند؟ شاید PHP، یا Ruby، یا حتی اگر جزئیات کار کنند، Go؟ نتیجه بعدا معلوم خواهد شد.

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.