درس ۰۱: آشنایی با زبان برنامه‌نویسی پایتون

آشنایی با زبان برنامه نویسی پایتون

Photo by Michael Olsen

این درس با بیان تاریخچه ایجاد زبان برنامه‌نویسی پایتون شروع و با توصیفی کوتاه و شرح ویژگی‌های آن ادامه می‌یابد؛ در شرح ویژگی‌ها سعی شده است کمی نیز توضیحات غیرپایتونی برای درک بهتر موضوعات ارایه گردد. همچنین در مورد کارایی پایتون و این موضوع که چرا در حال حاضر دو شاخه متفاوت از این زبان وجود دارد نیز صحبت شده است. هدف این درس ایجاد یک پیش‌زمینه‌ بدون ابهام از پایتون است! به این امید که مفید باشد و بتواند شما را به یادگیری این زبان تشویق کند 😉.

سطح: پایه



تاریخچه

داستان [1] پایتون از اواخر سال ۱۹۸۲ میلادی آغاز می‌شود، سالی که آقای روسوم پس از پایان دانشگاه به عنوان یک برنامه‌نویس وارد تیم توسعه‌ زبان ABC در مرکز CWI واقع در آمستردام هلند می‌شود. ABC یک زبان برنامه‌نویسی تفسیر‌شده (Interpreted) با اهداف آموزشی است که از اواخر دهه هفتاد میلادی، تحت پروژه‌ای در این مرکز آغاز شده بود. وی چهار یا پنج سال بعد، زمانی که از پروژه‌ زبان ABC نتیجه‌ مطلوب حاصل نمی‌گردد از آن خارج و به تیم توسعه‌ سیستم عامل آمیب می‌پیوندد. این موضوع از آن جهت دارای اهمیت است که در هنگام کار بر روی این سیستم عامل بود که آقای روسوم به فکر ایجاد یک زبان اسکریپتی (Scripting Language) جدید می‌افتد.

در دسامبر سال ۱۹۸۹ میلادی، تعطیلات کریسمس فرصتی می‌شود تا آقای روسوم به ایده سرگرم کننده‌ [2] خود بپردازد. البته پس از آن نیز زمان زیادی از وقت‌های آزاد خود را برای پیشرفت پروژه‌ای که ”Python“ نامیده بود صرف می‌کند. در این مسیر، تجربه‌ کار بر روی زبان ABC و همینطور مطالعات وی بر روی زبان‌ Modula-3 نقش فراوانی داشته است، در‌ واقع او یک نسخه‌ شخصی از بخش‌های مورد علاقه‌ خود از ABC ایجاد نمود. او یک ماشین مجازی ساده، یک تجزیه‌کننده (پارسرParser) ساده و یک سیستم زمان‌اجرا (Runtime System) ساده ایجاد کرد؛ یک زبان با نحو (سینتکس Syntax) اولیه که از تو‌رفتگی (Indentation) برای بلاک‌بندی بهره می‌برد و از انواع داده [3] دیکشنری، لیست، رشته و اعداد پشتیبانی می‌کرد و بر خلاف ABC توسعه‌پذیر می‌بود.

یک سال بعد آقای روسوم از پایتون در پروژه‌ آمیب استفاده می‌کند؛ نتیجه‌ مطلوب و نیز بازخورد آن در بین همکارانش موجب می‌شود تا وی به بسیاری از بهینه سازی‌های اولیه در پایتون اقدام نماید. این روند ادامه می‌یابد تا اینکه سرانجام در ماه دوم از سال ۱۹۹۱ میلادی این زبان را با نسخه 0.9.0 و تحت پروانه‌ای مشابه با پروانه‌ MIT از طریق یکی از «گروه‌های خبری» (یوزنت Usenet) با عنوان alt.sources منتشر می‌سازد که با استقبال بالایی نیز رو به رو می‌گردد.

منشا انتخاب نام پایتون توسط آقای روسوم برخلاف تصور عمومی یا آنچه که از لوگوی آن مشاهده می‌شود به نوع خاصی از مار مربوط نمی‌شود!؛ در حقیقت این نام برگرفته از یک سریال کمدی تولید انگلستان با عنوان ”Monty Python's Flying Circus“ می‌باشد که پخش اصلی آن در طی سال‌های ۱۹۶۹ تا ۱۹۷۴ میلادی از شبکه‌ BBC One بوده است.

توصیفی کوتاه

