این کتاب پیاده سازی مفسر برای زبان های برنامه نویسی است. همچنین کتابی در مورد چگونگی طراحی زبانی است که ارزش پیادهسازی را داشته باشد. کتاب با مثالهای عملی و فراوان توضیح داده شده و مثل کتاب معروف dragon فقط تئوریطور نیست.
#interpreters #compiler #book #online #practical #design #interpreter
https://craftinginterpreters.com/contents.html
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy
#interpreters #compiler #book #online #practical #design #interpreter
https://craftinginterpreters.com/contents.html
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍3🐳1🍓1
🔵 عنوان مقاله
Building a Simple Stack-Based Virtual Machine in Go
🟢 خلاصه مقاله:
** این مقاله از Phakorn Kiong با یک نمونه عملی نشان میدهد چگونه در Go یک VM ساده مبتنی بر Stack بسازیم. هسته سیستم شامل bytecode، یک instruction pointer، یک stack برای دادهها و چند opcode پایه مثل PUSH، POP، ADD، SUB، MUL، DIV، PRINT و HALT است. اجرای برنامه بهصورت حلقه fetch–decode–execute انجام میشود؛ هر opcode خوانده میشود، عمل مربوط روی stack اجرا میگردد و IP جلو میرود. قالب bytecode ساده است و مقادیر یا بهصورت فوری یا از یک constant pool خوانده میشوند. برای پایداری، کنترل خطاهایی مثل stack underflow/overflow و division by zero در نظر گرفته شده است. نمونههایی مثل محاسبه و چاپ 2*(3+4) برای تست آورده میشود و میتوان یک assembler کوچک برای تولید bytecode اضافه کرد. مسیرهای توسعه شامل کنترل جریان (JMP/JZ)، مقایسهها (EQ/LT/GT)، متغیرها با LOAD/STORE، و توابع با CALL/RET است؛ همچنین ابزارهایی مانند tracer، disassembler، REPL و تستها پیشنهاد میشوند. هدف مقاله آموزشی است و “Here’s the code” کد کامل و خوانا را برای شروع و گسترش فراهم میکند.
#Go #Golang #VirtualMachine #StackVM #Bytecode #Interpreter #Compiler #SystemsProgramming
🟣لینک مقاله:
https://golangweekly.com/link/174423/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Building a Simple Stack-Based Virtual Machine in Go
🟢 خلاصه مقاله:
** این مقاله از Phakorn Kiong با یک نمونه عملی نشان میدهد چگونه در Go یک VM ساده مبتنی بر Stack بسازیم. هسته سیستم شامل bytecode، یک instruction pointer، یک stack برای دادهها و چند opcode پایه مثل PUSH، POP، ADD، SUB، MUL، DIV، PRINT و HALT است. اجرای برنامه بهصورت حلقه fetch–decode–execute انجام میشود؛ هر opcode خوانده میشود، عمل مربوط روی stack اجرا میگردد و IP جلو میرود. قالب bytecode ساده است و مقادیر یا بهصورت فوری یا از یک constant pool خوانده میشوند. برای پایداری، کنترل خطاهایی مثل stack underflow/overflow و division by zero در نظر گرفته شده است. نمونههایی مثل محاسبه و چاپ 2*(3+4) برای تست آورده میشود و میتوان یک assembler کوچک برای تولید bytecode اضافه کرد. مسیرهای توسعه شامل کنترل جریان (JMP/JZ)، مقایسهها (EQ/LT/GT)، متغیرها با LOAD/STORE، و توابع با CALL/RET است؛ همچنین ابزارهایی مانند tracer، disassembler، REPL و تستها پیشنهاد میشوند. هدف مقاله آموزشی است و “Here’s the code” کد کامل و خوانا را برای شروع و گسترش فراهم میکند.
#Go #Golang #VirtualMachine #StackVM #Bytecode #Interpreter #Compiler #SystemsProgramming
🟣لینک مقاله:
https://golangweekly.com/link/174423/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Phakorn
Building a Simple Virtual Machine | Breakpoint 🛑
Explore building a simple VM in Go using stack-based architecture. Learn the fundamentals of virtual machines through hands-on implementation.
❤1
🔵 عنوان مقاله
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
🔵 عنوان مقاله
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