منو
 کاربر Online
468 کاربر online

انواع داده ای

تازه کردن چاپ
علوم ریاضی > علو م رایانه
(cached)




تعریف

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


اساس و پایه


هدف اساسی نوع دهی، دادن بعضی معانی به چیزی است که فقط متشکل از تعدادی بیت است. انواع معمولاً همراه با مقادیری در حافظه و یا اشیاءای مثل متغیرها هستند. چون هر مقدار، مجموعه ای از بیت هاست، در سخت افزار تفاوتی بین آدرس های حافظه، کد دستورالعمل، کاراکترها، اعداد صحیح و اعداد ممیز شناور وجود ندارد. انواع به شما می گوید که چگونه با این بیت ها رفتار کنید.
توابع اصلی که سیستم های نوعی تامین می کنند عبارتند از:
* امنیت - انواع امکان کد کردن بعضی از عملگرها را که در یک متن ویژه نمی توانند مجاز باشند، فراهم می کند. این مکانیزم حداکثر اشتباه های برنامه نویسان را به دنبال دارد. مثلاً عبارت 'Hello, Wikipedia" / 3 غیر مجاز است چون یک رشته نمی تواند تقسیم بر یک عدد صحیح شود. همان طوری که گفته شد نوع دهی قوی امنیت زیادی دارد. اما امنیت کامل را گارانتی نمی کند.
* بهینه سازی - چک نوع استاتیک می تواند اطلاعات مفیدی برای کامپایلر تولید کند. مثلاً، اگریک نوع بگوید که یک ارزش با مضربی از 4 مرتب شده، دسترسی حافظه می تواند بهینه گردد.
* سند سازی- استفاده از انواع در زبان ها سند سازی از کد را بهبود می بخشد. مثلاً، تعریف یک متغیر وقتی از نوع ویژه ای باشد، چگونگی استفاده از متغیر را مشخص می کند. در حقیقت، بسیاری از زبان ها به برنامه نویسان اجازه ی استفاده از انواع معنایی را با نشات از انواع اولیه، می دهند؛ که یا از عناصر یکی یا بیشتر از انواع اولیه تشکیل شده اند و یا به عنوان نامی دیگر، برای نام های متغیرهای اولیه شکل گرفته اند.
* انتزاع - انواع به برنامه نویسان امکان تفکر در مورد برنامه در سطحی بالاتر را بدون درد سر پیاده سازی سطح پایین می دهند. مثلاً، برنامه نویسان می توانند رشته ها را به عنوان مقادیر به جای فقط آرایه ای از بیت ها تلقی کنند.
* واحدی بودن - انواع به برنامه نویسان امکان بیان واسطی بین دو زیر سیستم را می دهد و تعاریف مورد نیاز برای عمل پذیری درونی زیر سیستم ها را محلی می کند و از تناقض ها هنگام ارتباط زیر سیستم ها جلوگیری می کند.
نوعاً هر مقدار مربوط به یک نوع ویژه است اگر چه یک نوع می تواند بیشتر از یک زیر نوع داشته باشد. موجودیت های دیگر، مانند اشیاء، واحدها، کانال های ارتباطی، وابستگی ها یا حتی خود انواع می توانند مربوط به یک نوع باشند. به عنوان مثال، نوع داده ای، نوع یک ارزش است، یک کلاس نوع یک شیء است. یک سیستم نوعی، که در هر زبان برنامه نویسی ویژه است، راه های برنامه های نوعی را که اجازه ی رفتار دارند، تصریح می کند و رفتار خارج از این قوانین را غیر قانونی اعلام می کند. یک سیستم اثر نوعاً بهتر از یک سیستم نوعی حلاجی شده است.
مطالعه ی سیستم های نوعی به عنوان نظریه نوع با هدف حساب lambda شناخته می شود.


چک انواع


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


نوع دهی استاتیک و پویا


