🎯مدیریت حافظه توسط زبان برنامهنویسی:🎯
🔹تقریبا اکثر زبانهای برنامهنویسی سطح بالا این قابلیت را دارند، زبانهایی مثل جاوا، پایتون، سیشارپ و... . از آنجایی که این فرآیند توسط خود زبان برنامهنویسی مدیریت میشود، پس باید یک الگوریتم آن را انجام دهد. اینکه این الگوریتم چطوری باشد و کی شروع به کار کند و ... بحثهایی هستند که ما بهشون علاقهمند هستیم. اما این خودکارسازی(Automation) مزایا و معایبی را به همراه دارد:
🔹مزایا:
🔹افزایش سرعت توسعه و برنامهنویسی راحت: برنامهنویس به حافظه و اینکه حافظه کی خالی یا پر میشود، توجهی نمیکند. طبیعتا تو پروژههای حساس و یا چالشی که حجم حافظه کمه، ممکن است برنامهنویس مجبور باشد به این مورد اهمیت بدهد ولی به طور کلی در اکثر موارد مهم نمیباشد.
🔹کمتر شدن مشکلات امنیتی ناشی از مدیریت حافظه: در طی سالیان با کشف باگها و افزایش تجربه طراحان زبانهای برنامهنویسی این روند رفته رفته بهتر شده است.
🔹رفع بعضی از معایب روش مدیریت دستی.
🔹معایب:
🔹مصرف منابع: برای اجرای دستورات خود garbage collector به cpu نیاز داریم. از سوی دیگر برای نگهداری اطلاعات موردنیاز GC(گاها به جای Garbage Colletor از GC استفاده خواهد شد) به حافظه نیاز داریم که به طبع اینها منابع را مصرف و هزینه دارند.
🔹کاهش performance: اول از همه بگم که اینطوری نیست که یهو performance را خیلی کم کند، نه، اما طبیعتا باعث کاهش هرچند خیلی خیلی جزئیای خواهد شد. طبیعتا در اکثر برنامههای موجود در جهان این میزان کاهش اصلا، اصلا، اصلا مطرح و مهم نیستند، چون کار performanceی خاصی انجام نمیدهند. اما این کاهش چرا رخ میدهد؟ GC نیاز به بررسی حافظه دارد، که این بررسی به زمان نیاز دارد و این زمان یک زمان مفید نمیباشد. توجه گردد که در مورد قبل ما درباره استفاده از cpu و حافظه حرف زدیم، اما اینجا درباره خود زمان لازم برای بررسی حرف میزنیم(البته طبق ادعای یک مقاله، درمواردی ممکن است، در مجموع نه تنها باعث کاهش performance نگردد بلکه باعث افزایش آن نیز شود).
🔹غیرقابل پیشبینی بودن: اینکه garbage collector کی و کجای برنامه شروع به کار میکند، برای ما مشخص نیست و این ممکن است در شرایط خیلی خیلی خاصی مشکلاتی را به وجود بیارد. به عنوان مثال این اتفاق شاید شاید در یک سفینه فضایی یا راکتور هستهای باعث مشکلاتی گردد!
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔹تقریبا اکثر زبانهای برنامهنویسی سطح بالا این قابلیت را دارند، زبانهایی مثل جاوا، پایتون، سیشارپ و... . از آنجایی که این فرآیند توسط خود زبان برنامهنویسی مدیریت میشود، پس باید یک الگوریتم آن را انجام دهد. اینکه این الگوریتم چطوری باشد و کی شروع به کار کند و ... بحثهایی هستند که ما بهشون علاقهمند هستیم. اما این خودکارسازی(Automation) مزایا و معایبی را به همراه دارد:
🔹مزایا:
🔹افزایش سرعت توسعه و برنامهنویسی راحت: برنامهنویس به حافظه و اینکه حافظه کی خالی یا پر میشود، توجهی نمیکند. طبیعتا تو پروژههای حساس و یا چالشی که حجم حافظه کمه، ممکن است برنامهنویس مجبور باشد به این مورد اهمیت بدهد ولی به طور کلی در اکثر موارد مهم نمیباشد.
🔹کمتر شدن مشکلات امنیتی ناشی از مدیریت حافظه: در طی سالیان با کشف باگها و افزایش تجربه طراحان زبانهای برنامهنویسی این روند رفته رفته بهتر شده است.
🔹رفع بعضی از معایب روش مدیریت دستی.
🔹معایب:
🔹مصرف منابع: برای اجرای دستورات خود garbage collector به cpu نیاز داریم. از سوی دیگر برای نگهداری اطلاعات موردنیاز GC(گاها به جای Garbage Colletor از GC استفاده خواهد شد) به حافظه نیاز داریم که به طبع اینها منابع را مصرف و هزینه دارند.
🔹کاهش performance: اول از همه بگم که اینطوری نیست که یهو performance را خیلی کم کند، نه، اما طبیعتا باعث کاهش هرچند خیلی خیلی جزئیای خواهد شد. طبیعتا در اکثر برنامههای موجود در جهان این میزان کاهش اصلا، اصلا، اصلا مطرح و مهم نیستند، چون کار performanceی خاصی انجام نمیدهند. اما این کاهش چرا رخ میدهد؟ GC نیاز به بررسی حافظه دارد، که این بررسی به زمان نیاز دارد و این زمان یک زمان مفید نمیباشد. توجه گردد که در مورد قبل ما درباره استفاده از cpu و حافظه حرف زدیم، اما اینجا درباره خود زمان لازم برای بررسی حرف میزنیم(البته طبق ادعای یک مقاله، درمواردی ممکن است، در مجموع نه تنها باعث کاهش performance نگردد بلکه باعث افزایش آن نیز شود).
🔹غیرقابل پیشبینی بودن: اینکه garbage collector کی و کجای برنامه شروع به کار میکند، برای ما مشخص نیست و این ممکن است در شرایط خیلی خیلی خاصی مشکلاتی را به وجود بیارد. به عنوان مثال این اتفاق شاید شاید در یک سفینه فضایی یا راکتور هستهای باعث مشکلاتی گردد!
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯سه نکته اساسی را باید به هنگام بحث از garbage collectorها در نظر داشته باشیم. این سه عبارتاند از:🎯
🔹حافظه: میزان حافظه heap که برای برنامه اختصاص داده میشود.
🔹توان عملیاتی(Throughput): مقدار زمان اجرای کد برنامه نسبت به مدت زمانی که garbage collector اجرا میگردد. به عنوان مثال اگر بگیم Throughput برابر %99 میباشد یعنی در ۹۹ درصد مواقع کد اصلی(برنامه) اجرا شده و ۱ درصد هم برای garbage collector صرف شده است. طبیعتا هرچقدر این عدد به ۱۰۰ نزدیکتر باشد، به معنی بهتر بودن garbage collector خواهد بود.
🔹تاخیر: مدت زمانی که اجرای برنامه اصلی به خاطر garbage collector با تاخیر مواجه شده است.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔹حافظه: میزان حافظه heap که برای برنامه اختصاص داده میشود.
🔹توان عملیاتی(Throughput): مقدار زمان اجرای کد برنامه نسبت به مدت زمانی که garbage collector اجرا میگردد. به عنوان مثال اگر بگیم Throughput برابر %99 میباشد یعنی در ۹۹ درصد مواقع کد اصلی(برنامه) اجرا شده و ۱ درصد هم برای garbage collector صرف شده است. طبیعتا هرچقدر این عدد به ۱۰۰ نزدیکتر باشد، به معنی بهتر بودن garbage collector خواهد بود.
🔹تاخیر: مدت زمانی که اجرای برنامه اصلی به خاطر garbage collector با تاخیر مواجه شده است.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌ بخش اول ❌
🎯اضافه کردن Context به یک پروژه آزاد🎯
.
🔹 https://www.youtube.com/watch?v=O7aaLb3_eGU
.
🔴 مدرس Forud Ghafouri
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯اضافه کردن Context به یک پروژه آزاد🎯
.
🔹 https://www.youtube.com/watch?v=O7aaLb3_eGU
.
🔴 مدرس Forud Ghafouri
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌ بخش دوم ❌
🎯اضافه کردن Context به یک پروژه آزاد🎯
.
🔹 https://www.youtube.com/watch?v=mVvi8WoZqWw
.
🔴 مدرس Forud Ghafouri
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯اضافه کردن Context به یک پروژه آزاد🎯
.
🔹 https://www.youtube.com/watch?v=mVvi8WoZqWw
.
🔴 مدرس Forud Ghafouri
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
Gopher Academy
❌ بخش اول ❌ 🎯اضافه کردن Context به یک پروژه آزاد🎯 . 🔹 https://www.youtube.com/watch?v=O7aaLb3_eGU . 🔴 مدرس Forud Ghafouri ➖➖➖➖➖➖➖➖➖ 🔰 @gopher_academy
👆🏻👆🏻👆🏻👆🏻
❌چندتا نکته ای که توی بخش اول گفته شد❌
.
🔹سعی کنید برای interface ها کامنت بنویسید
🔹اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🔹سعی کنید context رو توی فایل اصلی راه اندازی کنید
🔹توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🔹بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🔹تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🔹تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌چندتا نکته ای که توی بخش اول گفته شد❌
.
🔹سعی کنید برای interface ها کامنت بنویسید
🔹اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🔹سعی کنید context رو توی فایل اصلی راه اندازی کنید
🔹توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🔹بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🔹تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🔹تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌دوستان می تونن ما رو توی شبکه های اجتماعی و سایت های زیر دنبال کنند❌
✅instagram:
🉐https://www.instagram.com/gopher_academy
✅youtube:
🉐https://www.youtube.com/channel/UC1hnFiO8rUr7SpKgYLxqh7w
✅github:
🉐https://github.com/mrbardia72?tab=repositories
✅virgool:
🉐https://virgool.io/@bardiiia
✅linkedin:
🉐www.linkedin.com/in/bardia-kazemi-76559697
🔸admin: @mrbardia72
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
✅instagram:
🉐https://www.instagram.com/gopher_academy
✅youtube:
🉐https://www.youtube.com/channel/UC1hnFiO8rUr7SpKgYLxqh7w
✅github:
🉐https://github.com/mrbardia72?tab=repositories
✅virgool:
🉐https://virgool.io/@bardiiia
✅linkedin:
🉐www.linkedin.com/in/bardia-kazemi-76559697
🔸admin: @mrbardia72
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
چگونه #سوال برنامهنویسی خود را مطرح کنیم؟
۱- به هیچوجه با گوشی موبایل از صفحه مانیتور عکس نگیرید.
۲- کد رو توی https://carbon.now.sh کپی کنید تا یه شات خیلی تمیز بهتون بده.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
۱- به هیچوجه با گوشی موبایل از صفحه مانیتور عکس نگیرید.
۲- کد رو توی https://carbon.now.sh کپی کنید تا یه شات خیلی تمیز بهتون بده.
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🎯ترجمه این کتاب توی ریپوی زیر هست- دوستان میتونن استفاده کنن و همچنین درخواست ترجمه بخشی از کتاب رو بدن که زود به اتمام برسه🎯
.
🔹 https://github.com/Noah1001000/clean-code-persian
.
🔰 @gopher_academy
.
🔹 https://github.com/Noah1001000/clean-code-persian
.
🔰 @gopher_academy
🎯این قسمت live review 🎯
.
🔹 https://m.youtube.com/watch?v=87tD8EQczEY
.
🔺 مدرس Forud Ghafouri
🔰 @gopher_academy
.
🔹 https://m.youtube.com/watch?v=87tD8EQczEY
.
🔺 مدرس Forud Ghafouri
🔰 @gopher_academy
❌فرصت شغلی❌
🔸گولنگ (سنیور، مید لول، جونیور مستعد)
🔸در بومرنگ اپ
🔸رزومههای خودتون رو برای من بفرستید👇🏻
@Mahmoud_etc
#فرصت_شغلی
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔸گولنگ (سنیور، مید لول، جونیور مستعد)
🔸در بومرنگ اپ
🔸رزومههای خودتون رو برای من بفرستید👇🏻
@Mahmoud_etc
#فرصت_شغلی
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌فرصت شغلی❌
🔸برای تیمی که منم توش هستم توی علیبابا دنبال یک مهندس نرم افزار خوب هستیم. کارهای ما بیشتر با گو انجام میشه، برای نمونه ما rate limiter علیبابا رو نوشتیم که سرویس کریتیکال و باکیفیتیه. در صورت تمایل لطفا یکی دو پاراگراف دربارهٔ تجربیاتتون بهم dm کنید :) #ريتوييت
🔸 https://twitter.com/sinasiadat/status/1344174613962567680
#فرصت_شغلی
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔸برای تیمی که منم توش هستم توی علیبابا دنبال یک مهندس نرم افزار خوب هستیم. کارهای ما بیشتر با گو انجام میشه، برای نمونه ما rate limiter علیبابا رو نوشتیم که سرویس کریتیکال و باکیفیتیه. در صورت تمایل لطفا یکی دو پاراگراف دربارهٔ تجربیاتتون بهم dm کنید :) #ريتوييت
🔸 https://twitter.com/sinasiadat/status/1344174613962567680
#فرصت_شغلی
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌چندتا نکته گولنگی❌
.
🔹زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🔹هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🔹سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🔹سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🔹 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
.
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
.
🔹زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🔹هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🔹سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🔹سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🔹 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
.
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
توی زبانهای شیگرا، فراخوانی متد روی null باعث Null pointer exception میشه.
ولی توی گو، یک متد رو میشه روی nil هم فراخوانی کرد و تا زمانی که به خود شی کار نداشته باشی این خطا رو نمیگیری. مثلا
https://play.golang.org/p/dF1_Jcn1Bh8
دلیلش اینه که توی گو، متدها عملا یک تابع معمولی هستن، که انگار آرگومان اولشون (که تو لیست آرگومانها نیست) یه رفرنس به خود تایپه.
این یکی از دلایل منه که گو عملا شیگرا نیست.
🔻 https://twitter.com/fzerorubigd/status/1345363625175867394?s=19
🔰 @gopher_academy
ولی توی گو، یک متد رو میشه روی nil هم فراخوانی کرد و تا زمانی که به خود شی کار نداشته باشی این خطا رو نمیگیری. مثلا
https://play.golang.org/p/dF1_Jcn1Bh8
دلیلش اینه که توی گو، متدها عملا یک تابع معمولی هستن، که انگار آرگومان اولشون (که تو لیست آرگومانها نیست) یه رفرنس به خود تایپه.
این یکی از دلایل منه که گو عملا شیگرا نیست.
🔻 https://twitter.com/fzerorubigd/status/1345363625175867394?s=19
🔰 @gopher_academy
🔴GitHub Interview Questions And Answers
.
🔹 https://www.wisdomjobs.com/e-university/github-interview-questions.html
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
.
🔹 https://www.wisdomjobs.com/e-university/github-interview-questions.html
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy