گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
خیلی ممنون استاد . :rose:
بجز alphavss ، کتابخونه ی دیگه ای در زمینه ی vss نیست که این محدود را نداشته باشه و تنظیماتی که در برنامه مون انجام میدیم ، روی تنظیمات اون کتابخونه هم تاثیر داشته باشه ؟ (یعنی وقتی در برنامه مون از متد CoInitializeSecurity استفاده میکنیم ، توی اون کتابخونه هم تاثیر داشته باشه) .
من شبیه google هستم؟ باید اینترنت رو جستجو کنید.

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

فقط چند سئوال اینکه ، چرا مقدار پشته برای هر نخ ، فرق میکنه؟ یعنی مقدار پشته برای هر نخ ، بر اساس چه معیاری تعیین میشه که برای هر نخ ، میتونه مقدار متفاوتی داشته باشه؟
دو تا پشته در دو بخش متفاوت حافظه قرار دارند، سر و ته شون در موقعیت های متفاوتی است. مثل دو تا آرایه مجزا که هر دو در حافظه RAM هستند ولی شروع و پایان شون آدرس های متفاوتی داره.

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

چرا سی شارپ ای که ماشین مجازی و سیستم مدیریت شده ازش حذف بشه ، به درد برنامه نویسی سریع و همچنین سیستمی نمیخوره؟
به درد برنامه نویسی سریع نمی خوره چون دیگه از امکانات NET. و کنترل های انتزاعی اش نمیتونه استفاده کنه و برنامه نویس باید مثل ++C درگیر مدیریت منابع برنامه و ارتباط API سیستم و پیام های پنجره و ... باشه. به درد برنامه نویسی سیستمی هم نمیخوره چون ویژگی های یک زبان سطح پایین رو نداره.
چون گفته بودید کندی سی شارپ نسبت به سی پلاس پلاس ، بخاطر clr و کمپایلرش هه .
این دو که درست بشن ، طبعا باید سرعتش بیشتر بشه و به درد برنامه های سیستمی هم تا حدود زیادی بخورن دیگه .
این طور نیست؟ اگه نه ، چرا؟
ربطی نداره. شما فرض کنید که یک بودجه هنگفت در اختیارتون باشه و سخت افزار سیستم تون رو حسابی ارتقاء بدید و سرعت اجرای کد های #C تون 1000 برابر قبل بشه. خوبه؟ مشکل کندی سرعت برطرف شد. حالا که سرعتش بالا رفته می توانید با #C یک چاپگر مجازی بنویسید که بجای چاپ تصویر jpeg ذخیره کنه؟ یک سیستم رمزگذاری Real-Time ساده برای هارد دیسک تون بنویسید که بیت های 0 رو 1 کنه و بیت های 1 رو 0؟ انجام اینکار ها ارتباطی با کندی سرعت #C داره؟

بله . اگه مایکروسافت بجای اینکه روی پروژه ی .Net کردن ++C کار میکرد ، حالت برعکسش را انجام میداد ، یعنی روی غیر دات نت و حذف کردن clr در سی شارپ (به منظور سریع تر شدن سی شارپ و اجرای برنامه های سیستمی توسط سی شارپ) کار میکرد ، به نظرم بخش قابل توجهی از کاربران ++C را به خودش جذب میکرد .
نهایت کاری که انجام میداد ساختن یک زبان شبیه به ++C میشد، برنامه نویسی که سالها با ++C کار کرده و پروژه های زیادی به این زبان داره بیخودی ++C رو رها کنه و بره سراغ یک زبان مشابه؟

استاد ، کاربرد کلاس ProfileOptimization ، دقیقا در کجاست؟ :


در توضیحاتش نوشته (ترجمه اش که زیاد وارد نیستم) :

کارایی startup (شروع) ئه دامنه های اپلیکیشن را در اپلیکیشن هایی که به کمپایلر زمان اجرا (jit) نیاز دارن ، با اجرای کمپایل کردنِ پشت زمینه ی متدهایی که شبیه به اجرا شدن هستند ، بر اساس پروفایل هایی که در طول کمپایل های قبلی ایجاد شده ، بهبود میده .

که من دقیقا متوجه نشدم منظورش چیه .
منظورش از startup ، فقط زمان شروع اپلیکیشن هست (مثلا تا رویداد Load ویندوز) یا زمان های دیگه هم هست؟
منظورش از دامنه های اپلیکیشن هم متوجه نشدم چیه؟
منظورش از اپلیکیشن هایی که به کمپایلر زمان اجرا (jit) نیاز دارن را هم متوجه نشدم چیه؟ چون همه ی برنامه های سی شارپ ، کمپایلرِ jit را دارند دیگه . چون همه شون clr دارن .
کلا کاربرد این کلاس دقیقا کجاست؟
ممنون استاد :rose:
برنامه اجرایی NET. به زبان میانی CIL ئه و موقع اجرا تازه باید کامپایل بشه و لزومی هم نداره یکجا و بصورت کامل کامپایل بشه.
بخش هایی از کد در این لحظه قابل اجرا هستند که ابتدا از کد های زبان میانی CIL به کد زبان ماشین پردازنده ترجمه شدن.
طبعا در پردازنده چند هسته ای میشه در همون حین که یک بخشی از کد کامپایل شده اجرا میشه بخش دیگری در حال کامپایل باشه.
اگر اجرا به بخش هایی برسه که هنوز کامپایل نشدن، کاری نمیشه کرد و باید منتظر کامپایل شدن بمونن و این ایجاد وقفه می کنه. پس چه بهتر که همیشه یک قدم جلو باشیم و پیش از اجرا بشه پیش بینی کرد که کدوم بخش هایی از کد قراره زودتر اجرا بشن تا زودتر کامپایل بشن و وقفه کمتری در اجرا رخ بده.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
من شبیه google هستم؟ باید اینترنت رو جستجو کنید.
سلامی مجدد
خیلی ممنون استاد :rose:
جستجو کرده بودم اما چیز جالبی مثل اون انگار پیدا نکردم .