سادگی و خوانایی از ویژگی‌های بارز زبان برنامه‌نویسی پایتون است، آنچنان ساده که حتی کودکان نیز قادر به آموختن آن هستند و قدرت در کنار این سادگی و خوانایی، معجزه‌ پایتون می‌باشد. از نگاه هر برنامه‌نویسی، برنامه‌های پایتون مجموعه‌ای از کد‌های زیبا هستند، بدون هیچ آشفتگی و پیچیدگی. این زبان به جای این که برنامه‌نویس را درگیر فهم ساختارش کند، به ابزاری قدرتمند برای تحقق تمام آنچه که در فکر برنامه‌نویس است تبدیل می‌شود، اگر در اجرای نخست کدهای پایتون خود هیچ خطایی نگرفتید؛ تعجب نکنید! و اگر هم گرفتید، خوشحال باشید!. این زبان به شدت دوست داشتنی است 😍. ilovepython#

زبان برنامه‌نویسی پایتون همانطور که اشاره شد در سال ۱۹۹۱ میلادی توسط آقای روسوم خلق شده و توسعه‌ آن نیز زیر نظر مستقیم اوست. آقای روسوم زاده‌ سال ۱۹۵۶ میلادی و نخستین دارنده‌ عنوان BDFL (دیکتاتور خیرخواه جاویدان)‌ می‌باشد و هم اکنون (سال ۲۰۱۵) در شرکت Dropbox مشغول به کار است. (صفحه شخصی)

توسعه‌ پایتون با عصر توسعه و محبوبیت زبان‌های متن باز دیگری همچون Tcl ،Perl و Ruby هم‌ زمان بوده که این امر به پیشرفت و توسعه‌ آن کمک زیادی کرده است.

پایتون یک جامعه‌ کاربری بسیار بزرگ و پویا به همراه خود دارد که عامل پیشرفت و توسعه‌ بسیار مهمی برای هر زبان برنامه‌نویسی به شمار می‌رود. این جامعه هر ساله با برپایی همایش‌های گوناگون در سراسر جهان به تبادل آموخته‌ها می‌پردازد. یکی از رایج‌ترین این همایش‌ها PyCon (پای‌کان) می‌باشد که خوشبختانه ‌در ایران (PyCon Iran یا PyIran) نیز برگزار می‌شود.

این زبان تاکنون توسط شرکت یا سازمان‌های مطرح زیادی مورد استفاده قرار گرفته و در برنامه‌های کاربردی زیادی نیز از آن استفاده شده است که از جمله این موارد می‌توان به: reddit ،Pinterest ،Instagram (شبکه‌های اجتماعی) / Google (موتور جستجوگر و نیز سرویس یوتیوب) / Yahoo (سرویس نقشه) / IBM ،Intel ،Cisco ،Seagate (تست سخت‌افزار) / Dropbox (سرویس میزبانی ابری فایل) / EVE Online (بازی‌های آنلاین) / NASA ،Los Alamos (امور علمی) / iRobot (رباتیک) / Pixar ،Industrial Light and Magic ،Walt Disney (ساخت فیلم‌های انیمیشن) / BitTorrent (اشتراک فایل نظیر به نظیر) / CIA (وب‌سایت) / PayPal (سیستم انتقال پول آنلاین) / Mercurial (سیستم کنترل نسخه) / ESRI (نقشه‌برداری در برنامه GIS) و بسیاری دیگر [4] اشاره نمود. (پایتون در stackshare)

یک نکته مهم در مورد زبان برنامه‌نویسی پایتون، انواع پیاده‌سازی‌ (Implementation)‌ آن است. تا‌کنون از این زبان پیاده‌سازی‌های گوناگون و با اهداف متفاوتی توسعه یافته است که از این بین می‌توان به Jython (خاص ماشین مجازی جاوا)، IronPython (خاص چارچوب NET. مایکروسافت)، PyPy (با هدف سرعت اجرای بیشتر)، Stackless (با هدف اجرای بهتر برنامه‌های چند‌نخی) و البته CPython اشاره نمود. [5]

CPython (سی‌پایتون) پیاده‌سازی استاندارد و اصلی زبان پایتون می‌باشد که با استفاده از زبان برنامه‌نویسی C توسعه می‌یابد. توسط CPython می‌توانید علاوه بر کتابخانه‌ پایتون از کتابخانه‌‌ زبان‌های C و ++C نیز بهره ببرید.

توجه داشته باشید، پایتون (Python) نام یک زبان برنامه‌نویسی است و CPython (یا دیگر پیاده‌سازی‌‌های زبان پایتون) در واقع برنامه‌ایست که توسط آن می‌توان کد منبع (سورس کد Source Code) یک برنامه به زبان پایتون را اجرا نمود. به بیانی دیگر CPython یک پردازنده‌ برای زبان پایتون است.

ویژگی‌ها

پایتون یک زبان برنامه‌نویسی رایگان، متن باز (Open Source) و با بیانی کامل‌تر، آزاد است که هم‌‌اکنون (یعنی از نسخه‌ 2.1 و جدیدتر) پروانه‌ آن توسط «بنیاد نرم‌افزار پایتون» PSF اداره می‌گردد. پروانه‌ پایتون سازگار با پروانه‌ GPL3 است، با این حال به برنامه‌نویس این اجازه را می‌دهد که بتواند برنامه‌ای با سورس بسته (Closed Source) تولید نماید.

