نگاه کردن به پشت بایت کد پرده
نگاه کردن به پشت بایت کد پرده
هنگامی که مفسر CPython برنامه شما را اجرا می کند، ابتدا آن را به دنباله ای از دستورالعمل های بایت کد ترجمه می کند. بایت کد یک زبان متوسط برای ماشین مجازی پایتون است که به عنوان یک زبان مورد استفاده قرار می گیرد به جای اجرای مستقیم کد منبع قابل خواندن توسط انسان، از کدهای عددی فشرده، ثابت ها و مراجع استفاده می شود که نشان دهنده نتیجه تجزیه کامپایلر و تحلیل معنایی بهینه سازی عملکرد این باعث صرفه جویی در زمان و حافظه برای اجرای مکرر برنامه ها یا بخش هایی از برنامه ها به عنوان مثال، بایت کد حاصل از این مرحله کامپایل روی دیسک در فایل های .pyc و .pyo ذخیره می شود تا اجرا شود. همه اینها برای برنامه نویس کاملاً شفاف است. شما نمی کنید باید آگاه باشید که این مرحله ترجمه میانی اتفاق می افتد، یا نحوه برخورد ماشین مجازی پایتون با بایت کد. در واقع، همان فایل پایتون برای بار دوم سریعتر است. قالب بایت کد جزییات پیاده سازی تلقی می شود و تضمین نمی کند که بین نسخه های پایتون پایدار یا سازگار باشد. و با این حال، برای من بسیار روشنگر است که ببینم سوسیس چگونه درست می شود و درک حداقل برخی از کارهای درونی می تواند به شما در نوشتن کمک کند
کد عملکرد بیشتر (زمانی که این مهم است)
و همچنین بسیار است سرگرم کننده برای نگاه کردن به انتزاعات ارائه شده توسط مفسر CPython. بیایید این تابع greet() ساده را به عنوان نمونه آزمایشگاهی در نظر بگیریم که می توانیم بازی کنیم با و برای درک بایت کد پایتون استفاده کنید:return ‘Hello, ‘ + name + ‘!’ def greet(name): >>> greet(‘Guido’) ‘Hello, Guido!’به یاد داشته باشید که چگونه گفتم CPython ابتدا کد منبع ما را ترجمه می کند قبل از اینکه آن را “اجرا کند” به یک زبان میانی تبدیل شود؟ خوب، اگر این درست باشد، می توان. ما باید بتوانیم نتایج این مرحله تدوین را ببینیم. و ما هر تابع دارای یک ویژگی code (در پایتون 3) است که می توانیم از آن استفاده کنیم برای دستیابی به دستورالعمل ها، ثابت ها و متغیرهای ماشین مجازی استفاده شده توسط تابع سلام ما:b’dx01|x00x17x00dx02x17x00Sx00’ >>> greet.__code__.co_code (None, ‘Hello, ‘, ‘!’) >>> greet.__code__.co_consts >>> greet.__code__.co_varnames (‘name’,)میتوانید ببینید co_consts شامل بخشهایی از رشته تبریک است که عملکرد ما جمعآوری میکند. برای صرفه جویی در حافظه، ثابت ها و کدها جداگانه نگهداری می شوند فضا. ثابتها، خوب، ثابت هستند – به این معنی که هرگز نمیتوان آنها را تغییر داد و در مکانهای مختلف به جای یکدیگر استفاده میشوند. بنابراین به جای تکرار مقادیر ثابت واقعی در co_code در جریان ساختار، پایتون ثابت ها را به طور جداگانه در یک جدول جستجو ذخیره می کند. سپس جریان دستورالعمل می تواند به یک ثابت با یک در dex در جدول جستجو اشاره کند. همین امر برای متغیرهای ذخیره شده در امیدوارم این مفهوم کلی شروع به روشن شدن بیشتر کند. ولی نگاه کردن به جریان دستورالعمل co_code هنوز کمی احساس را در من ایجاد می کند دلگیر واضح است که این زبان میانی برای کار آسان است فیلد co_varnames. برای ماشین مجازی پایتون، نه انسان. پس از همه، این همان چیزی است کد منبع مبتنی بر متن برای.
قوانین ارسال دیدگاه در سایت