دو تا پشته در دو بخش متفاوت حافظه قرار دارند، سر و ته شون در موقعیت های متفاوتی است. مثل دو تا آرایه مجزا که هر دو در حافظه RAM هستند ولی شروع و پایان شون آدرس های متفاوتی داره.
ممنون .
:rose:
اما بجز این ، سئوالم اینه که چه چیزی باعث میشه که مثلا برای یه نخ ، 1 مگابایت مقدار حافظه برای پشته در نظر گرفته بشه اما برای نخ دیگه ، 2 مگابایت و ... .
یعنی چه چیزی باعث تفاوت در نظر گرفتن این حافظه برای پشته ها برای نخ ها میشن؟

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

به درد برنامه نویسی سریع نمی خوره چون دیگه از امکانات NET. و کنترل های انتزاعی اش نمیتونه استفاده کنه و برنامه نویس باید مثل ++C درگیر مدیریت منابع برنامه و ارتباط API سیستم و پیام های پنجره و ... باشه.
منظورم ، اجرای سریع کدهاست . مثل سی پلاس پلاس ، بتونه کدها را سریع اجرا کنه نه اینکه برنامه نویس ، توش سریع تر برنامه اش را بنویسه.

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

نهایت کاری که انجام میداد ساختن یک زبان شبیه به ++C میشد، برنامه نویسی که سالها با ++C کار کرده و پروژه های زیادی به این زبان داره بیخودی ++C رو رها کنه و بره سراغ یک زبان مشابه؟
بله . اما همونطور که میدونین ، خیلی از شرکت ها ، یه چیز جدیدی ارائه دادن که در سال های بعد تونست کاملا حرفیف قدرتمند طرف مقابلش را شکست بده و بازار را کاملا سمت خودش ببره .
کسایی که برنامه نویسی را در آینده کار میکنن و قراره یه زبانی را یاد بگیرن و هنوز یاد نگرفتن که تعصبی ندارن . مثلا ببینن یه زبانی در حد قابلیت های سی پلاس پلاس هست که آسونتر هم هست ، نسل بعد برنامه نویس ها ، به سراغ اون زبان میرن .

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

بر اساس تجربه اجراهای قبلی مشخص میشه که چه بخش های از کد زودتر و به احتمال بالاتری اجرا میشن، به همین خاطر نتیجه تحلیل اجرا های قبلی بصورت پروفایل ذخیره میشه تا بشه برای اجرا های بعدی پیش بینی کرد و در ابتدای اجرا اون موارد پیش بینی شده زودتر کامپایل بشن.
ProfileOptimization این نتایج رو بهینه می کنه و بر اساس خروجی اش اون کد هایی که در اولویت قرار دارن رو پشت پرده کامپایل می کنه تا موقعی که نوبت اجراشون رسید آماده اجرا باشن و احتمال وقفه کمتر بشه.
خیلی ممنون استاد از توضیح مفصل تون . قشنگ متوجه شدم :rose:

--------------------------------------------

استاد ، Pattern Matching در سی شارپ چیه (کلیات اش فقط) و در کجا کاربرد داره؟
 

the_king

مدیرکل انجمن
ممنون .
:rose:
اما بجز این ، سئوالم اینه که چه چیزی باعث میشه که مثلا برای یه نخ ، 1 مگابایت مقدار حافظه برای پشته در نظر گرفته بشه اما برای نخ دیگه ، 2 مگابایت و ...
نیاز نخ به پشته میتونه کاملا متفاوت باشه. کامپایلر هم بر اساس تعاریف خودش، مدل حافظه، نیاز برنامه، تنظیمات مورد نظر برنامه نویس و ... مقداری رو تعیین می کنه که مناسب باشه.


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

