سیستم نوع

**گونه‌سامان (سامانهٔ گونه‌دِهی یا سامانهٔ گونه‌بندی)**، یا **سیستمِ نوع** یا **تایپ‌سیستم** (انگلیسی: Type system) مجموعه‌ای از قوانین است که ویژگی «گونه(‌ها)» را به مفاهیم مختلف یک زبان برنامه‌نویسی، مانند متغیرها، رویه‌ها و عبارات، نسبت می‌دهد. هر زبان برنامه‌نویسی دارای تعدادی «گونه» است که داده ساختارهای مختلف مورد استفاده در برنامه‌ها را دسته‌بندی می‌کنند.

در علوم رایانه یک **گونه‌سامان** نحوهٔ ارتباط زبان برنامه‌نویسی را با مقادیر و عبارات تعیین می‌کند و تحت این روابط آن‌ها را دسته‌بندی کرده و رفتار مناسب آن‌ها را با یکدیگر تعیین می‌کند. یک نوع در داده‌ها به معنای یک دسته از مقادیر با ویژگی‌های عمومی یکسان است. البته باید در نظر داشت که ممکن است این ویژگی‌ها به‌طور واقعی در یک برنامه در حال اجرا، وجود نداشته باشد. سیستم نوع در بین زبان‌های برنامه‌نویسی مختلف به‌طور کلی متفاوت است. اصلی‌ترین تفاوت در مورد ایستا بودن یا ایجاد در زمان اجرا انواع داده در زبان‌های مختلف می‌باشد.

کامپایلرها با استفاده از این گونه‌سامان در صدد بهینه‌سازی رفتار خود در زمینهٔ ذخیره‌سازی فضا برمی‌آید.

عضوهای داده‌ای استاتیک یک کلاس، به عنوان «متغیرهای کلاس» شناخته می‌شوند، زیرا فقط یک مقدار منحصر به فرد برای همه‌ی اشیای آن کلاس وجود دارد. محتوای آن‌ها در یک شیء از آن کلاس با دیگری، متفاوت نیست .

## هدف سامانهٔ گونه‌ها
هدف اصلی «سامانهٔ گونه‌ها» جلوگیری از وقوع خطاهای اجرایی است. خطاهای اجرایی عموماً به صورت اشکال در روند اجرایی برنامه بروز پیدا می‌کنند. البته ممکن است برخی خطاهای اجرایی بدون داشتن اثر قابل مشاهده‌ای باعث تخریب داده شوند.

## زبان‌های برنامه‌نویسیِ با «گونهٔ داده» و بدون «گونهٔ داده»
متغیرهای یک زبان می‌توانند مقدارهای مختلفی بگیرند. حد بالای این مقادیر گونه (یا نوع) نامیده می‌شود. برای مثال، در زبان برنامه‌نویسی جاوا که دارای گونهٔ دادهٔ بولی (boolean) است؛ که دو مقدار درست (True) و نادرست (False) به خود می‌گیرد. به زبان‌هایی که مقادیر یک متغیر را از طریق نسبت دادن نوع به آن محدود می‌کنند، زبان‌های «دارای گونهٔ داده» یا «گونداده دار» گفته‌می‌شود. متغیرهای زبان‌های «فاقد گونهٔ داده»، مفهوم «گونه» را در خود ندارند. زبان‌های فاقد ‌گونداده ممکن است یک  داشته‌باشند که همهٔ مقادیر را بپذیرد. عملیات در زبان‌های فاقد گونداده می‌توانند روی متغیرهای با نوع نادرست اعمال شوند.

## خطاهای اجرایی و ایمنی
خطاهای اجرایی به‌طور کلی به دو دسته تقسیم می‌شوند.
* **خطاهای توقفی:** خطاهایی که باعث توقف روند اجرای برنامه می‌شوند.
* **خطاهای غیرتوقفی:** خطاهایی که برنامه را متوقف نکرده و باعث بروز رفتارهای غیرمنتظره در آینده می‌شوند.

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

## ویژگی‌های یک سامانهٔ گونه‌ها
گونداده‌های یک زبان برنامه‌نویسی از لحاظ صوری بودن تعریف‌شان با دیگر اجزای زبان تفاوت‌هایی دارند. تعریف انواع داده از این دید در میان یادداشت‌های غیر صوری یک زبان و تعریف مشخصات جزئی‌تر است؛ از یادداشت‌های زبان صوری‌تر است و از مشخصات جزئی راحت‌تر قابل پردازش است.
ویژگی‌های پایه‌ای یک سیستم انواع عبارت‌اند از: 
* «سامانهٔ گونه‌ها» باید به صورت تصمیم‌پذیر قابل تصدیق باشد. به این معنی که الگوریتمی (که به الگوریتم بررسی گونداده معروف است) وجود داشته‌باشد که خوش‌رفتار بودن برنامه را تصمیم بگیرد. هدف سیستم انواع تنها بیان هدف برنامه نیست؛ بلکه شناسایی و جلوگیری از وقوع خطاها است.
* «سامانهٔ گونه‌ها» باید شفاف باشد. برنامه‌نویس باید قادر باشد بدون ابهام رفتار یک سیستم انواع و بررسی نوع‌داده آن را پیش‌بینی کند.
* بررسی نوع داده در یک سیستم انواع باید قابل تحمیل باشد؛ اعلام انواع متغیرها باید در زمان کامپایل به صورت ایستا قابل بررسی باشد. بررسی‌های بیشتر باید در زمان اجرا به صورت پویا انجام بگیرند. همچنین وجود تناسب بین نوع هر متغیر با مقدار نسبت داده‌شده به آن باید بررسی شود.

