PDA

View Full Version : معنی این اصطلاحات در #C چیست: Strongly Typed, Type-Safety



tooraj_azizi_1035
شنبه 24 تیر 1391, 21:56 عصر
سلام
دوستان چندین اصطلاح هست که می خوام نظر اساتید رو در مورد معنی اون بدونم البته ممکنه باز هم اصطلاحات بیشتری باشه که بپرسم اما فعلاً این دو اصطلاح رو توضیح بدید:

C#‎‎ is a strongly typed language
Type Safety
Strongly Named Assemblies


سوال بعدی هم این است که اگر اینترفیس ها وجود نداشته باشند چه اتفاقی می افتد؟

لطفاً لینک نگذارید.
با تشکر:قلب:

Saeed_m_Farid
یک شنبه 25 تیر 1391, 13:39 عصر
اونجوری که شما اولش شرط گذاشتید، کار مشکل میشه! اصلاً اصلاً بدون لینک که نمیشه، اجازه بدین یکمی کوچولو لینک بذاریم...
بازم اگه اجازه بدین، یکی یکی توضیح بدیم:
______________

Strong typing (http://en.wikipedia.org/wiki/Strong_typing) معنی کلی‌اش این میشه که شما در زبان برنامه نویسی موردنظرتون باید مشخص کنید که متغیرها، ورودی/خروجی توابع، آرگومان‌ها و ... دقیقاً از چه نوعی هستند؛ یعنی کامپایلر در چنین زبان‌های برنامه‌نویسی، کدهای برنامه شما رو قبل از اینکه به مرحله Runtime برسه، بررسی می‌کنه و مطمئن میشه که شما نوع‌ها رو بصورت کامل مشخص کردید و نمی‌ذاره شما دادۀ بدون نوع داشته باشید، مثلاً اینها کدهای Strongly Typed هستند :
string someString = "abc";
ArrayList<String> listOfStrings = new ArrayList<String>();
public void SomeMethod(int integerParameter, string someStringParameter) { }
چون به صراحت مشخص کردن که از چه انواع داده‌ای استفاده می‌کنند؛ زبان‌های برنامه نویسی #C و Java، Lisp، Java Script، Ruby، پاسکال/دلفی و ... ذاتاً بر مبنای Strongly Typed بنا شده‌اند ولی راه‌های گریزی برای این نوع برنامه‌نویسی هم ارائه دادن که اگه وقت شد، در موردشون صحبت می‌کنیم (که حتماً خودتون هم دیدین)...
______________
در مقابل این نوع زبان‌ها (روش‌های برنامه نویسی) Weak typing (http://en.wikipedia.org/wiki/Weak_typing) قرار می‌گیره که شما با خیال راحت، هرجوری حال می‌کنید! می‌تونید از تعریف متغیر بدون نوع استفاده کنید، تو این نوع زبان‌ها، کامپایلر همه کار رو خودش می‌کنه و اصلاً کار نداره که شما برای متغیری نوع تعریف کنید، برای همین بسیار تنبل‌پرور هستند؛ اکثر زبان‌های اسکریپتی (منظور اینترپرِتِرها!) و زبان‌هایی مثل PHP، Perl و ... از این‌دسته هستند؛ مثلاً:

$var = 'Hello';
$var = 5;
$i = 1 + "1" // $i == 2
$i = 1 . "1" // $i == "11"
//***********
$a=10;
$b="a20";
$c=$a+$b;
print $c; #prints 10
خوب مزیت‌ Weakly Typed به اینه که شما خیلی راحت تر و سریعتر کد می‌نویسید و براحتی و با یک خط کد می‌تونید ترکیبی از آرایه و int و رشته و ساختار و ... رو پیاده کنید، مثلاً:

$GLOBALS['index1'][$key] = array(
'id' => $key,
'name' => 'MyName',
'used' => true,
'type' => $meta['type'],
'duration' => $time['time'],
'candidates' => array(
'title' => 'cond1',
'callback' => 'my_callback',
'arguments' => array(
'arg1' =>'xxxxxxx'),
'arg2' =>'yyyyyyy'),
'arg3' =>123456,
'arg4' =>$external_arg,
),
'access arguments' => array('access devel information'),
'preprocessors' => $preprocessors,
);

فرض کنید همچین کاری رو بخواهیم تو C یا پاسکال انجام بدیم، احتمالاً ابرجدّ انسان فراخوانی بشه! ولی درعوض بسیار امکان خطاهای سهوی بسیار بالا میره و شما باید خیلی مواظب بتشید، چون چنین مواردی در زمان runtime خودشون رو نشون میدن و ممکنه اصلاً نفهمید مشکل از کجاست، مثلاً تو PHP برای کامپایلر رشته های "1e3" و "1000" مساوی درنظر گرفته میشن؛ یا null و رشته خالی در شرط == یه معنی میدن و ...
____________________
برای کسانی که اطلاع ندارن که C و ++C جزو زبانهای strongly typed نیستند! حتماً تعجب می‌کنند که چرا باید اینها جزو زبانهای weakly typed دسته‌بندی بشن؟ برای دونستن دلیل این موضوع باید دقت کنید که C به شما اجازه میده که مقداری در حافظه رو علیرغم نوع داده عوض کنید، یعنی می‌تونید با اختصاص اشاره‌گر به محل یک داده عددی، مثدار رشته‌ای تو اون جایگزین کنید و برنامه رو داغون کنید، درسته این‌کار در مواقعی خاص لازم (و مفید) هست، ولی در 90 درصد موارد فقط باعث انفجار برنامه! و یا بدترش سردرگمی و بروز اشکال منطقی در برنامه میشه و بخاطر همین هست که میگن برنامه‌نویسی C کار بچه‌ها نیست...
typedef struct
{
int x;
int y;

} FooBar;

FooBar foo;
char * pStr = &foo;
pStr[0] = 'H';
pStr[1] = 'i';
pStr[2] = '\0';
همونطورکه میدونین در #C هم امکان تخصیص متغیرها و توابع بدون نام و نوع و ... هست؛ پس آیا میشه گفت در #C هم میشه بصورت weak typing کد نوشت؟ نه! به این نوع کدنویسی میگن dynamic typing و شامل لامبادا و لینک و تعریف متغیرهای var و object و ... میشه، این امکانی هست که کامپایلر پشت زمینه برای شما فراهم می‌کنه ولی از اصل Strong typing به‌هیچ وجه تخطّی نمی‌کنه!
http://i.msdn.microsoft.com/dynimg/IC118726.png
__________
دیگه ادامه نمیدم تا از این طولانی‌تر نشه، اگه سوالی بود در خدمتیم، بقیه‌اش رو هم در ادامه توضیح میدم...

fjm11100
یک شنبه 25 تیر 1391, 13:53 عصر
در مورد اینترفیس هم وجودش بخاطر استاندارد کردن کار گاهی ضروریه. مثلا شما یک کلاس طراحی کردی حالا میخوای بدی یکی دیگه پیاده سازی کنه. خب اون کلاس 100 جای دیگه هم بکار رفته پس باید اون نفر دقیقا منطبق بر طراحی شما پیاده سازی را انجام بده. برای همین شما بهش در قالب اینترفیس میگی چی داری و از چه جنسیه یا ورودی متدها دقیقا چیاست و از چه جنسی جوابش برمیگرده

Saeed_m_Farid
یک شنبه 25 تیر 1391, 16:03 عصر
در مورد دوتای دیگه یعنی: Strong-Named Assemblies و Type Safety در فصل سوم و چهارم کتاب جفری ریچر بصورت مفصل توضیح داده شده؛ اگه دوست ندارید به منبع اصلی مراجعه کنید، همونطورکه می‌دونید لینک دانلود رایگان ترجمه شده‌اش تو همین فروم موجود هست (اینجا (http://barnamenevis.org/showthread.php?313713)) چون من از کتاب ترجمه شده نخوندم که ببینم چطور توضیح داده، نمی‌تونم توصیه کنم که اون رو مطالعه کنید؛ ولی برای آگاهی شما باید بگم هیچ ارتباطی بین Strong-Named Assemblies و Strongly Typed وجود نداره! بطور خلاصه Strong-Named در اسمبلی‌های دات نت، اشاره به هویت یگانه اسمبلی‌های اون داره که تشکیل شده از نام، نسخه، تاریخچه باضافۀ یک امضاء دیجیتال که به شما اطمینان میده که مانند یک کلید منحصربفرد به اسمبلی موردنظرتون دسترسی داشته باشید، همین! هیچ ربطی به برنامه‌نویسی نداره.
در مورد Type Safety ولی کاملاً با مفهوم Strongly Typed که تو پست قبلی توضیح دادم، گره خورده. بنا به اون توضیحات CLR همیشه از نوع objectای که استفاده شده مطمئن هست و اطلاع داره، بنابراین شما همیشه می‌تونید با فراخوانی GetType از نوع object خودتون اطلاع داشته باشید. بنابراین شما 100% مطمئن می‌شید که به هیچ طریق امکان تغییر نوع وجود نداره و بقول جفری ریچر نمیشه مثلاً یه Employee تبدیل بشه به SuperHero! و این هم امنیت (مقابله با spoofing) رو تامین می‌کنه و هم ثبات و استحکام برنامه رو و هم کد تمیزتر و ...
این امر حتی تو الگوریتم‌های چنریک هم توسط CLR مدنظر قرار می‌گیره و اونجا هم نگاه میکنه ببینه شما درست از نوع متغیر استفاده می‌کنید یا نه؟ درغیر اینصورت مثلاً خطای InvalidCastException می‌گیرید! البته برخی اینترفیس‌های non-generic مثل IComparable استثناء هستند‌(فصل 13 همون کتاب)، مثلاً کد زیر که کد بدی هست:
internal struct SomeValueType : IComparable {
private Int32 m_x;
public SomeValueType(Int32 x) { m_x = x; }
public Int32 CompareTo(Object other) {
return(m_x - ((SomeValueType) other).m_x);
}
}
//...
public static void Main() {
SomeValueType v = new SomeValueType(0);
Object o = new Object();
Int32 n = v.CompareTo(v); // Undesired boxing
n = v.CompareTo(o); // InvalidCastException
}
و درستش این هست:
internal struct SomeValueType : IComparable {
private Int32 m_x;
public SomeValueType(Int32 x) { m_x = x; }
public Int32 CompareTo(SomeValueType other) {
return(m_x - other.m_x);
}
// NOTE: No public/private used on the next line
Int32 IComparable.CompareTo(Object other) {
return CompareTo((SomeValueType) other);
}
}
امیدوارم سوالات عوض کمتر شدن، بیشتر نشده باشه :دی
چون خیلی به لینک علاقه دارید یه دونه مرتبط با موضوع میذارم: Using the Dynamic Keyword in C# 4.0
(http://msdn.microsoft.com/en-us/magazine/ee336309.aspx)

Hossein_am
پنج شنبه 20 آبان 1395, 13:27 عصر
...
Saeed_m_Farid (http://barnamenevis.org/member.php?41415-Saeed_m_Farid)
چون به صراحت مشخص کردن که از چه انواع داده‌ای استفاده می‌کنند؛ زبان‌های برنامه نویسی
#C و Java، Lisp، Java Script، Ruby، پاسکال/دلفی و ... ذاتاً بر مبنای Strongly Typed بنا شده‌اند ولی راه‌های گریزی برای این نوع برنامه‌نویسی هم ارائه دادن که اگه وقت شد، در موردشون صحبت می‌کنیم (که حتماً خودتون هم دیدین)...
...
---------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------

با سلام و تشکر از توضیحات بسیار خوب آقای Saeed_m_Farid (http://barnamenevis.org/member.php?41415-Saeed_m_Farid).
فقط در مورد Javascript که شما آن را در گروه Strongly typed نام برده اید(تکه توضیح شما در بالا),آنطور که بنده در کتاب
"JavaScript The Good Parts - Crockford -O`Reilly" دیده ام ،و همینطور در برخی جاهای دیگر،ظاهرا Javascript جزو Strongly typedها نیست و اون رو در دسته weakly typed ها میدونن.
در کتاب نام برده ،این جمله در این مورد از نویسنده کتاب به چشم می خوره:
The fashion in most programming languages today demands strong typing. The theory
is that strong typing allows a compiler to detect a large class of errors at compile
time. The sooner we can detect and repair errors, the less they cost us. JavaScript is a
loosely typed language, so JavaScript compilers are unable to detect type errors. This
can be alarming to people who are coming to JavaScript from strongly typed languages