این روزها واقعا حالت جالبی برام داره سهتا از زبونهای مورد علاقهام یا تازه ورژن جدید شون رلیز شده یا به زودی رلیز میشن و هر کدومشون یا تغییرات نسبتا بزرگی دادن یا قراره توی ورژنی که میاد تغییرات جالبی ایجاد کنند
زبان GO قرار اول فوریه آینده ورژن ۱.۱۸ رو بده و توش جنریکها رو اضافه کنه، C# هم توی ورژن ۱۰ ش قراره ویژگیهای جالب جدیدی از async رو اضافه کنه مثل async method builder
چند روز پیش هم پایتون ۳.۱۰ منتشر شده، که متاسفانه یا خوشبختانه اوبونتو هنوز حتی ورژن ۳.۹ رو دیفالت توی پکیجهای خودش نذاشته.
بخاطر همین تصمیم گرفتم هم سوس کد پایتون رو برای خودم کامپایل کنم هم اینکه به این بهانه یکم درباره سورس کد زبان پایتون اینجا بنویسم
پیش نوشت:
من خوشم میاد از این کارا، نشستم دستی کامپایلش کردم شما میتونید بدون دردسر از apt و یا ویندوز اینستالر استفاده کنید
با apt:
sudo apt install software-properties-common -y sudo add-apt-repository ppa:deadsnakes/ppa -y sudo apt install python3.10
حالا بریم سراغ کامپایل کردنش:
مواد لازم برای این کار مسلما داشتن gcc و make و دسترسی به ترمیناله که من خودم از WSL2 ویندوز استفاده میکنم
خب بریم سر اصل مطلب، اول اینو بگم که پایتون ایمپلمنتیشنهای مختلفی داره مثل pypy و IronPython.net و هر کدوم، سورس کد پایتون رو تغییرات اساسی دادن که باعث زیاد شدن سرعت اجرا و یا کامپتیبل شدنش با مایکروسافت Common runtime language یا چیزای دیگه میشه و خب کامپایل کردنشون داستانی کاملا جداست.
حالا ما میخوایم CPython که ایمپلمنتیشن اصلی پایتونه رو یه نگاهی بش بندازیم
اول دایرکتوری که میخوایم توش کارامون رو بکنیم بسازیم
mkdir python_source && cd python_source
لیست دیپندنسیها و لایبرریهای مورد نیاز پایتون رو نصب میکنیم:
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev
که تقریبا همشون لایبرریهای نسبتا معروفی هستن مثل sqlite3, build-essential, libssl, و بقیه
فایل سورس کد هم که روی سایت پایتون هست و کلا ۲۴ مگه
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0b4.tgz
با tar بازش میکنیم و میریم ببینیم چیا توشه؟
tar -xf Python-3.10.0b4.tgz cd Python-3.10.0 ls
فایل config خیلی چیز جالبه و کار رو به شدددددت راحت میکنه، و میاد برای شما محتویات makefile.pre رو بسته به سیستم شما عوض میکنه. دیگه حتی نیازی نیست داکیومنتها رو بخونیم یا سورس کد رو تو گیتهاب زیر و رو کنیم. هر چند این فایل خودکار تولید شده و حدود ۲۰هزار خطه، اما بخشهاش کاملا مشخصند و اگه یکم bash script بلد باشید و قبلا پروژههای متن باز رو کامپایل کرده باشید راحت میتونید چیزایی که میخواید رو پیدا کنید. میدونیم که عموما این پروژههای متن باز توی فایل کانفیگشون، به بخش optimization دارن که makefile یا makefile.pre رو برای سیستم شما عوض میکنه
حالا که دستور مد نظر رو پیدا کردیم اجراش میکنیم
./configure --enable-optimizations
لیست بلند بالایی از متغییرهای مختلف خواهید دید که بر مبنای سیستم شما، تنظیم میشن. و یه چند ثانیه شایدم چند دقیقه کوتاه طول میکشه یه چیزی مثل تصویر پایین
تموم که شد وقت make کردن میشه، که احتمالا برای WSL باید خود پکیجش رو نصب کنید
sudo apt install make -y
کامند make یه flag داره به اسم -j یا jobs که میتونید بگید چندتا از پروسسورها رو استفاده کنه که خب من برای اینکه کارم سریعتر راه بیوفته میزنم رو ۸ تا. شما میتونی بگی پردازنده های بیشتری رو استفاده کنه یا کمتر
make -j 8
خود make میره makefile رو بر اساس Makefile.pre تولید میکنه براتون. وقتی میک فایل رو باز میکنید اولش یه همچین کامنتی میبینید که کامندهای بدرد بخور رو براتون نوشته
کامندهای make test , make install اصلیها هستن ولی نوشته make altinstall پایتون جدید رو با قبلیه جایگزین نمیکنه ولی make install اینکارو میکنه به همین دلیل من اینجا altinstall میکنم
make altinstall
معمولا برای اینکه ببینید نرم افزار درست کامپایل شده یا نه باید یه بار ترمینال رو ببندید دوباره باز کنید
برای چک کردن اینکه نصب تموم شده یا نه
python3.10 --version
حالا که کامپایل تموم شده بیاید یه نگاهی به خود سورس کد پایتون بندازیم
توی دایرکتوریای که حاصل فایل فشرده بود چندتا دایرکتوری دیگه هست که بعضیاش رو میخوام توصیه کنم حتما نگاه کنید واقعا آموزنده هستش و اینو به آدم میفهمونه که وقتی خیلی راحت خفن ترین کارهای دنیای برنامه نویسی رو با ۴ خط کد انجام میدیم، توی اون زیرزمین تنگ و تاریکی کدها که هیچ کس نمیخواد ببینتش چقدز نبوغ مهندسی خرج شده.
دایرکتوری Lib تمام لایبرریهای استاندارد رو شامل میشه که شدیدا توصیه میکنم حداقل لایبرریهای http, crypt, asyncio,ssl رو بخونید و ببینید چقدر نبوغ مهندسی برای پایتون خرج شده
دایرکتوری Python هم شامل سورس کد لایبرریهای هسته پایتونه که واقعا کدهای جالبی توش هست
من هنوز تو مدیریت خطاها بعضی وقتها شیش میزنم فایل errors.c خیلی برام باحال بود
دایرکتوری Objects هم سورس آبجکتهای built-in پایتون به زبان C هستن و انقدر دقیق و کامل کامت گذاری شدن که انگار دارید کتاب میخونید نه کد.