مبانی زبان Python _ بخش 1
در نخستین مقاله آموزش برنامهنویسی زبان python از سری مقالات مرتبط با برنامه نویسی در بازارهای مالی به شرح و بررسی «پایتون و اصول ذن پایتون!» میپردازیم.
– – –
مبانی زبان Python و شرح کلی
سایت رسمی این زبان، آن را با این عبارات توصیف میکند.:
پایتون یک زبان برنامهنویسی است که به شما امکان میدهد سریعتر کار کنید و سیستمهای خود را به طور موثرتر یکپارچه کنید. (integrate)
میتوانید یاد بگیرید که چگونه از پایتون استفاده کنید و دستاوردهای تقریبا سریعی را در بهرهوری و هزینههای تعمیر و نگهداری کمتر مشاهده کنید.
پایتون یک زبان برنامهنویسی سطح بالا (high-level) و همه منظوره است. فلسفه طراحی آن بر خوانایی کد با استفاده از تورفتگی(indentation) قابل توجه تأکید دارد.
زبانهای برنامه نویسی سطح بالا(High-level)
برای درک بهتر این توصیف در آموزش برنامهنویسی زبان python میتوانیم پرداخت کوتاهی به ماهیت این دست از زبانهای برنامهنویسی داشته باشیم در علوم کامپیوتر، یک زبان برنامهنویسی سطح بالا، یک زبان برنامهنویسی با انتزاع (abstraction) قوی از جزئیات کامپیوتر است. برخلاف زبانهای برنامهنویسی سطح پایین، ممکن است از عناصر زبان طبیعی استفاده کند، استفاده از آن آسانتر باشد، یا ممکن است بخشهای قابل توجهای از سیستمهای محاسباتی (مثلاً مدیریت حافظه) را خودکار کند (یا حتی کاملاً پنهان کند) و فرآیند توسعه یک برنامه را سادهتر و قابل درکتر از زمانی که از زبان سطح پایین استفاده میشود، کند.
مقدار انتزاع ارائه شده مشخص میکند که یک زبان برنامه نویسی چقدر “سطح بالا” است.
انتزاع(abstraction)
در مهندسی نرم افزار و علوم کامپیوتر، انتزاع (abstraction) عبارت است از :
- فرآیند حذف یا تعمیم جزئیات فیزیکی، مکانی یا زمانی یا ویژگیها در مطالعه اشیاء یا سیستمها برای تمرکز توجه بر جزئیات با اهمیت بیشتر؛ از نظر ماهیت شبیه به فرآیند تعمیم است.
- ایجاد مفهوم-اشیاء (concept-objects) انتزاعی با انعکاس ویژگیها یا ویژگیهای مشترک اشیاء یا سیستمهای مطالعه غیرانتزاعی مختلف(نتیجه فرآیند انتزاع)
در دهه 1960، یک زبان برنامهنویسی سطح بالا که از کامپایلر(Compiler) استفاده میکرد، معمولاً کد خودکار(autocode) نامیده می شد. نمونههایی از کدهای خودکار COBOL و Fortran هستند.
اولین زبان برنامهنویسی سطح بالا که برای کامپیوترها طراحی شد Plankalkül بود که توسط Konrad Zuse ایجاد شد. با این حال، در زمان او اجرا نشد و مشارکتهای اولیه او به دلیل جنگ جهانی دوم، جدا از تأثیر این زبان بر زبان “Superplan” توسط هاینز روتیشاوزر و همچنین تا حدی ALGOL، تا حد زیادی از پیشرفتهای دیگر جدا شد.
اولین زبان سطح بالا که به طور قابل توجهای گسترده شد، Fortran بود، یک توسعه مستقل از ماشین از سیستمهای Autocode قبلی IBM. خانواده ALGOL، با ALGOL 58 که در سال 1958 و ALGOL 60 در سال 1960 توسط کمیتههای دانشمندان کامپیوتر اروپایی و آمریکایی تعریف شد، بازگشت و همچنین توابع تودرتو(nested functions) را تحت دامنه واژگانی معرفی کردند. ALGOL 60 همچنین اولین زبان با تمایز واضح بین پارامترهای مقدار و نام و معنای متناظر آنها بود. ALGOL همچنین چندین مفهوم برنامهنویسی ساختیافته مانند ساختارهای while-do و if-then-else را معرفی کرد و نحو (syntax) آن اولین موردی بود که به شکل رسمی توصیف شد – فرم Backus-Naur (BNF).
تقریباً در همان دوره، COBOL رکوردها را معرفی کرد (که ساختار یا struct نیز نامیده می شود) و Lisp برای اولین بار یک انتزاع کاملاً کلی (fully general abstraction) لامبدا (lambda) را در یک زبان برنامه نویسی معرفی کرد.
کد Source و کد شی (Object Code)
کد Source به طور کلی به معنای عبارات برنامهنویسی است که توسط یک برنامه نویس با یک ویرایشگر متن یا یک ابزار برنامهنویسی بصری ایجاد می شود و سپس در یک فایل ذخیره میشود. کد شی به طور کلی به خروجی اشاره دارد، یک فایل کامپایل شده، که زمانی تولید میشود که کد Source با یک کامپایلر C کامپایل شود. فایل کد شیء حاوی دنبالهای از دستورالعملهای قابل خواندن توسط ماشین است که توسط CPU در یک کامپیوتر پردازش میشود. سیستم عامل یا نرم افزار کاربردی معمولاً به صورت کد شی کامپایل شده است.
تولید کد میانی (Intermediate Code Generation)
کد میانی(Intermediate Code) چیست؟
پاسخ: در طول ترجمه یک برنامه Source به کد شی برای یک ماشین مقصد، یک کامپایلر ممکن است یک کد زبان سطح متوسط (middle-level language code) ایجاد کند که به عنوان کد میانی یا متن میانی شناخته میشود.
پیچیدگی این کد بین کد زبان مبدأ(language code) و کد شی(object code) نهفته است.
کد میانی(intermediate code) را می توان به صورت نماد پسوند(postfix notation)، درخت نحو(syntax tree)، گراف غیر چرخهای جهت دار (directed acyclic graph Or DAG)، کد سه آدرس(three-address code)، چهارگانه(quadruples) و سه گانه(triples) نشان داد.
مزایای استفاده از تولید کد میانی نسبت به تولید کد مستقیم
مزایای استفاده از کد میانی نسبت به تولید کد مستقیم به شرح زیر است
کد میانی مستقل از ماشین است، که هدف قرار دادن مجدد کامپایلر برای تولید کد برای پردازندههای جدیدتر و متفاوت را آسان میکند.
کد میانی(Intermediate code) در مقایسه با زبان مبدأ (source language) به ماشین مقصد(target machine) نزدیکتر است، بنابراین تولید کد شی(object code) آسانتر است.
کد میانی امکان بهینهسازی کد را مستقل از ماشین(machine-independent optimization) میدهد. چندین تکنیک تخصصی برای بهینه سازی کد میانی توسط قسمت جلویی کامپایلر استفاده میشود.
ترجمه مبتنی بر نحو، تولید کد میانی را پیاده سازی میکند. بنابراین، با تقویت تجزیه کننده، میتوان آن را در تجزیه دستهبندی کرد.
دو نمایش برای بیان زبان های میانی
نمایش میانی سطح بالا(High-level)
- این نمایش به برنامه Source نزدیکتر است.
- بنابراین، ساختار سطح بالای یک برنامه را نشان می دهد، یعنی ساختار سلسله مراتبی طبیعی برنامه Source را به تصویر می کشد. نمونههای این نمایش نمودارهای غیر چرخهای جهت دار (DAG) و درخت های نحوی هستند. این نمایش برای کار بررسی نوع استاتیک مناسب است. ویژگیهای ضروری نمایندگی در سطح بالا به شرح زیر است:
• ساختار برنامه را حفظ میکند زیرا به برنامه Source نزدیکتر است.
• میتوان آن را به راحتی از برنامه Source ساخت.
• امکان شکستن برنامه Source برای استخراج سطوح اشتراک کد وجود ندارد که به همین دلیل بهینه سازی کد در این نمایش کمی پیچیده می شود.
نمایش میانی سطح پایین(Low-level):
- این نمایش به ماشین هدف نزدیکتر است،
- جایی که ساختار سطح پایین یک برنامه را نشان میدهد. برای کارهای وابسته به ماشین مانند تخصیص ثبت و انتخاب دستورالعمل مناسب است. یک مثال معمولی از این نمایش کد سه آدرسی است. ویژگیهای مهم بازنمایی سطح پایین به شرح زیر است:
• نزدیک دستگاه هدف است.
• تولید کد شی را آسان تر می کند.
• برنامه منبع برای تولید نمایش سطح پایین به تلاش زیادی نیاز دارد.
راستی تا صحبت از کامپایلر و اینها شده است بگذارید به بررسی چند مفهوم مهم در آموزش زبانهای برنامهنویسی خصوصا بحث مورد هدف این مقالات یعنی آموزش برنامهنویسی پایتون و پرداخت به مبانی زبان Python بپردازیم.
پردازشگرهای زبان (Language Processors)
کامپایلرها، مفسرها، برنامههای نوشته شده به زبانهای سطح بالا(high-level) را به کد ماشینی ترجمه میکنند که کامپیوتر آن را درک میکند. و اسمبلرها(assemblers) برنامههای نوشته شده به زبان سطح پایین(low-level) یا اسمبلی(assembly) را به کد ماشین ترجمه میکنند. در فرآیند کامپایل، چندین مرحله وجود دارد. برای کمک به برنامهنویسان در نوشتن کدهای بدون خطا، ابزارهای مختلفی در دسترس هستند.
زبان اسمبلی وابسته به ماشین است، اما ساختاری که برای نمایش دستورالعملها در آن استفاده می شود، مستقیماً توسط ماشین قابل درک نیست و زبان سطح بالا مستقل از ماشین است. یک کامپیوتر دستورالعملها را در کد ماشین، یعنی به شکل 0 و 1 میفهمد. نوشتن یک برنامه کامپیوتری به طور مستقیم در کد ماشین کاری خسته کننده است. برنامه ها بیشتر به زبانهای سطح بالا مانند جاوا، سی پلاس پلاس، پایتون و غیره نوشته می شوند و کد source نامیده می شوند.
این کد source را نمی توان مستقیماً توسط رایانه اجرا کرد و برای اجرا باید به زبان ماشین تبدیل شود. از این رو، از یک نرمافزار سیستم مترجم ویژه برای ترجمه برنامه نوشته شده با زبان سطح بالا به کد ماشین استفاده می شود که زبان پردازشگر نامیده می شود و برنامه با استفاده از آن به کد ماشین (برنامه شی / کد شی) ترجمه میشود.
پردازندههای زبان میتوانند یکی از سه نوع زیر باشند :
اسمبلر(Assembler)
اسمبلر برای ترجمه برنامه نوشته شده با زبان اسمبلی به کد ماشین استفاده میشود. برنامه source ورودی یک اسمبلر است که حاوی دستورالعملهای زبان اسمبلی است. خروجی تولید شده توسط اسمبلر، کد شی یا کد ماشین قابل درک توسط کامپیوتر است. اسمبلر اساسا اولین رابطی است که قادر به برقراری ارتباط انسان با ماشین است. ما به یک اسمبلر نیاز داریم که شکاف بین انسان و ماشین را پر کند تا بتوانند با یکدیگر ارتباط برقرار کنند.
کد نوشته شده به زبان اسمبلی نوعی دستورالعمل(mnemonics) مانند ADD، MUL، MUX، SUB، DIV، MOV و غیره است. و اسمبلر اساساً قادر است این mnemonic ها را به کد باینری تبدیل کند. این تبدیلها به معماری ماشینها نیز بستگی دارند.
به عنوان مثال، معماری اینتل 8085 و اینتل 8086 متفاوت است.
کامپایلر(Compiler)
پردازشگر زبانی که برنامه source کامل نوشته شده به زبان سطح بالا را به صورت یکجا میخواند و آن را به برنامهای معادل در زبان ماشین ترجمه می کند، کامپایلر نامیده می شود.
در واقع کامپایلر کدهای قابل خواندن توسط انسان را به زبانی که پردازنده کامپیوتر می فهمد (باینری 1 و 0 بیت) ترجمه می کند. کامپیوتر کد ماشین را برای انجام وظایف مربوطه پردازش می کند.
در یک کامپایلر، کد source در صورتی که عاری از خطا باشد با موفقیت به کد شی ترجمه می شود. یک کامپایلر باید با قوانین نحوی(syntax rule) زبان برنامهنویسی که در آن نوشته شده است مطابقت داشته باشد. با این حال، کامپایلر تنها یک برنامه است و نمی تواند خطاهای موجود در آن برنامه را برطرف کند. کامپایلر (در صورت وجود در کد source) خطاها را در پایان کامپایل با شماره خطوط مشخص میکند. قبل از اینکه کامپایلر بتواند دوباره کد source را با موفقیت دوباره کامپایل کند، خطاها باید حذف شوند.
برخی از زبانهای کامپایلری: C#، C++، C ، java
مفسر(Interpreter)
کار یک مفسر ترجمهی یک عبارت(statement) واحد از برنامه source به کد ماشین توسط یک پردازشگر زبان است به ترتیبی که بلافاصله قبل از رفتن به خط بعدی پروسه انجام شود. مفسر یک برنامه کامپیوتری است که هر دستور برنامه سطح بالا را به کد ماشین تبدیل میکند. این شامل کد source ، pre-compiled code و اسکریپتها(scripts) میشود.
اگر خطایی در عبارت وجود داشته باشد، مفسر فرآیند ترجمه خود را در آن عبارت خاتمه میدهد و یک پیام خطا نمایش میدهد. مفسر تنها پس از رفع خطا به خط بعدی برای اجرا میرود. یک مفسر مستقیماً دستورالعملهای نوشته شده در یک زبان برنامهنویسی را بدون اینکه قبلاً آنها را به یک کد شی یا کد ماشین تبدیل کند، اجرا میکند.
برخی از زبانهای مفسری: Matlab، Python، Perl، JavaScript، Ruby
تفاوت بین کامپایلر و مفسر
- کامپایلر برنامه ای است که کل کد source یک زبان برنامهنویسی را به کد ماشین اجرایی برای یک CPU تبدیل می کند.، یک مفسر یک برنامه source را میگیرد و آن را خط به خط اجرا می کند و هر خط را همانطور که به آن می رسد ترجمه می کند
- کامپایلر زمان زیادی را برای تجزیه و تحلیل کل کد منبع(Analyze the source) صرف می کند، اما زمان اجرای کلی(Overall execution) برنامه نسبتاً سریعتر است.، یک مفسر زمان کمتری را برای تجزیه و تحلیل کد source صرف می کند، اما زمان اجرای کلی برنامه کندتر است.
- کامپایلر پیام خطا را تنها پس از اسکن کل برنامه تولید میکند، بنابراین اشکالزدایی(Debugging) نسبتاً سخت است زیرا خطا میتواند در هر جایی از برنامه وجود داشته باشد. در کاربرد مفسر اشکالزدایی آسانتر است زیرا به تفسیر برنامه را تا زمانی ادامه میدهد که خطایی رخ نداده است.
- کامپایلر به حافظه زیادی برای تولید کدهای شی نیاز دارد. و مفسر به حافظه کمتری نسبت به کامپایلر نیاز دارد
- کامپایلر کد شی میانی(intermediate object code) میسازد. ولی مفسر هیچ کد شی واسطهای تولید نمیکند.
- از حیث امنیت زبانهای کامپایلری مناسبترند و زبانهای مفسری کمی آسیبپذیر است.
- در کل هم کامپایلر و هم مفسر کار یکسانی را انجام می دهند که عبارت است از تبدیل زبان برنامه نویسی سطح بالاتر به کد ماشین. با این حال، یک کامپایلر قبل از اجرای برنامه، کد را به کد ماشین تبدیل می کند (یک exe ایجاد می کند). ولی مفسر هنگامی که برنامه اجرا می شود، کد را به زبان ماشین تبدیل می کنند.
تاریخچهی مختصر پایتون
در ادامهی شرح مبانی زبان Python به شرح تاریخچهی مختصری از آن میپردازیم. پایتون یک زبان برنامهنویسی پویا با بهرهگیری از garbage-collecter است. که از الگوهای برنامه نویسی متعدد، از جمله برنامهنویسی ساخت یافته (به ویژه procedural یا رویه ای)، شی گرا(object-oriented) و تابعی(functional) پشتیبانی میکند. به دلیل کتابخانه استاندارد جامع آن، اغلب به عنوان یک زبان “دارای باتریها” (“batteries included“) توصیف میشود!
Guido van Rossum کار بر روی Python را در اواخر دهه 1980 به عنوان جانشین زبان برنامهنویسی ABC آغاز کرد و اولین بار در سال 1991 آن را با نام Python 0.9.0 منتشر کرد.Python 2.0 در سال 2000 منتشر شد و ویژگی های جدیدی مانند list comprehensions ، جمع آوری زبالههای شناسایی چرخه(cycle-detecting garbage collection)، شمارش رفرنسها(reference counting) و پشتیبانی از یونیکد(Unicode support) را معرفی کرد. Python 3.0 که در سال 2008 منتشر شد، یک ویرایش بزرگ بود که کاملاً با نسخههای قبلی سازگار نیست. پایتون 2 با نسخه 2.7.18 در سال 2020 متوقف شد.
پایتون همواره به عنوان یکی از محبوبترین زبان های برنامهنویسی رتبهبندی می شود.
ذن پایتون (Zen of python)
در راستای تکمیل این بخش از مقاله مبانی زبان Python به شرح کوتاهی از ذن پایتون میپردازیم.
Zen of Python مجموعهای از 19 “اصل راهنما” برای نوشتن برنامههای کامپیوتری است که بر طراحی زبان برنامهنویسی پایتون تأثیر میگذارد. مهندس نرمافزار تیم پیترز(Tim Peters) به آدرس ایمیل <tim.peters at gmail.com> این مجموعه اصول را در تاریخ : 19 آگوست 2004 تالیف کرده است و در سال 1999 در لیستی این موارد را منتشر کرد.
لیست پیترز یک اصل بیستم را با عنوان «گویدو باید آن را پر کند» (“… ! For Guido to fill in”) باز گذاشته است.، با اشاره به Guido van Rossum، خالق اصلی زبان پایتون. جای خالی اصل بیستم پر نشده است.
ذن پایتون پیترز به عنوان ورودی شماره 20 (PEP 20) در پیشنهادهای رسمی بهبود زبان پایتون Python Enhancement Proposals (PEPs) گنجانده شد و منتشر شد.، در مقالات آتی به طور جامع به بخشهای مختلف این موارد خواهیم پرداخت.
همچنین برای ادای احترام، این اصول در کتابخانههای استاندارد پایتون گنجانده شد.، که میتوان با وارد کردن import this به آن دسترسی پیدا کرد.
اصول «zen of python»
- زیبا بهتر از زشت است.
- صریح(Explicit) بهتر از ضمنی(Implicit) است.
- ساده(Simple) بهتر از پیچیده(Complex) است.
- پیچیده(Complex) بهتر از پیچیدهتر(Complicated) است.
- غیر تو در تو(flat) بهتر از تو در تو(nested) است.
- پراکنده(Sparse) بهتر از متراکم(dense) است.
- خوانایی(Readability) مهم است.
- موارد خاص آنقدر خاص نیستند که قوانین را زیر پا بگذارند.
- اگرچه عملی بودن(practicality) بر خلوص(purity) غلبه دارد.
- خطاها هرگز نباید بی صدا پاس داده شوند.
- مگر اینکه به صراحت(explicitly) ساکت شود!
- در مواجهه با ابهام، از وسوسه حدس زدن خودداری کنید.
- باید یک – و ترجیحاً تنها یک – راه واضح برای انجام آن وجود داشته باشد.
- اگرچه ممکن است این راه در ابتدا واضح نباشد مگر اینکه هلندی باشید.
- الان بهتر از هرگز است
- اگرچه هرگز اغلب بهتر از همین الان است.
- اگر توضیح پیادهسازی سخت باشد، ایده بدی است.
- اگر توضیح پیادهسازی آسان باشد، ممکن است ایده خوبی باشد.
- Namespace ها یک ایده عالی برای استفاده در کد هستند. – بیایید بیشتر از آنها استفاده کنیم.
- “… ! For Guido to fill in”
در مقالات بعدی آموزش مبانی زبان Python، مطالب را پی گرفته و دیگر مباحث پایه را شرح خواهیم داد.
همچنین میتوانید از سسله مقالات آموزش mql سایت جهان بورس استفاده نمایید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.