## بررسی گونه
بررسی گونه (Type-checking) فرایندی است برای اثبات اینکه هر عملیاتی که در برنامه اجرا می‌شود قواعد گونه‌ای زبان را رعایت می‌کند. به‌طور کلی به این معناست که تمامی عملوندها در تمامی گزاره‌ها دارای گونه مناسبی هستند.

بررسی کردن معنایی بر دو قسم است:

* بررسی ایستا: این نوع بررسی در هنگام کامپایل شدن اتفاق می افتد.
* بررسی پویا: این نوع بررسی در هنگام اجرا اتفاق می افتد.

### بررسی گونه‌ای ایستا
یک زبان ایستا گونه است اگر گونه متغیرها به جای زمان اجرا در زمان کامپایل مشخص شود. از مثال‌های معروف از زبان‌های ایستا-گونه می‌توان به زبان‌های Ada, C, C++, C#, JADE, Java, Fortran, Haskell, ML, Visual Basic, Pascal, and Scala اشاره کرد.

مزیت بزرگ زبان‌هایی که از بررسیِ گونهٔ ایستا استفاده می‌کنند این است که می‌توانند بسیاری از خطاها و اشتباهات را به سرعت در مرحله توسعه شناسایی کنند. ایستا گونگی معمولاً کدهای کامپایل شده‌ای را نتیجه می دهند که سریع تر اجرا می‌شوند زیرا زمانی که کامپایلر می‌داند که دقیقاً از چه گونه اطلاعاتی استفاده می‌کند می‌تواند کدهای ماشین بهینه تری تولید کند. ( کدهایی که سریع ترند یا حافظه کمتری اشغال می‌کنند)

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

یک بررسی‌کننده گونه ایستا به سرعت خطاهای گونه‌ای را در مسیرهای کد کمتر مورد استفاده پیدا می‌کند اما بدون بررسی ایستا گونه حتی با وجود پوشش 100% کد با تست ممکن است این چنین خطاهایی کشف نشوند.

نقطه منفی بررسی ایستا این است که اگر شما بخواهید در یک زبان با بررسی‌کننده گونه ایستا یک برنامه با خطا گونه‌ای را به صورت دستی اجرا کنید ، حتماً بررسی‌کننده گونه متوجه می‌شود و یک خطای گونه‌ای را ایجاد می‌کند و مانع اجرا برنامه شما می‌شود.

### بررسی گونه‌ای پویا
بررسی گونه پویا فرایندی است که ایمن بودن گونه‌های یک برنامه را در زمان اجرا تصدیق کند. زبان‌های معروف با بررسی‌کننده گونه پویا عبارتند از :

Groovy, JavaScript, Lisp, Lua, Objective-C, PHP, Prolog, Visual Basic, Python, Ruby, Smalltalk and Tcl.

بیشتر زبان‌های ایمن-گونه دارای سبکی از بررسی گونه پویا هستند حتی اگر آن‌ها از یک بررسی‌کننده ایستا نیز استفاده کنند. دلیل این امر این است که بررسی گونه‌ای ایستای بسیار از ویژگی‌ها و خواص مفید غیرممکن (یا بسیار دشوار) است. برای مثال برنامه‌ای را در نظر بگیرید که دو گونه A , B را تعریف کرده که A زیرگونه B  است. اگر برنامه سعی کند که یک مقدار از گونه A را به گونه B تبدیل کند که تبدیل رو به پایین   این عمل زمانی مجاز خواهد بود که مقدار تبدیل شونده خود از گونه B باشد بنابراین یک بررسی‌کننده پویا گونه لازم است که تصدیق کند که این عمل ایمن است. از دیگر قابلیت‌های زبانی که بررسی پویا گونه اجازه می دهد می‌توان به dynamic dispatch, late binding,  و  reflection اشاره کرد.

برخلاف بررسی‌کننده‌های گونه ایستا ، بررسی‌کننده‌های گونه پویا ممکن است باعث خرابی برنامه در زمان اجرا به علت خطاهای گونه‌ای شوند. در بعضی از زبان‌های برنامه‌نویسی این قابلیت وجود دارد که از این خطاها به وسیله روش‌های حل خطا و یا روش‌های ایمنی ضعیف خارج شد. در سایر زبان‌ها خطاهای گونه‌ای کشنده قلمداد می‌شود .

به علت سخت بودن تشخیص خطاهای گونه‌ای در زبان‌های با بررسی گونه‌ای پویا یک روش مرسوم استفاده از «یگان آزمایی»  می‌باشد.

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

با این حال بررسی‌کننده‌های پویا امکان ساختن زبان‌هایی را می دهند که دارای با قدرت بیشتر و امکانات بهتری باشند و توسعه محصولات را به صورت چشم‌گیری آسان تر کنند.

### فرایند طراحی یک صحت یاب گونه

# در ابتدا باید گونه‌هایی که در زبان موجود اند را شناسایی کنیم.
# سپس به شناسایی ساختارهایی از زبان که با این گونه‌ها در ارتباط اند می پردازیم
# در انتها قواعد معنایی که بر این زبان هستند را شناسایی می کنیم.

## جستارهای وابسته

* هم‌وردایی و پادوردایی (علوم رایانه)
* چندریختی در برنامه‌نویسی شئ‌گرا
* پندارهٔ گونه‌ها

## منابع

رده:انواع داده
رده:تحلیل برنامه
رده:سیستم‌های انواع
رده:نظریه نوع‌ها