سولود؛ زبان سیستمی که روی Go سوار شده
خلاصهٔ کاملتر
این روزها همه دارن زبان جدید میسازن؛ معمولاً «مثل Go ولی با امکانات بیشتر» یا «مثل Rust ولی سادهتر». به گفتهٔ نویسنده، Solod از دور شبیه همینهاست ولی مسیر متفاوتی رفته: تو سطح زبان، Solod عملاً یه زیرمجموعه از خود Go ـه — نه یه زبان Go-like، نه تلاشی برای «درست کردن اشتباهات Go».
نتیجهاش اینه که کل ابزار Go بدون دردسر کار میکنه: سینتکس هایلایتینگ، LSP، لینترها و سیستم مدیریت پکیج. کوییکاستارتش هم تقریباً همون فلوی معمول Go ـه — با go install ابزار خط فرمان so رو نصب میکنی، با go mod init و go get وابستگی رو اضافه میکنی، بعد کد معمولی Go مینویسی و فقط پکیجهای Solod رو بهجای پکیجهای استاندارد ایمپورت میکنی. تنها چیز تازه so run ـه که کار go run رو تقلید میکنه.
کتابخانهٔ استاندارد هم همین وضع رو داره: بخشی از کد و تستهای Go عیناً برداشته شده (با حفظ کپیرایت نویسندههای Go) و بخشی برای پشتیبانی از مدیریت دستی حافظه تغییر کرده. مثلاً Clone تو Solod یه آرگومان allocator اضافه میگیره و بهجای make از mem.AllocSlice استفاده میکنه:
func Clone(a mem.Allocator, s string) string {
if len(s) == 0 {
return ""
}
b := mem.AllocSlice[byte](a, len(s), len(s))
copy(b, s)
return string(b)
}نویسنده یه هشدار هم میده: ابزار Go نمیدونه Solod زیرمجموعهست، پس قابلیتهایی مثل function literal یا iterator رو که Solod پشتیبانی نمیکنه علامت نمیزنه؛ این خطاها فقط از ابزار اختصاصی so درمیان. ضمناً کدی که از Go کپی شده خودبهخود درست نیست و Solod به تستهای خودش، از جمله اجرا زیر sanitizer و تحلیلگر ایستا، نیاز داره.
ته ماجرا همهٔ کد Solod به C11 ترجمه و با GCC یا Clang کامپایل میشه، پس به همون اندازه که به Go تکیه داره، به ابزار C و دههها کار بهینهسازی هم متکیه. چون runtime نداره، تعامل بین Solod و C هیچ هزینهای نداره. جمعبندی نویسنده اینه که یه زبان جدید لزوماً به اکوسیستم جدید نیاز نداره و این وابستگی سنگین به Go نقطهٔ قوت Solod ـه، نه ضعفش.
نکات کلیدی:
- Solod در سطح زبان زیرمجموعهای از Go ـه، نه یه زبان Go-like
- ابزار Go شامل LSP، لینتر و مدیریت پکیج بدون تغییر کار میکنه
- بخش زیادی از کتابخانهٔ استاندارد Go پورت شده، با allocator صریح برای حافظه
- ابزار so خطاهای مربوط به قابلیتهای پشتیبانینشده رو گزارش میده
- خروجی نهایی C11 ـه و با GCC یا Clang کامپایل میشه