زبان پایتون از اجزای بسته نرم‌افزاری LAMP نیز به شمار می‌رود. این بسته عبارت است از: Linux ~ سیستم عامل / Apache ~ وب سرور / MySQL یا MariaDB ~ پایگاه‌ داده / Python یا Perl یا PHP ~ زبان برنامه‌نویسی.

این زبان خیلی پیش‌تر از آنکه حتی Eric Raymond و Bruce Perens از Open Source صحبت کنند، متن باز بوده است.

پایتون یک زبان برنامه‌نویسی همه منظوره (General-Purpose) است به این معنی که می‌توان از آن در توسعه طیف گسترده‌ای از انواع برنامه‌ها در حوزه‌های نرم‌افزاری گوناگون بهره برد؛ از جمله در توسعه برنامه‌های تحت وب و برنامه‌هایی با قابلیت «واسط گرافیکی کاربر» (GUI).

پایتون یک زبان برنامه‌نویسی به همراه مجموعه‌ بزرگی از قابلیت‌های از پیش آماده و قابل حمل است که به عنوان کتابخانه‌ استاندارد آن شناخته می‌شود. همچنین در کنار این کتابخانه‌ می‌توان از طیف بسیار وسیعی از کتابخانه‌های شخص ثالث (Third-Party) پایتون [6] نیز بهره برد. کتابخانه‌های شخص ثالث ابزارهای مفیدی را در امور فروانی همچون: برنامه‌نویسی علمی ~ NumPy ،SciPy / پردازش زبان‌های طبیعی ~ NLTK / ارتباط درگاه سریال ~ PySerial / ایجاد بازی ~ PyGame ،Pyglet ،PyOpenGL ،PySoy / هوش مصنوعی ~ PyBrain / ایجاد وب سایت ~ Django ،Flask ،Bottle ،CherryPy / پردازش تصویر ~ PIL/Pillow ،PythonMagick / واسط گرافیکی کاربر ~ PyGtk ،PyQt ،WxPython / کار با اسناد rdflib ~ pdf / رمزنگاری ~ PyCrypto ،pyOpenSSL ،cryptography و بسیاری دیگر... که مدام در حال توسعه هستند و بر تعداد و تنوع آن‌ها نیز افزوده می‌شود را در اختیار برنامه‌نویسان پایتون قرار می‌دهند.

پایتون یک زبان برنامه‌نویسی پویا (Dynamic) بوده و نیز از قابلیت مدیریت خودکار حافظه برخوردار است. این زبان شباهت‌هایی با TCL ،Perl ،Ruby ،PHP یا دیگر زبان‌های برنامه‌نویسی پویا دارد. در این نوع زبان‌ها بر‌خلاف زبان‌های ایستا (Static) مانند C++ ،C و Java نیازی به تعریف صریح نوع متغیرها [7] (Variables) نیست و همچنین نوع متغیر در طول برنامه قابل تغییر است. در زبان‌های پویا متغیرها از خود نوعی ندارند و تصمیم گیری برای تخصیص نوع در «زمان اجرا» (RunTime) انجام می‌پذیرد.

بر خلاف زبان C، در پایتون اختصاص و آزاد‌سازی حافظه (Memory) به صورت خودکار انجام می‌شود. پایتون برای آزاد‌سازی حافظه از دو روش «شمارش ارجاع» (Reference Counting) و «زباله روبی» [8] (Garbage Collection) بهره می‌گیرد. (البته فراموش نشود که صحبت در مورد پیاده‌سازی CPython است)

با اینکه پایتون یک زبان پویاست ولی در عین حال یک زبان «وابسته شدید به نوع» (Strongly Typed) نیز می‌باشد. در این نوع زبان‌ها (به مانند Java) تغییر ناگهانی و خودکار نوع داده (یا شی) انجام نمی‌شود؛ به عنوان نمونه چنانچه در پایتون عمل جمع بین یک نوع داده عددی مانند 3 و یک نوع داده غیر عددی مانند "7" صورت گیرد، یک Exception یا استثنای TypeError گزارش می‌گردد. در مقابل، زبان‌های «وابسته ضعیف به نوع» (Weak Typed) قرار دارند؛ در این زبان‌ها (به مانند Perl) نوع بر حسب موقعیت به صورت خودکار تغییر داده می‌شوند. در این مورد زبان‌های برنامه‌نویسی رفتارهای متفاوتی دارند،‌ به عنوان نمونه حاصل عبارت "7" + 3 در زبان Perl با تبدیل (Convert)‌ خودکار نوع داده غیر عددی "7" به عدد (7)، مقدار 10 محاسبه می‌گردد.

