🔵 عنوان مقاله
celebrates its tenth anniversary with a look
🟢 خلاصه مقاله:
این مقاله دهمین سالگرد یک ابزار زیرساختی متنباز مبتنی بر Go را جشن میگیرد و نشان میدهد چگونه از یک ابزار کوچک به مولفهای بالغ و شناختهشده در تیمهای DevOps و SRE تبدیل شده است؛ با بهبودهای کارایی و پایداری، معماری افزونهپذیر، API/CLI پایدار و تمرکز جدی بر امنیت و زنجیره تأمین. اکوسیستم آن با جامعهای پویا، مستندات بهتر، نسخهبندی معنادار، سازگاری عقبرو و یکپارچگی گسترده با فضای ابری، CI/CD و ابزارهای مشاهدهپذیری رشد کرده است. در ادامه، نقشهراه بر بهبود تجربه کاربری، غنیتر شدن API/SDK، تقویت policy-as-code، مدیریت بهتر وضعیت و دریفت، و اتوماسیون ایمنتر در مقیاس تأکید میکند.
#Go #Infrastructure #DevOps #OpenSource #Cloud #Automation #Security #Observability
🟣لینک مقاله:
https://golangweekly.com/link/175053/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
celebrates its tenth anniversary with a look
🟢 خلاصه مقاله:
این مقاله دهمین سالگرد یک ابزار زیرساختی متنباز مبتنی بر Go را جشن میگیرد و نشان میدهد چگونه از یک ابزار کوچک به مولفهای بالغ و شناختهشده در تیمهای DevOps و SRE تبدیل شده است؛ با بهبودهای کارایی و پایداری، معماری افزونهپذیر، API/CLI پایدار و تمرکز جدی بر امنیت و زنجیره تأمین. اکوسیستم آن با جامعهای پویا، مستندات بهتر، نسخهبندی معنادار، سازگاری عقبرو و یکپارچگی گسترده با فضای ابری، CI/CD و ابزارهای مشاهدهپذیری رشد کرده است. در ادامه، نقشهراه بر بهبود تجربه کاربری، غنیتر شدن API/SDK، تقویت policy-as-code، مدیریت بهتر وضعیت و دریفت، و اتوماسیون ایمنتر در مقیاس تأکید میکند.
#Go #Infrastructure #DevOps #OpenSource #Cloud #Automation #Security #Observability
🟣لینک مقاله:
https://golangweekly.com/link/175053/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Traefik Labs
Traefik's 10-Year Anniversary: A Community's Journey
10 years ago, I made a small reverse proxy project public. Fast forward to today and Traefik has 3.4B downloads and 56k GitHub stars. See how it unfolded.
🔵 عنوان مقاله
Slice Tails Don't Grow Forever
🟢 خلاصه مقاله:
** این مطلب از Golang Weekly توضیح میدهد که در Go، وقتی از یک slice یک “tail” مثل s[i:] میسازیم، رشد آن به capacity وابسته است و پایدار و بینهایت نیست. تا وقتی capacity اجازه دهد، append روی همان آرایهی پشتی انجام میشود؛ اما بهمحض عبور از capacity، runtime آرایهی جدیدی میسازد و دادهها را کپی میکند، در نتیجه اشتراک حافظه با sliceهای قبلی از بین میرود. این رفتار هم میتواند باعث شگفتی در منطق اشتراکگذاری دادهها شود و هم روی کارایی و مصرف حافظه اثر بگذارد (مثلاً نگهداشتن یک زیر-slice کوچک میتواند یک آرایهی بزرگ را در حافظه زنده نگه دارد). نتیجهٔ عملی: روی رشد بینهایت tail حساب نکنید، خروجی append را یک slice بالقوه با آرایهی پشتی جدید در نظر بگیرید، برای آزادسازی حافظه از copy استفاده کنید، در صورت نیاز capacity مناسب را از قبل با make در نظر بگیرید و حتماً با benchmark تصمیم بگیرید.
#Go #Golang #Slices #Append #MemoryManagement #Performance #GolangWeekly
🟣لینک مقاله:
https://golangweekly.com/link/175065/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Slice Tails Don't Grow Forever
🟢 خلاصه مقاله:
** این مطلب از Golang Weekly توضیح میدهد که در Go، وقتی از یک slice یک “tail” مثل s[i:] میسازیم، رشد آن به capacity وابسته است و پایدار و بینهایت نیست. تا وقتی capacity اجازه دهد، append روی همان آرایهی پشتی انجام میشود؛ اما بهمحض عبور از capacity، runtime آرایهی جدیدی میسازد و دادهها را کپی میکند، در نتیجه اشتراک حافظه با sliceهای قبلی از بین میرود. این رفتار هم میتواند باعث شگفتی در منطق اشتراکگذاری دادهها شود و هم روی کارایی و مصرف حافظه اثر بگذارد (مثلاً نگهداشتن یک زیر-slice کوچک میتواند یک آرایهی بزرگ را در حافظه زنده نگه دارد). نتیجهٔ عملی: روی رشد بینهایت tail حساب نکنید، خروجی append را یک slice بالقوه با آرایهی پشتی جدید در نظر بگیرید، برای آزادسازی حافظه از copy استفاده کنید، در صورت نیاز capacity مناسب را از قبل با make در نظر بگیرید و حتماً با benchmark تصمیم بگیرید.
#Go #Golang #Slices #Append #MemoryManagement #Performance #GolangWeekly
🟣لینک مقاله:
https://golangweekly.com/link/175065/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🤝1
🔵 عنوان مقاله
Do 2.0: Type-Safe Dependency Injection Toolkit
🟢 خلاصه مقاله:
Do 2.0 یک ابزار مدرن برای پیادهسازی الگوی Dependency Injection است که با تکیه بر generics بهجای reflection، یک API کاملاً type-safe ارائه میدهد. این تغییر، خطاها را از زمان اجرا به زمان کامپایل منتقل میکند، عملکرد و زمان راهاندازی را بهبود میدهد و با امکانات IDE مثل تکمیل خودکار و بازآرایی کد سازگارتر است. در Do 2.0 اتصال وابستگیها صریح و قابلردگیری است، بنابراین نگهداشت، آزمونپذیری و اطمینان از درستی گراف وابستگیها سادهتر میشود. برای کاربران فعلی Do، راهنمای ارتقا از نسخه v1 فراهم است و تغییرات کلیدی و نمونهها را برای مهاجرت آسان توضیح میدهد.
#DependencyInjection #TypeSafe #Generics #NoReflection #APIDesign #SoftwareArchitecture #Maintainability #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175066/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Do 2.0: Type-Safe Dependency Injection Toolkit
🟢 خلاصه مقاله:
Do 2.0 یک ابزار مدرن برای پیادهسازی الگوی Dependency Injection است که با تکیه بر generics بهجای reflection، یک API کاملاً type-safe ارائه میدهد. این تغییر، خطاها را از زمان اجرا به زمان کامپایل منتقل میکند، عملکرد و زمان راهاندازی را بهبود میدهد و با امکانات IDE مثل تکمیل خودکار و بازآرایی کد سازگارتر است. در Do 2.0 اتصال وابستگیها صریح و قابلردگیری است، بنابراین نگهداشت، آزمونپذیری و اطمینان از درستی گراف وابستگیها سادهتر میشود. برای کاربران فعلی Do، راهنمای ارتقا از نسخه v1 فراهم است و تغییرات کلیدی و نمونهها را برای مهاجرت آسان توضیح میدهد.
#DependencyInjection #TypeSafe #Generics #NoReflection #APIDesign #SoftwareArchitecture #Maintainability #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175066/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
do.samber.dev
⚙️ do: Type-safe dependency injection for Go | do
A dependency injection toolkit based on Go 1.18+ Generics.
👍1🔥1
Forwarded from Bardia & Erfan
♨️ راز خواب 12 ساعته پاول دورف؛ جایی که ایدههای تلگرام شکل میگیرن!
▪️پاول دورف، مدیرعامل تلگرام، گفته روزی بین ۱۱ تا ۱۲ ساعت میخوابه ، و جالبه که اینو نه تنبلی، بلکه منبع اصلی ایدههای درخشانش میدونه!
▪️دورف صبحها حتی سراغ گوشی هم نمیره، چون معتقده موبایلها جلوی تفکر مستقل رو میگیرن.
خودش میگه:
♨️ راز خواب 12 ساعته پاول دورف؛ جایی که ایدههای تلگرام شکل میگیرن!
▪️پاول دورف، مدیرعامل تلگرام، گفته روزی بین ۱۱ تا ۱۲ ساعت میخوابه ، و جالبه که اینو نه تنبلی، بلکه منبع اصلی ایدههای درخشانش میدونه!
▪️دورف صبحها حتی سراغ گوشی هم نمیره، چون معتقده موبایلها جلوی تفکر مستقل رو میگیرن.
خودش میگه:
«میخوام خودم تصمیم بگیرم چی تو زندگیم مهمه، نه اینکه شرکتها یا الگوریتمها برام تعیین کنن.»
👍3
🔵 عنوان مقاله
'We Tried Go's Experimental Green Tea Garbage Collector and It Didn't Help Performance'
🟢 خلاصه مقاله:
** تیم Dolt در Go 1.25 جمعآورنده زباله آزمایشی Green Tea را فعال و ارزیابی کرد، اما در سناریوی خاص خود بهبود محسوسی در کارایی مشاهده نکرد. با این حال، از آنجا که رفتار GC به نوع بار کاری وابسته است و Green Tea همچنان آزمایشی و اختیاری است، توصیه میشود هر تیم آن را در محیط و بنچمارکهای خود امتحان کرده و بر اساس شاخصهای واقعی تصمیم بگیرد.
#Go #Golang #GarbageCollector #GreenTea #Performance #Benchmarking #Dolt #Go1_25
🟣لینک مقاله:
https://golangweekly.com/link/175055/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
'We Tried Go's Experimental Green Tea Garbage Collector and It Didn't Help Performance'
🟢 خلاصه مقاله:
** تیم Dolt در Go 1.25 جمعآورنده زباله آزمایشی Green Tea را فعال و ارزیابی کرد، اما در سناریوی خاص خود بهبود محسوسی در کارایی مشاهده نکرد. با این حال، از آنجا که رفتار GC به نوع بار کاری وابسته است و Green Tea همچنان آزمایشی و اختیاری است، توصیه میشود هر تیم آن را در محیط و بنچمارکهای خود امتحان کرده و بر اساس شاخصهای واقعی تصمیم بگیرد.
#Go #Golang #GarbageCollector #GreenTea #Performance #Benchmarking #Dolt #Go1_25
🟣لینک مقاله:
https://golangweekly.com/link/175055/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Dolthub
We tried Go's experimental Green Tea garbage collector and it didn't help performance
Go 1.25 includes support for an experimental new garbage collector called Green Tea. We tried it out with Dolt's main performance benchmarks and summarize what difference it made (not much).
❤1
Forwarded from Linux Labdon
چند وقته درگیر این سایتم. تقریبا از صفر تا صد توسعه یه سیستم عامل و کرنل رو پروژه محور توضیح داده.
برا درک یه سری مفاهیم پیشنهاد میشه
https://wiki.osdev.org
<Behi/>
برا درک یه سری مفاهیم پیشنهاد میشه
https://wiki.osdev.org
<Behi/>
🐳1
🔵 عنوان مقاله
Starving, Sleeping, and Yielding: Understanding Go's Scheduler
🟢 خلاصه مقاله:
** این مقاله توضیح میدهد که چرا درک رفتار همزمان در Go به شناخت زمانبند آن بستگی دارد. زمانبند با مدل G‑M‑P، goroutineها را روی نخهای سیستمعامل اجرا میکند، آنها را هنگام بلاکشدن پارک میکند و با netpoller برای I/O هماهنگ میشود. سه وضعیت کلیدی بررسی میشود: Starvation وقتی رخ میدهد که goroutineهای آماده اجرا بهدلیل لوپهای سنگین CPU، الگوهای ناعادلانه در select، یا قفلها و syscall/cgo طولانی به CPU دسترسی پیدا نمیکنند؛ Sleeping با time.Sleep برای توقف کنترلشده مفید است اما میتواند تأخیر بسازد؛ و Yielding با runtime.Gosched امکان میدهد در حلقههای CPU‑محور به دیگر goroutineها نوبت بدهیم. از Go 1.14 به بعد، preemption غیرهمکارانه کمک کرده، اما حلقههای بدون نقطه توقف هنوز مشکلسازند. راهکارها شامل شکستن کارهای سنگین به بخشهای کوچک، پرهیز از busy‑wait، استفاده از context و timeout، طراحی منصفانه channel/select، کوچک نگهداشتن بخشهای بحرانی و تنظیم GOMAXPROCS است. برای عیبیابی نیز از go tool trace، runtime/trace، pprof و GODEBUG=schedtrace استفاده کنید و فقط در صورت نیاز، sleep یا yield موضعی و مستند به کار ببرید.
#Go #Golang #Concurrency #Scheduler #Goroutines #Performance #Parallelism #Systems
🟣لینک مقاله:
https://golangweekly.com/link/175057/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Starving, Sleeping, and Yielding: Understanding Go's Scheduler
🟢 خلاصه مقاله:
** این مقاله توضیح میدهد که چرا درک رفتار همزمان در Go به شناخت زمانبند آن بستگی دارد. زمانبند با مدل G‑M‑P، goroutineها را روی نخهای سیستمعامل اجرا میکند، آنها را هنگام بلاکشدن پارک میکند و با netpoller برای I/O هماهنگ میشود. سه وضعیت کلیدی بررسی میشود: Starvation وقتی رخ میدهد که goroutineهای آماده اجرا بهدلیل لوپهای سنگین CPU، الگوهای ناعادلانه در select، یا قفلها و syscall/cgo طولانی به CPU دسترسی پیدا نمیکنند؛ Sleeping با time.Sleep برای توقف کنترلشده مفید است اما میتواند تأخیر بسازد؛ و Yielding با runtime.Gosched امکان میدهد در حلقههای CPU‑محور به دیگر goroutineها نوبت بدهیم. از Go 1.14 به بعد، preemption غیرهمکارانه کمک کرده، اما حلقههای بدون نقطه توقف هنوز مشکلسازند. راهکارها شامل شکستن کارهای سنگین به بخشهای کوچک، پرهیز از busy‑wait، استفاده از context و timeout، طراحی منصفانه channel/select، کوچک نگهداشتن بخشهای بحرانی و تنظیم GOMAXPROCS است. برای عیبیابی نیز از go tool trace، runtime/trace، pprof و GODEBUG=schedtrace استفاده کنید و فقط در صورت نیاز، sleep یا yield موضعی و مستند به کار ببرید.
#Go #Golang #Concurrency #Scheduler #Goroutines #Performance #Parallelism #Systems
🟣لینک مقاله:
https://golangweekly.com/link/175057/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Bitfield Consulting
Starving, sleeping, and yielding: understanding Go's scheduler — Bitfield Consulting
Writing concurrent programs is easy, but understanding why they don’t work is much harder. In our continuing tutorial, we’ll learn about when and why goroutines starve, sleep, or yield.
❤1
🔵 عنوان مقاله
Build a Water Simulation in Go with raylib-go
🟢 خلاصه مقاله:
**این مقاله گامبهگام نشان میدهد چگونه با Go و raylib-go یک شبیهسازی بلادرنگ آب بسازیم؛ از انتخاب مدل فیزیکی تا پیادهسازی حلقه رندر. نویسنده بین رویکردهای ذرهای و مدلهای height-field/shallow-water مقایسه میکند و برای تعادل سرعت و واقعگرایی، height-field دوبعدی را برمی
🟣لینک مقاله:
https://golangweekly.com/link/175063/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Build a Water Simulation in Go with raylib-go
🟢 خلاصه مقاله:
**این مقاله گامبهگام نشان میدهد چگونه با Go و raylib-go یک شبیهسازی بلادرنگ آب بسازیم؛ از انتخاب مدل فیزیکی تا پیادهسازی حلقه رندر. نویسنده بین رویکردهای ذرهای و مدلهای height-field/shallow-water مقایسه میکند و برای تعادل سرعت و واقعگرایی، height-field دوبعدی را برمی
🟣لینک مقاله:
https://golangweekly.com/link/175063/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Medium
Build a Water Simulation in Go with Raylib-go
In this blog post, we will use raylib-go to create a lightweight water simulation for 2D games.
❤2👍1
🔵 عنوان مقاله
Accepted! Go Proposals Distilled
🟢 خلاصه مقاله:
این مجموعه با عنوان Accepted! Go Proposals Distilled خلاصهای روان از پیشنهادهای پذیرفتهشده زبان Go ارائه میکند تا بدون خواندن کل پروپوزالها، سریع از تغییرات نسخههای آینده باخبر شوید. هر پست دلیل پذیرش، تغییرات و کاربرد عملی آن را خلاصه میکند. تاکنون Anton موضوع maphash را پوشش داده و ادامهٔ سری نیز همزمان با پیشروی پیشنهادهای پذیرفتهشده منتشر خواهد شد.
#Go #Golang #GoProposals #GoUpdates #ProgrammingLanguages #DeveloperNews #Maphash
🟣لینک مقاله:
https://golangweekly.com/link/175050/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Accepted! Go Proposals Distilled
🟢 خلاصه مقاله:
این مجموعه با عنوان Accepted! Go Proposals Distilled خلاصهای روان از پیشنهادهای پذیرفتهشده زبان Go ارائه میکند تا بدون خواندن کل پروپوزالها، سریع از تغییرات نسخههای آینده باخبر شوید. هر پست دلیل پذیرش، تغییرات و کاربرد عملی آن را خلاصه میکند. تاکنون Anton موضوع maphash را پوشش داده و ادامهٔ سری نیز همزمان با پیشروی پیشنهادهای پذیرفتهشده منتشر خواهد شد.
#Go #Golang #GoProposals #GoUpdates #ProgrammingLanguages #DeveloperNews #Maphash
🟣لینک مقاله:
https://golangweekly.com/link/175050/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
antonz.org
Accepted! Go proposals distilled
Stay updated on changes coming in future Go releases.
👍1🎉1 1
🔵 عنوان مقاله
take control with Tuple
🟢 خلاصه مقاله:
این مطلب از Golang Weekly نشان میدهد چگونه بهکارگیری سنجیده Tuple میتواند به توسعهدهندگان Go کمک کند روی جریان داده، مدیریت خطا و همزمانی کنترل بیشتری داشته باشند. در این رویکرد، Tuple راهی فشرده برای بستن چند مقدار مرتبط در یک واحد نوعدار است که با تکیه بر جنریکها، ضمن کاهش کد تکراری، نیت کد و امضای توابع را شفافتر میکند. کاربردهای کلیدی شامل مدلسازی بار دادهی کانالها، جمعآوری خروجیها در الگوهای فناوت/فناین و عبور جفتهایی مانند (value, error) در پایپلاینهاست؛ با این تأکید که هرجا یک مفهوم دامنهای نامدار لازم است، یک struct کوچک همچنان گزینهی بهتر است. جمعبندی: Tuple گلولهی نقرهای نیست، اما اگر هدفمند استفاده شود، بدون لطمه به خوانایی یا ایمنی نوعی، کنترل و شفافیت بیشتری به کدهای Go میدهد و میتوان آن را بهصورت تدریجی در مرز پکیجها و پایپلاینها به کار گرفت.
#Golang #Go #Tuple #GolangWeekly #Generics #Concurrency #TypeSafety #SoftwareDesign
🟣لینک مقاله:
https://golangweekly.com/link/175071/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
take control with Tuple
🟢 خلاصه مقاله:
این مطلب از Golang Weekly نشان میدهد چگونه بهکارگیری سنجیده Tuple میتواند به توسعهدهندگان Go کمک کند روی جریان داده، مدیریت خطا و همزمانی کنترل بیشتری داشته باشند. در این رویکرد، Tuple راهی فشرده برای بستن چند مقدار مرتبط در یک واحد نوعدار است که با تکیه بر جنریکها، ضمن کاهش کد تکراری، نیت کد و امضای توابع را شفافتر میکند. کاربردهای کلیدی شامل مدلسازی بار دادهی کانالها، جمعآوری خروجیها در الگوهای فناوت/فناین و عبور جفتهایی مانند (value, error) در پایپلاینهاست؛ با این تأکید که هرجا یک مفهوم دامنهای نامدار لازم است، یک struct کوچک همچنان گزینهی بهتر است. جمعبندی: Tuple گلولهی نقرهای نیست، اما اگر هدفمند استفاده شود، بدون لطمه به خوانایی یا ایمنی نوعی، کنترل و شفافیت بیشتری به کدهای Go میدهد و میتوان آن را بهصورت تدریجی در مرز پکیجها و پایپلاینها به کار گرفت.
#Golang #Go #Tuple #GolangWeekly #Generics #Concurrency #TypeSafety #SoftwareDesign
🟣لینک مقاله:
https://golangweekly.com/link/175071/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Tuple
Generic Tools Suck
The best pair programming app for macOS and Windows developers.
👍2
🔵 عنوان مقاله
Register Allocation in the Go Compiler
🟢 خلاصه مقاله:
** این یادداشت دو موضوع فنی اما اثرگذار بر کارایی در Go را کنار هم میگذارد: نحوه تخصیص ثبات در کامپایلر و این واقعیت که «دمِ Sliceها برای همیشه رشد نمیکند». بخش نخست با الهام از تجربههای Vladimir Makarov در دنیای تخصیص ثبات توضیح میدهد که پشتصحنهی SSA در کامپایلر Go چگونه محدودههای حیات متغیرها را روی تعداد کمی ثبات سختافزاری نگاشت میکند، φها را حل و حرکتها را ادغام میکند و در صورت نیاز سرریز به پشته انجام میدهد. چالش اصلی، حفظ کیفیت کد (کاهش حرکتها و سرریزها) در کنار سرعت بالای کامپایل است؛ و ایدههایی مانند ترکیب رویکردهای linear-scan و coloring، مدیریت دقیق ثباتهای caller/callee-saved، سرریز در مسیرهای کماحتمال و rematerialization انتخابی به ایجاد این توازن کمک میکنند.
بخش دوم، با تکیه بر نوشتهی Ted Unangst، یادآور میشود که Slice در Go تنها وصلهای روی یک آرایه مشترک است: append میتواند باعث تخصیص دوباره و کپی شود، رشد ظرفیت با بزرگتر شدن Slice کند میشود، و با sub-slice ممکن است حافظهی «سرِ» حذفشده همچنان نگه داشته شود. «دمِ» Slice بدون ظرفیت کافی گسترش نمییابد و برای رها شدن حافظهی قدیمی باید گاهی به یک آرایهی تازه کپی کنید. راهکارها شامل استفاده از make با ظرفیت مناسب، پرهیز از نگهداشتن referenceهای ناخواسته به آرایهی بزرگ و کپی آگاهانه برای آزادسازی حافظه است.
جمعبندی: همانطور که انتخابهای تخصیص ثبات روی تعداد دستورها و سرریز اثر میگذارد، الگوهای کار با Slice نیز روی مصرف حافظه و فشار GC اثر دارند. درک این جزئیات به کدی چابکتر، تأخیر پایدارتر و رفتار قابل پیشبینیتر در سرویسهای Go منجر میشود.
#Go #Golang #Compiler #RegisterAllocation #Performance #MemoryManagement #Slices #SystemsProgramming
🟣لینک مقاله:
https://golangweekly.com/link/175064/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Register Allocation in the Go Compiler
🟢 خلاصه مقاله:
** این یادداشت دو موضوع فنی اما اثرگذار بر کارایی در Go را کنار هم میگذارد: نحوه تخصیص ثبات در کامپایلر و این واقعیت که «دمِ Sliceها برای همیشه رشد نمیکند». بخش نخست با الهام از تجربههای Vladimir Makarov در دنیای تخصیص ثبات توضیح میدهد که پشتصحنهی SSA در کامپایلر Go چگونه محدودههای حیات متغیرها را روی تعداد کمی ثبات سختافزاری نگاشت میکند، φها را حل و حرکتها را ادغام میکند و در صورت نیاز سرریز به پشته انجام میدهد. چالش اصلی، حفظ کیفیت کد (کاهش حرکتها و سرریزها) در کنار سرعت بالای کامپایل است؛ و ایدههایی مانند ترکیب رویکردهای linear-scan و coloring، مدیریت دقیق ثباتهای caller/callee-saved، سرریز در مسیرهای کماحتمال و rematerialization انتخابی به ایجاد این توازن کمک میکنند.
بخش دوم، با تکیه بر نوشتهی Ted Unangst، یادآور میشود که Slice در Go تنها وصلهای روی یک آرایه مشترک است: append میتواند باعث تخصیص دوباره و کپی شود، رشد ظرفیت با بزرگتر شدن Slice کند میشود، و با sub-slice ممکن است حافظهی «سرِ» حذفشده همچنان نگه داشته شود. «دمِ» Slice بدون ظرفیت کافی گسترش نمییابد و برای رها شدن حافظهی قدیمی باید گاهی به یک آرایهی تازه کپی کنید. راهکارها شامل استفاده از make با ظرفیت مناسب، پرهیز از نگهداشتن referenceهای ناخواسته به آرایهی بزرگ و کپی آگاهانه برای آزادسازی حافظه است.
جمعبندی: همانطور که انتخابهای تخصیص ثبات روی تعداد دستورها و سرریز اثر میگذارد، الگوهای کار با Slice نیز روی مصرف حافظه و فشار GC اثر دارند. درک این جزئیات به کدی چابکتر، تأخیر پایدارتر و رفتار قابل پیشبینیتر در سرویسهای Go منجر میشود.
#Go #Golang #Compiler #RegisterAllocation #Performance #MemoryManagement #Slices #SystemsProgramming
🟣لینک مقاله:
https://golangweekly.com/link/175064/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Vladimir Makarov
Register allocation in the Go compiler
As a maintainer of the GCC register allocator (RA), I naturally have a keen interest in the register allocators used in various industrial compilers. For some compilers, like LLVM and Cranelift, there is sufficient documentation, including papers and presentations…
❤1🎉1🍾1
Gopher Academy
📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
این بخش دربارهی مفهوم Span Class در مدیریت حافظهی Go است، و توضیح میدهد چطور وجود یا نبود اشارهگرها (pointers) روی عملکرد Garbage Collector تأثیر میگذارد. خلاصه و نکات مهمش به شکل زیر است 👇
📌 اSpan Class در Go
د🔹 Garbage Collector (GC در Go از نوع tracing است؛ یعنی برای یافتن آبجکتهای زنده، کل گراف حافظه را پیمایش میکند.
🔹 اگر یک نوع داده (type) هیچ اشارهگری نداشته باشد — مستقیم یا غیرمستقیم — GC میتواند آن را اسکن نکند**، چون مطمئن است که آن شیء به هیچ آبجکت دیگری اشاره ندارد.
🔹 این ویژگی در زمان کامپایل مشخص میشود، بنابراین هیچ هزینهی زمان اجرا (runtime cost) ندارد.
🧩 مفهوم Span Class:
برای استفاده از این بهینهسازی، Go مفهوم **Span Class را معرفی میکند.
هر Span Class بر اساس دو ویژگی تعریف میشود:
1.ا Size Class آبجکتهایی که در آن قرار دارند
2. وجود یا نبود اشارهگر در آن آبجکتها
🔸 اگر آبجکتهای Span شامل اشارهگر باشند → Scan Class
🔸 اگر اشارهگر نداشته باشند → NoScan Class
چون وجود اشارهگر یک ویژگی دودویی است (دارد یا ندارد)،
تعداد کل Span Classها برابر است با:
> 68 (تعداد Size Classها) × 2 = 136 Span Class
🔢 نحوهی تشخیص:
* هر Span Class یک عدد بین 0 تا 135 دارد.
* عدد زوج → Scan Class
* عدد فرد → NoScan Class
* Size Class = spanClass / 2
✅ جمعبندی
هر Span در Go نه فقط به یک Size Class بلکه به یک Span Class خاص تعلق دارد.
این تفکیک باعث میشود GC سریعتر و بهینهتر کار کند، چون لازم نیست آبجکتهای بدون اشارهگر را اسکن کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📌 اSpan Class در Go
د🔹 Garbage Collector (GC در Go از نوع tracing است؛ یعنی برای یافتن آبجکتهای زنده، کل گراف حافظه را پیمایش میکند.
🔹 اگر یک نوع داده (type) هیچ اشارهگری نداشته باشد — مستقیم یا غیرمستقیم — GC میتواند آن را اسکن نکند**، چون مطمئن است که آن شیء به هیچ آبجکت دیگری اشاره ندارد.
🔹 این ویژگی در زمان کامپایل مشخص میشود، بنابراین هیچ هزینهی زمان اجرا (runtime cost) ندارد.
🧩 مفهوم Span Class:
برای استفاده از این بهینهسازی، Go مفهوم **Span Class را معرفی میکند.
هر Span Class بر اساس دو ویژگی تعریف میشود:
1.ا Size Class آبجکتهایی که در آن قرار دارند
2. وجود یا نبود اشارهگر در آن آبجکتها
🔸 اگر آبجکتهای Span شامل اشارهگر باشند → Scan Class
🔸 اگر اشارهگر نداشته باشند → NoScan Class
چون وجود اشارهگر یک ویژگی دودویی است (دارد یا ندارد)،
تعداد کل Span Classها برابر است با:
> 68 (تعداد Size Classها) × 2 = 136 Span Class
🔢 نحوهی تشخیص:
* هر Span Class یک عدد بین 0 تا 135 دارد.
* عدد زوج → Scan Class
* عدد فرد → NoScan Class
* Size Class = spanClass / 2
✅ جمعبندی
هر Span در Go نه فقط به یک Size Class بلکه به یک Span Class خاص تعلق دارد.
این تفکیک باعث میشود GC سریعتر و بهینهتر کار کند، چون لازم نیست آبجکتهای بدون اشارهگر را اسکن کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥1💯1
Gopher Academy
📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
این بخش به ساختار Span Set در مدیریت حافظهی Go میپردازد. در واقع توضیح میدهد چطور runtime با کارایی بالا مجموعهای از spanها را سازماندهی میکند. خلاصهی دقیق و نکات کلیدی 👇
📘 Span Set در Go Runtime
🔹 برای مدیریت بهتر spanها، Go از ساختاری به نام Span Set استفاده میکند.
🔹 هر Span Set شامل مجموعهای از mspan**هایی است که همگی متعلق به **یک Span Class مشخص هستند
🧩 ساختار درونی Span Set
* از نظر فنی، Span Set یک slice از آرایهها است.
* اندازهی هر آرایه 512 خانه دارد.
* هر خانه شامل یک mspan object است (ممکن است null باشد).
* سلولهای بنفش → mspan معتبر (non-null)
* سلولهای سفید → تهی (null)
⚙️ عملیات (Push / Pop)
* دو متغیر کلیدی دارد: head و tail
*
*
* هنگام pop از head شروع میکند (بالا به پایین، چپ به راست).
* هنگام push از tail ادامه میدهد (بالا به پایین، چپ به راست).
* اگر آرایهای خالی شود، حذف شده و به pool آزاد برای استفادهی آینده برگردانده میشود.
🧵 همزمانی (Concurrency)
* متغیرهای
* به همین دلیل، چند goroutine میتوانند همزمان span اضافه یا حذف کنند
بدون نیاز به قفل (lock).
---
✅ خلاصه:
این ساختار ساده اما قدرتمند، به runtime اجازه میدهد تا مدیریت حافظه را سریع، بدون قفل و با حداقل سربار انجام دهد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📘 Span Set در Go Runtime
🔹 برای مدیریت بهتر spanها، Go از ساختاری به نام Span Set استفاده میکند.
🔹 هر Span Set شامل مجموعهای از mspan**هایی است که همگی متعلق به **یک Span Class مشخص هستند
🧩 ساختار درونی Span Set
* از نظر فنی، Span Set یک slice از آرایهها است.
* اندازهی هر آرایه 512 خانه دارد.
* هر خانه شامل یک mspan object است (ممکن است null باشد).
* سلولهای بنفش → mspan معتبر (non-null)
* سلولهای سفید → تهی (null)
⚙️ عملیات (Push / Pop)
* دو متغیر کلیدی دارد: head و tail
*
head
→ اولین span معتبر (برای pop)*
tail
→ آخرین span معتبر (برای push)* هنگام pop از head شروع میکند (بالا به پایین، چپ به راست).
* هنگام push از tail ادامه میدهد (بالا به پایین، چپ به راست).
* اگر آرایهای خالی شود، حذف شده و به pool آزاد برای استفادهی آینده برگردانده میشود.
🧵 همزمانی (Concurrency)
* متغیرهای
head
و tail
atomic هستند.* به همین دلیل، چند goroutine میتوانند همزمان span اضافه یا حذف کنند
بدون نیاز به قفل (lock).
---
✅ خلاصه:
اSpan Set
در Go ابزاری کارآمد برای نگهداری و مدیریت همزمان مجموعهای از spanهاست.این ساختار ساده اما قدرتمند، به runtime اجازه میدهد تا مدیریت حافظه را سریع، بدون قفل و با حداقل سربار انجام دهد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🍾1💋1
Gopher Academy
📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
این بخش وارد جزئیات مهمی از نحوهی تشخیص محل اشارهگرها (pointers) در حافظه توسط Garbage Collector در Go میشود. در ادامه توضیح مختصر و مفیدش 👇
📘 Heap Bits و Malloc Header در Go Runtime
🔹 در زبان Go، Garbage Collector (GC) باید بداند کدام قسمت از یک شیء شامل pointer است تا بتواند به درستی گراف حافظه را پیمایش کند.
اما بررسی تکتک فیلدهای هر struct در زمان اجرا (runtime) بسیار پرهزینه خواهد بود، مخصوصاً برای ساختارهای بزرگ یا تو در تو.
💡 راهحل Go: استفاده از متادیتا (Metadata)
برای حل این مشکل، Go از دو سازوکار اصلی استفاده میکند:
1. Heap Bits
* برای هر ناحیه از حافظهی heap، اطلاعاتی بهصورت بیتفیلد ذخیره میشود که مشخص میکند
هر بخش از آن حافظه شامل pointer است یا دادهی معمولی (non-pointer).
* این بیتها توسط کامپایلر در زمان کامپایل ساخته و در زمان اجرا توسط GC استفاده میشوند.
* نتیجه: GC میتواند مستقیماً بداند کدام قسمتها را باید دنبال کند، بدون نیاز به اسکن کل struct.
2. Malloc Header
* هر شیء در heap یک هدر (header) دارد که اطلاعات مدیریتی مثل اندازه، نوع و آدرس بیتهای مربوط به آن (heap bits) را نگهداری میکند.
ا * GC از این هدر برای دسترسی سریع به متادیتای مورد نیاز در زمان جمعآوری حافظه استفاده میکند.
⚙️ نتیجه
با ترکیب heap bits و malloc header**، GC در Go میتواند:
* تنها بخشهای لازم را اسکن کند (به جای کل حافظه)
* با سرعت و دقت بالا گراف اشیاء را پیمایش کند
* و در عین حال، **کارایی بالایی در مدیریت حافظه حفظ کند.
✅ خلاصه:
اGo با استفاده از *Heap Bits* و *Malloc Header*، مکان pointerها را از پیش میداند و به این ترتیب، فرآیند جمعآوری زباله را بسیار سریع و بهینه انجام میدهد — بدون نیاز به بررسی تکیتکی فیلدها در زمان اجرا.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
📘 Heap Bits و Malloc Header در Go Runtime
🔹 در زبان Go، Garbage Collector (GC) باید بداند کدام قسمت از یک شیء شامل pointer است تا بتواند به درستی گراف حافظه را پیمایش کند.
اما بررسی تکتک فیلدهای هر struct در زمان اجرا (runtime) بسیار پرهزینه خواهد بود، مخصوصاً برای ساختارهای بزرگ یا تو در تو.
💡 راهحل Go: استفاده از متادیتا (Metadata)
برای حل این مشکل، Go از دو سازوکار اصلی استفاده میکند:
1. Heap Bits
* برای هر ناحیه از حافظهی heap، اطلاعاتی بهصورت بیتفیلد ذخیره میشود که مشخص میکند
هر بخش از آن حافظه شامل pointer است یا دادهی معمولی (non-pointer).
* این بیتها توسط کامپایلر در زمان کامپایل ساخته و در زمان اجرا توسط GC استفاده میشوند.
* نتیجه: GC میتواند مستقیماً بداند کدام قسمتها را باید دنبال کند، بدون نیاز به اسکن کل struct.
2. Malloc Header
* هر شیء در heap یک هدر (header) دارد که اطلاعات مدیریتی مثل اندازه، نوع و آدرس بیتهای مربوط به آن (heap bits) را نگهداری میکند.
ا * GC از این هدر برای دسترسی سریع به متادیتای مورد نیاز در زمان جمعآوری حافظه استفاده میکند.
⚙️ نتیجه
با ترکیب heap bits و malloc header**، GC در Go میتواند:
* تنها بخشهای لازم را اسکن کند (به جای کل حافظه)
* با سرعت و دقت بالا گراف اشیاء را پیمایش کند
* و در عین حال، **کارایی بالایی در مدیریت حافظه حفظ کند.
✅ خلاصه:
اGo با استفاده از *Heap Bits* و *Malloc Header*، مکان pointerها را از پیش میداند و به این ترتیب، فرآیند جمعآوری زباله را بسیار سریع و بهینه انجام میدهد — بدون نیاز به بررسی تکیتکی فیلدها در زمان اجرا.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
❤1💋1
Gopher Academy
📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
🧠د Heap Bits در Go — هوشمندی در مدیریت حافظه
در Go، اشیاء کوچکتر از ۵۱۲ بایت درون spanهایی نگهداری میشن که خودشون چندین شیء هماندازه دارن.
اما چطور Garbage Collector میفهمه کدوم بخش از این اشیاء شامل pointer هست؟
پاسخ: با Heap Bitmap ✅
🔹 هر span یک نقشهی بیتی (bitmap) در انتهای خودش داره.
🔹 هر بیت مربوط به یک "word" از حافظه (معمولاً ۸ بایت) هست:
1️⃣ = شامل pointer
0️⃣ = دادهی عادی (non-pointer)
به این ترتیب، GC فقط بخشهایی رو اسکن میکنه که واقعاً pointer دارن — سریعتر و بهینهتر از اینکه کل حافظه بررسی بشه.
📦 هر span علاوهبر فضای مورد نیاز برای اشیاء، مقداری فضا برای این bitmap کنار میگذاره.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در Go، اشیاء کوچکتر از ۵۱۲ بایت درون spanهایی نگهداری میشن که خودشون چندین شیء هماندازه دارن.
اما چطور Garbage Collector میفهمه کدوم بخش از این اشیاء شامل pointer هست؟
پاسخ: با Heap Bitmap ✅
🔹 هر span یک نقشهی بیتی (bitmap) در انتهای خودش داره.
🔹 هر بیت مربوط به یک "word" از حافظه (معمولاً ۸ بایت) هست:
1️⃣ = شامل pointer
0️⃣ = دادهی عادی (non-pointer)
به این ترتیب، GC فقط بخشهایی رو اسکن میکنه که واقعاً pointer دارن — سریعتر و بهینهتر از اینکه کل حافظه بررسی بشه.
📦 هر span علاوهبر فضای مورد نیاز برای اشیاء، مقداری فضا برای این bitmap کنار میگذاره.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
❤1👍1
Gopher Academy
📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
برای اشیایی که اندازهشان بیشتر از ۵۱۲ بایت باشد، استفاده از یک بیتمپ بزرگ برای مدیریت حافظه کارآمد نیست. به جای آن، هر شیء با یک هدر ۸ بایت به نام "malloc header" همراه میشود. این هدر شامل یک اشارهگر به اطلاعات نوع شیء (type information) است.
این اطلاعات نوع شامل یک فیلد به نام "GCData" است که چیدمان اشارهگرها (pointer layout) در نوع شیء را کدگذاری میکند. جمعآوری زباله (garbage collector) از این دادهها استفاده میکند تا به طور دقیق و کارآمد فقط فیلدهایی که حاوی اشارهگرها هستند را هنگام پیمایش گراف اشیاء پیدا کند.
به زبان ساده، این روش به جمعآوری زباله کمک میکند تا بدون نیاز به بررسی کل حافظه، فقط بخشهای مهم را که به اشیاء دیگر اشاره دارند، شناسایی و مدیریت کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
این اطلاعات نوع شامل یک فیلد به نام "GCData" است که چیدمان اشارهگرها (pointer layout) در نوع شیء را کدگذاری میکند. جمعآوری زباله (garbage collector) از این دادهها استفاده میکند تا به طور دقیق و کارآمد فقط فیلدهایی که حاوی اشارهگرها هستند را هنگام پیمایش گراف اشیاء پیدا کند.
به زبان ساده، این روش به جمعآوری زباله کمک میکند تا بدون نیاز به بررسی کل حافظه، فقط بخشهای مهم را که به اشیاء دیگر اشاره دارند، شناسایی و مدیریت کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍1🤝1
Gopher Academy
🔵 Introduction
🔴 https://t.me/gopher_academy/4231
➖➖➖➖➖➖➖➖
🔵 Go’s View of Virtual Memory
🔴 https://t.me/gopher_academy/4232
➖➖➖➖➖➖➖➖
🔵 Arena and Page
🔴 https://t.me/gopher_academy/4233
➖➖➖➖➖➖➖➖
🔵 Span and Size Class
🔴https://t.me/gopher_academy/4260
🟡Two spans with different size classes
🟢https://t.me/gopher_academy/4261
🟡Tail waste in span
🟢https://t.me/gopher_academy/4262
🟡User objects and size class objects
🟢https://t.me/gopher_academy/4263
➖➖➖➖➖➖➖➖
🔵Span Class
🔴 https://t.me/gopher_academy/4283
➖➖➖➖➖➖➖➖
🔵Span Set
🔴https://t.me/gopher_academy/4284
➖➖➖➖➖➖➖➖
🔵 Heap Bits and Malloc Header
🔴https://t.me/gopher_academy/4285
🟡Heap bits in a span
🟢https://t.me/gopher_academy/4286
🟡Malloc header in objects
🟢https://t.me/gopher_academy/4287
🔴 https://t.me/gopher_academy/4231
➖➖➖➖➖➖➖➖
🔵 Go’s View of Virtual Memory
🔴 https://t.me/gopher_academy/4232
➖➖➖➖➖➖➖➖
🔵 Arena and Page
🔴 https://t.me/gopher_academy/4233
➖➖➖➖➖➖➖➖
🔵 Span and Size Class
🔴https://t.me/gopher_academy/4260
🟡Two spans with different size classes
🟢https://t.me/gopher_academy/4261
🟡Tail waste in span
🟢https://t.me/gopher_academy/4262
🟡User objects and size class objects
🟢https://t.me/gopher_academy/4263
➖➖➖➖➖➖➖➖
🔵Span Class
🔴 https://t.me/gopher_academy/4283
➖➖➖➖➖➖➖➖
🔵Span Set
🔴https://t.me/gopher_academy/4284
➖➖➖➖➖➖➖➖
🔵 Heap Bits and Malloc Header
🔴https://t.me/gopher_academy/4285
🟡Heap bits in a span
🟢https://t.me/gopher_academy/4286
🟡Malloc header in objects
🟢https://t.me/gopher_academy/4287
♥️جزییات فنی این بخش از مقالات رو می تونید توی لینک زیر بخونید
- https://github.com/golang/go/blob/go1.24.0/src/runtime/runtime2.go#L529-L529
🎯 کد تنظیمات اولیه runtime در Go - بخش اصلی اجرا!
- https://github.com/golang/go/blob/go1.24.0/src/runtime/proc.go#L117-L117
🚀 مدیریت فرآیندها (goroutines) در runtime Go.
- https://man7.org/linux/man-pages/man2/mmap.2.html
📚 مستندات mmap لینوکس - تخصیص حافظه به فرآیندها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L245-L311
🗂 مدیریت هیپ در Go - تخصیص و آزادسازی صفحات حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L402-L496
🔧 مدیریت پیشرفته هیپ - ردیابی و تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L6
📏 تعریف کلاسهای اندازه اولیه برای حافظه کارآمد.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L61
🧮 محاسبات دقیقتر برای کلاسهای اندازه حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L44
⚙️ تنظیمات اضافی برای دستهبندی اندازهها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go
📂 فایل کامل کلاسهای اندازه حافظه در Go.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L556-L562
♻️ کد آزادسازی صفحات حافظه در هیپ.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mspanset.go#L14-L52
🌐 مدیریت مجموعه اسپنها برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mbitmap.go#L549-L582
🖼 مدیریت بیتمپ برای ردیابی حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/malloc.go#L1470-L1470
💾 بخشی از تابع malloc برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/internal/abi/type.go#L31-L42
📋 تعریف ساختار نوع و متادیتای ABI در Go.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
- https://github.com/golang/go/blob/go1.24.0/src/runtime/runtime2.go#L529-L529
🎯 کد تنظیمات اولیه runtime در Go - بخش اصلی اجرا!
- https://github.com/golang/go/blob/go1.24.0/src/runtime/proc.go#L117-L117
🚀 مدیریت فرآیندها (goroutines) در runtime Go.
- https://man7.org/linux/man-pages/man2/mmap.2.html
📚 مستندات mmap لینوکس - تخصیص حافظه به فرآیندها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L245-L311
🗂 مدیریت هیپ در Go - تخصیص و آزادسازی صفحات حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L402-L496
🔧 مدیریت پیشرفته هیپ - ردیابی و تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L6
📏 تعریف کلاسهای اندازه اولیه برای حافظه کارآمد.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L61
🧮 محاسبات دقیقتر برای کلاسهای اندازه حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go#L44
⚙️ تنظیمات اضافی برای دستهبندی اندازهها.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/sizeclasses.go
📂 فایل کامل کلاسهای اندازه حافظه در Go.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mheap.go#L556-L562
♻️ کد آزادسازی صفحات حافظه در هیپ.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mspanset.go#L14-L52
🌐 مدیریت مجموعه اسپنها برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/mbitmap.go#L549-L582
🖼 مدیریت بیتمپ برای ردیابی حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/runtime/malloc.go#L1470-L1470
💾 بخشی از تابع malloc برای تخصیص حافظه.
- https://github.com/golang/go/blob/go1.24.0/src/internal/abi/type.go#L31-L42
📋 تعریف ساختار نوع و متادیتای ABI در Go.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔵 عنوان مقاله
The new() Function Will Take an Expression in Go 1.26
🟢 خلاصه مقاله:
در Go 1.26 یک بهبود کوچک اما کاربردی میآید: تابع new() میتواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح میدهد که این تغییر برخی الگوهای تخصیص و مقداردهی را سادهتر و خواناتر میکند. Tim Little با استفاده از raylib-go یک شبیهسازی آب بلادرنگ در Go میسازد و نشان میدهد چگونه میتوان با ترکیب کارایی Go و سادگی raylib، رندر و فیزیک ساده را پیادهسازی کرد. Vladimir Makarov به تخصیص ثبات در کامپایلر Go میپردازد و تأثیر آن بر کارایی، استراتژیها و ملاحظات بخش SSA را شرح میدهد. در نهایت، Ted Unangst یادآوری میکند که «دم» برشها در Go بینهایت رشد نمیکند و باید به ظرفیت، بازبرش و رفتار append توجه کرد تا از خطاها و افت کارایی جلوگیری شود.
#Go #Golang #Go126 #Compiler #RegisterAllocation #raylib #GameDev #Slices
🟣لینک مقاله:
https://golangweekly.com/link/175062/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
The new() Function Will Take an Expression in Go 1.26
🟢 خلاصه مقاله:
در Go 1.26 یک بهبود کوچک اما کاربردی میآید: تابع new() میتواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح میدهد که این تغییر برخی الگوهای تخصیص و مقداردهی را سادهتر و خواناتر میکند. Tim Little با استفاده از raylib-go یک شبیهسازی آب بلادرنگ در Go میسازد و نشان میدهد چگونه میتوان با ترکیب کارایی Go و سادگی raylib، رندر و فیزیک ساده را پیادهسازی کرد. Vladimir Makarov به تخصیص ثبات در کامپایلر Go میپردازد و تأثیر آن بر کارایی، استراتژیها و ملاحظات بخش SSA را شرح میدهد. در نهایت، Ted Unangst یادآوری میکند که «دم» برشها در Go بینهایت رشد نمیکند و باید به ظرفیت، بازبرش و رفتار append توجه کرد تا از خطاها و افت کارایی جلوگیری شود.
#Go #Golang #Go126 #Compiler #RegisterAllocation #raylib #GameDev #Slices
🟣لینک مقاله:
https://golangweekly.com/link/175062/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Gopher Academy
🔵 عنوان مقاله The new() Function Will Take an Expression in Go 1.26 🟢 خلاصه مقاله: در Go 1.26 یک بهبود کوچک اما کاربردی میآید: تابع new() میتواند یک عبارت بگیرد، نه فقط یک نوع؛ Chris Siebenmann توضیح میدهد که این تغییر برخی الگوهای تخصیص و مقداردهی…
مثال از مقاله
یکی از مثالهای مقاله مربوط به ساخت یک struct به نام Person است:
type Person struct {
Name string
Age *int
}
func newPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: new(age), // ایجاد اشارهگر به کپی مقدار age
}
}
در اینجا، new(age) یک اشارهگر به کپی مقدار age میسازد. این کار قبلاً با &age ممکن بود، اما استفاده از new(age) میتواند در مواردی مثل بهینهسازیهای کامپایلر (مانند آنالیز فرار یا escape analysis) مفید باشد، چون متغیر ورودی age ممکن است روی پشته (stack) باقی بماند و نیازی به تخصیص در هیپ (heap) نداشته باشد.
نکته در مورد ثابتها (Constants)
یک نکته که در مقاله ذکر شده، این است که وقتی از new() با یک ثابت عددی (مثل 10) استفاده میکنید، نوع پیشفرض آن *int است، که ممکن است در برخی موارد باعث خطای نوع (type mismatch) شود. برای مثال:
var ui uint
var uip *uint
ui = 10 // درست است، چون 10 به طور خودکار به uint تبدیل میشود
uip = new(10) // خطا: نوع *int نمیتواند به *uint اختصاص یابد
برای رفع این مشکل، باید نوع ثابت را صراحتاً مشخص کنید:
uip = new(uint(10)) // درست است
چرا این تغییر مفید است؟
- سادگی کد: حذف نیاز به متغیرهای موقت باعث کوتاهتر و خواناتر شدن کد میشود.
- بهینهسازی: کامپایلر Go ممکن است بتواند کدهای نوشتهشده با new(expr) را بهتر بهینه کند.
- یکنواختی: این تغییر باعث میشود که کار با انواع ساده و پیچیده در Go یکسانتر شود.
- محبوبیت: به نظر میرسد که معادلهای این قابلیت (مثل تابع ref()) در جامعه Go رایج بوده و این ویژگی جدید پاسخ به نیاز واقعی توسعهدهندگان است.
مثال تکمیلی
فرض کنید میخواهید یک اشارهگر به یک مقدار محاسبهشده بسازید:
func calculateValue(x, y int) *int {
return new(x + y) // اشارهگری به نتیجه x + y
}
func main() {
p := calculateValue(5, 3) // p اشارهگری به مقدار 8 است
fmt.Println(*p) // خروجی: 8
}
این کد بدون نیاز به متغیر موقت، یک اشارهگر به نتیجه x + y میسازد.
نتیجهگیری
تغییر در تابع new() در Go 1.26 یک بهبود کوچک اما کاربردی است که کد را سادهتر و انعطافپذیرتر میکند. این قابلیت به توسعهدهندگان اجازه میدهد تا بدون متغیرهای موقت، اشارهگرهایی به مقادیر محاسبهشده یا کپیهای مقادیر دیگر بسازند، و در عین حال ممکن است به بهینهسازیهای کامپایلر کمک کند.
یکی از مثالهای مقاله مربوط به ساخت یک struct به نام Person است:
type Person struct {
Name string
json:"name"
Age *int
json:"age"
// سن اگر مشخص باشد؛ در غیر این صورت nil}
func newPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: new(age), // ایجاد اشارهگر به کپی مقدار age
}
}
در اینجا، new(age) یک اشارهگر به کپی مقدار age میسازد. این کار قبلاً با &age ممکن بود، اما استفاده از new(age) میتواند در مواردی مثل بهینهسازیهای کامپایلر (مانند آنالیز فرار یا escape analysis) مفید باشد، چون متغیر ورودی age ممکن است روی پشته (stack) باقی بماند و نیازی به تخصیص در هیپ (heap) نداشته باشد.
نکته در مورد ثابتها (Constants)
یک نکته که در مقاله ذکر شده، این است که وقتی از new() با یک ثابت عددی (مثل 10) استفاده میکنید، نوع پیشفرض آن *int است، که ممکن است در برخی موارد باعث خطای نوع (type mismatch) شود. برای مثال:
var ui uint
var uip *uint
ui = 10 // درست است، چون 10 به طور خودکار به uint تبدیل میشود
uip = new(10) // خطا: نوع *int نمیتواند به *uint اختصاص یابد
برای رفع این مشکل، باید نوع ثابت را صراحتاً مشخص کنید:
uip = new(uint(10)) // درست است
چرا این تغییر مفید است؟
- سادگی کد: حذف نیاز به متغیرهای موقت باعث کوتاهتر و خواناتر شدن کد میشود.
- بهینهسازی: کامپایلر Go ممکن است بتواند کدهای نوشتهشده با new(expr) را بهتر بهینه کند.
- یکنواختی: این تغییر باعث میشود که کار با انواع ساده و پیچیده در Go یکسانتر شود.
- محبوبیت: به نظر میرسد که معادلهای این قابلیت (مثل تابع ref()) در جامعه Go رایج بوده و این ویژگی جدید پاسخ به نیاز واقعی توسعهدهندگان است.
مثال تکمیلی
فرض کنید میخواهید یک اشارهگر به یک مقدار محاسبهشده بسازید:
func calculateValue(x, y int) *int {
return new(x + y) // اشارهگری به نتیجه x + y
}
func main() {
p := calculateValue(5, 3) // p اشارهگری به مقدار 8 است
fmt.Println(*p) // خروجی: 8
}
این کد بدون نیاز به متغیر موقت، یک اشارهگر به نتیجه x + y میسازد.
نتیجهگیری
تغییر در تابع new() در Go 1.26 یک بهبود کوچک اما کاربردی است که کد را سادهتر و انعطافپذیرتر میکند. این قابلیت به توسعهدهندگان اجازه میدهد تا بدون متغیرهای موقت، اشارهگرهایی به مقادیر محاسبهشده یا کپیهای مقادیر دیگر بسازند، و در عین حال ممکن است به بهینهسازیهای کامپایلر کمک کند.
👍2
🔵 عنوان مقاله
Building a Coding Agent in Go from Scratch
🟢 خلاصه مقاله:
این مجموعه سه مطلب عملی برای توسعهدهندگان Go را کنار هم میگذارد: ساخت یک coding agent از صفر در Go، استفاده از Timing Wheels برای انقضای کارآمد ۱۰ میلیون کلید بدون اسکنهای O(n)، و مروری دقیق بر sync شامل Mutex، RWMutex، WaitGroup، Once، Cond و Pool. بخش agent بر معماری ماژولار، هماهنگی goroutine و channel، sandbox امن و حلقه بازخورد برای اجرای کد و بهبود تدریجی تأکید دارد. نوشته Bill Kennedy نشان میدهد چگونه با سطلبندی زمانسنجها و حرکت چرخ، سربار و نوسان تأخیر کاهش مییابد و حتی در مقیاس بزرگ پایدار میماند. در نهایت، مرور sync توصیههای عملی برای انتخاب درست بین primitives و channel، کاهش contention، و ارزیابی با benchmark، pprof و race detector ارائه میکند تا سامانههای Go هم هوشمند و هم سریع باشند.
#Go #Golang #Concurrency #TimingWheels #sync #SystemsProgramming #GoInternals #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175365/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Building a Coding Agent in Go from Scratch
🟢 خلاصه مقاله:
این مجموعه سه مطلب عملی برای توسعهدهندگان Go را کنار هم میگذارد: ساخت یک coding agent از صفر در Go، استفاده از Timing Wheels برای انقضای کارآمد ۱۰ میلیون کلید بدون اسکنهای O(n)، و مروری دقیق بر sync شامل Mutex، RWMutex، WaitGroup، Once، Cond و Pool. بخش agent بر معماری ماژولار، هماهنگی goroutine و channel، sandbox امن و حلقه بازخورد برای اجرای کد و بهبود تدریجی تأکید دارد. نوشته Bill Kennedy نشان میدهد چگونه با سطلبندی زمانسنجها و حرکت چرخ، سربار و نوسان تأخیر کاهش مییابد و حتی در مقیاس بزرگ پایدار میماند. در نهایت، مرور sync توصیههای عملی برای انتخاب درست بین primitives و channel، کاهش contention، و ارزیابی با benchmark، pprof و race detector ارائه میکند تا سامانههای Go هم هوشمند و هم سریع باشند.
#Go #Golang #Concurrency #TimingWheels #sync #SystemsProgramming #GoInternals #Performance
🟣لینک مقاله:
https://golangweekly.com/link/175365/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
YouTube
Building a coding agent from scratch - Bill Kennedy
In this talk, Bill will share how AI agents fundamental work and interact with LLMs to perform basic tasks like listing, reading, and editing files. During the talk, Bill will live code an agent and explain all the parts of the code needed to make this work.…
❤3
🔵 عنوان مقاله
How to Reproduce and Fix an I/O Data Race with Go and DTrace
🟢 خلاصه مقاله:
در این مقاله نویسنده با یک باگ مبهم روبهرو میشود که فقط در CI رخ میدهد: یک data race در سطح I/O فایلها که باعث شکست گهگاه تستها میشود. چون این رقابت در مرز فایلسیستم رخ میدهد و نه در حافظه مشترک، ابزار race detector در Go آن را تشخیص نمیدهد. برای بازتولید محلی، نویسنده شرایط شبیه CI را ایجاد میکند: اجرای تکراری تستها، افزایش همزمانی، و ایجاد تنوع زمانی تا ترتیبهای نادری که خطا را میسازند آشکار شوند. با استفاده از DTrace و رصد فراخوانیهای سیستمی مانند open، write، fsync و rename، الگوی واقعی آشکار میشود: خواندن فایل همزمان با نوشتن/حذف جزئی یا قبل از تحویل اتمی محتوا.
راهکار با اتمیسازی و هماهنگسازی است: نوشتن در فایل موقت و سپس os.Rename برای تحویل اتمی، افزودن fsync در نقاط لازم، و در صورت نیاز قفل/کانال برای سریالسازی دسترسی به مسیرهای مشترک. در تستها نیز از t.TempDir() برای جداسازی حالت، پرهیز از تکیه بر mtime، و اتکا به سیگنالهای قطعی بهجای تأخیرهای زمانی استفاده میشود. نتیجه، حذف flaky بودن در CI و همگرایی رفتار محلی و CI است؛ و درس اصلی اینکه برای رقابتهای I/O باید به ابزارهای ردیابی سطح سیستم تکیه کرد و پروتکل I/O را صریح و اتمی طراحی نمود.
#Go #DTrace #Concurrency #CI #Filesystem #Testing #Debugging #RaceCondition
🟣لینک مقاله:
https://golangweekly.com/link/175360/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How to Reproduce and Fix an I/O Data Race with Go and DTrace
🟢 خلاصه مقاله:
در این مقاله نویسنده با یک باگ مبهم روبهرو میشود که فقط در CI رخ میدهد: یک data race در سطح I/O فایلها که باعث شکست گهگاه تستها میشود. چون این رقابت در مرز فایلسیستم رخ میدهد و نه در حافظه مشترک، ابزار race detector در Go آن را تشخیص نمیدهد. برای بازتولید محلی، نویسنده شرایط شبیه CI را ایجاد میکند: اجرای تکراری تستها، افزایش همزمانی، و ایجاد تنوع زمانی تا ترتیبهای نادری که خطا را میسازند آشکار شوند. با استفاده از DTrace و رصد فراخوانیهای سیستمی مانند open، write، fsync و rename، الگوی واقعی آشکار میشود: خواندن فایل همزمان با نوشتن/حذف جزئی یا قبل از تحویل اتمی محتوا.
راهکار با اتمیسازی و هماهنگسازی است: نوشتن در فایل موقت و سپس os.Rename برای تحویل اتمی، افزودن fsync در نقاط لازم، و در صورت نیاز قفل/کانال برای سریالسازی دسترسی به مسیرهای مشترک. در تستها نیز از t.TempDir() برای جداسازی حالت، پرهیز از تکیه بر mtime، و اتکا به سیگنالهای قطعی بهجای تأخیرهای زمانی استفاده میشود. نتیجه، حذف flaky بودن در CI و همگرایی رفتار محلی و CI است؛ و درس اصلی اینکه برای رقابتهای I/O باید به ابزارهای ردیابی سطح سیستم تکیه کرد و پروتکل I/O را صریح و اتمی طراحی نمود.
#Go #DTrace #Concurrency #CI #Filesystem #Testing #Debugging #RaceCondition
🟣لینک مقاله:
https://golangweekly.com/link/175360/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy