نوع داده (data type) چیست؟
آیا میدانید نوع داده چیست؟ تصور کنید که در حال انجام اسبابکشی هستید و وسایل خود را درون جعبههایی میگذارید. سپس نوع وسایلی که درون جعبه وجود دارد (برای مثال “شکستنی”) را روی برچسبی مینویسید و روی آن میچسبانید. ازاینپس با خواندن آن برچسب میفهمید که چه چیزی درون جعبه وجود دارد و چگونه باید با آن رفتار کنید. در زبانهای برنامهنویسی، نوع دادهها مانند این برچسبها عمل میکنند. کامپیوتر از روی آنها میتواند بفهمد چه چیزی در متغیرها ذخیره شده است و طبق چه الگویی باید با آنها رفتار کند. وجود این برچسبها ضروری است. به این خاطر که کامپیوترها در نهایت تنها با اعداد باینری (0 و 1) کار میکنند و این برچسبها به کامپیوتر کمک میکند که چگونه این اعداد را تفسیر و پردازش کند.
سیستم نوع داده چیست؟
سیستم نوع داده؛ مانند یک کتابچه راهنما، به مفسر زبان برنامهنویسی میفهماند که طبق چه قوانینی باید با نوع دادهها رفتار و آنها را مدیریت کند. همچنین این سیستم به برنامهنویسها کمک میکند تا از نوع دادهها بهدرستی استفاده کنند و خارج از چهارچوب قوانین آن نوع داده کاری انجام ندهند.
هر زبان برنامهنویسی، دارای یک سیستم نوع داده است که در مفسر و یا کامپایلر آن زبان وجود دارد. نحوه کار این سیستم در هر زبان فرق دارد و دارای ویژگیهای متفاوتی است.
در ادامه به بررسی انواع ویژگیهایی که این سیستمها دارند میپردازیم.
انواع سیستم نوع داده از نظر زمان بررسی نوع داده (type checking)
بررسی نوع داده (type checking) فرایندی است که طی آن، اعتبارسنجی و اعمال قوانین آن نوع داده انجام میشود. این فرایند میتواند در دو زمان رخ بدهد:
- در زمان کامپایل (compile time) که به آن نوع ایستا (statically typed) گفته میشود.
- در زمان اجرا (run time) که به آن نوع پویا (dynamically typed) گفته میشود.
نوع ایستا (statically typed)
بررسی نوع داده در این حالت در زمان کامپایل کد رخ میدهد. در حالت ایستا نوع هر متغیری که استفاده میکنیم باید مشخص باشد. به دلیل اینکه اطلاعات متغیرها در زمان کامپایل تعیین میشوند، کدی که بعد از کامپایل به زبان ماشین تبدیل شده است بسیار بهینه است و با سرعت بالاتری نسبت به حالت پویا اجرا میشود. همچنین اگر مشکلی در کد وجود داشته باشد، برنامه اجرا نمیشود و ارور مربوطه نمایش داده میشود.
از زبانهایی که از نوع بررسی ایستا استفاده میکنند، میتوان به C#, Java, Rust و TypeScript اشاره کرد.
هم رویش منتشر کرده است:
آموزش سی شارپ از صفر — گرافیکی با ساخت اپ در ویژوال استودیو
نوع پویا (dynamically typed)
بررسی نوع داده در این حالت در زمان اجرا کد رخ میدهد. بررسی نوع متغیرها در حالت پویا درست قبل از زمان استفاده آنها انجام میشود. این ویژگی باعث میشود تا کد ما قابلیت انعطاف بسیار بالایی داشته باشد، به این دلیل که میتوانیم مقادیر با نوع داده مختلف را درون هر متغیر استفاده کنیم.
از سوی دیگر به دلیل اینکه بررسی نوع دادهها در زمان اجرا انجام میشود، میتواند منجر به اتفاقافتادن ارورهای زمان اجرا (runtime error) شود.
همچنین زمان اجرا کد در زبانهای پویا آهستهتر از زبانهای ایستا است.
از زبانهایی که از نوع بررسی پویا استفاده میکنند، میتوان به Python، JavaScript و PHP اشاره کرد.
انواع سیستم نوع داده از نظر تعریف نوع داده (type declaration)
همانطور که پیشتر گفته شد، در زبانهای ایستا (static)، نوع متغیرها حتمی باید در هنگام تعریف آنها مشخص شود. معمولاً در زبانهای برنامهنویسی ایستا، دو روش برای تعیین نوع متغیرها وجود دارد.
نوع تعریف صریح (explicit)
در زبانهایی با نوع تعریف متغیر صریح (explicit)، نوع داده متغیر حتمی باید در هنگام تعریف آن بهصورت صریحی مشخص شود. بهعنوانمثال در زبان برنامهنویسی C++ برای تعریف متغیر عددی باید از کلیدواژه int قبل از تعریف متغیر استفاده کرد.
int num = 20;
نوع تعریف غیرصریح (implicit)
در زبانهایی با نوع تعریف متغیر غیرصریح (implicit)، این قابلیت وجود دارد که برنامهنویس نوع داده را مشخص نکند و خود زبان، نوع داده مناسب را باتوجهبه استفادهای که از متغیر شده، تعیین کند.
به این مثال از زبان TypeScript توجه کنید:
let num = 100;
در این مثال، نوع داده مشخصی برای متغیر num تعیین نشده است. نوع داده از استفادهای که از آن شده (ریختن عدد 100 در آن) تعیین میشود و نوع Number به آن اختصاص مییابد.
انواع سیستم نوع داده از نظر سختگیری در استفاده متغیرها
سیستمهای نوع داده به دودسته نوع داده قوی (strongly typed) و نوع داده ضعیف (weakly typed) نیز تقسیم میشوند. البته تعریف دقیقی از ویژگیهایی که یکزبان نوع داده قوی یا ضعیف را تشکیل میدهند وجود ندارد.
بهصورت کلی، یکزبان سیستم نوع داده قوی دارد اگر:
- خود زبان نتواند تغییری در نوع متغیرها ایجاد و آنها را تبدیل کند. تمام تبدیلها باید صراحتاً توسط برنامهنویس انجام شود.
- به شما اجازه ندهد از متغیری در عملیاتی که به آن مجاز نیست استفاده کنید.
توجه کنید که قوی و ضعیفبودن سیستم نوع داده در زبانهای برنامهنویسی لزوماً به معنی ایستا (static) بودن آنها نیست. بهعنوانمثال پایتون یکزبان برنامهنویسی پویا (dynamic) است که در دستهبندی نوع داده قوی قرار میگیرد.
به کد زیر که به زبان برنامهنویسی Python نوشته شده است دقت کنید:
print("2"+2)
این کد با خطا TypeError روبرو میشود؛ زیرا این کد از عملگر + برای دو نوع دادهای استفاده میکند که مجاز نیستند.
هم رویش منتشر کرده است:
آموزش پایتون از صفر — برنامه نویسی مقدماتی تا پیشرفته Python
اما اگر همین کد را در یکزبان با نوع داده ضعیف بنویسیم، خود زبان یک عملیات تبدیل نوع انجام میدهد و بدون خطا اجرا میشود.
به مثال زیر در JavaScript دقت کنید.
console.log("2"+2) //output: 22
سیستم نوع داده قوی باعث بهوجودآمدن خطاهای نوع داده (TypeError) بیشتری میشود. اما از سوی دیگر باعث میشود خوانایی کد بالاتر برود و همچنین برنامه به خطاهای منطقی و عملیات هایی که برنامهنویس آنها را پیشبینی نکرده برخورد نکند.
انواع سیستم نوع داده از نظر تطابق نوع داده (type compatibility)
تطابق نوع داده (type compatibility) به بررسی شباهتها میان نوع دادههای مختلف بهمنظور سازگار کردن آنها با یکدیگر انجام میشود. زبانهای برنامهنویسی به از این نظر به دودسته کلی تقسیم میشوند:
- نوع داده اسمی (nominally typed)
- نوع داده ساختاری (structurally typed)
نوع داده اسمی (nominally typed)
در این حالت متغیرها تنها زمانی با یکدیگر سازگار هستند که نوع داده آنها دقیقاً یکسان باشد. در نوع داده اسمی هر نوع دادهای منحصربهفرد است و ما نمیتوانیم نوعهای مختلف را به هم نسبت بدهیم، حتی اگر داده و شکل آنها مانند هم باشد.
نوع داده ساختاری (structurally typed)
در نوع داده ساختاری دو نوع باهم سازگار هستند اگر دارای ساختار و شکل یکسانی باشند. در این حالت نام نوع داده آنها مهم نیست و تنها ساختار آنها برای سازگاری بررسی میشود.
به مثال زیر توجه کنید.
public class Dog {
public String name;
public Dog(string name) {
this.name=name;
}
}
public class Cat {
public String name;
public Cat(string name) {
this.name=name;
}
}
Dog dog = new Dog("Pluto");
Cat cat = new Cat("Pluto");
در نوع داده اسمی، با اینکه ساختار کلاس Cat و Dog مشابه است، این دو کلاس باهم سازگاری ندارند و نمیتوان از آنها بهجای یکدیگر استفاده کرد.
اما در نوع داده ساختاری، این دو کلاس با یکدیگر سازگارند و میتوان از آنها بهجای یکدیگر استفاده کرد. به طور مثال اگر متدی انتظار دریافت شیء از نوع Dog داشته باشد، میتوانیم بدون دریافت خطا از شیء نوع Cat استفاده کنیم.
سخن پایانی
در این صفحه از مجله همرویش فهمیدیم که سیستم نوع داده چیست؟ و به بررسی انواع سیستمهای نوع داده (type system) در زبانهای برنامهنویسی پرداختیم. این اطلاعات به ما کمک میکند تا دید وسیعتری نسبت به نحوه کار زبان موردعلاقه خود داشته باشیم و برنامههایی که مینویسیم طراحی (design) و ساختار بهتری داشته باشند.
اگر به این دسته از مطالب علاقهمند هستید، میتوانید ما را در شبکههای اجتماعی همرویش دنبال کنید.
کلیدواژگان
سیستم نوع داده چیست؟ | what is type system?| type system in programming | تایپ سیستم چیست؟ | انواع سیستم نوع داده
منابع
Type Systems in Programming Languages
Typing: dynamic vs. static and weak vs. strong
2 دیدگاه برای “سیستم نوع داده (type system) چیست؟__ انواع سیستم نوع داده در برنامهنویسی ”
موضوع جالبی بررسی شده. یکی از زبانهایی که هم تعیین نوع ایستا و هم پویا داره کامن لیسپ هست. مقالهاش رو اینجا میتونید به فارسی بخونید:
https://farooqkz.de1.hashbang.sh/storage/download?name=didier.pdf
که یه ترجمه از این مقاله هست که به انگلیسی نوشته شده:
https://iaeng.org/IJCS/issues_v32/issue_4/IJCS_32_4_19.pdf
How to make Lisp run faster than C
مقاله بسیار خوبیه. جامع و از چند جنبه بررسی شده. بی صبرانه منتظر انتشار بخش دوم هستم.