منظورم ، اجرای سریع کدهاست . مثل سی پلاس پلاس ، بتونه کدها را سریع اجرا کنه نه اینکه برنامه نویس ، توش سریع تر برنامه اش را بنویسه.
ابزار های توسعه سریع برنامه / نرم افزار یا RAD یک طیف شناخته است با ویژگی های مشخص، برنامه نویسی سریع با توصیفی که شما می کنید طیف شناخته شده ای نیست و سرعت در اجرای کد هم اولویتی در محبوبیت زبان های برنامه نویسی نداره. اگر غیر از این بود Python و Javascript و PHP مفسری و Java و #C دارای ماشین مجازی نمی توانستند در حد C++ / C یا بیشتر محبوب باشند.
شما دارید بر اساس سلیقه خودتون یک نیازمندی تعریف می کنید، نه طبقه بندی های مرسوم. با سلیقه شخصی نمی توانید اهداف مایکروسافت رو تحلیل کنید. مشخصه که چرا مایکروسافت مطابق سلیقه شما رفتار نمی کنه.

اگه اشتباه نکنم ، شما قبلا گفته بودین که اگه محدودیت های کمپایلر و دات نت و clr در زبان سی شارپ برداشته بشه ، از بقیه ی لحاظ ها ، چندان فرقی با سی پلاس پلاس نداره (البته میگم اگه اشتباه نکنم چون خیلی وقت بود و من فعلا دقیق یادم نیست) .
زبان رو با زبان و کامپایلر رو با کامپایلر مقایسه می کنیم، برای استفاده هم ترکیب زبان و کامپایلر رو با ترکیب زبان و کامپایلر مقایسه می کنیم.
بله، از لحاظ نحوی و کلمات کلیدی این دو زبان شباهت زیادی بهم دارند، نه تنها ++C/ C به Java هم شباهت زیادی داره. اما این صرفا مقایسه زبان با زبان ئه، ربطی به توانایی کامپایلر ها نداره، قبلا در مورد مقایسه کامپایلر ها به قدر کافی صحبت کرده ایم.

پس سی شارپ (بدون در نظر گرفتن کمپایلر و clr و دات نت)، قابلیت های زبان سطح پایین سی پلاس پلاس را نداره.
شما با #C بدون کامپایلر هیچ کاری نمی توانید بکنید، پس در استفاده از #C دارید همراه کامپایلرش با ++C به همراه کامپایلرش مقایسه می کنید.
بله. توقع دیگری دارید؟ شما یکسری موارد اساسی و ساختاری رو از #C حذف می کنید، همه مواردی که مختص زبان های سطح بالا بوده.
چیزی که ازش میمونه ویژگی های زبان های سطح پایین رو داره؟ خیر. خود به خود قابلیت های زبان های سطح پایین بهش اضافه میشه؟ خیر.
معلومه که نمی توانید همچین #C ناقص و بلاتکلیفی رو با یک زبان حرفه ای سطح پایین مقایسه کنید.

بله . اما همونطور که میدونین ، خیلی از شرکت ها ، یه چیز جدیدی ارائه دادن که در سال های بعد تونست کاملا حرفیف قدرتمند طرف مقابلش را شکست بده و بازار را کاملا سمت خودش ببره .
کسایی که برنامه نویسی را در آینده کار میکنن و قراره یه زبانی را یاد بگیرن و هنوز یاد نگرفتن که تعصبی ندارن . مثلا ببینن یه زبانی در حد قابلیت های سی پلاس پلاس هست که آسونتر هم هست ، نسل بعد برنامه نویس ها ، به سراغ اون زبان میرن .
این نظریه شما است، درست؟ این لیست محبوبیت زبان ها است :
ببینید چند تا زبان بالای لیست قابلیت ها و سرعت C++ / C رو دارند که در رتبه های بالا قرار گرفته اند؟ نیازی به قابلیت ها و سرعت ++C داشتند تا در اون رتبه ها قرار بگیرند؟
در ضمن شما ایده دارید که زبانی در حد قابلیت های زبان سطح پایین ++C طراحی بشه که هم قابلیت های ++C رو داشته باشه و هم مثل زبان سطح بالای #C آسون باشه؟ یعنی هم زبان سطح پایینی باشه که به پردازنده نزدیکتر باشه و هم زبان سطح بالایی باشه و به انسان نزدیکتر باشه؟ متناقض ئه.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نیاز نخ به پشته میتونه کاملا متفاوت باشه. کامپایلر هم بر اساس تعاریف خودش، مدل حافظه، نیاز برنامه، تنظیمات مورد نظر برنامه نویس و ... مقداری رو تعیین می کنه که مناسب باشه.



فرضا در هدر فایل اجرایی نوشته شده پشته یک مگابایت و نیم باشه، هر نخ ای که در پروسه اون فایل اجرایی ساخته بشه مقدار پیشفرض پشته اش یک مگابایت و نیم خواهد بود، دیگه چه فرقی می کنه که در تایمر ساخته بشه یا رخداد کلیک دکمه. همه پشته ها در اون پروسه مقدارش همونه که در هدر فایل اجرایی مشخص شده، مگر اینکه در جایی از کد اجرایی مقدار سر و ته پشته عمدا تغییر داده بشه که اونم فقط در برخی کد های Assembly و C++ / C و Pascal و ... و اونم خیلی به ندرت صورت می گیره.
خیلی ممنون استاد از توضیحات کامل تون :rose:
پس در فایل اجرایی ، فقط مقدار پیش فرض برای هر نخ ای که در هر رویداد و هر جا در برنامه قراره اجرا بشه را مشخص میکنه اما کمپایلر ، بر اساس نیاز نخ ، اون مقدار پیش فرض برای پشته را موقع اختصاص دادن پشته ، میتونه تغییر بده .

ابزار های توسعه سریع برنامه / نرم افزار یا RAD یک طیف شناخته است با ویژگی های مشخص، برنامه نویسی سریع با توصیفی که شما می کنید طیف شناخته شده ای نیست و سرعت در اجرای کد هم اولویتی در محبوبیت زبان های برنامه نویسی نداره. اگر غیر از این بود Python و Javascript و PHP مفسری و Java و #C دارای ماشین مجازی نمی توانستند در حد C++ / C یا بیشتر محبوب باشند.
شما دارید بر اساس سلیقه خودتون یک نیازمندی تعریف می کنید، نه طبقه بندی های مرسوم. با سلیقه شخصی نمی توانید اهداف مایکروسافت رو تحلیل کنید. مشخصه که چرا مایکروسافت مطابق سلیقه شما رفتار نمی کنه.

زبان رو با زبان و کامپایلر رو با کامپایلر مقایسه می کنیم، برای استفاده هم ترکیب زبان و کامپایلر رو با ترکیب زبان و کامپایلر مقایسه می کنیم.
بله، از لحاظ نحوی و کلمات کلیدی این دو زبان شباهت زیادی بهم دارند، نه تنها ++C/ C به Java هم شباهت زیادی داره. اما این صرفا مقایسه زبان با زبان ئه، ربطی به توانایی کامپایلر ها نداره، قبلا در مورد مقایسه کامپایلر ها به قدر کافی صحبت کرده ایم.


شما با #C بدون کامپایلر هیچ کاری نمی توانید بکنید، پس در استفاده از #C دارید همراه کامپایلرش با ++C به همراه کامپایلرش مقایسه می کنید.
بله. توقع دیگری دارید؟ شما یکسری موارد اساسی و ساختاری رو از #C حذف می کنید، همه مواردی که مختص زبان های سطح بالا بوده.
چیزی که ازش میمونه ویژگی های زبان های سطح پایین رو داره؟ خیر. خود به خود قابلیت های زبان های سطح پایین بهش اضافه میشه؟ خیر.
معلومه که نمی توانید همچین #C ناقص و بلاتکلیفی رو با یک زبان حرفه ای سطح پایین مقایسه کنید.
خیلی ممنون استاد :rose:

این نظریه شما است، درست؟ این لیست محبوبیت زبان ها است :
ببینید چند تا زبان بالای لیست قابلیت ها و سرعت C++ / C رو دارند که در رتبه های بالا قرار گرفته اند؟ نیازی به قابلیت ها و سرعت ++C داشتند تا در اون رتبه ها قرار بگیرند؟
در ضمن شما ایده دارید که زبانی در حد قابلیت های زبان سطح پایین ++C طراحی بشه که هم قابلیت های ++C رو داشته باشه و هم مثل زبان سطح بالای #C آسون باشه؟ یعنی هم زبان سطح پایینی باشه که به پردازنده نزدیکتر باشه و هم زبان سطح بالایی باشه و به انسان نزدیکتر باشه؟ متناقض ئه.
پایتون ، سومین محبوبت را با نرخ 10.47 درصد داره؟
پایتون مگه چه قابلیت هایی داره که سی شارپ خیلی ضعیف ترش را داره که بیش از دو برابر با هم اختلاف دارن؟
حالا اگه جاوا هست، بخاطر برنامه نویسی اندروید که از این زبان استفاده میکنه ، یه چیزی . اما باز هم جاوا ، خیلی با سی شارپ اختلاف داره .
چه تفاوت اساسی ای بین این 3 زبان هست که این همه توی محبوبیت شون فرق داره؟


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

و اینکه برای Regex اگه بخوایم مثال و اینکه بگیم کجا کاربرد داره ، اینه که یه نمونه ای برای رشته مینویسیم و رشته هایی که با اون نمونه ای که مطابقت دارن را پیدا میکنه و در پیدا کردن رشته هایی که کاراکتر یا مجموعه ای از کاراکترهای خاصی فقط از اون رشته را بخوایم ، بسیار کاربرد داره (مثلا آدرس سایتی که در رشته ای (بصورت پراکنده) نهفته هست یا اعدادی که در رشته ها (بصورت پراکنده) نهفته هست و ...) .

حالا کاربرد Pattern Matching را این جوری بخوایم توضیح بدیم و مثال بزنیم ، چجوری میشه و تفاوتش با Regex کجاست؟

---------------------------------------------------

استاد ، در Net. نسخه ی 5 ، انگار دیگه خبری از دات Net FrameWork نیست . یعنی اون FrameWork رو ازش گرفتن و فقط اسمش .Net هست (بدون FrameWork یا Core یا Standard) .
این یعنی مایکروسافت قراره این FrameWork و Core و Standard اینها را با هم ترکیب کنه و یکپارچه کنه؟
یعنی با انتخاب Net. نسخه ی 5 و بالاتر ، دیگه FrameWork و Core و Standard معنا و تفاوتی ندارن و وقتی با اون Net. نسخه ی 5 ، یه برنامه ای بنویسیم ، هم توی ویندوز و هم در سیستم عامل هایی که قبلا باید توی دات Net Core مینوشتن تا بالا میومد (مثل لینوکس و مکینتاش و ...) ، الان با نسخه ی 5 اش ، با نوشتن یک برنامه ، در همه ی این سیستم عامل ها قابلیت اجرا خواهد داشت؟

اگه آره ، این باعث نمیشه که قابلیت های بیشتری که در یک سیستم عامل داشت را فدا کنه؟ مثلا قابلیت های بیشتری که توسط دات Net Framework در ویندوز ارائه میکرد ، کمتر بشه؟

اخیرا هم شنیدم که مایکروسافت میخواد سیستم عاملی بنام windows core بزنه که انگار قراره همه ی ویندوزها در همه ی دستگاه ها (مثل pc و کنسول و ...) را یکپارچه کنه . البته windows 10 هم الان همین ویژگی را داره اما فرقش با ویندوز 10 چیه را نمیدونم .
ای کاش بجای طراحی سیستم عامل یکپارچه ی windows core که همین الان ویندوز 10 هم این ویژگی را داره ، یه فکری به حال سیستم عامل قدرتمند و قابل رقابت با اندروید را میکرد .

ممنون استاد .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون استاد از توضیحات کامل تون :rose:
پس در فایل اجرایی ، فقط مقدار پیش فرض برای هر نخ ای که در هر رویداد و هر جا در برنامه قراره اجرا بشه را مشخص میکنه.
بله.
اما کمپایلر ، بر اساس نیاز نخ ، اون مقدار پیش فرض برای پشته را موقع اختصاص دادن پشته ، میتونه تغییر بده.
خیر. فایل اجرایی رو کامپایلر میسازه، اندازه پشته در فایل اجرایی رو کامپایلر قبلا ثبت کرده، بعد بیاد چیزی که خودش تعیین کرده رو تغییر بده؟ کامپایلر #C که هنگام اجرا هیچ نقشی نداره، کامپایلر زبان میانی هم در هنگام اجرای کد هم ترجمه اش می کنه، روال رو تغییر نمیده.

پایتون ، سومین محبوبت را با نرخ 10.47 درصد داره؟
پایتون مگه چه قابلیت هایی داره که سی شارپ خیلی ضعیف ترش را داره که بیش از دو برابر با هم اختلاف دارن؟
محبوبیت ارتباط مستقیمی با قابلیت ها نداره، با میزان استفاده هر کاربرد در ارتباط ئه.
در هر کاربردی یکسری قابلیت ها اهمیت بیشتری داره و طبعا یکسری ابزار ها و زبان ها برای اون کاربرد مناسبتر هستند. هر چقدر یک کاربرد بیشتر استفاده بشه، محبوبیت اون زبان هم بخاطر استفاده اش در اون کاربرد بیشتر میشه. طبعا زبانی مثل فرترن برای محاسبات ریاضی و علمی خیلی مناسب ئه اما چون محاسبات ریاضی و علمی به نسبت سایر کاربرد ها خیلی عمومی نیست طبعا فرترن نمیتونه محبوبیت بالایی داشته باشه. این دلیل بر این نیست فرترن ضعیفتر از فلان زبان ئه.

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

حالا اگه جاوا هست، بخاطر برنامه نویسی اندروید که از این زبان استفاده میکنه ، یه چیزی . اما باز هم جاوا ، خیلی با سی شارپ اختلاف داره .
چه تفاوت اساسی ای بین این 3 زبان هست که این همه توی محبوبیت شون فرق داره؟
مقایسه هاتون فنی نیست. می توانید در مورد هر کدوم از زبان های برنامه نویسی و مقایسه قابلیت های زبان های برنامه نویسی تحقیق کنید.


ممنون استاد .
اگه درست متوجه شده باشم ، یعنی چیزی شبیه عملکرد Regex ها را داره؟
اگه آره ، فرق شون چیه؟
Regex هم موردی رو با الگویی تطبیق میده اما نه، شبیه اش نیست، چون Regex برای تطبیق یک نوع خاصی از الگو است که اولا خاص تحلیل متن string ئه و ثانیا بر مبنای عبارات باقاعده است. Regex بجز برای متن string هیچ کارکردی نداره و عبارات باقاعده هم صرفا برای #C نیست.
برای همین ارتباطی با زبان #C و Pattern Matching در #C نداره، در Pattern Matching صحبت نوع داده خاصی نیست، صحبت تفکیک روال ئه، یعنی کاری که با if های متعدد قابل اجرا است بصورت خلاصه تری پیاده سازی بشه. در سایت مایکروسافت بخوبی و با مثال توضیحش داده.

و اینکه برای Regex اگه بخوایم مثال و اینکه بگیم کجا کاربرد داره ، اینه که یه نمونه ای برای رشته مینویسیم و رشته هایی که با اون نمونه ای که مطابقت دارن را پیدا میکنه و در پیدا کردن رشته هایی که کاراکتر یا مجموعه ای از کاراکترهای خاصی فقط از اون رشته را بخوایم ، بسیار کاربرد داره (مثلا آدرس سایتی که در رشته ای (بصورت پراکنده) نهفته هست یا اعدادی که در رشته ها (بصورت پراکنده) نهفته هست و ...) .

حالا کاربرد Pattern Matching را این جوری بخوایم توضیح بدیم و مثال بزنیم ، چجوری میشه و تفاوتش با Regex کجاست؟

استاد ، در Net. نسخه ی 5 ، انگار دیگه خبری از دات Net FrameWork نیست . یعنی اون FrameWork رو ازش گرفتن و فقط اسمش .Net هست (بدون FrameWork یا Core یا Standard) .
این یعنی مایکروسافت قراره این FrameWork و Core و Standard اینها را با هم ترکیب کنه و یکپارچه کنه؟
در ظاهر ترکیب کردن نه ولی در واقع نمیخواد ترکیب شون کنه، میخواد هر چیزی بجز Core رو محو کنه.
به این معنا است که دیگه NET Framework. رو توسعه نمیده و طبعا دیگه Standard کارکردش رو از دست میده و متمرکز میشه روی NET Core. ولی با اسم جدید NET. که از نسخه 3 به 5 پرش می کنه.

یعنی با انتخاب Net. نسخه ی 5 و بالاتر ، دیگه FrameWork و Core و Standard معنا و تفاوتی ندارن و وقتی با اون Net. نسخه ی 5 ، یه برنامه ای بنویسیم ، هم توی ویندوز و هم در سیستم عامل هایی که قبلا باید توی دات Net Core مینوشتن تا بالا میومد (مثل لینوکس و مکینتاش و ...) ، الان با نسخه ی 5 اش ، با نوشتن یک برنامه ، در همه ی این سیستم عامل ها قابلیت اجرا خواهد داشت؟
بله، یا حداقل قراره اینطور باشه.

اگه آره ، این باعث نمیشه که قابلیت های بیشتری که در یک سیستم عامل داشت را فدا کنه؟ مثلا قابلیت های بیشتری که توسط دات Net Framework در ویندوز ارائه میکرد ، کمتر بشه؟
چاره ای نیست. همه زبان هایی که چند پلتفرمی هستند باید یکسری قابلیت های اختصاصی هر پلتفرم رو فدای سازگاری کنند. اگر غیر از این باشه ناسازگار کد پیش میاد و دیگه از حالت سازگاری بین پلتفرمی خارج میشه، مثل ++C که در هر پلتفرمی کامپایلر داره، ولی هر کامپایلر و مجموعه کتابخانه ای ساز خودش رو میزنه و ناسازگاری میان پیاده سازی متفاوت کامپایلر و کتابخانه هاش مشکل ایجاد می کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله.

خیر. فایل اجرایی رو کامپایلر میسازه، اندازه پشته در فایل اجرایی رو کامپایلر قبلا ثبت کرده، بعد بیاد چیزی که خودش تعیین کرده رو تغییر بده؟ کامپایلر #C که هنگام اجرا هیچ نقشی نداره، کامپایلر زبان میانی هم در هنگام اجرای کد هم ترجمه اش می کنه، روال رو تغییر نمیده.
ممنون استاد . :rose:
من چمیدونم استاد . خودتون گفتین اندازه ی پشته بصورت پیش فرض در فایل اجرایی مشخص میشه و بعد هم گفتین هر نخ ممکنه اندازه ی پشته اش با نخ دیگه ای متفاوت باشه .
اما از اینی که اینجا گفتین برمیاد که انگار اندازه ی پشته ی همه ی نخ ها با هم برابرن و همون اول توسط فایل اجرایی تعیین میشه و تغییری در اختصاص حافظه برای پشته های هر نخ ، بوجود نمیاد .

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

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


مقایسه هاتون فنی نیست. می توانید در مورد هر کدوم از زبان های برنامه نویسی و مقایسه قابلیت های زبان های برنامه نویسی تحقیق کنید.
کاربرد پایتون کجاست که .net core هم نمیتونه انجامش بده؟

Regex هم موردی رو با الگویی تطبیق میده اما نه، شبیه اش نیست، چون Regex برای تطبیق یک نوع خاصی از الگو است که اولا خاص تحلیل متن string ئه و ثانیا بر مبنای عبارات باقاعده است. Regex بجز برای متن string هیچ کارکردی نداره و عبارات باقاعده هم صرفا برای #C نیست.
برای همین ارتباطی با زبان #C و Pattern Matching در #C نداره، در Pattern Matching صحبت نوع داده خاصی نیست، صحبت تفکیک روال ئه، یعنی کاری که با if های متعدد قابل اجرا است بصورت خلاصه تری پیاده سازی بشه. در سایت مایکروسافت بخوبی و با مثال توضیحش داده.


آها کاربرد Pattern Matching برای زمان if های تو در تو استفاده میشه .
همین رو میخواستم .