نکته

استثنا‌ در واقع وضعیت یا خطایی (Error) است که در برنامه پیش‌بینی شده و بروز آن‌ به مانند یک اعتراض گزارش می‌شود. از طرفی در برنامه برای هر اعتراض، چگونگی رسیدگی به آن نیز تعریف می‌شود.

پایتون یک زبان برنامه‌نویسی سطح بالا (High-Level) به مانند C ،Ruby ،PHP و Java است که به وسیله‌ آن عمل برنامه‌نویسی به آسانی و با سرعتی بالا انجام می‌پذیرد و بر‌خلاف زبان برنامه‌نویسی سطح پایینی (Low-Level) مانند Assembly، برنامه‌نویس را درگیر مسایل خاص موجود در این سطح به مانند کار با ثبات‌ها (Registers)، آدرس‌های حافظه و غیره... نمی‌سازد.

نکته

بر اساس یک دسته‌بندی رایج [9]، زبان‌های برنامه‌نویسی را می‌توان به نسبت درگیر ساختن برنامه‌نویس با مفاهیم سخت‌افزاری یا میزان سطح انتزاع (Abstraction) برنامه‌نویس از سخت‌افزار، در دو سطح دسته‌بندی نمود: ۱. پایین ~ زبان ماشین و Assembly (اسمبلی) ۲. بالا ~ Java ،C++ ،C و غیره...

توجه

میزان انتزاع تمام زبان‌های برنامه‌نویسی سطح بالا به یک نسبت نمی‌باشد؛ به عنوان نمونه میزان انتزاع زبان پایتون بیشتر از Java و سطح انتزاع Java نیز بسیار بیشتر از زبان C است:

Machine < Assembly < C < C++ < Java < Python

نکته

تنها زبان قابل فهم و اجرا برای هر ماشینی (یا رایانه‌ای)، زبان ماشین (Machine Language) خاص آن است و تمامی برنامه‌های نوشته شده در هر سطحی از انتزاع که باشند، پیش از اجرا می‌بایست به این زبان ترجمه شوند. بدیهی است که نیاز این پردازش اضافی به نسبت از سرعت اجرای برنامه می‌کاهد. عمل ترجمه برای کدهای اسمبلی توسط اسمبلر (Assembler) و برای باقی زبان‌ها توسط کامپایلر (Compiler) یا مفسر (Interpreter) انجام می‌پذیرد.

پایتون یک زبان برنامه‌نویسی چند‌ الگویی (Multi-Paradigm) است و برنامه‌نویس را مجبور به رعایت الگوی خاصی نمی‌کند. این زبان از الگوهای: دستوری (Imperative) یا رویه‌ای (Procedural)، تابعی (Functional) و شی‌گرایی (Object-Oriented) پشتیبانی می‌کند؛ البته همانظور که گفته شد نمی‌توان پایتون را به صورت خالص (Pure) متعلق به هر یک از این الگوها دانست [10].

جدا از پشتیبانی الگوی برنامه‌نویسی شی‌گرا، ساختار پایتون به صورت کامل شی‌گراست و هر چیزی در این زبان یک شی (Object) است؛ در آینده بیشتر در این مورد صحبت خواهیم کرد.

پایتون (پیاده‌سازی CPython) به عنوان یک زبان تفسیر‌شده (Interpreted) شناخته می‌شود. با یک تعریف کلی در این نوع زبان‌ها کار خواندن سورس کد برنامه، ترجمه به زبان ماشین و در نهایت اجرای آن توسط یک مفسر انجام می‌گیرد. در پایتون عمل ترجمه و اجرای سورس کد را می‌توان در دو مرحله متوالی خلاصه نمود:

۱- کامپایل سورس کد به بایت‌کد (ByteCode)

۲- تفسیر بایت‌کد به زبان ماشین و اجرای آن

به این صورت که ابتدا سورس کد برنامه‌ به یک زبان میانی نزدیک به زبان ماشین با نام بایت‌کد ترجمه می‌شود و سپس بایت‌کد حاصل به ماشین مجازی (Virtual Machine) - به عنوان موتور زمان‌اجرای پایتون - فرستاده و توسط آن تفسیر و اجرا می‌گردد.

توجه

با این که پایتون (پیاده‌سازی CPython) به عنوان یک زبان تفسیر‌شده شناخته می‌شود ولی در زمان‌اجرا (RunTime) برای ترجمه‌ سورس کد به بایت‌کد از یک کامپایلر استفاده می‌کند.

تفاوت عملکرد کامپایلر و مفسر

به صورت خیلی کلی، کوتاه و ساده:

