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

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. ای وجود نداشت که بخواد ازش استفاده بشه.
 

SU-57

Active Member
سلام استاد علی

من تو اینترنت سرچ کردم گفتن که برای اینکه فاکتوریل یک عدد رو بتونیم درست در بیاریم مخصوصا برای اعداد بالای 30 باید از کلاس BigInteger استفاده کنیم که این کلاس در فضای کاری system.numerics قرار داره. حالا من هر کاری می کنم نمی تونم این فضا رو به اون بالای کدهام اضافه کنم انگار که اصلا برای من اینو نداره. کپی پیست هم می کنم زیرش خط قرمز خطا ظاهر می شه.

کدش هم اینه

کد:
private static System.Numerics.BigInteger Factorial(System.Numerics.BigInteger n) {
        System.Numerics.BigInteger results =
            new BigInteger(1);
     
        for(int i=1; i<=n; i++)
            results *= i;
     
        return results;
    }

ولی من برای محاسبه فاکتوریل 5 می خوام که فقط شکل کدش رو متوجه بشم و بتونم در اینده هر عددی مثل 50 به جای 5 هم قرار بدم. کد ساده می خوام. مثلا مثل این کد که با دستور for پیدا کردم و باید حتما داخل یک باتون باشه که اینجا باتون 3 هست. چون توی اینترنت کدهایی هست که داخل باتون نیست و من متوجه نمیشم.
من می خوام در بدترین حالت یک تابع بیرون باتون باشه که تابع ما باشه و اصل کد داخل باتون باشه که وقتی روی باتون کلیک می کنم نتیجه رو توی دیالوگ باکس نشون بده چون فعلا تا اینجا اینجوری آموزش دیدم.
مثل کد زیر در ساده ترین حالت ممکن باشه

کد:
  private void button3_Click(object sender, EventArgs e)
        {
            int fact = 1;
            for (int i = 1; i <= 5; i++)
            {
                fact = fact * i;
            }
            MessageBox.Show(fact.ToString());

        }
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی

من تو اینترنت سرچ کردم گفتن که برای اینکه فاکتوریل یک عدد رو بتونیم درست در بیاریم مخصوصا برای اعداد بالای 30 باید از کلاس BigInteger استفاده کنیم که این کلاس در فضای کاری system.numerics قرار داره. حالا من هر کاری می کنم نمی تونم این فضا رو به اون بالای کدهام اضافه کنم انگار که اصلا برای من اینو نداره. کپی پیست هم می کنم زیرش خط قرمز خطا ظاهر می شه.

یا گلپسر ، سلام .
بعد از یه قرن آمدی . :)

چون این فضای نام ، در فایل اسمبلیِ System.Runtime.Numerics.dll قرار داره . به احتمال بسیار زیاد ، در reference ات ، این فایل موجود نیست . چک کن اگه نیست ، در reference ات کلیک راست کن و Add Reference را بزن و این فایل را جستجو و اضافه کن .

کدش هم اینه

کد:
private static System.Numerics.BigInteger Factorial(System.Numerics.BigInteger n) {
        System.Numerics.BigInteger results =
            new BigInteger(1);
    
        for(int i=1; i<=n; i++)
            results *= i;
    
        return results;
    }

ولی من برای محاسبه فاکتوریل 5 می خوام که فقط شکل کدش رو متوجه بشم و بتونم در اینده هر عددی مثل 50 به جای 5 هم قرار بدم. کد ساده می خوام. مثلا مثل این کد که با دستور for پیدا کردم و باید حتما داخل یک باتون باشه که اینجا باتون 3 هست. چون توی اینترنت کدهایی هست که داخل باتون نیست و من متوجه نمیشم.
من می خوام در بدترین حالت یک تابع بیرون باتون باشه که تابع ما باشه و اصل کد داخل باتون باشه که وقتی روی باتون کلیک می کنم نتیجه رو توی دیالوگ باکس نشون بده چون فعلا تا اینجا اینجوری آموزش دیدم.
مثل کد زیر در ساده ترین حالت ممکن باشه

کد:
  private void button3_Click(object sender, EventArgs e)
        {
            int fact = 1;
            for (int i = 1; i <= 5; i++)
            {
                fact = fact * i;
            }
            MessageBox.Show(fact.ToString());

        }

اول اینکه الگوریتم فاکتوریل که دادی ، اشتباه هه .
الگوریتم اش اینه :

C#:
            fact = number;
            for (i = number - 1; i >= 1; i--)
            {
                fact = fact * i;
            }

بعد اینکه منظورت اینه که این الگوریتم را میخوای توی متد و تابع بریزی و اون متد را در رویداد دکمه ات فراخونی کنی؟
 

the_king

مدیرکل انجمن
اول اینکه الگوریتم فاکتوریل که دادی ، اشتباه هه .
الگوریتم اش اینه :

C#:
            fact = number;
            for (i = number - 1; i >= 1; i--)
            {
                fact = fact * i;
            }
فاکتوریل ای با مقدار خروجی 0 نداریم، !0 باید بشه یک، نه صفر، با این الگوریتمی که شما نوشته اید !0 میشه صفر.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
فاکتوریل ای با مقدار خروجی 0 نداریم، !0 باید بشه یک، نه صفر، با این الگوریتمی که شما نوشته اید !0 میشه صفر.

سلام استاد .
البته کد کامل نیست . یعنی به عنوان متد ارائه نشد که شرط ها و return اش کامل باشه .
فقط کلیت الگوریتم بود .
 

the_king

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

SajjadKhati

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

استاد اون که متد نبود که کدش کامل باشه .
البته ببخشید که جواب دادم . صرفا میخواستم اون چیزهایی را که بلدم بگم تا کمکی کرده باشم تا صرف زمان تون برای جواب دادن ، کمتر بشه .
:rose:
 

the_king

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد استاد .
خیلی ممنون :rose:

استاد ، اگه بعدا قصد داشته باشم در برنامه ای ، از تبدیل گفتار به نوشتار (که از زبان فارسی پشتیبانی کنه) استفاده کنم ، اگه آنلاین بخوام که از سرویس Google Speech میتونم با این روش استفاده کنم :


اما اگه آفلاین (مثل یه dll و کتابخونه) بخوام ، چی کار باید کنم؟
میشه سرویس Google Speech که آنلاین هست را بصورت آفلاین استفاده کرد؟ اگه آره ، چجوری؟
وگرنه مایکروسافت که از زبان فارسی پشتیبانی نمیکنه و همچنین اگه اشتباه نکنم ، قدرتش ، به قدرت Google Speech نمیرسه .
البته من از سایت زیر ، یه کتابخونه ی ایرانی پیدا کردم که خریدنی هه اما من تا میشه ، رایگان میخوام (البته از قدرتش هم خبر ندارم) :


راه دیگه ای هست؟

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

و اینکه استاد ، کد زیر :

C#:
            int var_1 = 5;
            unsafe
            {
                int* pointerToVar_1 = &var_1;
                var_1 = 10;
                Debug.WriteLine(*pointerToVar_1);

                *pointerToVar_1 += 1;
                Debug.WriteLine(var_1 +"\n"+* pointerToVar_1);
            }

نشون میده که وقتی مقدار متغییر استراکچر (مثل int و ...) را تغییر میدیم ، در همون حافظه ی قبلی اش ، مقدارش فقط عوض میشه (یعنی حافظه ی جدیدی بهش اختصاص داده نمیشه) . درسته؟
البته منظورم درباره ی قضیه ی اینکه هر لحظه آدرس حافظه ممکنه تغییر کنه (حالا نمیدونم توسط سیستم عامل بود یا توسط clr و gc) ، نیست . درباره ی این قضیه ، میدونم .
تشکر استاد . :rose:
 

the_king

مدیرکل انجمن
استاد ، اگه بعدا قصد داشته باشم در برنامه ای ، از تبدیل گفتار به نوشتار (که از زبان فارسی پشتیبانی کنه) استفاده کنم ، اگه آنلاین بخوام که از سرویس Google Speech میتونم با این روش استفاده کنم :


اما اگه آفلاین (مثل یه dll و کتابخونه) بخوام ، چی کار باید کنم؟
میشه سرویس Google Speech که آنلاین هست را بصورت آفلاین استفاده کرد؟ اگه آره ، چجوری؟
تجربه و اطلاعاتی در این زمینه ندارم.

