انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: بررسی Type Checking در زبانهای برنامه نویسی  (دفعات بازدید: 4021 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین shampoo

  • Newbie
  • *
  • ارسال: 6
بررسی Type Checking در زبانهای برنامه نویسی
« : 26 امرداد 1388، 02:28 ق‌ظ »
بررسی Type Checking در زبانهای برنامه نویسی


در علوم رایانه ای ماهیت یک سیستم نوع (type) ممکن است به عناوین مختلفی تعریف گردد مانند یک روش ترکیبی سربراه برای اثبات عدم وجود رفتارهای خاص یک برنامه و اینکه عبارات طبقه بندی شده و بر اساس انواع مقادیر تعریف شده محاسبه خواهد شد. و به تعریفی دیگر یک سیستم نوع گذاری مشخص می‌کند که یک زبان برنامه نویسی چگونه مقادیر و عبارات را در نوع (type) دسته بندی ‌کند. این نوع سیستم است که توسط جریان بررسی ارزش مقادیر محتوای یک و یا چند متغییر را تعیین می کند و در میان چک می کند که با خطا مواجه نشود . یک کامپایلر ممکن است که برای بهینه نمودن و ذخیره سازی یک متغییر ثابت از یک سری الگوریتمهای گوناگون جهت انجام عملیات بروی این متغییر استفاده نماید. در اغلب کامپایلرهای C بطور مثال متغییر تعریف شده از نوع شناور بیانگر ۳۲ بیت از دیتا می باشد . اما میزان عمق و محدودیت در تعریف آن بشدت تحت تاثیر نوع زبان مورد استفاده نیز می باشد. زیرا هر زبان برنامه نویسی از قواعد و الگوریتمهای خاص خود برای تعیین نوع متغییراستفاده می کند.

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

کارکردهایی که عمدتا در این نوع (type) سیستمها مورد استفاده قرار می گیرد.

ایمنی (Safety) : استفاده از این روش سبب می گردد که کامپایلر کدهای بی معنی و یا به احتمال زیاد اشتباه را تشخیص دهد برای مثال این عبارت Hello, World /3 غلط می باشد زیرا یک رشته را نمی توان بر یک عدد صحیح تقسیم نمود تفکیک پذیری در نوع متغییر امکانی ایمن می باشد اما در نهایت این ایمنی تضمین شده نمی باشد .

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

مستند سازی (Documentation) : در type systems نوع ها می توانند در قالب مستندات بکار گرفته شوند . به عنوان مثال می توانند مقصود و هدف برنامه نویس را مشخص نمایند بعنوان نمونه متغییر Mynum می تواند معرف یه عدد صحیح باشد اما ممکن است برنامه نویس صریحا دستوری را تعریف نموده تا اینکه مقدار متغییر Mynum را بدست آورد که در این حالت مستند سازی تعریفی جدید به نام تابع بوجود می آید.

تجرید و یا پیمانه ای (Abstraction) : نوع ها (types) به برنامه نویس اجازه می دهند که به سطحی فراتر از بیت و بایتها بی اندیشند و نگران اموری که در سطح پایین سیستم انجام می پذیرد نباشند در واقع یک برنامه نویس می تواند ارزش یک رشته (String) را متشکل از چند کاراکتر در کنار هم در نظر بگیرد تا اینکه آن را متشکل از دسته های بیشماری از بایت ها تصور نماید.

یک برنامه بطور معمول برای هر مقدار یک نوع خاص را تخصیص می دهد (هر چند که ممکن است که نوع به زیر نوع نیز تقسیم بندی گردد ) بمانند اشیاء ، ماژولها ، کانال های ارتباطی ، وابستگیها ، و یا حتی در نوع خود ، می توانند به یک نوع وابسته گردند و بعضا در اجرا ممکن است که هویت آنها را مورد بررسی قرار گیرد ( هر چند که از نظر فنی مفاهیم خاص خود را دارا می باشند).
DATA TYPE ==> مشخص کننده یک نوع از یک مقدار
CLASS ==> مشخص کننده یک نوع از یک شی
KIND ==> مشخص کننده یک نوع از یک نوع
یک سیستم نوع برای هر زبان برنامه نویسی تعریف شده می باشد و برنامه باید از این مقررات پیروی نماید در غیر اینصورت هر نوع دستوری که خارج از این قوانین صادر گردد یک تخلف آشکار صورت گرفته است و موجب صدور خطا در برنامه می شود. در این میان اگر یک زبان برنامه نویسی با توجه به طبیعت طراحی شده خود به میزان زیادی به بررسی نوع وابسته باشد و دارای ساختاری قوی باشد اصطلاحا به آن (strong Type) اطلاق می گردد. و بگونه ای دیگر اگر زبان مورد نظر تمام عبارات را را از نظر سیستم نوع بطور کامل بررسی ننماید در زمره (Weakly Typed) قرار خواهد گرفت.

بررسی نوع (Type checking)

روند تأیید و بازبینی برنامه از نظر صحت و صقم آن توسط این گزینه مورد بررسی قرار می گیرد. Type Checking خود به دو بخش تقسیم بندی میگردد.

۱- اگر این روند در هنگام کامپایل برنامه (Compile-Time) اعمال گردد به آن اصطلاحا بررسی ایستا (Static Check) گفته می شود.
در زبانهای استاتیک یک نوع (Type) توسط متغییرها معرفی می شوند و ارزش و مقدار متغییرها در این نوع سیستم نقشی ایفا نمی کند. زبانهایی بمانند C, C++, C#, JADE, Java, Fortran, Haskell, ML, Pascal, Perl همگی از استاتیک نوع می باشند.

۲- اگر در هنگام اجرای برنامه (Run-Time) واقع گردد به این عمل اصطلاحا (Dynamic-Check) گفته می شود.
در زبانهای دینامیک یک نوع (Type) برخلاف زبانهای استاتیک توسط مقادیر معرفی می شوند و خود متغییر دارای اهمیت نمی باشد . زبانهایی بمانند Lua, Groovy, JavaScript, Lisp, Objective-C , Perl وPHP, Prolog, Python, Ruby, Smalltalk و Tcl/Tk که معمولا هم کد باز می باشند همگی با کمی وجه اشتراک و تفاوت جزوء زبانهای دینامیک نوع قرار می گیرند.

مروری بر تفاوتهای این دو سیستم

زبانهای (Dynamic Type Check) به دلیل اینکه عمل خطایابی را در مرحله اجرای برنامه صورت انجام می دهند قابلیت و انعطاف پذیری بیشتری نسبت نوع بررسی استاتیک را دارند ولی ضمانت کمتری در بوجود آمدن خطا را دارند و بعضا بعنوان ابزاری مکمل برای زبانهای برنامه نویسی سیستمی بمانند سی و سی ++ مورد استفاده قرار می گیرند ولی قابلیت حل مشکلات دیگری را هم دارند ولی زبانهای سیستمی از الگوریتمهای پیشرفته و ساختار اطلاعاتی مستحکم خود بهره برده و از احتمال بوجود آمدن خطا در هنگام کامپایل جلوگیری می نمایند . ولی از طرف دیگر کدها در زبانهای (Dynamic Type Check) راحتر و سریع تر تفسیر می گردند و برنامه نویس زمان کمتری صرف کدنویسی می کند و به همین سبب اغلب برنامه نویسان از آن در نوشتن پروژه های عظیم استفاده می نمایند. ولی امروزها کثریت برنامه نویسان سعی می کنند که از ترکیب این دو استفاده نمایند زیرا هر یک از این سیستم ها دارای نقاط قوت و ضعف خود هستند و استفاده از هردو سبب می گردد که برنامه نویس به امکانات بیشتری دسترسی داشته باشد. توضیح نویسنده مقاله: بارها از خودم این سوال را پرسیده بودم چه دلیلی است که یک برنامه نویس با تعصب C از تکه کدهای پایتون در برنامه خود استفاده نماید و یا بالعکس آن یک برنامه نویس پایتون از روتینهای C در برنامه خود استفاده کند ؟
خوب با توجه به مطالب اشاره شده در بالا در جمع بندی مطالب می توانیم به اختصار به نتایج زیر منتهی گردیم.

نقاط قوت در (Static Type Check)

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

نقاط ضعف در (Static Type Check)

    * انعطاف پذیری بسیار کمی را دارا می باشند
    * میزان کد نویسی و تالیف برنامه طولانی و پیچیده می باشد

نقاط قوت در (Dynamic Type Check)

    * این زبانها بسیار انعطاف پذیر می باشند و راحت تر و سریعتر تفسیر می گردند
    * میزان کد نویسی و زمان آن به میزان قابل توجهی کم می گردد.
    * مقدار زمانی که صرف بررسی کد و کامپایل آن می گردد بسیار کوتاه می باشد.

نقاط ضعف در (Dynamic Type Check)

    * معمولا برخی از برنامه های نوشته شده نسبت به معادل خود در زبانهای کنتر اجرا می گردد.Static Type Check کندتر اجرا می گردد.
    * بعلت اینکه نوع متغییر تغییر پذیر می باشد باید محتوای آنها دایما مورد بررسی و شناسایی قرار گیرد و به سبب اینکه در هنگام اجرا خطاها بررسی می شوند برنامه با خطاهای پیش بینی نشده ای مواجه می گردد به همین علت همیشه باید در آخر برنامه را مورد آزمایشهای گونگونی قرار گیرد.

ترجمه و تالیف : علی ابراهیمی ایمیل : Persianvfx@yahoo.com info@ali-ebrahimi.com
لینک موضوع در وب سایت http://www.ali-ebrahimi.com/?p=77
منابع و مواخذ مورد استفاده :
http://en.wikipedia.org/wiki/Programming_language
http://en.wikipedia.org/wiki/Type_system#Dynamic_typing
http://www.c2.com/cgi/wiki?DynamicTyping
http://web-ext.u-aizu.ac.jp/~hamada/LP/types.pdf