🧩 پس این دو Heap را از هم جدا کنیم
وقتی میگوییم:
Traditional Heap
منظور ناحیهای از Virtual Address Space است که بهصورت سنتی با Program Break مرتبط است.
اما وقتی در Go Runtime دربارهی:
Go Heap
صحبت میکنیم، منظور memory managed by Go runtime است.
این memory میتواند از Virtual Memory سیستمعامل گرفته شود و Runtime خودش آن را به ساختارهایی مانند arena، page و span تقسیم و مدیریت کند.
پس:
وقتی میگوییم:
Traditional Heap
منظور ناحیهای از Virtual Address Space است که بهصورت سنتی با Program Break مرتبط است.
Heap
↑
Program Break
اما وقتی در Go Runtime دربارهی:
Go Heap
صحبت میکنیم، منظور memory managed by Go runtime است.
این memory میتواند از Virtual Memory سیستمعامل گرفته شود و Runtime خودش آن را به ساختارهایی مانند arena، page و span تقسیم و مدیریت کند.
پس:
Traditional Heap
≠
Go Runtime Heap
🌍 ب Program Break به معماری CPU وابسته است؟
نه به آن شکلی که شاید در ابتدا تصور کنید.
ب Program Break یک مفهوم مربوط به:
است.
ب CPU وظیفهی اجرای دستورها و ترجمهی Virtual Addressها را برعهده دارد، اما مفهوم
بنابراین روی سیستمهایی مانند:
هر دو میتوانند مفهوم Program Break را داشته باشند.
اما layout دقیق Virtual Address Space میتواند بر اساس معماری، Kernel، تنظیمات سیستم و ویژگیهای سختافزار متفاوت باشد.
نه به آن شکلی که شاید در ابتدا تصور کنید.
ب Program Break یک مفهوم مربوط به:
Operating System
+
Process Virtual Address Space
+
ABI / Memory Model
است.
ب CPU وظیفهی اجرای دستورها و ترجمهی Virtual Addressها را برعهده دارد، اما مفهوم
brk خودش یک CPU feature نیست.بنابراین روی سیستمهایی مانند:
Linux + x86-64
Linux + ARM64
هر دو میتوانند مفهوم Program Break را داشته باشند.
اما layout دقیق Virtual Address Space میتواند بر اساس معماری، Kernel، تنظیمات سیستم و ویژگیهای سختافزار متفاوت باشد.
🔥 حالا کل داستان را کنار هم بگذاریم
یک مدل ذهنی خوب:
البته این تصویر conceptual است و layout واقعی Virtual Address Space به OS، معماری و تنظیمات سیستم بستگی دارد.
یک مدل ذهنی خوب:
Process Virtual Address Space
┌─────────────────────────────────────────────┐
│ Stack │
├─────────────────────────────────────────────┤
│ │
│ mmap'd regions / Go Heap │
│ │
│ ┌─────────────────────────┐ │
│ │ Arena │ │
│ │ Pages / Spans │ │
│ └─────────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ Arena │ │
│ │ Pages / Spans │ │
│ └─────────────────────────┘ │
│ │
├─────────────────────────────────────────────┤
│ Traditional Heap │
├─────────────────────────────────────────────┤
│ BSS │
├─────────────────────────────────────────────┤
│ Data │
├─────────────────────────────────────────────┤
│ Code │
└─────────────────────────────────────────────┘
↑
Program Break
البته این تصویر conceptual است و layout واقعی Virtual Address Space به OS، معماری و تنظیمات سیستم بستگی دارد.
🎯 پس Program Break را چطور به خاطر بسپاریم؟
اگر بخواهیم همهی بحث را در چند خط خلاصه کنیم:
و مهمترین نکته:
و حتی مهمتر:
وقتی این تفاوت را درک کنید، مفاهیمی مثل
و در نهایت Garbage Collector در Go خیلی راحتتر کنار هم قرار میگیرند.
.
اگر بخواهیم همهی بحث را در چند خط خلاصه کنیم:
Program Break
↓
مرز انتهای Traditional Heap
brk / sbrk
↓
تغییر این مرز
malloc
↓
API سطح بالاتر برای allocation
Allocator
↓
مدیریت memory و درخواست آن از OS
mmap
↓
ایجاد / نگاشت memory regionهای Virtual Address Space
Go Runtime
↓
Allocator و Memory Manager خودش
و مهمترین نکته:
ب Program Break مرز کل Dynamic Memory یک Process نیست.
و حتی مهمتر:
ب Go Heap را نباید با Traditional Heap زیر Program Break یکی دانست.
وقتی این تفاوت را درک کنید، مفاهیمی مثل
mmap، mheap، arena، spanو در نهایت Garbage Collector در Go خیلی راحتتر کنار هم قرار میگیرند.
.
Gopher Academy
🧠 این Program Break چیه؟ 🔺https://xn--r1a.website/gopher_academy/5277 🔼 درواقعه Program Break چه کاری انجام میدهد؟ 🔺https://xn--r1a.website/gopher_academy/5278 ⚠️ مهم ترین نکات این بحث Program Break ≠ Physical RAM 🔺https://xn--r1a.website/gopher_academy/5279 🔗 این Program Break چه ارتباطی…
این قسمت Program Break ها به پایین رسیده می تونید از اینجا به کل مطالبش دسترسی داشته باشید♥️
🔵 عنوان مقاله
simd/archsimd package
🟢 خلاصه مقاله:
پکیج simd/archsimd در تلاش است تا جایگزینی قدرتمند برای کتابخانههای C باشد و با بهرهگیری از زبان برنامهنویسی Go، عملکرد فوقالعادهتری ارائه دهد. این بسته، تمرکز خود را بر بهبود سرعت اجرا دارد و ویژگیهای متنوعی را در بر میگیرد که توسعهدهندگان را در بهینهسازی برنامههایشان یاری میکند.
در این مسیر، یکی از جنبههای مهم، مواجهه با شگفتیهای مربوط به برنامهریزی حالتِ حسابگرای (PGO) است که میتواند بر روی کارایی نهایی تأثیرگذار باشد و نیازمند توجه ویژهای است. همچنین، استفاده از جنریکها در این پکیج امکان تخصصیسازی در زمان کامپایل را فراهم میکند که این قابلیت، انعطافپذیری و کارایی برنامهها را چندبرابر میکند.
علاوه بر این، این پروژه از هستههای پردازشی قدرتمند مانند AVX2 و AVX512 بهرهمند است که امکانات محاسباتی را به سطح فوقالعادهای میرساند. این ویژگیها، مخصوصاً در پردازشهای سنگین و سطوح بالا، مزیت رقابتی ایجاد میکنند و به توسعهدهندگان اجازه میدهند تا نرمافزارهای با کارایی بالا تولید کنند.
به طور خلاصه، این پکیج با ترکیب فناوریهای برتر و راهکارهای نوآورانه، هدفمند است تا جایگزینی قوی و بهینه برای کتابخانههای C باشد، و در عین حال، توسعه و اجرای برنامهها را سریعتر و مؤثرتر سازد.
#برنامهنویسی #Go #بهینهسازی #پردازش_پاسخی
🟣لینک مقاله:
https://go.dev/doc/go1.26#simd
➖➖➖➖➖➖➖➖
👑 @gopher_academy
simd/archsimd package
🟢 خلاصه مقاله:
پکیج simd/archsimd در تلاش است تا جایگزینی قدرتمند برای کتابخانههای C باشد و با بهرهگیری از زبان برنامهنویسی Go، عملکرد فوقالعادهتری ارائه دهد. این بسته، تمرکز خود را بر بهبود سرعت اجرا دارد و ویژگیهای متنوعی را در بر میگیرد که توسعهدهندگان را در بهینهسازی برنامههایشان یاری میکند.
در این مسیر، یکی از جنبههای مهم، مواجهه با شگفتیهای مربوط به برنامهریزی حالتِ حسابگرای (PGO) است که میتواند بر روی کارایی نهایی تأثیرگذار باشد و نیازمند توجه ویژهای است. همچنین، استفاده از جنریکها در این پکیج امکان تخصصیسازی در زمان کامپایل را فراهم میکند که این قابلیت، انعطافپذیری و کارایی برنامهها را چندبرابر میکند.
علاوه بر این، این پروژه از هستههای پردازشی قدرتمند مانند AVX2 و AVX512 بهرهمند است که امکانات محاسباتی را به سطح فوقالعادهای میرساند. این ویژگیها، مخصوصاً در پردازشهای سنگین و سطوح بالا، مزیت رقابتی ایجاد میکنند و به توسعهدهندگان اجازه میدهند تا نرمافزارهای با کارایی بالا تولید کنند.
به طور خلاصه، این پکیج با ترکیب فناوریهای برتر و راهکارهای نوآورانه، هدفمند است تا جایگزینی قوی و بهینه برای کتابخانههای C باشد، و در عین حال، توسعه و اجرای برنامهها را سریعتر و مؤثرتر سازد.
#برنامهنویسی #Go #بهینهسازی #پردازش_پاسخی
🟣لینک مقاله:
https://go.dev/doc/go1.26#simd
➖➖➖➖➖➖➖➖
👑 @gopher_academy
go.dev
Go 1.26 Release Notes - The Go Programming Language
❤1👍1
Forwarded from AI
Media is too big
VIEW IN TELEGRAM
استرا یا همون GPT-5.6 Astra هرچیزی ک هست، در خیلی کارها بهتر از ما انسان هست.
ببینید چطور تمام I am not a Robot ها رو ب راحتی حل میکنه.
وارد مرحله pre-AGI شدیم قطعا. دیگه داستان تخیلی نیست و داره تبدیل ب واقعیت میشه.
<Kaveh/>
ببینید چطور تمام I am not a Robot ها رو ب راحتی حل میکنه.
وارد مرحله pre-AGI شدیم قطعا. دیگه داستان تخیلی نیست و داره تبدیل ب واقعیت میشه.
<Kaveh/>
🔥6
🔵 عنوان مقاله
How Debian Code Search Got Fast TurboPFor in Pure Go with SIMD
🟢 خلاصه مقاله:
در دنیای توسعه نرمافزار، سرعت و کارایی اهمیت زیادی دارند، بهخصوص زمانی که قصد بهبود عملکرد سیستمهای پایهای مانند موتورهای جستوجوی کد را دارید. در این مقاله، به بررسی چگونگی بهکارگیری بسته آزمایشی simd/archsimd در زبان برنامهنویسی Go میپردازیم که توانسته جایگزین کتابخانههای C شده و عملکرد قابل توجهی ارائه دهد. یکی از جذابترین بخشها، استفاده از تکنیکهای پیشرفته مانند PGO برای بهینهسازیهای خودکار، بهرهگیری از جنریکها برای تخصصیسازی در زمان کامپایل، و پیادهسازی هستههای محاسباتی AVX2 و AVX512 است. این نوآوریها باعث شدهاند تا سیستمهایی که با هدف سرعت در جستوجو و تحلیل کد طراحی شدهاند، به صورت قابل توجهی سریعتر عمل کنند و تجربه کاربری بهتری ارائه دهند.
در واقع، استفاده از زبان Go و امکانات جدید آن، بویژه بستههای آزمایشی SIMD، این فرصت را فراهم کرده است تا توسعهدهندگان بتوانند کدهای بسیار کارآمدتری بنویسند. این تغییرات نه تنها در سرعت اثرگذار هستند بلکه نگهداری و توسعه برنامهها را نیز آسانتر میکنند، چون کدهای چندرشتهای و تخصصیسازی در زمان کامپایل، باعث کاهش خطاهای مرتبط با بهینهسازیهای دستی میشود. نتیجه نهایی، سیستم جستوجوی کدی است که در عین سادگی، بسیار قدرتمند و سریع است و به توسعهدهندگان امکان میدهد تا بهرهوری بالاتری در پروژههای خود داشته باشند.
#برنامهنویسی #Go #سریع #بهینهسازی
🟣لینک مقاله:
https://michael.stapelberg.ch/posts/2026-09-06-dcs-fast-turbopfor-go-simd/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How Debian Code Search Got Fast TurboPFor in Pure Go with SIMD
🟢 خلاصه مقاله:
در دنیای توسعه نرمافزار، سرعت و کارایی اهمیت زیادی دارند، بهخصوص زمانی که قصد بهبود عملکرد سیستمهای پایهای مانند موتورهای جستوجوی کد را دارید. در این مقاله، به بررسی چگونگی بهکارگیری بسته آزمایشی simd/archsimd در زبان برنامهنویسی Go میپردازیم که توانسته جایگزین کتابخانههای C شده و عملکرد قابل توجهی ارائه دهد. یکی از جذابترین بخشها، استفاده از تکنیکهای پیشرفته مانند PGO برای بهینهسازیهای خودکار، بهرهگیری از جنریکها برای تخصصیسازی در زمان کامپایل، و پیادهسازی هستههای محاسباتی AVX2 و AVX512 است. این نوآوریها باعث شدهاند تا سیستمهایی که با هدف سرعت در جستوجو و تحلیل کد طراحی شدهاند، به صورت قابل توجهی سریعتر عمل کنند و تجربه کاربری بهتری ارائه دهند.
در واقع، استفاده از زبان Go و امکانات جدید آن، بویژه بستههای آزمایشی SIMD، این فرصت را فراهم کرده است تا توسعهدهندگان بتوانند کدهای بسیار کارآمدتری بنویسند. این تغییرات نه تنها در سرعت اثرگذار هستند بلکه نگهداری و توسعه برنامهها را نیز آسانتر میکنند، چون کدهای چندرشتهای و تخصصیسازی در زمان کامپایل، باعث کاهش خطاهای مرتبط با بهینهسازیهای دستی میشود. نتیجه نهایی، سیستم جستوجوی کدی است که در عین سادگی، بسیار قدرتمند و سریع است و به توسعهدهندگان امکان میدهد تا بهرهوری بالاتری در پروژههای خود داشته باشند.
#برنامهنویسی #Go #سریع #بهینهسازی
🟣لینک مقاله:
https://michael.stapelberg.ch/posts/2026-09-06-dcs-fast-turbopfor-go-simd/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Michael Stapelberg
Debian Code Search: Fast TurboPFor with Go SIMD
This August, I accomplished what I wanted for many years: I deleted the last cgo dependency in Debian Code Search! This was made possible by Go’s recently introduced SIMD support, because now we can implement the TurboPFor integer compression format as efficiently…
👍1
🔵 عنوان مقاله
Could Go Build cgo Packages Without a C Compiler?
🟢 خلاصه مقاله:
در فرآیند توسعه برنامههای گو، یکی از چالشهای مهم، کامپایل کردن بستههای cgo است که نیازمند ابزارهای مربوط به زبان C است. در واقع، هنگام استفاده از قابلیت import "C" برای cross-compiling، توسعهدهندگان باید ابزارهای کامل زبان C را روی سیستم خود نصب و پیکربندی کنند، که این کار میتواند زمانبر و پیچیده باشد. این موضوع به ویژه در مواردی رخ میدهد که هدف تنها استفاده از کتابخانههای C از پیشساخته شده است، و نیاز به توسعه مستقیم کدهای C در پروژه نیست.
در این راستا، یک پیشنهاد جدید مطرح شده است که هدف آن سادهسازی این فرآیند است. بر اساس این ایده، بستههایی که فقط به کتابخانههای C از پیشساخته شده مراجعه میکنند، میتوانند ساختار رابط خود را در فایلهای گو مناسب و با علامتگذاریهای خاص مشخص کنند. این کار به توسعهدهندگان اجازه میدهد بدون نیاز به نصب و پیکربندی یک ابزار کامل زبان C، بستههای مربوطه را در پروژههای خود استفاده و Build کنند. این راهکار به طور خاص برای پروژههایی موثر است که تنها به رابطهای C که قبلاً ساخته شدهاند نیاز دارند و برنامهنویسان نمیخواهند وارد فرآیندهای پیچیده ساخت زبان C شوند.
با این تصور، کار با بستههای cgo بسیار آسانتر و قابل دسترستر میشود، زیرا نیازی به نصب و تنظیم ابزارهای پیچیده نیست و تنها کافی است interfaceهای مورد نیاز مشخص و مستند شده باشند. این تغییر بهبود قابل توجهی در سهولت توسعه و انتشار پکیجهای گو ایجاد میکند و امکان استفاده سریعتر و راحتتر از کتابخانههای C را فراهم میسازد.
---
در نتیجه، این ابتکار میتواند توانایی ساخت بستههای cgo بدون نیاز به کامپایلر زبان C را فراهم کند و توسعهدهندگان بیشتری را ترغیب به استفاده از این فناوری کند، مخصوصاً در پروژههای چندپلتفرمی و محیطهایی که نصب ابزارهای توسعه در آنها دشوار است.
#برنامهنویسی #گو #توسعه_پایگاه_کد #پیشرفت_تکنولوژی
🟣لینک مقاله:
https://github.com/golang/go/issues/81450
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Could Go Build cgo Packages Without a C Compiler?
🟢 خلاصه مقاله:
در فرآیند توسعه برنامههای گو، یکی از چالشهای مهم، کامپایل کردن بستههای cgo است که نیازمند ابزارهای مربوط به زبان C است. در واقع، هنگام استفاده از قابلیت import "C" برای cross-compiling، توسعهدهندگان باید ابزارهای کامل زبان C را روی سیستم خود نصب و پیکربندی کنند، که این کار میتواند زمانبر و پیچیده باشد. این موضوع به ویژه در مواردی رخ میدهد که هدف تنها استفاده از کتابخانههای C از پیشساخته شده است، و نیاز به توسعه مستقیم کدهای C در پروژه نیست.
در این راستا، یک پیشنهاد جدید مطرح شده است که هدف آن سادهسازی این فرآیند است. بر اساس این ایده، بستههایی که فقط به کتابخانههای C از پیشساخته شده مراجعه میکنند، میتوانند ساختار رابط خود را در فایلهای گو مناسب و با علامتگذاریهای خاص مشخص کنند. این کار به توسعهدهندگان اجازه میدهد بدون نیاز به نصب و پیکربندی یک ابزار کامل زبان C، بستههای مربوطه را در پروژههای خود استفاده و Build کنند. این راهکار به طور خاص برای پروژههایی موثر است که تنها به رابطهای C که قبلاً ساخته شدهاند نیاز دارند و برنامهنویسان نمیخواهند وارد فرآیندهای پیچیده ساخت زبان C شوند.
با این تصور، کار با بستههای cgo بسیار آسانتر و قابل دسترستر میشود، زیرا نیازی به نصب و تنظیم ابزارهای پیچیده نیست و تنها کافی است interfaceهای مورد نیاز مشخص و مستند شده باشند. این تغییر بهبود قابل توجهی در سهولت توسعه و انتشار پکیجهای گو ایجاد میکند و امکان استفاده سریعتر و راحتتر از کتابخانههای C را فراهم میسازد.
---
در نتیجه، این ابتکار میتواند توانایی ساخت بستههای cgo بدون نیاز به کامپایلر زبان C را فراهم کند و توسعهدهندگان بیشتری را ترغیب به استفاده از این فناوری کند، مخصوصاً در پروژههای چندپلتفرمی و محیطهایی که نصب ابزارهای توسعه در آنها دشوار است.
#برنامهنویسی #گو #توسعه_پایگاه_کد #پیشرفت_تکنولوژی
🟣لینک مقاله:
https://github.com/golang/go/issues/81450
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
proposal: cmd/cgo: cgo without a C toolchain · Issue #81450 · golang/go
Cgo Without C Toolchain Background Cgo provides a mechanism to incorporate C code into Go programs. Currently, it requires a C toolchain to be present on the host system whenever building code with...
🔵 عنوان مقاله
go-oracledb: An Official Pure Go Driver for Oracle Database
🟢 خلاصه مقاله:
در حال حاضر در مرحله آزمایشی است، اما دیدن یک کلاینت رسمی و مستقیم زبان گو از جانب اوراکل بسیار جالب توجه است. این خبر نشان میدهد که شرکت اوراکل به توسعهدهندگان فعال در حوزه زبان گو اهمیت میدهد و قصد دارد راه حلی رسمی و موثق برای اتصال به پایگاه داده اوراکل ارائه دهد. در حال حاضر، گزینههای موجود در بازار شامل «گو-ورا» است که کاملاً بر پایه زبان گو توسعه یافته و عملکرد قابل قبولی دارد، و «گو-درور» که از کتابخانههای کلاینت اوراکل و از طریق فناوری cgo استفاده میکند. این تازهوارد رسمی بر اساس نیازهای توسعهدهندگان ساخته شده و میتواند آیندهای روشن برای پروژههای مبتنی بر زبان گو با پایگاه داده اوراکل رقم بزند، بهخصوص در زمانی که اعتماد به ابزارهای رسمی و پشتیبانی شده اهمیت فراوانی دارد.
#اوراکل #پایگاه_داده #برنامهنویسی #گو
🟣لینک مقاله:
https://github.com/oracle/go-oracledb
➖➖➖➖➖➖➖➖
👑 @gopher_academy
go-oracledb: An Official Pure Go Driver for Oracle Database
🟢 خلاصه مقاله:
در حال حاضر در مرحله آزمایشی است، اما دیدن یک کلاینت رسمی و مستقیم زبان گو از جانب اوراکل بسیار جالب توجه است. این خبر نشان میدهد که شرکت اوراکل به توسعهدهندگان فعال در حوزه زبان گو اهمیت میدهد و قصد دارد راه حلی رسمی و موثق برای اتصال به پایگاه داده اوراکل ارائه دهد. در حال حاضر، گزینههای موجود در بازار شامل «گو-ورا» است که کاملاً بر پایه زبان گو توسعه یافته و عملکرد قابل قبولی دارد، و «گو-درور» که از کتابخانههای کلاینت اوراکل و از طریق فناوری cgo استفاده میکند. این تازهوارد رسمی بر اساس نیازهای توسعهدهندگان ساخته شده و میتواند آیندهای روشن برای پروژههای مبتنی بر زبان گو با پایگاه داده اوراکل رقم بزند، بهخصوص در زمانی که اعتماد به ابزارهای رسمی و پشتیبانی شده اهمیت فراوانی دارد.
#اوراکل #پایگاه_داده #برنامهنویسی #گو
🟣لینک مقاله:
https://github.com/oracle/go-oracledb
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - oracle/go-oracledb: The goal of the pure Go driver is to deliver an official, robust and stable driver for Oracle Database.
The goal of the pure Go driver is to deliver an official, robust and stable driver for Oracle Database. - oracle/go-oracledb
🔵 عنوان مقاله
gomodjail 2.0: An Experimental Jail for Go Modules
🟢 خلاصه مقاله:
در جهان توسعه نرمافزار، مدیریت وابستگیها یکی از چالشهای مهم است. اخیراً، ابزار جدیدی با نام «گومودجیل ۲.۰» معرفی شده که روشی نوآورانه برای محدود کردن دسترسیهای مربوط به ماژولهای Go ارائه میدهد. این ابزار، بر پایه ایدهای آزمایشی ساخته شده است تا توسعهدهندگان بتوانند به صورت امنتر و کنترلشدهتری وابستگیهای پروژههای خود را مدیریت کنند.
گومودجیل ۲.۰ توسط سازنده پروژه «لیما» توسعه یافته است و به عنوان یک سیستم نمونهسازی برای محدود کردن تعاملات ماژولهای Go طراحی شده است. در این سیستم، توسعهدهندگان میتوانند با استفاده از یک کامنت خاص در فایل go.mod، مشخص کنند که این ماژول تحت چه محدودیتهایی قرار دارد. سپس، ابزار gomodjail به طور خودکار بررسی میکند که آیا این ماژول توانایی دسترسی به فایل سیستم، شبکه، تنظیم سیستم کرنل و یا انجام فراخوانیهای سیستمی خام را دارد یا خیر.
در واقع، هدف از این پروژه آزمایشگاهی، ایجاد محیطهایی ایزوله و امن برای اجرای ماژولهای Go است تا در صورت نیاز، دسترسیهای خارجی محدود شده و امنیت پروژه افزایش یابد. این روش به توسعهدهندگان امکان میدهد تا وابستگیهای خود را با کنترل دقیقتر مدیریت کنند و از بروز مشکلات امنیتی جلوگیری کنند.
در نهایت، گومودجیل ۲.۰ نمونهای است از تلاشهای مداوم در جهت بهبود امنیت و کنترل در پروژههای متنباز Go، و نشان میدهد که آینده توسعه این زبان برنامهنویسی میتواند با ابزارهای پیشرفتهتر و امنتر شکل گیرد.
#گومودجیل #امنیت_در_برنامهنویسی #مدیریت_وابستگی #Go
🟣لینک مقاله:
https://github.com/AkihiroSuda/gomodjail
➖➖➖➖➖➖➖➖
👑 @gopher_academy
gomodjail 2.0: An Experimental Jail for Go Modules
🟢 خلاصه مقاله:
در جهان توسعه نرمافزار، مدیریت وابستگیها یکی از چالشهای مهم است. اخیراً، ابزار جدیدی با نام «گومودجیل ۲.۰» معرفی شده که روشی نوآورانه برای محدود کردن دسترسیهای مربوط به ماژولهای Go ارائه میدهد. این ابزار، بر پایه ایدهای آزمایشی ساخته شده است تا توسعهدهندگان بتوانند به صورت امنتر و کنترلشدهتری وابستگیهای پروژههای خود را مدیریت کنند.
گومودجیل ۲.۰ توسط سازنده پروژه «لیما» توسعه یافته است و به عنوان یک سیستم نمونهسازی برای محدود کردن تعاملات ماژولهای Go طراحی شده است. در این سیستم، توسعهدهندگان میتوانند با استفاده از یک کامنت خاص در فایل go.mod، مشخص کنند که این ماژول تحت چه محدودیتهایی قرار دارد. سپس، ابزار gomodjail به طور خودکار بررسی میکند که آیا این ماژول توانایی دسترسی به فایل سیستم، شبکه، تنظیم سیستم کرنل و یا انجام فراخوانیهای سیستمی خام را دارد یا خیر.
در واقع، هدف از این پروژه آزمایشگاهی، ایجاد محیطهایی ایزوله و امن برای اجرای ماژولهای Go است تا در صورت نیاز، دسترسیهای خارجی محدود شده و امنیت پروژه افزایش یابد. این روش به توسعهدهندگان امکان میدهد تا وابستگیهای خود را با کنترل دقیقتر مدیریت کنند و از بروز مشکلات امنیتی جلوگیری کنند.
در نهایت، گومودجیل ۲.۰ نمونهای است از تلاشهای مداوم در جهت بهبود امنیت و کنترل در پروژههای متنباز Go، و نشان میدهد که آینده توسعه این زبان برنامهنویسی میتواند با ابزارهای پیشرفتهتر و امنتر شکل گیرد.
#گومودجیل #امنیت_در_برنامهنویسی #مدیریت_وابستگی #Go
🟣لینک مقاله:
https://github.com/AkihiroSuda/gomodjail
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - AkihiroSuda/gomodjail: [Experimental] jail for Go modules
[Experimental] jail for Go modules. Contribute to AkihiroSuda/gomodjail development by creating an account on GitHub.
👍1
همکاران سیستم برگزار میکند:
بوتکمپ برنامهنویسی Go
ℹ️ آغاز دوره از ۲ مهرماه | ۴ جلسه ۴.۵ ساعته | ساعت ۸:۳۰ تا ۱۳
‼️ در طی ۴ جلسه مباحث اصلی برنامهنویسی با زبان Go رو یاد میگیری و با انجام پروژههای کوچک به حل چالشها و مسائل واقعی دنیای برنامهنویسی میپردازی.
🔺هزینه دوره: رایگان
📧 برای شرکت در این دوره کافیه رزومهت رو برای ما ارسال کنی:
Hr-Dev@systemgroup.net
🔷 سرفصلهای بوتکمپ
- Think in Go
Familiarity with Go Program Structure, Data Types, Types, and Functions
- Build with Go
Methods، Interfaces، Abstraction, Packages
- Go Beyond One Thread
Goroutine، Channel، Shared State, Concurrency
- Engineer with Confidence
Development Tools, Testing, Project structure, and principles of writing reliable software
⌛ مهلت ارسال رزومه: سهشنبه ۳۱ شهریورماه ۱۴۰۵
📍این دوره آموزشی به صورت حضوری در محل شرکت همکاران سیستم در شهر تهران برگزار میشه.
لینکدین | اینستاگرام
بوتکمپ برنامهنویسی Go
ℹ️ آغاز دوره از ۲ مهرماه | ۴ جلسه ۴.۵ ساعته | ساعت ۸:۳۰ تا ۱۳
‼️ در طی ۴ جلسه مباحث اصلی برنامهنویسی با زبان Go رو یاد میگیری و با انجام پروژههای کوچک به حل چالشها و مسائل واقعی دنیای برنامهنویسی میپردازی.
🔺هزینه دوره: رایگان
📧 برای شرکت در این دوره کافیه رزومهت رو برای ما ارسال کنی:
Hr-Dev@systemgroup.net
🔷 سرفصلهای بوتکمپ
- Think in Go
Familiarity with Go Program Structure, Data Types, Types, and Functions
- Build with Go
Methods، Interfaces، Abstraction, Packages
- Go Beyond One Thread
Goroutine، Channel، Shared State, Concurrency
- Engineer with Confidence
Development Tools, Testing, Project structure, and principles of writing reliable software
⌛ مهلت ارسال رزومه: سهشنبه ۳۱ شهریورماه ۱۴۰۵
📍این دوره آموزشی به صورت حضوری در محل شرکت همکاران سیستم در شهر تهران برگزار میشه.
لینکدین | اینستاگرام
🍾1
Forwarded from AI
🔵 عنوان مقاله
Claude Fable 5.1 and Mythos 5.1 (8 minute read)
🟢 خلاصه مقاله:
شرکت انتروپیک به تازگی نسخههای جدید مدلهای خود را معرفی کرده است؛ Claude Fable 5.1 و Mythos 5.1. این نسخهها با بهبود در قابلیتهای کدنویسی و تحقیقات، به کاربران امکان میدهند تا در حوزههای تخصصی با کارایی بیشتری فعالیت کنند. همچنین، قیمتگذاری این نسخهها به گونهای تنظیم شده است که هزینههای موثر برای کاربران کاهش یابد، در عین حال محافظتها و اقدامات امنیتی بهروز و جامعتری در آنها تعبیه شده است.
نسخه Mythos، که از همان مدل پایه بهره میبرد، به شکل ویژهای برای کنترل دسترسیهای پیشرفته طراحی شده است. این قابلیتها، بهخصوص در کارهای حساس در زمینه امنیت سایبری و علوم زیستی، امکان دسترسی مطمئن و کنترل شده را فراهم میآورد. به این ترتیب، Mythos نه تنها قدرتمند است بلکه به کاربران اجازه میدهد تا در زمینههای حیاتی، با اعتماد کامل از امکانات آن بهرهمند شوند.
به طور کلی، این نسخههای جدید نشاندهنده تعهد انتروپیک به ارتقاء مداوم فناوریها و تضمین امنیت و کارایی در استفادههای تخصصی هستند. ارائه امکانات پیشرفته در کنار قیمت مناسب و محافظتهای کارآمد، این مدلها را به گزینهای برتر در حوزه هوش مصنوعی و فناوریهای نوین تبدیل کرده است.
#هوش_مصنوعی #امنیت_سایبری #پژوهش #فناوری
🟣لینک مقاله:
https://www.anthropic.com/claude-fable-and-mythos-5-1?utm_source=tldrai
➖➖➖➖➖➖➖➖
👑 @ai_Labdon
Claude Fable 5.1 and Mythos 5.1 (8 minute read)
🟢 خلاصه مقاله:
شرکت انتروپیک به تازگی نسخههای جدید مدلهای خود را معرفی کرده است؛ Claude Fable 5.1 و Mythos 5.1. این نسخهها با بهبود در قابلیتهای کدنویسی و تحقیقات، به کاربران امکان میدهند تا در حوزههای تخصصی با کارایی بیشتری فعالیت کنند. همچنین، قیمتگذاری این نسخهها به گونهای تنظیم شده است که هزینههای موثر برای کاربران کاهش یابد، در عین حال محافظتها و اقدامات امنیتی بهروز و جامعتری در آنها تعبیه شده است.
نسخه Mythos، که از همان مدل پایه بهره میبرد، به شکل ویژهای برای کنترل دسترسیهای پیشرفته طراحی شده است. این قابلیتها، بهخصوص در کارهای حساس در زمینه امنیت سایبری و علوم زیستی، امکان دسترسی مطمئن و کنترل شده را فراهم میآورد. به این ترتیب، Mythos نه تنها قدرتمند است بلکه به کاربران اجازه میدهد تا در زمینههای حیاتی، با اعتماد کامل از امکانات آن بهرهمند شوند.
به طور کلی، این نسخههای جدید نشاندهنده تعهد انتروپیک به ارتقاء مداوم فناوریها و تضمین امنیت و کارایی در استفادههای تخصصی هستند. ارائه امکانات پیشرفته در کنار قیمت مناسب و محافظتهای کارآمد، این مدلها را به گزینهای برتر در حوزه هوش مصنوعی و فناوریهای نوین تبدیل کرده است.
#هوش_مصنوعی #امنیت_سایبری #پژوهش #فناوری
🟣لینک مقاله:
https://www.anthropic.com/claude-fable-and-mythos-5-1?utm_source=tldrai
➖➖➖➖➖➖➖➖
👑 @ai_Labdon
Anthropic
Introducing Claude Fable 5.1 and Claude Mythos 5.1
Our most advanced models for coding and knowledge work. Their research capabilities also offer an early glimpse of how AI models will contribute to scientific progress.
❤1
Forwarded from Front-End
میدلولها خیلی بدردتون میخوره
چند روز بعد از اینکه درباره تجربه خوبم با Graphify نوشتم،
از workflow اصلی همون پروژه حذفش کردم!
نه چون Graphify بد بود.
اتفاقاً چون استفاده ازش باعث شد دقیقتر بفهمم از این مدل ابزارها چی میخوام.
مسئلهای که داشتم فقط Search داخل codebase نبود.
مسئله اصلی Orientation بود.
هر تسک جدید با چند سؤال تکراری شروع میشد:
این component کجا استفاده شده؟
این composable رو چی مصرف میکنه؟
این feature بین چه فایلهایی پخش شده؟
اگه این قسمت رو تغییر بدم، چه چیزهای دیگهای تحت تأثیر قرار میگیرن؟
و Graphify برای اولین بار این حس رو بهم داد که قبل از باز کردن فایلها، میشه یه نقشه از پروژه داشت.
بعد رفتم سراغ Codebase Memory MCP تا ببینم همین ایده وقتی مستقیم وارد workflow خود Coding Agent میشه چه فرقی میکنه.
مهاجرت هم اصلاً بیدردسر نبود :)))
بعد از نصب و Index کردن پروژه، MCP داخل Codex با خطای Transport closed شکست خورد. CLI کار میکرد، Index سالم بود، حتی MCP خام هم جواب میداد؛ ولی چیزی که واقعاً میخواستم یعنی workflow داخل Codex کار نمیکرد.
بعد از بررسی و سه Clean Start مستقل، MCP بالاخره در هر سه Session پایدار کار کرد و migration رو نهایی کردم.
اما بخش جالبتر برای من اولین تسک واقعی بعد از مهاجرت بود.
میخواستم نسخه موبایل پورتفولیوم رو اصلاح کنم: Header، Language Selector، Bottom Navigation و Responsive behavior.
قبل از اینکه شروع کنم فایلها رو بگردم، از CBM خواستم محدوده کار رو پیدا کنه.
یکی از چیزهایی که سریع مشخص کرد این بود که BottomNav.vue از قبل توی پروژه وجود داره، ولی اصلاً داخل Layout mount نشده.
همین کشف ساده جلوی ساختن دوباره چیزی رو گرفت که از قبل داشتم.
ولی در همون تسک محدودیتش هم مشخص شد.
و CBM معماری اولیه رو خوب پیدا کرد، اما detect_changes نتونست impact واقعی یه تغییر UI رو کامل بفهمه.
Responsive CSS، Safe Area، RTL، Overflow توی عرض 320px و چیزی که کاربر واقعاً توی Browser میبینه، لزوماً توی Call Graph مشخص نیست.
و اینجا به نتیجهای رسیدم که به نظرم از خود مهاجرت مهمتره:
من دیگه Graphify و Codebase Memory رو دو رقیب مستقیم نمیبینم.
برای پروژههای Code-heavy، جایی که بیشتر سؤالها درباره implementation فعلی، dependencyها، refactor و impact تغییراته، CBM برای من انتخاب طبیعیتریه.
ولی وقتی پروژه فقط Code نیست و PRD، ADR، Research، Architecture Docs، PDF، Diagram و Domain Knowledge بخش مهمی از پروژهان، Graphify هنوز ارزش خیلی جدیای داره.
حتی برای یه محصول بزرگ احتمالاً از هر دو استفاده میکنم:
کدبیس Memory برای اینکه بفهمم:
«الان کد چطور کار میکنه؟»
و Graphify برای اینکه بفهمم:
«چرا اصلاً اینطوری طراحی شده؟»
با یه شرط مهم:
هیچکدوم Source of Truth نهایی نیستن.
و Graph کمک میکنه سریعتر برسم به جواب.
ولی برای implementation هنوز سورس رو میخونم، برای requirement خود PRD رو چک میکنم و برای UI هنوز Browser حرف آخر رو میزنه.
تجربه کامل migration، failure، تست MCP و اولین task واقعی بعد از مهاجرت رو اینجا نوشتم:
http://aliarghyani.vercel.app/fa/blog/graphify-to-codebase-memory-mcp
| <Ali Arghyani/>
چند روز بعد از اینکه درباره تجربه خوبم با Graphify نوشتم،
از workflow اصلی همون پروژه حذفش کردم!
نه چون Graphify بد بود.
اتفاقاً چون استفاده ازش باعث شد دقیقتر بفهمم از این مدل ابزارها چی میخوام.
مسئلهای که داشتم فقط Search داخل codebase نبود.
مسئله اصلی Orientation بود.
هر تسک جدید با چند سؤال تکراری شروع میشد:
این component کجا استفاده شده؟
این composable رو چی مصرف میکنه؟
این feature بین چه فایلهایی پخش شده؟
اگه این قسمت رو تغییر بدم، چه چیزهای دیگهای تحت تأثیر قرار میگیرن؟
و Graphify برای اولین بار این حس رو بهم داد که قبل از باز کردن فایلها، میشه یه نقشه از پروژه داشت.
بعد رفتم سراغ Codebase Memory MCP تا ببینم همین ایده وقتی مستقیم وارد workflow خود Coding Agent میشه چه فرقی میکنه.
مهاجرت هم اصلاً بیدردسر نبود :)))
بعد از نصب و Index کردن پروژه، MCP داخل Codex با خطای Transport closed شکست خورد. CLI کار میکرد، Index سالم بود، حتی MCP خام هم جواب میداد؛ ولی چیزی که واقعاً میخواستم یعنی workflow داخل Codex کار نمیکرد.
بعد از بررسی و سه Clean Start مستقل، MCP بالاخره در هر سه Session پایدار کار کرد و migration رو نهایی کردم.
اما بخش جالبتر برای من اولین تسک واقعی بعد از مهاجرت بود.
میخواستم نسخه موبایل پورتفولیوم رو اصلاح کنم: Header، Language Selector، Bottom Navigation و Responsive behavior.
قبل از اینکه شروع کنم فایلها رو بگردم، از CBM خواستم محدوده کار رو پیدا کنه.
یکی از چیزهایی که سریع مشخص کرد این بود که BottomNav.vue از قبل توی پروژه وجود داره، ولی اصلاً داخل Layout mount نشده.
همین کشف ساده جلوی ساختن دوباره چیزی رو گرفت که از قبل داشتم.
ولی در همون تسک محدودیتش هم مشخص شد.
و CBM معماری اولیه رو خوب پیدا کرد، اما detect_changes نتونست impact واقعی یه تغییر UI رو کامل بفهمه.
Responsive CSS، Safe Area، RTL، Overflow توی عرض 320px و چیزی که کاربر واقعاً توی Browser میبینه، لزوماً توی Call Graph مشخص نیست.
و اینجا به نتیجهای رسیدم که به نظرم از خود مهاجرت مهمتره:
من دیگه Graphify و Codebase Memory رو دو رقیب مستقیم نمیبینم.
برای پروژههای Code-heavy، جایی که بیشتر سؤالها درباره implementation فعلی، dependencyها، refactor و impact تغییراته، CBM برای من انتخاب طبیعیتریه.
ولی وقتی پروژه فقط Code نیست و PRD، ADR، Research، Architecture Docs، PDF، Diagram و Domain Knowledge بخش مهمی از پروژهان، Graphify هنوز ارزش خیلی جدیای داره.
حتی برای یه محصول بزرگ احتمالاً از هر دو استفاده میکنم:
کدبیس Memory برای اینکه بفهمم:
«الان کد چطور کار میکنه؟»
و Graphify برای اینکه بفهمم:
«چرا اصلاً اینطوری طراحی شده؟»
با یه شرط مهم:
هیچکدوم Source of Truth نهایی نیستن.
و Graph کمک میکنه سریعتر برسم به جواب.
ولی برای implementation هنوز سورس رو میخونم، برای requirement خود PRD رو چک میکنم و برای UI هنوز Browser حرف آخر رو میزنه.
تجربه کامل migration، failure، تست MCP و اولین task واقعی بعد از مهاجرت رو اینجا نوشتم:
http://aliarghyani.vercel.app/fa/blog/graphify-to-codebase-memory-mcp
| <Ali Arghyani/>
aliarghyani.vercel.app
Graphify رو با Codebase Memory MCP عوض کردم؛ ولی نه برای همهچیز
روایت مهاجرت یک پروژه Nuxt از Graphify به Codebase Memory MCP؛ از دردسرهای MCP تا اولین تسک واقعی و مرز درست استفاده از هر ابزار.
👍1
مهندسان اوبر در یک بلاگپست فنی جزییات جالبی از نصف کردن تاخیر جستجوی Uber Eats منتشر کردهاند. فارغ از بهینهسازیهای مرسوم معماری، استفاده عملیشان از ایجنتهای هوش مصنوعی برای تیونینگ کد توجه من را جلب کرد.
خلاصه تغییرات کلیدی:
۱. تغییر متریک اصلی به ATF (مدتزمان رندر اولین بخش تصویر در گوشی کاربر) و تبدیل رندر HTML به یک پایپلاین کاملا Async.
۲. جداسازی Hydration به دو فاز مجزا؛ واکشی سریع سیگنالهای رتبهبندی برای اجرای زودهنگام مدلها، و لود موازی جزییات نمایشی (قیمت، تصویر و...).
۳. بهینهسازی امبدینگها با کاهش دقت اعشار و فشردهسازی تا ۴۶٪، در کنار تبدیل پوینترها به Value types در کد Go که مصرف ۴۰ درصدی پردازنده توسط Garbage Collector را به شدت کم کرد.
۴. استفاده از لوپ خودکار ایجنتی؛ ایجنت با تحلیل پروفایلهای زنده پروداکشن، باتلنکهای ریز را پیدا میکرد، کد بهینهسازی مینوشت، پولریکوئست میزد و با بنچمارک نتیجه را میسنجید.
۵. برنامههای آینده بر پایه مایکروبچینگ، فیلترینگ در لایه ایندکس (Zero-Pass Ranking) و استریم فرگمنتهای نتایج به سمت کلاینت.
لینک مقاله: بخوانیدش، خیلی جالبه!
uber.com/us/en/blog/uber-eats-search-pipeline/
| <Mehdi Allahyari/>
خلاصه تغییرات کلیدی:
۱. تغییر متریک اصلی به ATF (مدتزمان رندر اولین بخش تصویر در گوشی کاربر) و تبدیل رندر HTML به یک پایپلاین کاملا Async.
۲. جداسازی Hydration به دو فاز مجزا؛ واکشی سریع سیگنالهای رتبهبندی برای اجرای زودهنگام مدلها، و لود موازی جزییات نمایشی (قیمت، تصویر و...).
۳. بهینهسازی امبدینگها با کاهش دقت اعشار و فشردهسازی تا ۴۶٪، در کنار تبدیل پوینترها به Value types در کد Go که مصرف ۴۰ درصدی پردازنده توسط Garbage Collector را به شدت کم کرد.
۴. استفاده از لوپ خودکار ایجنتی؛ ایجنت با تحلیل پروفایلهای زنده پروداکشن، باتلنکهای ریز را پیدا میکرد، کد بهینهسازی مینوشت، پولریکوئست میزد و با بنچمارک نتیجه را میسنجید.
۵. برنامههای آینده بر پایه مایکروبچینگ، فیلترینگ در لایه ایندکس (Zero-Pass Ranking) و استریم فرگمنتهای نتایج به سمت کلاینت.
لینک مقاله: بخوانیدش، خیلی جالبه!
uber.com/us/en/blog/uber-eats-search-pipeline/
| <Mehdi Allahyari/>
Uber
Halving the Time: How Uber Eats Rebuilt Its Search Pipeline
Every millisecond of latency is a lost opportunity—especially when people are hungry. 🍔 We cut Uber Eats search latency in half by re-architecting our full-stack pipeline. Read our latest deep dive to see how we did it.
👍2🔥2
Gopher Academy
۳. بهینهسازی امبدینگها با کاهش دقت اعشار و فشردهسازی تا ۴۶٪، در کنار تبدیل پوینترها به Value types در کد Go که مصرف ۴۰ درصدی پردازنده توسط Garbage Collector را به شدت کم کرد.
🔰 بهینهسازی Embeddingها در شرکت Uber با هدف کاهش دقت اعشار و فشردهسازی تا ۴۶٪، در کنار تبدیل Pointerها به Value Typeها در کد Go که باعث شد مصرف ۴۰ درصدی CPU توسط Garbage Collector بهشدت کاهش پیدا کند.
🟢 توضیحات کامل در لینک زیر: 👇
🔴 part 1: https://xn--r1a.website/gopher_academy/5308
🔴 part 2: https://xn--r1a.website/gopher_academy/5309
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🟢 توضیحات کامل در لینک زیر: 👇
🔴 part 1: https://xn--r1a.website/gopher_academy/5308
🔴 part 2: https://xn--r1a.website/gopher_academy/5309
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Telegram
Gopher Academy
بذارید دقیق و با مثال توضیح بدیم.
۱. اول ببینیم Embedding چیست
فرض کن برای هر رستوران یک embedding داریم:
Restaurant: Pizza Hut
Embedding:
[0.1823, -0.4211, 0.7328, 0.0912, ...]
این اعداد معمولاً float32 هستند.
مثلاً یک embedding با 768 dimension:
type…
۱. اول ببینیم Embedding چیست
فرض کن برای هر رستوران یک embedding داریم:
Restaurant: Pizza Hut
Embedding:
[0.1823, -0.4211, 0.7328, 0.0912, ...]
این اعداد معمولاً float32 هستند.
مثلاً یک embedding با 768 dimension:
type…
🍾1
بذارید دقیق و با مثال توضیح بدیم.
۱. اول ببینیم Embedding چیست
فرض کن برای هر رستوران یک embedding داریم:
این اعداد معمولاً
مثلاً یک embedding با 768 dimension:
هر
یعنی تقریباً 3KB برای هر embedding.
حالا اگر میلیونها رستوران/آیتم داشته باشی، حجم حافظه خیلی سریع بالا میرود.
۲. کاهش دقت اعشار یعنی چه؟
فرض کن مقدار اصلی:
باشد.
برای مدلهای ML همیشه لازم نیست تمام این دقت را نگه داریم.
میتوان آن را مثلاً به چیزی مثل:
تقلیل داد.
اینجا یک نکته مهم وجود دارد:
کاهش precision الزاماً به معنی تبدیل
روشهای مختلفی وجود دارد، مثل:
FP32 → FP16
FP32 → BF16
Quantization
INT8
و روشهای دیگر
ایده کلی این است:
مثلاً اگر از
پس embedding:
تبدیل میشود به:
یعنی تقریباً ۵۰٪ کاهش حجم.
در پروژه Uber طبق توضیحی که آوردی، ترکیب روشهای فشردهسازی به حدود ۴۶٪ کاهش حجم embeddingها رسیده است.
۳. اما قسمت جالبتر: Pointer → Value
این قسمت برای یک برنامهنویس Go خیلی مهمتر است.
فرض کن چنین structای داریم:
و جایی در سیستم:
اینجا داریم pointer برمیگردانیم:
یعنی یک object روی heap ساخته میشود و ما pointer آن را نگه میداریم.
چرا این میتواند برای GC بد باشد؟
فرض کن سیستم Uber Eats در هر search هزاران یا میلیونها object بسازد:
مثلاً:
به جای:
در حالت pointer، تعداد زیادی object جداگانه داریم که GC باید آنها را بررسی و مدیریت کند.
یعنی:
هرچه allocation بیشتر باشد، کار GC هم بیشتر میشود.
۴.ا Value Type چه تغییری ایجاد میکند؟
به جای:
میتوانیم داشته باشیم:
یعنی objectها داخل خود slice قرار میگیرند.
به شکل ساده:
Pointer
Value
در حالت دوم، معمولاً allocationهای جداگانهی کمتری داریم.
۵. چرا GC اینجا خیلی مهم است؟
ا Go یک Garbage Collector دارد.
وقتی objectهایی روی heap ساخته میشوند:
و دیگر کسی به آنها نیاز ندارد، GC باید تشخیص دهد:
اگر برنامه تعداد بسیار زیادی object کوچک تولید کند:
ا GC باید دائماً این heap را بررسی کند.
در یک سیستم search با traffic بسیار بالا، این هزینه میتواند قابل توجه باشد.
۶. یک مثال واقعیتر در Go
فرض کن Search Engine شما برای هر request این کار را میکند:
اگر 10,000 نتیجه داشته باشیم:
اما هر
این ساختار pointer-heavy است.
اگر بتوانیم:
داشته باشیم، data locality بهتر میشود و objectهای جداگانهی کمتری ساخته میشوند.
۷.ا Data Locality هم مهم است
این قسمت خیلی جالب است.
ا CPU دوست دارد دادههایی که پشت سر هم هستند را از memory/cache بخواند.
مثلاً:
ممکن است در حافظه تقریباً اینطور باشد:
ولی:
ممکن است:
۱. اول ببینیم Embedding چیست
فرض کن برای هر رستوران یک embedding داریم:
Restaurant: Pizza Hut
Embedding:
[0.1823, -0.4211, 0.7328, 0.0912, ...]
این اعداد معمولاً
float32 هستند.مثلاً یک embedding با 768 dimension:
type Embedding []float32
هر
float32 برابر ۴ بایت است:768 × 4 = 3072 bytes
یعنی تقریباً 3KB برای هر embedding.
حالا اگر میلیونها رستوران/آیتم داشته باشی، حجم حافظه خیلی سریع بالا میرود.
۲. کاهش دقت اعشار یعنی چه؟
فرض کن مقدار اصلی:
0.18237491
باشد.
برای مدلهای ML همیشه لازم نیست تمام این دقت را نگه داریم.
میتوان آن را مثلاً به چیزی مثل:
0.1824
تقلیل داد.
اینجا یک نکته مهم وجود دارد:
کاهش precision الزاماً به معنی تبدیل
float32 به float16 نیست.روشهای مختلفی وجود دارد، مثل:
FP32 → FP16
FP32 → BF16
Quantization
INT8
و روشهای دیگر
ایده کلی این است:
دقت کمتر
↓
حجم کمتر
↓
Memory bandwidth کمتر
↓
Cache بهتر
↓
CPU / latency کمتر
مثلاً اگر از
float32 به float16 برویم:float32 = 4 bytes
float16 = 2 bytes
پس embedding:
768 × 4 = 3072 bytes
تبدیل میشود به:
768 × 2 = 1536 bytes
یعنی تقریباً ۵۰٪ کاهش حجم.
در پروژه Uber طبق توضیحی که آوردی، ترکیب روشهای فشردهسازی به حدود ۴۶٪ کاهش حجم embeddingها رسیده است.
۳. اما قسمت جالبتر: Pointer → Value
این قسمت برای یک برنامهنویس Go خیلی مهمتر است.
فرض کن چنین structای داریم:
type Restaurant struct {
ID string
Name string
Price float64
}و جایی در سیستم:
func getRestaurant() *Restaurant {
return &Restaurant{
ID: "123",
Name: "Pizza",
Price: 12.5,
}
}اینجا داریم pointer برمیگردانیم:
*Restaurant
یعنی یک object روی heap ساخته میشود و ما pointer آن را نگه میداریم.
چرا این میتواند برای GC بد باشد؟
فرض کن سیستم Uber Eats در هر search هزاران یا میلیونها object بسازد:
Search
│
├── Restaurant pointer
├── Restaurant pointer
├── ...
└── Restaurant pointer
مثلاً:
[]*Restaurant
به جای:
[]Restaurant
در حالت pointer، تعداد زیادی object جداگانه داریم که GC باید آنها را بررسی و مدیریت کند.
یعنی:
Heap
├── Restaurant #1
├── Restaurant #2
├── Restaurant #3
├── ...
هرچه allocation بیشتر باشد، کار GC هم بیشتر میشود.
۴.ا Value Type چه تغییری ایجاد میکند؟
به جای:
restaurants := []*Restaurant{
&Restaurant{...},
&Restaurant{...},
&Restaurant{...},
}میتوانیم داشته باشیم:
restaurants := []Restaurant{
{ID: "1", Name: "A"},
{ID: "2", Name: "B"},
{ID: "3", Name: "C"},
}یعنی objectها داخل خود slice قرار میگیرند.
به شکل ساده:
Pointer
[]*Restaurant
slice
├── pointer ──────> Restaurant #1
├── pointer ──────> Restaurant #2
└── pointer ──────> Restaurant #3
Value
[]Restaurant
slice
├── Restaurant #1
├── Restaurant #2
└── Restaurant #3
در حالت دوم، معمولاً allocationهای جداگانهی کمتری داریم.
۵. چرا GC اینجا خیلی مهم است؟
ا Go یک Garbage Collector دارد.
وقتی objectهایی روی heap ساخته میشوند:
r := &Restaurant{}و دیگر کسی به آنها نیاز ندارد، GC باید تشخیص دهد:
این object دیگر قابل دسترسی نیست، پس میتوانم حافظهاش را آزاد کنم.
اگر برنامه تعداد بسیار زیادی object کوچک تولید کند:
request
↓
1000 objects
↓
10,000 objects
↓
100,000 objects
ا GC باید دائماً این heap را بررسی کند.
در یک سیستم search با traffic بسیار بالا، این هزینه میتواند قابل توجه باشد.
۶. یک مثال واقعیتر در Go
فرض کن Search Engine شما برای هر request این کار را میکند:
type Result struct {
ID string
Score float64
Restaurant *Restaurant
}اگر 10,000 نتیجه داشته باشیم:
[]Result
اما هر
Result به یک object دیگر اشاره میکند:Result
|
+----> Restaurant
|
+----> Restaurant
|
+----> Restaurant
این ساختار pointer-heavy است.
اگر بتوانیم:
type Result struct {
ID string
Score float64
Restaurant Restaurant
}داشته باشیم، data locality بهتر میشود و objectهای جداگانهی کمتری ساخته میشوند.
۷.ا Data Locality هم مهم است
این قسمت خیلی جالب است.
ا CPU دوست دارد دادههایی که پشت سر هم هستند را از memory/cache بخواند.
مثلاً:
[]Restaurant
ممکن است در حافظه تقریباً اینطور باشد:
[Restaurant][Restaurant][Restaurant][Restaurant]
ولی:
[]*Restaurant
ممکن است:
❤1👍1
[pointer][pointer][pointer][pointer]
↓ ↓
heap heap
↓ ↓
Restaurant Restaurant
ب CPU باید pointer را دنبال کند تا به object برسد.
بنابراین Value Type میتواند cache locality بهتری ایجاد کند.
البته این به اندازه و ساختار واقعی struct و access pattern بستگی دارد؛ نمیشود گفت pointer همیشه بد و value همیشه خوب است.
۸. نکته بسیار مهم: Pointer همیشه بد نیست
این را حتماً در ذهن داشته باش.
این حرف:
Pointer → Value = همیشه performance بهتر
درست نیست.
مثلاً اگر struct خیلی بزرگ باشد:
type HugeStruct struct {
Data [10000]byte
}کپی کردن آن ممکن است گران باشد.
در چنین شرایطی:
func process(x HugeStruct)
میتواند هزینهی copy داشته باشد.
در حالی که:
func process(x *HugeStruct)
فقط یک pointer را منتقل میکند.
پس تصمیم بین:
T
و:
*T
به مواردی مثل:
اندازه struct
تعداد allocationها
escape analysis
lifetime object
mutation
تعداد pointerها
memory layout
access pattern
وابسته است.
۹. احتمالاً اتفاق مهمی که Uber انجام داده
اگر بخواهیم سادهسازی کنیم، مشکل آنها احتمالاً چیزی شبیه این بوده:
Search Request
↓
Ranking
↓
Thousands of objects
↓
Heap allocations
↓
GC
↓
CPU consumption
↓
Latency
با تغییر data structures:
Search Request
↓
Ranking
↓
More value-based structures
↓
Fewer heap allocations
↓
Less GC work
↓
Less CPU
↓
Lower latency
و درواقعه GC حدود ۴۰٪ CPU را مصرف میکرده و این تغییرات باعث کاهش شدید این هزینه شده است.
یک نکته خیلی مهم برای Go Developer
اگر بخواهم این بخش را در یک جمله خلاصه کنم:
آنها فقط کد را سریعتر نکردند؛ تعداد و شکل objectهایی را که Go باید در heap مدیریت و توسط GC بررسی کند تغییر دادند.
این نوع optimization در سیستمهای high-throughput خیلی مهم است.
و نکته جالبتر این است که برای پیدا کردن همین bottleneckها از production profiling استفاده کردند، نه اینکه صرفاً حدس بزنند کدام کد کند است.
👍1🙏1
Forwarded from Persian Post
امروز، ۲۶ شهریور، زادروز پسر کوروش بزرگه؛ روزی که بهعنوان «روز پسر» نامگذاری شده.
❤2🔥1