و اینکه استاد ، کد زیر :

C#:
            int var_1 = 5;
            unsafe
            {
                int* pointerToVar_1 = &var_1;
                var_1 = 10;
                Debug.WriteLine(*pointerToVar_1);

                *pointerToVar_1 += 1;
                Debug.WriteLine(var_1 +"\n"+* pointerToVar_1);
            }

نشون میده که وقتی مقدار متغییر استراکچر (مثل int و ...) را تغییر میدیم ، در همون حافظه ی قبلی اش ، مقدارش فقط عوض میشه (یعنی حافظه ی جدیدی بهش اختصاص داده نمیشه) . درسته؟
البته منظورم درباره ی قضیه ی اینکه هر لحظه آدرس حافظه ممکنه تغییر کنه (حالا نمیدونم توسط سیستم عامل بود یا توسط clr و gc) ، نیست . درباره ی این قضیه ، میدونم .
اولا int یک structure نیست و int مثالی از structure محسوب نمیشه. value type معادل structure نیست، باید بگید متغیر value type، نه متغیر structure.
ثانیا برای نتیجه ای که می خواهید بگیرید کد تون مثال مناسبی نیست.
ثالثا بله، صرفا مقدار متغیر int تغییر می کنه و حافظه جدیدی بهش تخصیص داده نمیشه.
C#:
        private struct MyStructure
        {
            public int var_1;
            public int var_2;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var m = new MyStructure { var_1 = 5 };
            unsafe
            {

                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
                m = new MyStructure { var_1 = 10 };
                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
                m.var_1++;
                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
            }
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
تجربه و اطلاعاتی در این زمینه ندارم.


اولا int یک structure نیست و int مثالی از structure محسوب نمیشه. value type معادل structure نیست، باید بگید متغیر value type، نه متغیر structure.
ثانیا برای نتیجه ای که می خواهید بگیرید کد تون مثال مناسبی نیست.
ثالثا بله، صرفا مقدار متغیر int تغییر می کنه و حافظه جدیدی بهش تخصیص داده نمیشه.
C#:
        private struct MyStructure
        {
            public int var_1;
            public int var_2;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var m = new MyStructure { var_1 = 5 };
            unsafe
            {

                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
                m = new MyStructure { var_1 = 10 };
                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
                m.var_1++;
                Debug.WriteLine(((long)&m.var_1).ToString("X8"));
            }
        }

خیلی ممنون استاد . :rose:
آو . استاد ، new هم میکنیم ، مقدار آدرس قبلی ویرایش میشه و تغییر میکنه و آدرس جدیدی (نسبت به آدرس قبلی) ، در نظر گرفته نمیشه؟!
مگه کلمه ی کلیدی new ، حافظه ی جدیدی اختصاص نمیداد؟
اگه از قبل حافظه ای میداشت ، کلمه ی کلیدی new ، صرفا مقدار را در همون آدرس از حافظه تغییر میده و آدرس جدیدی را به عنوان مقداردهی ، در نظر نمیگیره؟

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

بعد اینکه استاد ، قبلا درباره ی اینکه مثلا در آنتی ویروس ها ، قبل از اجرای فایل ، فایل را بررسی و اگه ویروسی بود ، مانع اجراش میشن و یا اینکه مثلا علاوه بر این ، در آنتی ویروس پادویش ، وقتی کاربر بخواد فایلی را از فلش اجرا کنه ، مانع اش میشه یا مانع کپی کردنِ فایل های ویروسی میشن ، درباره ی این عملیاتِ سطح پایین (که مانع کپی کردن یا اجرای فایل اون هم در زمان real time میشن) گفته بودید که برای این قضایا ، اینها درایور مینویسن و با زبان هایی مثل ++C این کارها را انجام میدن .

سئوالاتم اینکه :
1) آیا با کار کردن با توابع هسته ی سیستم عامل (توابع kernel32.dll) ، نمیشه این کارها (حالا خاصا منع کردن فایل از کپی شدن توسط کاربر) را انجام داد؟

2) یا مثلا نمیشه توسط قضیه ی Data Access and Storage :


یا با توابع هِدِرِ fileapi.h :