یک کامپایلر (در زبان‌های کامپایل‌شده) تمامی سطرهای سورس کد برنامه را به صورت یکجا خوانده و سپس با ساخت یک فایل جدید و مستقل از سورس کد با نام «کد مقصد یا آبجکت کد» (Object Code) یا فایل اجرایی (Executable) عمل ترجمه به زبان ماشین را پایان می‌بخشد. برنامه حاصل از کامپایلر توانایی هر چند بار اجرا در رایانه مقصد، بدون نیاز به کامپایل دوباره را دارد، اما فاقد حمل‌پذیری بوده و کاربر نهایی نیز به هیچ عنوان توانایی دسترسی به سورس کد برنامه و تغییر یا ویرایش آن را نخواهد داشت. اما یک مفسر (در زبان‌های تفسیر‌شده) سورس کد برنامه را به صورت سطر به سطر می‌خواند و هر سطر را به صورت جداگانه به زبان ماشین ترجمه و سپس بلافاصله آن را اجرا می‌کند. به این صورت که هنگامی یک سطر در حال اجراست در همان لحظه سطر بعدی در حال ترجمه به زبان ماشین می‌باشد. برنامه‌های نوشته شده با زبان‌های برنامه‌نویسی تفسیر‌شده برای هر بار اجرا در رایانه هدف نیاز به تفسیر دوباره دارند. این تفاوت عملکرد گرچه باعث کاهش سرعت اجرای برنامه‌های تفسیر‌شده نسبت به برنامه‌های کامپایل‌شده می‌شود ولی خواندن سطر به سطر کدها در مفسر علاوه بر قابلیت تشخیص خطای بهتر، این امکان را بوجود می‌آورد که هر کاربری بتواند حتی در زمان اجرای برنامه سورس کد را ویرایش و تغییر دهد؛ این دسته از زبان‌ها در مواقعی که پیوسته نیاز به افزودن ویژگی‌های متفاوت به برنامه است بسیار مورد توجه قرار گرفته‌اند.

توجه

ماشین مجازی پایتون (CPython VM) به صورت یک حلقه تکرار است که دستورات بایت‌کد را یکی یکی می‌خواند، به زبان ماشین تفسیر و بلافاصله اجرا می‌کند.

پایتون یک زبان برنامه‌نویسی قابل‌حمل (Portable) است. می‌توان گفت سورس کد برنامه‌ای به این زبان قابلیت اجرا در هر رایانه‌ای را دارد. بایت‌کد پایتون شبیه به زبان ماشین است ولی با این تفاوت که مخصوص هیچ ماشین (یا رایانه) خاصی نیست. در مقابل،‌ وقتی سورس کد برنامه‌ای توسط کامپایلر به زبان ماشین ترجمه می‌شود، نتیجه آن فایلی است که تنها در ماشین‌هایی که این کد برای آن‌ها (متناسب با معماری پردازنده) ترجمه شده است، قابل اجرا می‌باشد ولی بایت‌کد پایتون به کمک ماشین مجازی خود این توانایی را دارد که در هر ماشینی اجرا گردد.

نکته

هر ماشین، زبان ماشین مخصوص به خود را دارد و به همین دلیل در حالت عادی اجرای یک برنامه در ماشین‌هایی با معماری متفاوت، در مواردی نیازمند تغییر سورس کد برنامه و نیز ترجمه‌ مجدد آن توسط یک کامپایلر متناسب با معماری آن ماشین خاص می‌باشد.

ماشین مجازی، بسته‌ایست نرم‌افزاری که قابلیت نصب بر روی انواع ماشین‌ها را داراست و وظیفه‌ آن ایجاد یک ماشین مجزا (بر روی ماشین مقصد) برای اجرای مستقل کدها (بایت‌کدها) می‌باشد. به این نوع ماشین مجازی «ماشین مجازی پردازش» [11] گفته می‌شود.

بر همین اساس، هم اکنون سورس کد یک برنامه به زبان پایتون بدون نیاز به هیچ تغییری در تمام سیستم‌های عامل‌ مطرح قابل اجراست.

پایتون یک زبان برنامه‌نویسی توسعه‌پذیر (Extensible) است. کدهای نوشته شده با پایتون را می‌توان به دیگر سورس کدهای این زبان افزود و همچنین می‌توان از کتابخانه‌ها و کدهای نوشته شده با دیگر زبان‌های برنامه‌نویسی در میان کدهای پایتون استفاده کرد (مانند C و ++C در پیاده‌سازی CPython یا Java در پیاده‌سازی Jython).