در ظاهر ترکیب کردن نه ولی در واقع نمیخواد ترکیب شون کنه، میخواد هر چیزی بجز Core رو محو کنه.
به این معنا است که دیگه NET Framework. رو توسعه نمیده و طبعا دیگه Standard کارکردش رو از دست میده و متمرکز میشه روی NET Core. ولی با اسم جدید NET. که از نسخه 3 به 5 پرش می کنه.


بله، یا حداقل قراره اینطور باشه.


چاره ای نیست. همه زبان هایی که چند پلتفرمی هستند باید یکسری قابلیت های اختصاصی هر پلتفرم رو فدای سازگاری کنند. اگر غیر از این باشه ناسازگار کد پیش میاد و دیگه از حالت سازگاری بین پلتفرمی خارج میشه، مثل ++C که در هر پلتفرمی کامپایلر داره، ولی هر کامپایلر و مجموعه کتابخانه ای ساز خودش رو میزنه و ناسازگاری میان پیاده سازی متفاوت کامپایلر و کتابخانه هاش مشکل ایجاد می کنه.
آها یعنی قرار نیست عملا نسخه ی windows pc ، قابلیت مهمی براش اضافه بشه تا نسبت به اون ، دات net framework هم تغییر کنه . آخرین تغییرات را در نسخه ی دات net framework 4.8 دادن و هر کس خواست برنامه ای بنویسه که قابلیت های دات نت اش در کامل ترین حالت برای windows pc باشه ، از نسخه ی net framework 4.8 استفاده میکنه .
دیگه هم قرار نیست توسعه یا قابلیت مهمی برای windows pc اضافه بشه که در طرف مقابلش دات net framework ، به روز بشه .

و در واقع ، دات Net نسخه ی 5 برای کسایی هه که تا حالا با دات Net Core 3.X استفاده میکردن .
درسته؟
 

the_king

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

اما از اینی که اینجا گفتین برمیاد که انگار اندازه ی پشته ی همه ی نخ ها با هم برابرن و همون اول توسط فایل اجرایی تعیین میشه و تغییری در اختصاص حافظه برای پشته های هر نخ ، بوجود نمیاد .
اندازه پشته نخ هایی که در برنامه ساخته میشه ثابت و برابر ئه و کامپایلر هم قبلا در هدر فایل اجرایی ثبتش کرده. موقع اجرا هم کامپایلر در تغییر اندازه پشته ای که در برنامه ایجاد میشه دخالتی نمی کنه. حالا ممکنه یک برنامه نویس مثلا در برنامه ++C ای طبق منطق خودش لازم ببینه پشته رو جابجا کنه، اندازه اش رو کم و زیاد کنه، لازم دیده که ابعادی متفاوت از پیشفرض پشته رو بکار ببره، پشته با اندازه پیشفرض ایجاد شده بوده ولی برنامه نویس در فلان بخش از کد ابعاد پشته رو تغییر داده. نه تاثیری روی ابعاد پیشفرض پشته میذاره و نه روی اندازه پشته سایر نخ ها تاثیر داره و نه به تشخیص کامپایلر ربطی داره، کد برنامه نویسه که خواسته ابعاد پشته پردازنده رو تغییر بده.

کاربرد پایتون کجاست که .net core هم نمیتونه انجامش بده؟
اولا x رو با y به شرطی می توانید مقایسه کنید که قابل مقایسه باشند، NET Core. زبان برنامه نویسی نیست که با پایتون مقایسه اش کنید، ثانیا در موردش تحقیق کنید، ولی لطفا نتیجه اش رو در این تاپیک مطرح نکنید چون ربطی به موضوع این تاپیک نداره.

آها یعنی قرار نیست عملا نسخه ی windows pc ، قابلیت مهمی براش اضافه بشه تا نسبت به اون ، دات net framework هم تغییر کنه . آخرین تغییرات را در نسخه ی دات net framework 4.8 دادن و هر کس خواست برنامه ای بنویسه که قابلیت های دات نت اش در کامل ترین حالت برای windows pc باشه ، از نسخه ی net framework 4.8 استفاده میکنه .
اصطلاحات درستی رو بکار نمی برید ولی معنی کلی اش همینه.

دیگه هم قرار نیست توسعه یا قابلیت مهمی برای windows pc اضافه بشه که در طرف مقابلش دات net framework ، به روز بشه .
ظاهرا اینطوره.

و در واقع ، دات Net نسخه ی 5 برای کسایی هه که تا حالا با دات Net Core 3.X استفاده میکردن .
درسته؟
نه. برای همه میتونه یک انتخاب جدید باشه. نیازی نیست که پروژه های قبلی رو به NET. جدید تبدیل کنید، ولی اگر قصد شروع پروژه جدیدی رو دارید می توانید تحت نسخه جدید NET. شروع کنید. پروژه های قدیمی می توانند بدون تغییر در همون NET Framework. بمانند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
پس اندازه ی پشته ها در زبان سی شارپ (و کلا زبان های managed) ، یکسان هستند و برنامه نویس نمیتونه تغییرشون بده و در زبان هایی مثل ++C ، این مقدار میتونه توسط برنامه نویس ، تغییر کنه .
یعنی اون تغییری که گفتین میتونه انجام بشه ، فقط در زبان هایی مثل ++C و اون هم توسط خود برنامه نویس هست (نه اینکه کمپایلر بصورت خودکار این تغییرات را انجام بده) .
درسته؟

