درک انواع داده ای ایستا پویا / قوی ضعیف
سلام مجتبی هستم و توی این مقاله میخوام درباره یه موضوع اساسی و پایهای توی دنیای برنامه نویس صحبت کنم. رویکردی که زبانهای برنامه نویسی نسبت به انوع دادهای دارن چیه؟
به نظر شما جواب 2 + “2” چند میشه؟
بعضیها میگن 4 بعضیها میگن 22 و بعضیها هم میگن این محاسبه درست نیست. اما من همیشه میگم اگه بدونیم با چه نوع دادهای در چه فضایی مواجه هستیم اونوقت می تونم تصمیم بگیریم که چطور برنامه بنویسیم.
به طور معمول وقتی درباره زبان های برنامه نویسی صحبت می کنیم می تونیم اون ها رو از نظر رفتارشون با انواع دادهها درون یک دایره که به چهار بخش تقسیم شده قرار بدیم با دو محوریت ایستا/پویا و قوی/ ضعیف.
اما این اصطلاحات به چه معنا هستن و هرکدوم از این ویژگی ها چه قابلیت هایی رو به زبانها میدن
نوع داده ایستا
استفاده از این نوع داده در یک زبان به این معنی هست که نوع متغیر هایی که در برنامه تعریف می کنید در هنگام کامپایل بررسی میشن درواقع زبان هایی که از این نوع داده استفاده می کنن انتظار دارن که شما نوع هر متغیر رو در هنگام نوشتن برنامه صراحتا اعلام کنید به نمونه زیر نگاه کنید:
این تیکه کد از زبان ++C هست که دو عدد x , y رو با هم جمع می کنه همون طور که می بینید در تعریف تمام متغیر ها از کلمه کلیدی int استفاده شده که یعنی این متغیر ها از نوع عدد صحیح هستن فقط می تونن اعداد صحیح رو قبول کنن و تا آخر هم عدد صحیح باقی می مونن و اگه مقداری غیر از عدد صحیح رو بهشون بدیم با خطا مواجه می شیم مگر اینکه صراحتاً نوع اونها تغییر داده بشه.
نوع داده پویا / dynamic
دقیقاً در نقطه مقابل نوع استاتیک قرار می گیره یعنی زبانهایی که از این نوع استفاده می کنن نوع داده متغیر ها رو در هنگام اجرا بررسی می کنن یا به قول خارجی ها “check on the fly” نمونه زیر رو ببینید.
تکه کد بالا از زبان Python که یک زبان نوع داینامیک هست همان عمل جمع اعداد x , y را انجام میده با این حال خبری از تعریف نوع متغیر نیست درواقع در زبانهای نوع داینامیک نوع متغیر پس از تخصیص یافتن توسط خود زبان تعیین میشه مثلاً اگر بگیم x = 5 است پس یعنی x یک متغییر از نوع عدد صحیح است.
دایرهای که اول مقاله بود رو یادتونه یه محور دیگه داشت که روی strong / weak بود. این بخش یکم شاید پیچیدهتر باشه چون یه قانون واحد نداره من سعی می کنم کلیت ماجرا و اون چه که بیشتر باهاش مواجه می شیم رو بیان کنم.
نوع داده قوی / strong
در اکثر مواقع اما نه همیشه می تونیم زبانهایی که از نوع داده strong استفاده می کنن رو این شکلی تعریف کنیم. “اصولا اجازه نمی دهند انواع دادهای مختلف بدون اجازه برنامه نویس به نوع دادهای دیگری تبدیل شوند” مثلاً ”123” همیشه به عنوان یک رشته در نظر گرفته میشه مگر اینکه برنامه نویس نوع اون رو صراحتاً به نوع عددی تغییر بده اون موقع به 123 تبدیل میشه ( به وجود ” ” در اطراف 123 دقت کنید) نمونه زیر رو ببینید.
در تکه کد بالا از زبان Python سعی می کنیم که عدد 1 رو با رشته ”2” جمع کنیم. اصولاً زبانهای با نوع داده strong اجازه چنین کاری رو به ما نمیدن چون نمیشه مطمعن بود که منظور ما در هنگام استفاده از عملگر + جمع ریاضی هست یا به هم چسبوندن دو رشته در کنار هم و همون طور که می بینید اجرای این برنامه منجر به تولید خطایی به اسم TypeError شده که دقیقاً یعنی نوع این دادهها به هم نمی خوره و نمیدونه چطور عملگر + رو روی اونها اعمال کنه. مگر اینکه ما صراحتاً نوع یکی از این متغیر ها رو به نوع متغیر دیگه تغییر بدیم مثلاً هردوتا رو تبدیل کنیم به عدد صحیح.
قاعدتاً تا الان متوجه شدین که python یک زبان dynamic/strong هست.
نوع داده ضعیف / weak
این بخش به نظر خودم خیلی هیجان انگیزه. طبیعتاً زبان های نوع weak بر خلاف زبانهای نوع strong عمل می کنن. مفسر یا کامپایلر در این نوع زبانها سعی می کنه با استفاده از روشهایی که شاید در اوایل کمی گیجکننده باشه از اون چه که بهش میدیم بهترین استفاده رو بکنه اما وقتی درک کنیم داره چیکار می کنه خیلی هم منطقی هست. مثلاً توی بعضی از موارد ممکنه یک عدد صحیح رو به عنوان یک رشته در نظر بگیره برای اینکه بتونه اونو توی یک متن جا بده بیایید مثال قبلی رو با یه زبان نوع weak خیلی معروف به اسم JavaScript انجام بدیم.
توجه کنید که بر خلاف اونچه که در پایتون اتفاق افتاد اینجا با خطا مواجه نمی شیم و نتیجه این محاسبه 12 میشه نه 3 چون JavaScript بر اساس قواعدی که خودش داره توی چنین مواردی ترجیح میده که هر دو متغیر رو به عنوان رشته در نظر بگیره و از عملیات به هم چسبوندن رشتهها استفاده کنه و بخاطر همین یک زبان نوع weak محسوب میشه.
در ادامه نگاهی بندازیم به اینکه زبانهای معروف توی چه دستهای از دایره ما قرار می گیرن.
Static –strong: C++ , C# , Java
- dynamic strong: Smalltalk, Perl, Ruby, Python
-dynamic weak: JavaScript
مقایسه مزایا و معایب
در زبانهای نوع داینامیک معمولاً برنامه نوشتن و یاد گرفتن برنامه نویسی ساده تره چون کمتر شما رو درگیر تعریف دقیق متغیرها می کنن اما از اونجایی که نوع متغیرها در هنگام اجرا بررسی میشن معمولاً از این بابت نسبت به زبانهای استاتیک کندتر هستن (البته سرعت به مسائل زیاد دیگه ای هم بستگی داره)
و در مورد strong / weak هم به نظر خودم با زبانهای نوع strong راحتتر میشه کار کرد چون همون جور که از اسمشون هم پیداست بیشتر به نوع دادهها اهمیت میدن و این محدودیتها باعث میشه که عملیات های ناخواسته به وجود نیاد.
کلام آخر
همه این ویژگیها فقط ویژگی هستن!!! هیچ کدوم برتری یا نقطه ضعف نیستن قبل تر ها که این موضوع رو نمی دونستم همیشه می دیدم و می شنیدم که خیلیها با زبانی مثل JavaScript شوخی می کنن و میگن که اگه بهش بگیم 2 + “2” بهمون میگه 22 و مطالبی از این دست از زبان های دیگه تا اینکه بلاخره با مفهومstatic / daynamic --- strong / weak آشنا شدم و تازه فهمیدم که همه این مسائل دلایل کاملاً منطقی داره و اگه زبانتون رو به درستی بشناسید خیلی خوب میشه از این قابلیتها استفاده کرد و اون وقته که حتی می تونید آگاهانه تر انتخاب کنید که از چه زبانی برای چه کاری استفاده کنید.
یک نقطه عطف مهم برای پایتون در سال 2020 اتفاق افتاد. پایتون 2.7 برای اولین بار در سال 2010 منتشر شد و در 1 ژانویه 2020 پستیبانی رسمی از اون تموم شد. پایتون 2 نزدیک به 20 سال به خوب...
توزیع لینوکس یا در حقیقت توزیع گنو/لینوکس (در حالت عامیانه بین بیشتر مردم گنو/لینوکس به عنوان لینوکس شناخته میشه که البته اشتباه هستش چون لینوکس فقط بخشی از سیستم عام...
دقیقاً در نقطه مقابل نوع استاتیک قرار میگیره یعنی زبانهایی که از این نوع استفاده میکنن نوع داده متغییر ها رو در هنگام اجرا بررسی میکنن یا به قول خارجی ها “check on the fly...
درواقع توسعه دهندهای گرامی اومدن دوباره یک کامپایلر مخصوص برای پایتون میکرو کنترلی ساختن و همچنین یک اجرا کنند و … که خیلی کار سختیه و کار هر کسی نیست! ولی همین کار...
بررسی ویژگی ها و مزیت ها و جزییات این زبان از حوصله این مقاله خارج هست و در این مقاله من فقط به 5 کاربرد پایتون در تکنولوژی اشاره میکنم ولی اگه علاقمند هستید که بیشتر د...
خروجی ها تو پایتون با امکانت زیادی رو به رو هستن شامل فونت مناسب، پشتیبانی از زبانهای فراوان نظیر فارسی و انگلیسی و همچنین پشتیبانی از رنگهای مختلف....