پایتون دارای دستور زبانی تمیز و خوانایی (Readability) بالای کد است. خوانایی در طراحی پایتون مورد تاکید بوده و در کنار شی‌گرایی از مهم‌ترین ویژگی‌های یک کد به جهت استفاده مجدد می‌باشد. پایتون به مانند زبان ABC از روش «تو‌رفتگی» بوسیله‌ فضاهای خالی برای بلاک‌بندی [12] استفاده می‌کند. در پایتون اجباری به استفاده از نقطه ویرگول (Semicolon) ; و برخی پرانتز گذاری‌ها نمی‌باشد و البته وجود انواع داده (Data Types) - البته به بیانی درست‌تر «انواع شی» - متنوع و نیز پویایی پایتون موجب کمتر شدن حجم کد‌نویسی و صرفه‌جویی در زمان توسعه نسبت به زبان‌هایی به مانند C++ ،C و حتی Java می‌شود. تحقیقات نشان می‌دهند: کاری که یک برنامه‌نویس پایتون می‌تواند در مدت زمان دو ماه به انجام برساند، دو برنامه‌نویس ++C در مدت یک سال قادر به تکمیل آن نخواهند بود!

پایتون یک زبان حساس به حرف (Case Sensitive) است. در این نوع زبان‌ها (مانند C ،C++ ،Java ،Perl و غیره...) بین حروف کوچک (Lowercase) و بزرگ (Uppercase) به مانند a و A تفاوت وجود دارد. با توجه به این موضوع، مفسر پایتون بین کلمات True ،true و TRUE تمایز می‌گذارد.

کارایی

معمولا افراد در مواجه با یادگیری زبان پایتون نگرانی‌هایی در مورد کارایی (Performance) برنامه‌های توسعه یافته با این زبان خواهند داشت به خصوص در جایگاه مقایسه با زبان Java، به هر حال پایتون یک زبان تفسیر‌شده است و در اجرا سرعت کمتری نسبت به زبان‌های کامپایل‌شده مانند C و Java خواهد داشت. معمولا کارایی بالا برابر با سرعت بالاست ولی قضاوت در مورد کارایی به این سادگی درست نیست!

در هر پروژه‌ای بسته به چیزی که می‌خواهیم می‌بایست انتخاب نماییم. اگر مبنای کارایی برای یک پروژه در سرعت بالای اجرا باشد (مانند برنامه‌های سیستمی)؛‌ زبان C همیشه بهترین انتخاب است ولی اگر مبنا در سرعت بالای توسعه و صرفه جویی در منابع از جمله هزینه باشد انتخاب مناسب پایتون است. گاهی نیز بهترین کارایی با استفاده ترکیبی از زبان‌های متفاوت به دست می‌آید.

در بسیاری از کاربردها سرعت پایتون کاملا قابل قبول است، وجود بایت‌کد‌ موجب افزایش سرعت در اجراهای بعدی برنامه می‌شود و نکات برنامه‌نویسی زیادی برای بهبود سرعت اجرا در پایتون وجود دارد که در این کتاب به تدریج اشاره خواهد شد. نباید فراموش کرد که یکی از مهمترین عامل‌های کارایی داشتن الگوریتمی بهینه است و البته نوشتن ماژول‌ها به زبان C نیز موجب افزایش قابل توجه کارایی پایتون می‌شود - پایتون کند است اگر اشتباه استفاده شود - با این وجود در حالت عادی اگر هزار مورد وجود داشته باشد که پایتون برای آن‌ها بهترین انتخاب باشد، سرعت یکی از آن‌ها نخواهد بود و برای توسعه برنامه‌هایی که سرعت اجرا نقش بسیار تعیین کننده‌‌ای دارد باید از زبان‌های دیگری استفاده نمایید.

لازم است به این نکته هم توجه داشته باشیم که تمام این صحبت‌ها در مورد پیاده‌سازی CPython از زبان پایتون بوده و پیاده‌سازی‌های دیگری نیز از زبان پایتون با هدف سرعت بالای اجرا (به مانند PyPy) توسعه یافته است.

نسخه‌ها

هم اکنون دو شاخه از پایتون به صورت موازی (Parallel) در کنار یکدیگر در دسترس هستند: نسخه‌های 2x و 3x.

در یک سیر تاریخی، نسخه‌ پایدار 2.0 در شانزدهم اکتبر سال ۲۰۰۰ میلادی و در ادامه‌ نسخه 1.6 منتشر (Release) می‌شود؛ پس از آن نیز توسعه‌ پایتون به همان صورت پیشین ادامه می‌یابد تا این که در دسامبر سال ۲۰۰۸ میلادی نسخه‌ای از پایتون با شماره‌ 3.0 که از آن با عنوان ”Python 3000“ یا ”Py3K“ نیز یاد می‌شود، با رویکرد شکستن «سازگاری با نسخه‌های پیشین» (Backward Compatibility) منتشر می‌گردد. به بیان دیگر: مفسر نسخه‌های جدید (3x) پایتون قادر به اجرای سورس کدی که بر پایه‌ مفسر نسخه‌های پیشین تهیه شده است، نخواهد بود. (که این اتفاق در جامعه پایتون بسیار بحث برانگیز بوده و هست!)

