وباسمبلی (WebAssembly) یک استاندارد باز است که امکان اجرای کدهای باینری بهینه را در محیطهای جاوا اسکریپت فراهم میکند. هدف اصلی آن افزایش سرعت و کارایی برنامههای وب است، اما میتوان آن را در محیطهای دیگر نیز اجرا کرد.
وب امروزی پر از برنامههای پیچیده است: از بازیهای آنلاین مثل Krunker تا ویرایشگرهای بلادرنگ مثل Figma. جاوااسکریپت، با وجود انعطافپذیریاش، گاهی تو تأمین عملکرد لازم برای این برنامهها کم میاره. اینجا WebAssembly (WASM) وارد میشه، یه فناوری انقلابی که عملکرد برنامههای وب رو به سطح جدیدی میبره.
WASM یه استاندارد باز و فرمت باینریه که به توسعهدهندگان اجازه میده کدهای نوشتهشده با زبانهایی مثل C، C++، Rust و Go رو بهصورت بهینه تو مرورگرها اجرا کنن. این کدها تو محیطی ایزوله با امنیت بالا اجرا میشن و سرعتشون گاهی تا چند برابر جاوااسکریپته. WASM از سال 2017، که بهصورت رسمی پشتیبانی مرورگرها رو به دست آورد، توسط غولهایی مثل گوگل، مایکروسافت، موزیلا و اپل حمایت شده و حالا تو پروژههای واقعی، از Adobe Premiere Web تا بازیهای AAA، نقش کلیدی داره.
مثال عملی: یه ویرایشگر عکس آنلاین رو تصور کن. با WASM، میتونی پردازش تصویر رو با سرعت C++ تو مرورگر انجام بدی، بدون اینکه کاربر چیزی نصب کنه.
برای شروع این دوره، به این موارد نیاز دارید:
بیایید اولین پروژه WASM رو بسازیم و قدرت این فناوری رو از نزدیک ببینیم!
برای کار با Go در WASM، از TinyGo استفاده میکنیم، نسخهای سبکتر از Go که برای محیطهای محدود مثل مرورگرها بهینه شده.
اگر از Homebrew استفاده میکنید (مک/لینوکس):
brew install tinygo
برای ویندوز یا روشهای دیگه، به tinygo.org سر بزنید.
این دستورات رو اجرا کنید تا مطمئن بشید همهچیز آماده است:
go version
tinygo version
خروجی باید چیزی شبیه این باشه:
go version go1.21.5
tinygo version 0.31.0
یه پوشه پروژه بسازید و فایل main.go
رو با این کد پر کنید:
package main
import "fmt"
func main() {
fmt.Println("سلام از WebAssembly و Go!")
}
این کد ساده یه پیام رو تو کنسول مرورگر چاپ میکنه.
برای تبدیل کد Go به WASM، این دستور رو اجرا کنید:
tinygo build -o main.wasm -target wasm -no-debug -opt=2 main.go
-target wasm
: خروجی رو برای مرورگرها تنظیم میکنه.-no-debug
: اندازه فایل رو کوچیکتر میکنه.-opt=2
: بهینهسازی حداکثری اعمال میشه.فایل main.wasm
تولید میشه که کد باینری شماست.
برای اجرای WASM تو مرورگر، به یه فایل جاوااسکریپت کمکی به اسم wasm_exec.js
نیاز دارید. این فایل رو از مخزن Go دانلود کنید و کنار پروژه بذارید.
حالا فایل index.html
رو با این کد بسازید:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8" />
<title>اولین پروژه WebAssembly</title>
<script src="wasm_exec.js"></script>
</head>
<body>
<h1>سلام از WebAssembly و Go!</h1>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject)
.then((result) => {
go.run(result.instance);
})
.catch((err) => console.error("خطا:", err));
</script>
</body>
</html>
یه سرور محلی راه بندازید (چون مرورگرها فایلهای WASM رو مستقیم از سیستم نمیخونن):
python -m http.server 8080
حالا به http://localhost:8080
برید. تو کنسول مرورگر (F12 > Console)، باید پیام "سلام از WebAssembly و Go!" رو ببینید.
حالا بیایید WASM و جاوااسکریپت رو به هم وصل کنیم تا یه ماشینحساب ساده بسازیم که جمع دو عدد رو انجام بده.
فایل main.go
رو با این کد جایگزین کنید:
package main
import "syscall/js"
//export add
func add(a, b int) int {
return a + b
}
func main() {
js.Global().Set("add", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
return add(args[0].Int(), args[1].Int())
}))
select {} // برنامه رو در حال اجرا نگه میداریم
}
//export add
: تابع add
رو برای جاوااسکریپت قابل دسترسی میکنه.select {}
: از خروج برنامه جلوگیری میکنه.tinygo build -o main.wasm -target wasm -no-debug main.go
فایل index.html
رو به این شکل تغییر بدید:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8" />
<title>ماشینحساب با WebAssembly</title>
<script src="wasm_exec.js"></script>
</head>
<body>
<h1>ماشینحساب ساده با Go و WASM</h1>
<input type="number" id="a" placeholder="عدد اول" />
<input type="number" id="b" placeholder="عدد دوم" />
<button id="calc">محاسبه</button>
<p>نتیجه: <span id="result">0</span></p>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject)
.then((result) => {
go.run(result.instance);
document.getElementById("calc").addEventListener("click", () => {
const a = parseInt(document.getElementById("a").value);
const b = parseInt(document.getElementById("b").value);
const res = window.add(a, b);
document.getElementById("result").textContent = res;
});
})
.catch((err) => console.error("خطا:", err));
</script>
</body>
</html>
سرور رو دوباره اجرا کنید (python -m http.server 8080
) و به localhost:8080
برید. دو عدد وارد کنید، روی محاسبه کلیک کنید و نتیجه جمع رو ببینید. این تعامل نشون میده چطور WASM و جاوااسکریپت میتونن باهم کار کنن.
حالا بیایید مستقیماً از Go به DOM مرورگر دسترسی پیدا کنیم و یه پیام پویا اضافه کنیم.
فایل main.go
رو با این کد بهروزرسانی کنید:
package main
import "syscall/js"
func main() {
document := js.Global().Get("document")
div := document.Call("createElement", "div")
div.Set("innerHTML", "این پیام از Go و WebAssembly اومده!")
div.Set("style", "color: blue; font-size: 18px; margin-top: 10px;")
document.Get("body").Call("appendChild", div)
select {} // برنامه رو فعال نگه میداریم
}
syscall/js
: به Go اجازه میده با DOM و جاوااسکریپت تعامل کنه.div
جدید میسازه و پیامی رو تو صفحه نمایش میده.tinygo build -o main.wasm -target wasm -no-debug main.go
فایل index.html
رو به حالت ساده برگردونید:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8" />
<title>تغییر DOM با WebAssembly</title>
<script src="wasm_exec.js"></script>
</head>
<body>
<h1>تغییر DOM با Go و WASM</h1>
<script>
const go = new Go();
WebAssembly.instantiateStreaming(fetch("main.wasm"), go.importObject)
.then((result) => {
go.run(result.instance);
})
.catch((err) => console.error("خطا:", err));
</script>
</body>
</html>
سرور رو اجرا کنید و به localhost:8080
برید. باید یه پیام آبیرنگ با متن "این پیام از Go و WebAssembly اومده!" زیر عنوان ببینید. این نشون میده WASM میتونه مستقیماً DOM رو دستکاری کنه.
تو این ماژول، با WebAssembly آشنا شدید و یاد گرفتید چطور با Go و TinyGo برنامههای وب سریع و امن بسازید. از چاپ یه پیام ساده تو کنسول تا ساخت یه ماشینحساب تعاملی و تغییر DOM، قدمهای اولیه رو برداشتید. WASM دنیایی از امکاناته: از اجرای بازیهای سنگین تو مرورگر تا اپلیکیشنهای ابری پیچیده. تو ماژولهای بعدی، سراغ موضوعات پیشرفتهتر میریم، مثل بهینهسازی عملکرد، کار با کتابخونههای C++ و ادغام با فریمورکهای مدرن.
بیایید تو ماژول بعدی، WASM رو به پروژههای بزرگتر ببریم و وب رو سریعتر کنیم!
ایمیلت رو بده تا اعلان آپدیتهای جدید بگیری.
کامنتها