پایتون مفسری هست  یا کامپایلری؟بله!

اگه از من بپرسید پایتون چیه بدون شک بهتون میگم پایتون یک زبان برنامه‌نویسی تفسیری، سطح بالا، و همه منظوره استدقیقا همون چیزی که توی ویکیپدیا نوشته اما قضیه به همین سادگی ها هم نیست یعنی کلا زندگی اینطور نیست که همه چیز سیاه یا سفید باشه زندگی پر از رنگ ها و طرح های زیبا و مختلف هستقضیه اینه که :پایتون مفسری نیست! کامپایلری هم نیست!!!!!!برای اینکه قضیه روشن بشه بریم یک تعریف کوچولو از کامپایلر ببینیمکامپایل کردن یعنی چی و کامپایلر چی کار میکنه؟خود لغت کامپایل کردن یعنی فرایند تفسیر یا ترجمه کردن از زبان A به زبان B و کامپایلر هم یعنی چیزی یا کسی که این فرایند رو انجام میده . کامپایلر ها هم تو کامپیوتردقیقا همین کارو میکنن میان کد یا برنامه شمارو از یک زبان سطح بالا که برای انسان قابل فهم هست (مثلا سی یا سی پلاس پلاس) تبدیلش میکنن به یک زبان قابل فهم برای کامپیوتر. اما طبق تعریف میشه این رو گسترده تر کرد مثلا دوست شما ازتون میخواد که درس جلسه پیش رو که استاد توضیح داده و دوستتون غایب بوده رو براش توضیح بدید کاری که شما میکنید اینه که حرف های معلم رو به زبون خودتون برای دوستتون توضیح میدید یعنی دارید حرف های معلم یا استادتون رو برای دوستتون کامپایل میکنیدپایتون هم از این قاعده مستثنی نیست . پایتون میاد و کد شما رو کامپایل میکنه به بایدکدبایدکد ها دستوراتی هستن شبیه دستورات cpu با این تفاوت که مستقیم توسط cpu اجرا نمیشن بلکه توسط یک ماشین مجازی که تقریبا ! یک جور شبیه ساز cpu هست اجرا میشن خط به خط. تفسیری!ممکنه با خودتون بپرسید این فایل های بایدکد چطورین و دستوراتش چه شکلیه؟>>> import dis >>> def example(x): ... for i in range(x): ... print(2 * i) ... >>> dis.dis(example) 2 0 SETUP_LOOP 28 (to 30) 2 LOAD_GLOBAL 0 (range) 4 LOAD_FAST 0 (x) 6 CALL_FUNCTION 1 8 GET_ITER >> 10 FOR_ITER 16 (to 28) 12 STORE_FAST 1 (i) 3 14 LOAD_GLOBAL 1 (print) 16 LOAD_CONST 1 (2) 18 LOAD_FAST 1 (i) 20 BINARY_MULTIPLY 22 CALL_FUNCTION 1 24 POP_TOP 26 JUMP_ABSOLUTE 10 >> 28 POP_BLOCK >> 30 LOAD_CONST 0 (None) 32 RETURN_VALUE >>>این ها دستورات بایدکدی هستن که توسط ماشین مجازی پایتون تولید میشن و بعد توسط ماشین مجازی اجرا میشن . این که این دستورات چی هستن و هر کدوم دقیقا چی کار میکنن موضوع بحث الان ما نیست اما از اینجا میتونید یه کلی اطلاعات جالب درباره دستورات بایدکد پایتون به دست بیارید فایل های بایتکد پایتون که پسوندشون pyc هستن رو میشه توی پوشه __pycache__ پیدا کرد. بزارید با یک مثال مفهوم رو روشن تر کنمبرنامه های پایتونی زیر رو در نظر بگیرید که یکیشون یک آدرس یک پوشه رو میگیره و اون یکی نمایششون میده . یکیشون رو اسمش رو میذاریم list_files.py که قراره لیست فایل هارو برگردونه from os import listdir from os.path import isfile, join def list_files(path): return [f for f in listdir(path) if isfile(join(path, f))]اون یکی هم show_files.py که قراره فایل هارو نشون بدهfrom list_files import list_files path = input('Please enter your path!\t') files = list_files(path) for file_name in files: print(file_name)حالا بیایید برنامه رو اجرا کنیم و نتیجه رو ببینیمنتیجه اجرای برنامه show_files همون طور که میبینید بعد از اجرای برنامه برای باراول یک پوشه ایجاد شد به نام __pycache__ که توی اون پوشه محتوای کامپایل شده برنامه رو میشه دیدمحتوای پوشه __pycache__این که چرا فقط فایل list_files رو کامپایل کرده به دلیل اینکه ما توی فایل show_files مون اومدیم و فایل list_files رو import کردیمحالا سوال اینجاست دقیقا چه اتفاقی میفته زمانی که برای بار اول این برنامه رو اجرا میکنیم؟پایتون برای بار اول که این برنامه رو اجرا میکنید میاد و یک دفعه تمام فایل های پایتونی رو کامپایل میکنه (خودتون میتونید با python -m py_compile show_files هم دستی برنامه رو کامپایل کنید) و یکرسی هاشون رو توی پوشه __pycache__ میریزه و بعد محتوای اون پوشه رو همراه با تمام فایل های کامپایل شده میده به ماشین مجازی و ماشین مجازی هم خط به خط تمام فایل های کامپایل شده رو اجرا میکنه!!!دفعه های بعد که برنامه رو اجرا میکنید یک مرحله از کار کم میشه پایتون فایل های کامپایل شده رو داره و فقط میده شون به ماشین مجازی و این باعث میشه برای دفعه های بعد برنامه سریع تر اجرا بشهزمان اجرای برنامه برای اولین بار بدون وجود پوشه __pycache__زمان اجرای برنامه برای دومین بار با وجود پوشه __pycache__خوب پس با این تفاسیر دفعه بعد که یکی ازتون پرسید پایتون چیه دیگه دقیق تر بهش توضیح میدید کهپایتون تقریبا یک زبان برنامه‌نویسی تفسیری، سطح بالا، و همه منظوره استپی نوشت: این نوشته اولین نوشته من هست و طبیعیه که یه کلی غلط داشته باشه یا خوندنش خیلی سخت باشه برای همین به بزرگی خودتون تمام این مشکلات رو نادیده بگیرد و حتی نظر بدید که بتونم در نوشته های آینده مشکلاتم رو رفع کنم.کوچیک شما Pyrannosaurus!