ظاهرا آقای روسوم خیلی پیش از این زمان نیاز به ایجاد یک سری تغییرات در ساختار و سینتکس این زبان را احساس کرده بود. شاید نخستین نشانه‌ از لزوم ایجاد تغییرات در پایتون را بتوان از صحبت‌های ایشان در همایش متن باز اوریلی (OSCON) سال ۲۰۰۲ با عنوان «پشیمانی‌های پایتون» (Python Regrets) دریافت کرد. به هر صورت تیم توسعه‌ پایتون در پی رفع این نیاز، از بین حفظ گذشته‌ پایتون و پایبندی به فلسفه‌ سادگی آن؛ دومی را انتخاب می‌کند، ویژگی‌های کهنه کنار گذاشته و ویژگی‌های جدید جایگزین می‌گردند.

با انتشار یک نسخه‌ جدید به صورت معمول می‌بایست توسعه‌ نسخه‌ قدیمی متوقف شود، ولی از آنجا که زیر‌ساخت شرکت‌های بزرگی به پایتون وابسته بوده (مانند Google) و ارتقا نسخه برای آن‌ها حداقل بسیار زمان‌بر خواهد شد، برنامه‌ها و کتابخانه‌های کوچک و بزرگ بسیار زیادی توسط کاربران جامعه‌ پایتون برای نیاز‌های ریز و کلان گوناگونی توسعه یافته است که سازگار شدن تمام آن‌ها با نسخه‌ جدید پایتون بعید به نظر می‌رسد و از همه مهم‌تر خود برنامه‌نویسان پایتون می‌باشند که پس از سال‌ها اکنون مجبور هستند کارهای دیروز خود را با سینتکس و در مواقعی حتی با کتابخانه و ماژول‌هایی متفاوت به انجام برسانند؛ تیم توسعه‌ پایتون، برای پر کردن شکاف به وجود آمده بین دیروز و امروز پایتون یا به بیانی هموار کردن مسیر مهاجرت به نسخه‌ جدید پایتون،‌ علاوه بر اینکه از پیش سعی کرده بود تا ویژگی‌های جدید و سینتکس نسخه‌ 3.0 را به نسخه‌ 2.6 (که دو ماه زودتر منتشر شده بود) پورت (Port) کند، به توسعه‌ نسخه قدیمی پایان نمی‌دهد و نسخه‌ دیگری را با شماره‌ 2.7 در سوم جولای ۲۰۱۰، تقریبا یک سال پس از انتشار نسخه‌ 3.1 به همراه بسیاری از ویژگی‌های جدید آن منتشر می‌سازد.

بر طبق سند [13] PEP 404، هرگز نسخه‌ای با شماره‌ 2.8 به صورت رسمی منتشر نخواهد شد و نسخه‌ 2.7 با یک پشتیبانی طولانی مدت، نقطه‌ پایان نسخه‌ قدیمی پایتون خواهد بود. ابتدا قرار شد از این نسخه به مدت پنج سال پشتیبانی (تلاش برای رفع باگ‌ها) شود ولی چند ماه پیش، این زمان به ده سال یعنی تا سال ۲۰۲۰ افزایش یافت.

نسخه‌ پایدار (Stable) پایتون با قالب A.B.C؛ مانند 3.4.2 شماره‌‌گذاری و منتشر می‌شود. عدد A، بخش اصلی (Major) شماره نسخه است و زمانی افزایش می‌یابد که واقعا تغییرات بزرگ و زیادی در زبان پایتون ایجاد شده باشد. عدد B، بخش جزئی (Minor) شماره نسخه را نشان می‌دهد و با ایجاد یک سری تغییرات مهم در زبان پایتون افزایش خواهد یافت. عموما شماره‌ نسخه‌ پایتون تنها به صورت A.B نشان داده می‌شود، زیرا عدد C تنها با رفع اشکال (Bug) احتمالی نسخه‌ منتشر شده افزایش می‌یابد (از عدد صفر) که این امر نیز شامل همه‌ نسخه‌های پایتون نمی‌شود.

کدام نسخه؟ برای شروع یادگیری و اهداف آموزشی نسخه‌ 3x مناسب است و در صورت نیاز تنها با مطالعه‌ مقایسه بین این دو نسخه می‌توانید با نسخه‌ قدیمی نیز آشنا شوید. همچنین اگر قصد توسعه‌ برنامه‌های دسکتاپ را داشته (یعنی زمانی که محدود به نسخه‌ نصب شده بر روی سرور نیستید) یا مواقعی که در ایجاد برنامه‌ خود نیازی به کتابخانه‌هایی که هنوز (اوایل ۲۰۱۵) با نسخه‌ 3x سازگار نشده‌اند (مانند Twisted) را ندارید؛‌ استفاده از نسخه‌ 3x بسیار خوب است. به هر حال تلاش می‌شود که این کتاب بتواند به دور از آشفتگی هر دو نسخه را پوشش دهد.

