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👍1
🔵 عنوان مقاله
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
🔵 عنوان مقاله
How Cloudflare Found a Bug in Go's arm64 Compiler
🟢 خلاصه مقاله:
Cloudflare در مقیاسی بسیار بزرگ از Go روی زیرساختهای متنوع، بهویژه arm64، استفاده میکند؛ جایی که خطاهای نادر هم بهدفعات رخ میدهند. آنها با مجموعهای از اختلالهای پراکنده که فقط در بیلدهای arm64 دیده میشد مواجه شدند و با مقایسه میان معماریها، کاناریکردن، و ساخت یک نمونه حداقلی، سرنخها را از منطق برنامه به سمت ابزار ساخت هدایت کردند. ریشه مشکل، یک خطای تولید کد در بخش arm64 کامپایلر Go بود که در شرایط خاص به بدترجمهسازی منجر میشد. تیم Cloudflare با همکاری تیم Go، مشکل را گزارش، بازتولید و برطرف کرد و پس از انتشار پچ، آن را بهصورت مرحلهای در کل ناوگان اعمال نمود. نتیجه این تجربه: آزمون میانمعماری، کاناریکردن ارتقاهای ابزار، و تقویت مشاهدهپذیری برای مقابله با خطاهای کمشیوع اما پرهزینه در مقیاس بالا حیاتی است.
#Cloudflare #Go #arm64 #Compiler #Bug #ProductionScale #Reliability #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175353/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How Cloudflare Found a Bug in Go's arm64 Compiler
🟢 خلاصه مقاله:
Cloudflare در مقیاسی بسیار بزرگ از Go روی زیرساختهای متنوع، بهویژه arm64، استفاده میکند؛ جایی که خطاهای نادر هم بهدفعات رخ میدهند. آنها با مجموعهای از اختلالهای پراکنده که فقط در بیلدهای arm64 دیده میشد مواجه شدند و با مقایسه میان معماریها، کاناریکردن، و ساخت یک نمونه حداقلی، سرنخها را از منطق برنامه به سمت ابزار ساخت هدایت کردند. ریشه مشکل، یک خطای تولید کد در بخش arm64 کامپایلر Go بود که در شرایط خاص به بدترجمهسازی منجر میشد. تیم Cloudflare با همکاری تیم Go، مشکل را گزارش، بازتولید و برطرف کرد و پس از انتشار پچ، آن را بهصورت مرحلهای در کل ناوگان اعمال نمود. نتیجه این تجربه: آزمون میانمعماری، کاناریکردن ارتقاهای ابزار، و تقویت مشاهدهپذیری برای مقابله با خطاهای کمشیوع اما پرهزینه در مقیاس بالا حیاتی است.
#Cloudflare #Go #arm64 #Compiler #Bug #ProductionScale #Reliability #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175353/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
The Cloudflare Blog
How we found a bug in Go's arm64 compiler
84 million requests a second means even rare bugs appear often. We'll reveal how we discovered a race condition in the Go arm64 compiler and got it fixed.
❤1
Forwarded from Bardia & Erfan
پاول دوروف: آزادی اینترنت در حال نابودیه; ۴۱ سالگی رو جشن نمیگیرم
پاول دوروف در تولد ۴۱ سالگیاش نوشت:
«دیگه حس جشن ندارم؛ چون نسل ما داره اینترنت آزادی رو از دست میده که پدرانمون ساختن.
کشورهایی که روزی آزاد بودن، دارن به سمت کنترل کامل پیش میرن — از شناسه دیجیتال در بریتانیا تا اسکن پیامهای خصوصی در اتحادیه اروپا.
در آلمان منتقدان دولت تحت پیگردن، در بریتانیا مردم برای توییتهاشون زندانی میشن و در فرانسه از مدافعان آزادی بازجویی میشه.
ما فریب خوردیم تا باور کنیم باید سنت، حریم خصوصی و آزادی بیان رو قربانی کنیم.
من جشن نمیگیرم... چون زمان ما برای نجات آزادی تموم میشه.»
پاول دوروف در تولد ۴۱ سالگیاش نوشت:
«دیگه حس جشن ندارم؛ چون نسل ما داره اینترنت آزادی رو از دست میده که پدرانمون ساختن.
کشورهایی که روزی آزاد بودن، دارن به سمت کنترل کامل پیش میرن — از شناسه دیجیتال در بریتانیا تا اسکن پیامهای خصوصی در اتحادیه اروپا.
در آلمان منتقدان دولت تحت پیگردن، در بریتانیا مردم برای توییتهاشون زندانی میشن و در فرانسه از مدافعان آزادی بازجویی میشه.
ما فریب خوردیم تا باور کنیم باید سنت، حریم خصوصی و آزادی بیان رو قربانی کنیم.
من جشن نمیگیرم... چون زمان ما برای نجات آزادی تموم میشه.»
👍2
Forwarded from AI Labdon
اگه به پروژههای اوپنسورس و ساختار و معماریشون علاقهمندین سایت DeepWiki رو داشته باشین
این سایت با هوشمصنوعی جزییات پروژههای اوپنسورس رو در اختیارتون میذاره
هر پروژه که روی گیتهاب هست رو کافیه به جای دامنه github.com بیاین deepwiki.com قرار بدین
مثلا فریمورک لاراول:
https://deepwiki.com/laravel/laravel
<Λmir/>
این سایت با هوشمصنوعی جزییات پروژههای اوپنسورس رو در اختیارتون میذاره
هر پروژه که روی گیتهاب هست رو کافیه به جای دامنه github.com بیاین deepwiki.com قرار بدین
مثلا فریمورک لاراول:
https://deepwiki.com/laravel/laravel
<Λmir/>
DeepWiki
laravel/laravel | DeepWiki
This document provides an overview of the Laravel application skeleton repository at https://github.com/laravel/laravel. This is a Laravel 12.x skeleton application that serves as a starting point for
🔵 عنوان مقاله
be experimenting with
🟢 خلاصه مقاله:
از کتابخانههای زیادی که میخواهند به مخاطبان بیشتری برسند، در حال حاضر نسخههای JavaScript ارائه میشود تا هم در مرورگر و هم در محیطهای Node.js، Deno و Bun در دسترس باشند. مزیت اصلی، دسترسی گسترده، توزیع ساده از طریق npm و تجربه کاربری یکپارچه بین فرانتاند و بکاند است.
دو مسیر رایج وجود دارد: بازنویسی بومی با TypeScript برای ارائه APIهای استاندارد، تایپهای دقیق و قابلیت tree-shaking؛ یا پورت از زبانهای سطح پایین به WebAssembly برای حفظ کارایی و استفاده مجدد از کد موجود. ابزارهایی مانند Emscripten، wasm-bindgen و ابزارهای Go این کار را تسهیل میکنند و با ارائه TypeScript declarations سطح استفادهپسند ایجاد میشود.
چالشها شامل انتخاب بین ESM و CJS، بهینهسازی اندازه باندل و داراییهای WASM، محدودیتهای مرورگر (فایلسیستم و سوکت خام)، تفاوتهای اجرا در Node.js/Deno/Bun، و مدیریت کارایی و زمان راهاندازی است. استفاده از Web Workers، بارگذاری تدریجی، بنچمارکگیری در محیطهای مختلف و مستندسازی دقیق کمککننده است. در حوزه امنیت نیز باید مراقب زنجیره تأمین، نسخهبندی SemVer، تست و انتشار مرحلهای بود.
نمونههای موفق شامل OpenCV.js، نسخه WASM از SQLite، TensorFlow.js، ONNX Runtime Web و Pyodide است که نشان میدهند با طراحی API مناسب و ابزار درست، پورتهای جدی عملی است. قاعده تصمیمگیری: اگر کتابخانه سنگین و بهینه است، WASM انتخاب خوبی است؛ اگر هدف تجربه توسعهدهنده در اکوسیستم JavaScript است، بازنویسی با TypeScript بهتر است؛ و برای قابلیتهای سختافزاری/سیستمی، رویکرد هیبریدی یا سمت سرور منطقی است. با پیشرفت WebAssembly/WASI، WebGPU و پلتفرمهای edge مانند Cloudflare Workers و Vercel Edge، زمان مناسبی برای آزمایش و تکرار است.
#JavaScript #WebAssembly #TypeScript #NodeJS #Deno #npm #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175359/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
be experimenting with
🟢 خلاصه مقاله:
از کتابخانههای زیادی که میخواهند به مخاطبان بیشتری برسند، در حال حاضر نسخههای JavaScript ارائه میشود تا هم در مرورگر و هم در محیطهای Node.js، Deno و Bun در دسترس باشند. مزیت اصلی، دسترسی گسترده، توزیع ساده از طریق npm و تجربه کاربری یکپارچه بین فرانتاند و بکاند است.
دو مسیر رایج وجود دارد: بازنویسی بومی با TypeScript برای ارائه APIهای استاندارد، تایپهای دقیق و قابلیت tree-shaking؛ یا پورت از زبانهای سطح پایین به WebAssembly برای حفظ کارایی و استفاده مجدد از کد موجود. ابزارهایی مانند Emscripten، wasm-bindgen و ابزارهای Go این کار را تسهیل میکنند و با ارائه TypeScript declarations سطح استفادهپسند ایجاد میشود.
چالشها شامل انتخاب بین ESM و CJS، بهینهسازی اندازه باندل و داراییهای WASM، محدودیتهای مرورگر (فایلسیستم و سوکت خام)، تفاوتهای اجرا در Node.js/Deno/Bun، و مدیریت کارایی و زمان راهاندازی است. استفاده از Web Workers، بارگذاری تدریجی، بنچمارکگیری در محیطهای مختلف و مستندسازی دقیق کمککننده است. در حوزه امنیت نیز باید مراقب زنجیره تأمین، نسخهبندی SemVer، تست و انتشار مرحلهای بود.
نمونههای موفق شامل OpenCV.js، نسخه WASM از SQLite، TensorFlow.js، ONNX Runtime Web و Pyodide است که نشان میدهند با طراحی API مناسب و ابزار درست، پورتهای جدی عملی است. قاعده تصمیمگیری: اگر کتابخانه سنگین و بهینه است، WASM انتخاب خوبی است؛ اگر هدف تجربه توسعهدهنده در اکوسیستم JavaScript است، بازنویسی با TypeScript بهتر است؛ و برای قابلیتهای سختافزاری/سیستمی، رویکرد هیبریدی یا سمت سرور منطقی است. با پیشرفت WebAssembly/WASI، WebGPU و پلتفرمهای edge مانند Cloudflare Workers و Vercel Edge، زمان مناسبی برای آزمایش و تکرار است.
#JavaScript #WebAssembly #TypeScript #NodeJS #Deno #npm #OpenSource
🟣لینک مقاله:
https://golangweekly.com/link/175359/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔵 عنوان مقاله
PG Back Web 0.5: A Postgres Backup System with Web Interface
🟢 خلاصه مقاله:
** PG Back Web 0.5 یک ابزار مبتنی بر Go برای مدیریت پشتیبانگیریهای Postgres از طریق یک رابط وب ساده و کاربرپسند است. این برنامه امکان زمانبندی پشتیبانها، پایش وضعیت و مشاهده تاریخچه را فراهم میکند و با webhooks میتواند اعلانها را به سامانههای بیرونی ارسال کند. استقرار آن بهصورت Docker image بسیار ساده است و در نسخه 0.5 پشتیبانی از Postgres 18 نیز اضافه شده تا با آخرین نسخه Postgres سازگار باشد.
#Postgres #Backup #Go #Docker #Database #DevOps #Webhooks #Monitoring
🟣لینک مقاله:
https://golangweekly.com/link/175372/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
PG Back Web 0.5: A Postgres Backup System with Web Interface
🟢 خلاصه مقاله:
** PG Back Web 0.5 یک ابزار مبتنی بر Go برای مدیریت پشتیبانگیریهای Postgres از طریق یک رابط وب ساده و کاربرپسند است. این برنامه امکان زمانبندی پشتیبانها، پایش وضعیت و مشاهده تاریخچه را فراهم میکند و با webhooks میتواند اعلانها را به سامانههای بیرونی ارسال کند. استقرار آن بهصورت Docker image بسیار ساده است و در نسخه 0.5 پشتیبانی از Postgres 18 نیز اضافه شده تا با آخرین نسخه Postgres سازگار باشد.
#Postgres #Backup #Go #Docker #Database #DevOps #Webhooks #Monitoring
🟣لینک مقاله:
https://golangweekly.com/link/175372/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - eduardolat/pgbackweb: 🐘 Effortless PostgreSQL backups with a user-friendly web interface! 🌐💾
🐘 Effortless PostgreSQL backups with a user-friendly web interface! 🌐💾 - eduardolat/pgbackweb
❤1