(وقتی میرین سراغ یک زبان برنامهنویسی جدید، معمولا چنتا اصطلاح هست که باهاش رو به رو میشین…)
زبان برنامهنویسی strongly typed در مقابل weakly typed
تو یه زبان strongly typed اجازه نداریم عملیاتی انجام بدیم که با نوع دادههای ما همخوانی نداشته باشه و در صورت انجام مفسر یا کامپایلر به ما خطا نشون میده، اما در یک زبان weakly typed، مفسر یا کامپایلر خودش به صورت خودکار یک سری عملیات روی دادههای ما انجام میده (معمولا یکی از دادهها رو به نوع اون یکی داده تبدیل میکنه) و نهایتا بدون دادن خطا به جواب میرسه.
مثال:
فرض کنیم بخوایم مقدار رشتهای «5″ رو با مقدار عددی 7 جمع کنیم، تو زبانهایی که نوع داده محکم تعریف شده (strongly typed)، با خطا رو به رو میشیم و قبلش باید خودمون با استفاده از توابعی که در دسترس داریم یکی از دادهها رو به نوع دیگه تبدیل کنیم؛ اما در زبانی که نوع داده ضعیف تعریف شده (weakly typed)، ممکنه به جواب «57″ یا 12 برسیم.
کدوم بهتره؟
هر چند ممکنه در نگاه اول دوست داشته باشیم کامپایلر/مفسر خودش همهی کارها رو بکنه، اما بیشتر برنامه نویسا اعتقاد دارن زبانی که دادههاش رو محکم تعریف کنه بهتره، چون در صورت بروز خطا همون محلی که خطا رخ داده با پیغام type error رو به رو میشین، در حالی که اگه نوع دادهها ضعیف تعریف بشه، معمولا خطا در قسمت دیگهای از برنامه خودش رو نشون میده، و پیدا کردن محل خطا سخته (گاهی خیلی سخته!)، اینم در نظر بگیرین که باید قوانین مربوطه به تبدیل انواع هنگام برخورد به این موارد رو یاد بگیرین. مثلا بدونین در چه مواردی جواب «57″ میشه و در چه مواردی 12…
زبان برنامه نویسی static typed در مقابل dynamic typed
یکی از تعاریف سادهای که در این مورد شنیدم اینه که در یک زبان static typed نوع داده در طرف متغیر تعریف میشه در حالی که در یک زبان dynamic typed نوع داده به وسیلهی مقدارش مشخص میشه.
نتیجه اینکه شما در یک زبانی که نوع داده استاتیکی مشخص شده، باید هنگام تعریف متغیر، نوع دادهای که قراره بگیره رو مشخص کنین، و بعد از اینکه نوع داده رو مشخص کردین دیگه نمیتونین دادهای از نوع دیگه بهش بدین (مثلا اگه بهش گفتین این متغیر یک مقدار رشتهایه، دیگه نمیتونین بهش عدد اعشاری بدین)؛ اما زبانی که نوع دادههاش دینامیکی تعریف میشن دقیقا برعکسه، یعنی اولا شما لازم نیست هنگام تعریف متغیر نوع دادهتون رو مشخص کنین، ثانیا میتونین به متغیری که قبلا یک مقدار رشتهای داشته، حالا یک مقدار عددی بدین (بدون اینکه هیچ خطایی دریافت کنین)
کدوم بهتره؟
از همین الآن بگم، اتفاق نظر در این زمینه وجود نداره، هر کدوم مزایا و معایب دارن…
پیش از هر چیز باید اضافه کنم اینه که تو بعضی از زبانهای استاتیکی، کامپایلر/مفسر بدون اینکه لازم باشه شما ابتدا متغیر رو تعریف کنین، میاد و با استفاده از نوع دادهای که به متغیر اختصاص میدین، نوع متغیر رو تعیین میکنه. (یعنی مینویسین x=5 و مفسر خودش میاد و x رو از نوع integer تعریف میکنه). بنابراین در زبانی که متغیرهاش استاتیکی باشن الزاما لازم نیست ابتدا متغیرها رو تعریف کنین یا قسمتی از وقتتون رو صرف به خاطر سپردن روش انجام این کارها بکنین.
از یک طرف تعریف نوع دادهها به صورت پویا (dynamic typing)، کار رو آسون میکنه، چون دیگه لازم نیست نوع متغیرها رو برای برنامه تعریف کنیم و در ضمن هنگام تغییر نوع مقادیر متغیرها با خطا رو به رو نمیشیم، از اون طرف تشخیص خطا در زبانهایی که به صورت استاتیک نوع داده رو مشخص میکنن سریعتر و راحتتر صورت میگیره و احتمال خطا در برنامهی نهایی کمتره، هر چند درصد وقوع این خطاها ممکنه ناچیز باشه.
برنامه نویسانی که از زبانهای دینامیکی استفاده میکنن، برای گرفتن خطاهای احتمالی دست به دامن نوشتن برنامههای خطایاب میشن که هم این خطاها و خطاهای دیگهی احتمالی برنامه رو میگیره و بهش میگن test suites یا unit tests.
+ در زبانهایی که دادهها دینامیکی تعریف میشن، بررسیهای لازم هنگام اجرای برنامه پیچیدهتر میشن و باید با هر بار اجرای برنامه تکرار بشن و این یعنی برنامههای زبانهایی که دادههای استاتیکی دارن معمولا سریعتر هستن. البته زمانی که صرف کامپایل برنامه میشه درست برعکسه و در زبانهای نوع دینامیکی این زمان کمتره و میتونه باعث کاهش زمان چرخهی «ویرایش-کامپایل-آزمایش-اشکالزدایی» بشه. (این چرخهایه که یک برنامه نویس مدام باید تکرارش کنه)
و باید گفت در زبانهایی که نوع متغیرها دینامیک تعریف میشن، یک سری کارها میشه کرد که تو زبانهای استاتیک تعریف شده نمیشه. مثلا در یک زبانی که دادهها دینامیکی هستن، میشه یک دادهی ورودی رو به مانند یک خط از کدهای اون برنامه اجرا کرد (تابع eval) اما این کار در زبان نوع استاتیکی به این سادگی نیست. و چند امتیاز دیگه برای زبانهای نوع دینامیکی…
اینم یه جدول برای مقایسه زبانهای مختلف از نظر تایپسیستم اونها:
| نام زبان برنامه نویسی |
Strong Typed |
Weak Typed |
Dynamic Typed |
Static Typed |
| C |
|
× |
|
× |
| Python |
× |
|
× |
|
| Visual Basic |
× |
|
|
× |
| PHP |
|
× |
× |
|
| Java |
× |
|
|
× |
| Java Script |
|
× |
× |
|
| C Sharp |
× |
|
× |
× |
| Object Pascal |
× |
|
× |
× |
| Pascal |
× |
|
|
× |
| Ruby |
× |
|
× |
|
منابع:
36.290070
59.596851
دوستداشتن:
نخستین کسی باشید که این نوشته را دوست دارد.