پی‌نوشت

[1]برگرفته از نوشته‌های وبلاگ [The History of Python] و همینطور مصاحبه‌ [The Making of Python]
[2]”...در دسامبر سال ۱۹۸۹ دنبال یک پروژه‌ برنامه‌نویسی به عنوان سرگرمی می‌گشتم تا اوقات فراغت به وجود آمده از تعطیلات کریسمس را پر کنم. دفتر کارم (یک آزمایشگاه تحقیقاتی دولتی در آمستردام) بسته بود، ولی یک رایانه‌ شخصی داشتم و چیزی بیش از این هم در اختیارم نبود. تصمیم گرفتم تا مفسری برای یک زبان اسکریپتی جدید بنویسم. قبلا در مورد آن فکر کرده بودم: از نسل زبان ABC و جذاب برای هکرهای Unix/C. نام پایتون را برای عنوان کاری این پروژه انتخاب کردم، کمی گستاخانه ( و یک طرفدار بزرگ Monty Python’s Flying Circus)...“ - نقل از آقای روسوم [منبع]
[3]در دروس آینده به انواع داده (Data Types) در زبان پایتون به صورت کامل پرداخته می‌شود. البته خواهید دید که این مبحث در پایتون با عنوان «انواع شی» ارايه می‌گردد.
[4]برای مشاهده‌ موارد استفاده بیشتر پایتون می‌توانید به صفحه‌های [درباره پایتون] و [ویکی پایتون] مراجعه نمایید.
[5]موارد بیشتر در [ویکی پایتون]
[6]این‌ها در واقع ماژول یا کتابخانه‌هایی هستند که توسط افراد و تیم‌هایی مستقل و خارج از مجموعه‌ اصلی توسعه‌ پایتون، ایجاد و توسعه داده می‌شوند. برای دانستن بیشتر می‌توانید به [ویکی پایتون] مراجعه نمایید.
[7]متغیر در پایتون، نامی است که به یک شی (Object) در حافظه اشاره می‌کند. (در دروس آینده به آن پرداخته خواهد شد)
[8]از نسخه 2.0 و جدیدتر به پایتون (پیاده‌سازی CPython) افزوده شده است.
[9]دسته‌بندی رایج دیگر، بر مبنای نسل (Generation) است. زبان‌های نسل اول زبان‌های ماشین، نسل دوم زبان‌های اسمبلی، نسل سوم زبان‌های سطح بالایی مانند C# ،C++ ،C ،Lisp ،Cobol ،Fortran و Java هستند. زبان‌های نسل چهارم آن‌هایی هستند که برای کاربرد‌هایی خاص طراحی شده‌اند مانند NOMAD برای تولید گزارش، SQL برای پرس و جوهای (Queries) پایگاه‌ داده و Postscript برای قالب‌بندی متن. اصطلاح زبان نسل پنجم به زبان‌های مبتنی بر منطق و شرط (logic- and constraint-based) مانند Prolog و OPS5 گفته می‌شود. (آورده شده از کتاب: کامپایلرها... نوشته Aho و...، ویرایش دوم، صفحه ۱۳) - زبان پایتون یک زبان همه منظوره است و در دسته زبان‌های نسل سوم قرار می‌گیرد،‌ هر چند که نسبت به برخی از زبان‌های این نسل سطح بالاتری دارد.
[10]با توجه به نوشته‌ Jeremy Jones با عنوان Python's (Weak) Functional Programming Paradigm.
[11]منظور از ماشین مجازی در اینجا ”Process Virtual Machine“ است و نباید با «ماشین مجازی سیستمی» (System Virtual Machine) اشتباه گرفته شود.
[12]برای نمونه: این کار در زبان Pascal توسط کلمات Begin و End، در زبان‌های C و Java توسط آکولاد { } صورت می‌گیرد.
[13]

PEPs یا Python Enhancement Proposals (طرح‌های توسعه‌ پایتون) در واقع مجموعه اسنادی است که تیم توسعه‌ پایتون از آن‌ها برای توصیف شیوه‌ طراحی، ویژگی‌های جدید یا منطق، فرآیند و راهبردهای آینده پایتون استفاده می‌کنند. فهرست: PEP 0

در این میان شیوه استاندارد کد‌نویسی در زبان پایتون توسط سندی با نام (PEP8 (Style Guide for Python Code بیان می شود که به تدریج در دروس آتی بیان خواهد شد. این سند قالب کدنویسی که هر برنامه‌نویس حرفه‌ای پایتون انتظار دارد از کدهای شما ببیند را ترسیم می‌کند.



😊 امیدوارم مفید بوده باشه

لطفا دیدگاه و سوال‌های مرتبط با این درس خود را در کدرز مطرح نمایید.