در حوزه دینامیک، چک نوع معمولاً در زمان اجرا انجام می شود چون متغیرها می توانند به طور متناوب مطابق با مسیر اجرا نوع دار شوند. سیستم های نوعی استاتیک برای حوزه ی دینامیک معمولاً نیاز به نشان دادن صریح محتوای مسیر اجرا و امکان وابستگی انواع به آن دارند. بنابراین به نظر می رسد که نیاز به یک سیستم نوعی پرزحمت یا ناچیز باشد که به درستی کار کند.
C، جاوا، ML و Haskell نوع دار استاتیک هستند، در حالیکه Lisp، Perl، Visual Basic، Ruby و Python به صورت پویا نوع دار شده اند. نوع دار کردن دینامیک اغلب با فراخوانی زبان های متنی و دیگر محیط های توسعه کاربردی سریع بهم پیوسته اند. انواع دینامیک اغلب در زبان های تفسیر شده استفاده می شوند، در حالی که انواع استاتیک در زبان های کامپایل شده به کار می روند. پیوند زبان های نوع دار شده و نوع دار نشده را ببینید.
نوع دار کردن اردکی یک راه جالب برای توصیف نوع دار کردن (دینامیک) زبان های متنی است که نوع یک ارزش را حدس می زند. این روش به وسیله Dave Thomas در انجمن Ruby ارائه شد، مقدمه آن اینچنین است "(ارجاع به یک ارزش) اگر شبیه یک اردک راه می رود و شبیه به یک اردک صدا می کند بنابراین یک اردک است."
برای فهمیدن اینکه چگونه چک نوعی کار می کند مثال شبه دستورالعمل زیر را نگاه کنید:
(var x; / / (1
(x = 5; / / (2
(x = "hi "; / / (3
در این مثال، (1) نام x را تعریف می کند؛ (2) مقدار صحیح 5 را به x می دهد؛ و (3) مقدار رشته ای "hi " را به x می دهد. در بیشتر سیستم های نوع دار استاتیک قطعه کد بالا غیر مجاز است، چون (2) و (3) دو مقدار با نوع متناقض به x می دهند.
در مقابل، یک سیستم نوع دار دینامیک به برنامه بالا اجازه ی اجرا می دهد چون نام x نیاز ندارد که نوع سازگاری داشته باشد. پیاده سازی یک زبان نوع دار دینامیک خطاهای مربوط به بکار بردن ارزش ها را - "خطاهای نوعی"- در زمانی که عبارت اشتباه اجرا می شود، می گیرد. به عبارت دیگر، نوع دار کردن دینامیک خطاها را در حین اجرای برنامه می گیرد. یک پیاده سازی نوعی از نوع دار کردن دینامیک، همه ی ارزش های برنامه که با یک نوع، قالب بندی شده اند را حفظ می کند و قالب نوعی را قبل از اینکه هر مقداری در عملیات استفاده شود چک می کند. به عنوان مثال:
(var x = 5; / / (1
(var y = "hi " ; / / (2
(x + y; / / (3
در این قطعه کد، (1) مقدار 5 را به x می دهد؛ (2) مقدار "hi " را به y می دهد؛ و (3) سعی در جمع x و y دارد. در زبان نوع دار دینامیک، ارزشی که به x محدود می شود باید از نوع صحیح باشد و ارزشی که به y محدود می شود باید از نوع رشته باشد.
وقتی که برنامه سعی در اجرای خط 3 دارد، پیاده سازی زبان قالب های نوعی عدد صحیح و رشته را چک می کند و می فهمد که عمل + (جمع) برای این دو نوع تعریف نشده است و پیغام خطا می دهد.
بعضی از زبان های نوع دار استاتیک یک "درپشتی" در زبان دارند که امکان نوشتن کدی را به برنامه نویسان می دهد که چک نوعی استاتیک ندارد. مثلاً C و جاوا برای انجام این کار از "casts" استفاده می کنند.
حضور نوع استاتیک در زبان برنامه نویسی دلالت بر غیبت مکانیزم های نوعی دینامیک نمی کند. مثلاً جاوا به صورت استاتیک نوع دار شده، اما عملیات ویژه ای نیاز به پشتیبانی تست های نوعی زمان اجرا دارد، که شکلی از نوع دار کردن دینامیک است. پیوندزبان برنامه نویسی را برای بحث درباره ی تقابل بین نوع دینامیک و استاتیک ببیند.


چک نوعی دینامیک و استاتیک درعمل


انتخاب بین نوع دهی استاتیک و پویا نیاز به تعادل بین محاسن آنها برای به دست آوردن نتیجه ی مطلوب دارد. بسیاری از برنامه نویسان یکی را به دیگری ترجیح می دهند؛ تا حدی که زبان هایی که از سیستم نامطلوب پیروی می کنند غیر قابل استفاده یا فلج شوند.
نوع دهی استاتیک خطاها را به صورت قابل اعتماد و در زمان کامپایل می یابد. این ویژگی قابلیت اطمینان برنامه ی تحویل داده شده را افزایش می دهد. اگرچه، برنامه نویسان برسر اینکه خطاهای نوعی معمول چگونه اند وبنابراین، چه نسبتی از خطاهایی که نوشته شده اند به وسیله ی نوع دهی استاتیک گرفته می شوند توافقی ندارند. نوع دهی استاتیک این باور را ایجاد می کند که برنامه هایی که از لحاظ نوع چک می شوند قابل اعتمادند، در حالی که نوع دهی دینامیک از کدهای توزیع شده که قابلیت اعتماد آنها اثبات شده و بانک های اطلاعاتی که خطا را کاهش می دهند حمایت می کند. ارزش نوع دهی استاتیک وقتی که قدرت سیستم نوعی افزایش می یابد زیاد می شود. حمایت از زبان هایی مانند ML و Haskell این پیشنهاد را طراحی کرده که همه ی خطاها را می توان خطای نوعی در نظر گرفت، اگر نوع هایی که در برنامه استفاده شده اند به اندازه ی کافی توسط برنامه نویس، خوب تعریف شده باشند یا به وسیله کامپایلر استنباط شده باشند.
نوع دهی استاتیک منجر می شود که کد کامپایل شده سریع تر اجرا شود. وقتی کامپایلر نوع های داده ای درست که مورد استفاده اند را می شناسد، می تواند کد ماشین را که کار درست انجام می دهد تولید کند. در ضمن، کامپایلرها در زبان های نوع دار استاتیک میان برها را راحت تر می فهمند. بعضی از زبان های نوع دار دینامیک مانند Common Lisp امکان تعاریف نوعی اختیاری برای بهینه کردن به این منظور را می دهند. نوع دهی استاتیک این ویژگی را گسترش می دهد. پیوند بهینه سازی را ببینید.
زبان های نوع دار استاتیک که فاقد استنباط نوعی هستند - مانند جاوا- نیاز دارند که برنامه نویسان انواعی را که آنها برای استفاده در توابع و متودها نیاز دارند، تالیف کنند. این عمل به عنوان مستند سازی مضاعف برای برنامه است، و کامپایلر به برنامه نویسان اجازه ی نادیده گرفتن همزمانی را نمی دهد. اگرچه، یک زبان می تواند بدون نیاز به تعاریف نوعی، نوع دار استاتیک شود، بنابراین، این نتیجه ی نوع دهی استاتیک نیست. نوع دهی استاتیک امکان ترکیب کتابخانه ها را می دهد، کتابخانه ها احتمال کمی دارد که به وسیله ی کاربران به طور تصادفی بد استفاده شوند. این امکان می تواند به عنوان مکانیزم مضاعف برای ابلاغ مقاصد گسترش دهندگان کتابخانه استفاده شود.
سیستم نوعی استاتیک استتفاده از ترکیبات زبان قدرتمند را بیشتر از زبان های با قدرت پایین تر ایجاب می کند. این موضوع امکان استفاده از ترکیبات قوی را سخت می کند و بنابراین بار انتخاب "ابزار درست برای مسئله" را به دوش برنامه نویس می اندازد، که ممکن است متمایل به استتفاده از ابزار قدرتمند موجود شود. انتخاب ابزار قوی ممکن است باعث اجرا، قابلیت اعتماد یا درستی مضاعف مسئله شود، چون محدودیت های نظری روی ماهیت ها وجود دارد که می تواند از ساختارهای زبان قوی نشأت گرفته باشد. مثلاً، استفاده ی یک بعدی از بازگشت یا متغیرهای سراسری ممکن است سبب اثرات زیان آور مستند شده، شود.
نوع دهی دینامیک به ترکیبات امکان غیر مجاز شدن در بعضی از سیستم های نوعی استاتیک را می دهد. مثلاً، توابع eval که داده های دلخواه را اجرا می کنند به عنوان کد امکان اجرا دارند (اگر چه نوع دهی در طول کد ارزیابی شده ممکن است استاتیک باشد). در ضمن، نوع دهی دینامیک کد قدیمی را با نمونه ی اصلی تطبیق می دهد، مثل امکان استفاده از رشته به جای ساختار داده ای.
نوع دهی دینامیک به اشکال زداها امکان عملکرد بهتر را می دهد. در عمل اشکال زدا می تواند کد را به صورت دلخواه تغییر دهد و به برنامه اجازه ی ادامه ی اجرا را بدهد. برنامه نویسان گاهی درزبان های دینامیک در اشکال زدا برنامه می نویسند و بنابراین سیکل ویرایش - کامپایل - تست - اشکال زدایی کوتاهتری دارند. اگر چه نیاز به استفاده از اشکال زداها به عنوان نشانه ای از طراحی یا پیشرفت مسائل پردازش ملاحظه شده است.
نوع دهی دینامیک به کامپایلر امکان اجرای سریع تر را می دهد، چون چک کمتری برای اجرا و کد کمتری برای ملاقات دوباره، وقتی چیزی تغییر می کند وجود دارد. درضمن سیکل ویرایش - کامپایل - تست - اشکال زدایی را کاهش می دهد.


نوع دهی قوی و ضعیف


زبان های نوع دار" قوی" به عمل امکان موفقیت روی آرگومان هایی که نوع اشتباه دارند نمی دهد. یک مثال از عدم حضور نوع دهی قوی تبدیل نوع داده در C است اگر شما نوع یک ارزش را در C تغییر دهید، نه تنها کامپایلر نیاز به کد جدید دارد بلکه انتظار می رود زمان اجرا نیز این امکان را برای کد فراهم کند. این به کد C امکان فشردگی و سرعت می دهد اما اشکال زدایی را مشکل می کند.
گاهی جمله ی " زبان امن" به طور عمومی برای توصیف زبان هایی که عملیات تعریف نشده را اجازه نمی دهند اتفاق افتد، به کار می رود. مثلاً یک زبان امن مرزهای آرایه ای را نیز چک می کند.
نوع دهی ضعیف یعنی انواع به طور ضمنی هنگام استفاده تغییر یابند.
می خواهیم مثال قبل را ببینیم:
(var x = 5; / / (1
(var y = "hi " ; / / (2
(x + y; / / (3
اگر کد بالا در یک زبان نوع دار ضعیف مثل Visual Basic نوشته شده بود، کد به طور کامل اجرا می شد و نتیجه ی "5hi " را می داد. عدد 5 به رشته ی "5" تبدیل شده تا عمل انجام شود. اگر چه، مشکلاتی با این تبدیلات در زبان های نوع دار ضعیف وجود دارد. مثلاً آیا نتیجه ی کد روبرو 9 است یا "54"؟
;var x = 5
;"var y = "4
;x + y
بسیاری معتقدند که نوع دهی ضعیف، تمرین بد را ترویج می کند اما به برنامه نویسان استفا

تعداد بازدید ها: 22628


ارسال توضیح جدید
الزامی
big grin confused جالب cry eek evil فریاد اخم خبر lol عصبانی mr green خنثی سوال razz redface rolleyes غمگین smile surprised twisted چشمک arrow



از پیوند [http://www.foo.com] یا [http://www.foo.com|شرح] برای پیوندها.
برچسب های HTML در داخل توضیحات مجاز نیستند و تمام نوشته ها ی بین علامت های > و < حذف خواهند شد..