درباره ی پایتون هم منظورم این بود که پلتفرم دات Net Core (با کتابخونه های دیگه اش) با زبان سی شارپ ، چه قابلیت هایی را نداره که زبان پایتون با کتابخونه هاش داره . چون اگه اشتباه نکنم ، عمده ترین کاربرد پایتون ، توی برنامه نویسی وب هست . درسته؟
--------------------------


استاد ، در alphavss نسخه ی 2.00 ، از دات Net Core 3.1 و بالاتر پشتیبانی میکنه .
دات Net Core پلتفرمی هه که وقتی توش برنامه نویسی کنیم ، اون برنامه در همه ی سیستم عامل ها (از جمله ویندوز و لینوکس و مکینتاش و ...) اجرا میشه دیگه . درسته؟
اگه درسته ، مگه بقیه ی سیستم عامل ها ، سرویس vss دارن که این نسخه از alphavss از اون ها پشتیبانی کنه؟!
فرضا هم اگه این سرویس را داشته باشن . مگه توابع و ساختاری که استفاده میشه برای این سرویس در همه ی سیستم عامل ها مشترک هه که در همه شون با یه کتابخونه بشه دسترسی داشت؟!
چجوری هه این قضیه؟!

و اینکه چرا در زامارین از دات Net Core استفاده نکردن و اگه اشتباه نکنم ، پلتفرم مونو رو ساختن که اختراع خود شرکتی بود که زامارین را ساخت؟
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
پس اندازه ی پشته ها در زبان سی شارپ (و کلا زبان های managed) ، یکسان هستند و برنامه نویس نمیتونه تغییرشون بده و در زبان هایی مثل ++C ، این مقدار میتونه توسط برنامه نویس ، تغییر کنه .
یعنی اون تغییری که گفتین میتونه انجام بشه ، فقط در زبان هایی مثل ++C و اون هم توسط خود برنامه نویس هست (نه اینکه کمپایلر بصورت خودکار این تغییرات را انجام بده) .
درسته؟
ممکنه پلاگینی برای تغییر تنظیمات کامپایلر باشه که اینکار رو انجام بده. اما به هر حال با ویرایش فایل اجرایی exe می توانید اندازه پشته پیشفرض رو تغییر بدهید. یا با استفاده از متد سازنده Thread که پارامتر دومش اندازه Stack است، می توانید نخ هایی بسازید که پشته شون طولی متفاوت از اندازه پشته پیشفرض دارند. البته اندازه پشته پیشفرض در اغلب موارد کاملا کافی است، اگر سر ریزی پشته پیش بیاد و باگ ای هم در کار نباشه، مربوط به الگوریتم های نامناسبی است که نوشته اید.

استاد ، در alphavss نسخه ی 2.00 ، از دات Net Core 3.1 و بالاتر پشتیبانی میکنه .
دات Net Core پلتفرمی هه که وقتی توش برنامه نویسی کنیم ، اون برنامه در همه ی سیستم عامل ها (از جمله ویندوز و لینوکس و مکینتاش و ...) اجرا میشه دیگه . درسته؟
نه. منطقی هم نیست که Windows Volume Shadow Copy Service رو در لینوکس داشته باشید. اینکه NET Core. چند پلتفرمی باشه معنی اش اینه که برای همه پلتفرم ها SDK و کتابخانه مشترکی داره که با همه شون سازگاری داره. اما این صرفا خود Framework ئه، شما در برنامه الزاما فقط از اون بخش مشترک استفاده نمی کنید. یعنی به این معنا نیست که برنامه شما هم الزاما با چند پلتفرم سازگاری داره. شما خیلی راحت می توانید این سازگاری رو زیر پا بذارید.
مثلا شما در برنامه NET Core. تون نیاز به تغییری در Registry ویندوز دارید. آیا NET Core. نمیذاره اینکار رو بکنید؟ چرا، می توانید.
از پکیج Microsoft.Win32.Registry استفاده می کنید و سراغ Registry ویندوز می روید و به همین سادگی فاتحه سازگاری با پلتفرم های غیر ویندوزی خونده میشه. اون alphavss هم میتونه کدی بنویسه که با NET Core. سازگار ئه ولی معنی اش این نیست که alphavss وابستگی به سیستم عامل ویندوز نداره و در پلتفرم های دیگه قابل استفاده است.

و اینکه چرا در زامارین از دات Net Core استفاده نکردن و اگه اشتباه نکنم ، پلتفرم مونو رو ساختن که اختراع خود شرکتی بود که زامارین را ساخت؟
مونو خیلی قدیمی تر از زامارین ئه. در ضمن زمانی که زامارین طراحی شد NET Core. ای وجود نداشت که بخواد ازش استفاده بشه.
 

جدیدترین ارسال ها

بالا