اگه از من بپرسید پایتون چیه بدون شک بهتون میگم
پایتون یک زبان برنامهنویسی تفسیری، سطح بالا، و همه منظوره است
دقیقا همون چیزی که توی ویکیپدیا نوشته اما قضیه به همین سادگی ها هم نیست یعنی کلا زندگی اینطور نیست که همه چیز سیاه یا سفید باشه زندگی پر از رنگ ها و طرح های زیبا و مختلف هست
قضیه اینه که :
برای اینکه قضیه روشن بشه بریم یک تعریف کوچولو از کامپایلر ببینیم
خود لغت کامپایل کردن یعنی فرایند تفسیر یا ترجمه کردن از زبان 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)
حالا بیایید برنامه رو اجرا کنیم و نتیجه رو ببینیم
همون طور که میبینید بعد از اجرای برنامه برای باراول یک پوشه ایجاد شد به نام __pycache__ که توی اون پوشه محتوای کامپایل شده برنامه رو میشه دید
این که چرا فقط فایل list_files رو کامپایل کرده به دلیل اینکه ما توی فایل show_files مون اومدیم و فایل list_files رو import کردیم
حالا سوال اینجاست دقیقا چه اتفاقی میفته زمانی که برای بار اول این برنامه رو اجرا میکنیم؟
پایتون برای بار اول که این برنامه رو اجرا میکنید میاد و یک دفعه تمام فایل های پایتونی رو کامپایل میکنه (خودتون میتونید با python -m py_compile show_files هم دستی برنامه رو کامپایل کنید) و یکرسی هاشون رو توی پوشه __pycache__ میریزه و بعد محتوای اون پوشه رو همراه با تمام فایل های کامپایل شده میده به ماشین مجازی و ماشین مجازی هم خط به خط تمام فایل های کامپایل شده رو اجرا میکنه!!!
دفعه های بعد که برنامه رو اجرا میکنید یک مرحله از کار کم میشه پایتون فایل های کامپایل شده رو داره و فقط میده شون به ماشین مجازی و این باعث میشه برای دفعه های بعد برنامه سریع تر اجرا بشه
خوب پس با این تفاسیر دفعه بعد که یکی ازتون پرسید پایتون چیه دیگه دقیق تر بهش توضیح میدید که
پایتون تقریبا یک زبان برنامهنویسی تفسیری، سطح بالا، و همه منظوره است
پی نوشت: این نوشته اولین نوشته من هست و طبیعیه که یه کلی غلط داشته باشه یا خوندنش خیلی سخت باشه برای همین به بزرگی خودتون تمام این مشکلات رو نادیده بگیرد و حتی نظر بدید که بتونم در نوشته های آینده مشکلاتم رو رفع کنم.
کوچیک شما Pyrannosaurus!