مثلا با متد LockFile و ... اش ، این کارها را انجام داد؟

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

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

تشکر استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد . :rose:
آو . استاد ، new هم میکنیم ، مقدار آدرس قبلی ویرایش میشه و تغییر میکنه و آدرس جدیدی (نسبت به آدرس قبلی) ، در نظر گرفته نمیشه؟!
مگه کلمه ی کلیدی new ، حافظه ی جدیدی اختصاص نمیداد؟
اگه از قبل حافظه ای میداشت ، کلمه ی کلیدی new ، صرفا مقدار را در همون آدرس از حافظه تغییر میده و آدرس جدیدی را به عنوان مقداردهی ، در نظر نمیگیره؟
اینکه حافظه جدیدی تخصیص داده بشه یا نشه به نحوه پیاده سازی زبان و بخش عملگر انتساب ( = ) مربوطه، ربطی به new که یک کلمه کلیدی زبان ئه نداره.
توضیحات عملگر new رو بخونید، ببینید داخلش صحبتی در مورد حافظه جدید شده یا نه. اگر نشده پس ربطی به حافظه جدید نداره.
فرض کنید که i = 4 + 5 رو دارید، 5 در یک حافظه مجزا است، 4 در یک حافظه مجزا، 4 + 5 در یک حافظه دیگه محاسبه میشه و عملگر = این مقدار رو در حافظه i کپی می کنه. حالا اینکه در سمت راست = ئه new ای بوده یا نبوده و چه تعدادی حافظه مجزا بوده که ربطی به عملکرد عملگر انتساب و کاری که با مقدار i و حافظه اش می کنه نداره.

بعد اینکه استاد ، قبلا درباره ی اینکه مثلا در آنتی ویروس ها ، قبل از اجرای فایل ، فایل را بررسی و اگه ویروسی بود ، مانع اجراش میشن و یا اینکه مثلا علاوه بر این ، در آنتی ویروس پادویش ، وقتی کاربر بخواد فایلی را از فلش اجرا کنه ، مانع اش میشه یا مانع کپی کردنِ فایل های ویروسی میشن ، درباره ی این عملیاتِ سطح پایین (که مانع کپی کردن یا اجرای فایل اون هم در زمان real time میشن) گفته بودید که برای این قضایا ، اینها درایور مینویسن و با زبان هایی مثل ++C این کارها را انجام میدن .

سئوالاتم اینکه :
1) آیا با کار کردن با توابع هسته ی سیستم عامل (توابع kernel32.dll) ، نمیشه این کارها (حالا خاصا منع کردن فایل از کپی شدن توسط کاربر) را انجام داد؟
Kernel32.dll توابع هسته سیستم عامل نیست، شامل یکسری توابع اساسی است که برنامه های سطح کاربری ویندوز ازش استفاده می کنند.
و در کل برنامه ای در سطح کاربر نمی تونه از هسته سیستم عامل سرویسی بگیره که نیاز به دسترسی سطح هسته داره.

2) یا مثلا نمیشه توسط قضیه ی Data Access and Storage :


یا با توابع هِدِرِ fileapi.h :


مثلا با متد LockFile و ... اش ، این کارها را انجام داد؟
سرویس هایی که شما بخواهید در سطح کاربری دریافت کنید به همون شکل هم نقض شدنی هستند :

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


4) استاد ، شما با ++C هم کار کردین . درسته؟
بله.

و اینکه خودتون سعی نکردین که تا حالا درایوری (با عملکردهایی مثل همین جلوگیری از کپی شدن و ...) بسازین؟
خیر.

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

اگه کسی مثل من بخواد همچین چیزی بسازه ، اول باید ++C یاد بگیره (یا با سی شارپ هم میشه)؟
حتما باید یک زبان سطح پایینتری مثل C یا ++C و اسمبلی رو یاد بگیرید، اما یاد گرفتن ++C/C بخش ساده کار ئه، چون خیلی از موارد مشترک با #C داره خیلی راحت یاد می گیرید. بخش سخت کار یاد گرفتن معماری سیستم عامل و درایور نویسی و پیاده سازی بر اساس جزئیات فنی مستندات مایکروسافت ئه که سرسری نمیشه ازشون گذشت.

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

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

بالا