سلام یک زبان برنامهنویسی متنباز، همهمنظوره و سیستمی است. گونهها در آن ایستا هستند، برنامهها به کد ماشین بومی کامپایل میشوند و کامپایلرش با خود سلام نوشته شده است. آنچه زبان برنامهنویسی سلام را از زبانهای دیگر جدا میکند این است که هر واژهی کلیدی، هر گونه، هر بستهی کتابخانهی استاندارد و هر پیام خطای کامپایلر دو شکل دارد، انگلیسی و فارسی، و هر دو شکل دقیقاً به یک برنامه کامپایل میشوند.
این مقاله نقطهی شروع مجلهی سلام است. توضیح میدهد سلام چه نوع زبانی است، کد واقعی نشان میدهد، کامپایلر و ابزارهایش را مرور میکند، سرعت اندازهگیریشدهاش را با همهی ملاحظاتش میآورد و صریح میگوید یک زبان جوان هنوز چه چیزهایی ندارد.
زبان برنامهنویسی سلام در یک بند
سلام یک زبان کامپایلی با گونههای ایستاست برای ساختن همه چیز، از ابزارهای خط فرمان و سرورهای وب تا برنامههای رومیزی و هستههایی که بدون سیستمعامل اجرا میشوند. مینویسید تابع ریشه: و بلوکی که با پایان بسته میشود؛ کامپایلر گونهها را بررسی میکند، از راه C، LLVM یا پشتوانهی بومی خودش کد میسازد و در پایان یک فایل اجرایی برای لینوکس، مک، ویندوز یا وب تحویل میدهد. نه ماشین مجازی در کار است و نه زبالهروب (Garbage Collector). کتابخانهی استانداردی با بیش از ۱۷۰ بسته شبکه، پایگاه داده، رمزنگاری، فشردهسازی، تصویر، یادگیری ماشین و بسیاری چیزهای دیگر را پوشش میدهد و یک زبان صفحهی داخلی، کد سلام را به HTML، CSS و جاوااسکریپت تبدیل میکند. نام زبان همان واژهی آشنای «سلام» است؛ هم به معنای درود و هم یادآور صلح.
نخستین برنامه به زبان سلام
کوچکترین برنامهی کامل سلام این است. بلوکها با دونقطه باز و با پایان بسته میشوند و سرچاپ ورودیهایش را چاپ میکند و به خط بعد میرود.
تابع ریشه:
سرچاپ "سلام دنیا!"
پایانهمین برنامه به انگلیسی. کامپایلر زبان فایل را از روی واژههای کلیدی تشخیص میدهد، پس نه کلیدی برای جابهجایی لازم است و نه ابزار جداگانهای: func همان تابع است، main همان تابع ورود ریشه، println همان سرچاپ و end همان پایان.
func main:
println "Hello, Salam!"
endهر دو فایل از یک پیشانهی کامپایلر، یک بررسیکنندهی گونه و یک تولیدکنندهی کد میگذرند و فایلهای اجراییشان جای هم را میگیرند. مقالهی یک زبان، دو خط جزئیات این کار را توضیح میدهد.
سلام چه نوع زبانی است؟
اگر با Go، Rust، Swift یا پایتون کار کرده باشید، بیشتر سلام برایتان آشنا خواهد بود. جدول زیر انتخابهای اصلی طراحی را یکجا نشان میدهد.
| پرسش | پاسخ سلام |
|---|---|
| گونهها | ایستا، با استنتاج گونه: شمار := ۰ از گونهی صحیح است و ع := ۳.۱۴ از گونهی اعشار۶۴ |
| کامپایل | پیش از اجرا (AOT) به کد بومی، از راه C، LLVM یا پشتوانهی بومی خود سلام |
| حافظه | بدون زبالهروب؛ مقدارها روی پشته زندگی میکنند و ظرفهای روی هیپ با .آزادکن() یا دیرکن آزاد میشوند |
| گونههای داده | ساختار با متد، جداشمارهایی که داده حمل میکنند، چندتایی، گونههای عام (Generics)، میانجی، گونهی اختیاری T? |
| خطاها | مقدارهای Result با تلاش، بهعلاوهی خطادار، پرتاب خطا و تلاش/گرفتن خطا |
| همزمانی | نخ، مخزن کار محدود، واژهی کلیدی برو (go)، کانال، Future و عملیات اتمی |
| مقصدها | لینوکس، مک، ویندوز، WebAssembly، جاوااسکریپت، اندروید، iOS و اجرای مستقل بدون سیستمعامل |
| زبان کد منبع | انگلیسی و فارسی، با یک کتابخانهی استاندارد مشترک |
| مجوز | GPL-3.0، با توسعهی باز در گیتهاب |
متغیرها تغییرناپذیرند، مگر خودتان چیز دیگری بخواهید: نام := "سارا" را نمیشود دوباره مقداردهی کرد، ولی ناپایا شمار := ۰ را میشود. مقداردهی دوباره به یک متغیر تغییرناپذیر خطای کامپایل است، نه هشدار. همین قاعدهی کوچک یک دستهی کامل از باگهای ناخواسته را از میان برمیدارد و کد را خواناتر میکند، چون نامی که ناپایا ندارد هرگز عوض نمیشود.
نمونهای از کد واقعی سلام
برنامهی بعدی یک ساختار، یک آرایهی لفظی، تابعی با نام چندکلمهای، حلقهی هر و انتساب مرکب را به کار میبرد. کوتاه است، اما نشان میدهد کد سلام معمولاً چطور خوانده میشود.
ساختار کتاب:
همگانی عنوان: رشته
همگانی صفحهها: صحیح
پایان
تابع زمان خواندن(ک: کتاب): صحیح:
برگشت ک.صفحهها / ۴۰
پایان
تابع ریشه:
کتابها := [
کتاب { عنوان = "شازده کوچولو"، صفحهها = ۹۶ }،
کتاب { عنوان = "تلماسه"، صفحهها = ۴۱۲ }،
کتاب { عنوان = "SICP"، صفحهها = ۶۵۷ }،
]
ناپایا جمع := ۰
هر ک در کتابها:
ساعت := زمان خواندن(ک)
سرچاپ ک.عنوان، "حدود"، ساعت، "ساعت وقت میگیرد"
جمع += ک.صفحهها
پایان
سرچاپ "جمع صفحهها:"، جمع
پایاندو نکته به چشم میآید. نخست، زمان خواندن یک نام تابع است که از دو کلمه ساخته شده. سلام فاصله را درون نامها مجاز میداند تا فراخوانی تابع مثل یک جمله خوانده شود؛ این در فارسی، که بسیاری از مفهومها بهطور طبیعی دوکلمهایاند، اهمیت بیشتری دارد. همچنین فاصله و نیمفاصله درون نام یکی حساب میشوند، پس صفحهها و صفحه ها یک ناماند. دوم، فیلدها با همگانی علامت خوردهاند: فیلدهای ساختار تا خودتان نگویید درون بستهی خودشان خصوصیاند، پس بخش عمومی هر گونه همیشه صریح است.
یک نکتهی دیگر برای خوانندهی فارسیزبان: عددها در کد با رقمهای فارسی نوشته شدهاند، اما خروجی با رقمهای لاتین چاپ میشود. این رفتار عمدی است و اگر خروجی باید فارسی باشد، تبدیل رقم را خودتان انجام میدهید.
یک زبان، دو املا: برنامهنویسی فارسی و انگلیسی
بیشتر پروژههای «برنامهنویسی به زبان مادری» در ترجمهی واژههای کلیدی متوقف میشوند. سلام جلوتر میرود. واژههای کلیدی، گونههای پایه، متدهای داخلی، تابع ورود، همهی بستههای کتابخانهی استاندارد و همهی تابعهایشان، و همهی پیامهای کامپایلر کنار نام انگلیسی یک نام فارسی هم دارند. برنامهنویس فارسیزبان پیامی مثل «شناسهی ناشناخته» را به فارسی و با کد خطایی که با رقم فارسی نوشته شده (خطا[خطا۰۰۱]) میخواند، و برنامهنویس انگلیسیزبان همان پیام را به انگلیسی میبیند.
چون هر دو املا به یک برنامه میرسند، دو جامعهی کاربری یک کامپایلر، یک کتابخانهی استاندارد و یک مجموعه آزمون مشترک دارند. فرمان salam translate یک فایل را از یک املا به املای دیگر بازنویسی میکند و بسیاری از نمونههای این سایت به همین شکل در هر دو زبان وجود دارند. کد فارسی رقمهای فارسی را هم در عددها میپذیرد و ویرگول فارسی «،» را هم بهعنوان جداکننده، و ویرایشگر آنلاین و افزونههای ویرایشگر کد فارسی را راست به چپ نمایش میدهند.
کامپایلر خودمیزبان سلام
کامپایلر سلام خودمیزبان (Self-hosting) است: با خود سلام نوشته شده و خودش را کامپایل میکند. پیادهسازی اولیهی C در اوت ۲۰۲۶ (تابستان ۱۴۰۵) کنار گذاشته شد و از آن پس هر نسخه با نسخهی قبلی خود کامپایلر ساخته شده است. نوشتن کامپایلر به همان زبانی که کامپایل میکند سختترین آزمونی است که یک زبان میتواند از سر بگذراند، چون کامپایلر تقریباً به همهی امکانات زبان نیاز دارد: ساختار، جداشمار، نگاشت درهم، رشته، پرونده، بازگشت و مقدار زیادی مدیریت دقیق حافظه.
ساخت یک برنامه از مرحلههای آشنا میگذرد: تحلیل واژگانی، تجزیه، تحلیل معنایی همراه با استنتاج گونه و بررسیهای ایستای فراوان، و در آخر تولید کد. سلام سه پشتوانه (Backend) دارد:
- LLVM، پیشفرض نسخههای رسمی (که LLVM را درون خود دارند) و موتور پشت مقصد WebAssembly؛
- C، که با
--backend=cانتخاب میشود و هر جا LLVM درون کامپایلر نباشد به کار میرود؛ کد C تولیدشده را به gcc، clang یا tcc همراه کامپایلر میسپارد؛ - پشتوانهی بومی، که با
--backend=nativeانتخاب میشود، خودش کد ماشین x86-64، x86 سیودوبیتی، AArch64، ARM سیودوبیتی یا RISC-V را مینویسد و با پیوندده داخلی پیوند میدهد، پس به هیچ ابزار بیرونی نیازی ندارد.
بررسیها پیش از تولید هر کدی اجرا میشوند. salam check همانجا میایستد و برای همین سریعترین راه پیدا کردن اشتباههاست؛ پیامهایش کدهای ثابتی دارند (E001، W147 و مانند آنها) که میشود جستوجویشان کرد. مقالهی کامپایلر یک برنامه را در همهی این مرحلهها دنبال میکند.
کتابخانهی استاندارد زبان سلام
سلام با یک کتابخانهی استاندارد بزرگ عرضه میشود که در مرجع کتابخانه بسته به بسته و با یک نمونه برای هر تابع عمومی مستند شده است. در آن اینها را پیدا میکنید:
- متن، عبارت باقاعده، یونیکد، ابزارهای متن فارسی و عربی و قالبها؛
- پرونده، فرایند، پایانه، زمان و تقویم، از جمله تقویم جلالی (هجری شمسی)؛
- کلاینت و سرور HTTP با مسیریاب و میانافزار، WebSocket، HTTP/2، gRPC، GraphQL، SSH و TLS؛
- راهانداز برای SQLite، PostgreSQL، MySQL، Redis و ClickHouse، کلاینت برای Elasticsearch، OpenSearch، Meilisearch و Typesense، و بررسیکنندهای برای رشتههای SQL؛
- رمزنگاری، JWT، فشردهسازی و آرشیو (zip، tar، gzip، xz، zstd، 7z و خواندن RAR)؛
- تصویر، صدا، ماتریس، تانسور، مشتقگیری خودکار و لایههای شبکهی عصبی.
بستههایی که دیگران نوشتهاند با salam add از گیتهاب اضافه میشوند، در salam.lock قفل میشوند و با checksum وارسی میشوند. صفحهی مدیر بسته این روند را توضیح میدهد.
ابزارهای سلام
همه چیز یک فایل اجرایی به نام salam است. فرمانهایی که بیشتر از همه به کار میبرید اینهاست:
salam run hello.salam # ساخت و اجرا، بدون نگه داشتن فایل اجرایی
salam build hello.salam # ساختن فایل اجرایی
salam check src/ # بررسی گونهها بدون تولید کد
salam test # اجرای همهی تابعهای test_ در فایلهای *_test.salam
salam format . # قالببندی کد در همان فایلها
salam translate fa app.salam # بازنویسی کد انگلیسی به فارسی
salam page build site.salam # تبدیل برنامهی صفحه به HTML، CSS و JSیک مفسر (salam exec) هم هست که به ابزار C نیازی ندارد، بهعلاوهی REPL، مستندساز، راهانداز خطایاب، بررسیکنندهی حافظه، سرور زبان (LSP) برای ویرایشگرها و افزونه برای Visual Studio Code و ده ویرایشگر دیگر. اگر نمیخواهید چیزی نصب کنید، ویرایشگر آنلاین سلام را در خود مرورگر کامپایل و اجرا میکند.
سرعت زبان سلام چقدر است؟
سلام بدون زبالهروب به کد بومی کامپایل میشود، پس جایش کنار C، Rust و Go است، نه کنار پایتون. محک (Benchmark) خود پروژه ۳۹ برنامه را مقایسه میکند که در همهی زبانها الگوریتم یکسانی دارند. در اندازهگیری ۵ آبان ۱۴۰۵ (۲۷ اکتبر ۲۰۲۶)، میانگین سلام ۱۰٫۶ میلیثانیه، C ۱۱٫۷ میلیثانیه و Rust ۱۱٫۳ میلیثانیه بود. در برابر سریعترینِ C، C++، Rust و Go در هر برنامه، سلام در ۶ برنامه جلوتر، در ۲۷ برنامه برابر و در ۶ برنامه عقبتر بود. پایتون حدود ۵۶ برابر زمان برد.
این عددها را «یک رده با C و Rust» بخوانید، نه رتبهبندی. بیشتر برنامهها در چند میلیثانیه تمام میشوند، پس راهاندازی فرایند بخشی از هر اندازهگیری است و فاصلههای کمتر از حدود ۵٪ از اجرایی به اجرای دیگر عوض میشوند. صفحهی سرعت همهی عددها و دادهی خام را منتشر میکند و مقالهی آیا سلام از C و Rust سریعتر است؟ آنها را با دقت میخواند.
زبان سلام برای چه کسانی است؟
- فارسیزبانانی که برنامهنویسی یاد میگیرند و میخواهند با زبان خودشان شروع کنند و بعدها، بی آنکه زبان برنامهنویسیشان را عوض کنند، به واژههای کلیدی انگلیسی بروند.
- توسعهدهندگان سیستمی و بکاند که کارایی بومی را با نحوی کوچکتر و خواناتر از C یا C++ میخواهند.
- توسعهدهندگان وب که یک زبان برای سرور و برای صفحههایی که سرور تحویل میدهد میخواهند.
- استادان و دانشجویان درس کامپایلر، چون کامپایلر با همان زبانی نوشته شده که کامپایل میکند و کد منبعش باز است.
سلام هنوز چه چیزهایی نیست
معرفی صادقانه باید بگوید یک زبان کجا کم دارد. سلام جوان است و این در چند جا پیداست:
- بررسیکنندهی امانت (Borrow Checker) ندارد. سلام ایمنی حافظه را به شیوهی Rust اثبات نمیکند. بررسی مرز آرایه، هشدارهای مالکیت و بررسیکنندهی حافظه دارد، اما آزاد کردن حافظهی هیپ هنوز کار خود شماست.
- اکوسیستم کوچک. کتابخانهی استاندارد بزرگ است، اما جامعهی کاربری و شمار بستههای شخص ثالث در برابر پایتون، Go یا Rust بسیار کم است.
- پیش از نسخهی ۱٫۰. زبان هنوز بین نسخهها تغییر میکند. برای نمونه، تعریف متغیر محلی با گونهی صریح در سال ۲۰۲۶ حذف شد. هنگام ارتقا انتظار داشته باشید کدتان را بهروز کنید.
- استقرار کم در محیط عملیاتی تا امروز، یعنی برای مسئلههای غیرعادی پاسخهای آزمودهشدهی کمتری وجود دارد.
هیچکدام از اینها همیشگی نیست، اما وقتی امروز برای یک پروژه زبان انتخاب میکنید اهمیت دارند.
یادگیری زبان سلام را از کجا شروع کنیم؟
کامپایلر را در لینوکس یا مک با یک فرمان نصب کنید:
curl -fsSL https://raw.githubusercontent.com/SalamLang/Salam/refs/heads/main/install.sh | shکاربران ویندوز فرمان PowerShell را از صفحهی نصب اجرا میکنند. بعد آموزش رایگان را دنبال کنید که در ۴۷ درس کوتاه از نخستین برنامه تا سرور وب پیش میرود و هر درسش برنامههای کامل و خروجی واقعی آنها را دارد.
پرسشهای پرتکرار
آیا سلام یک زبان برنامهنویسی فارسی است؟
سلام یک زبان دوزبانه است. میتوانید یک برنامه را از اول تا آخر به فارسی یا به انگلیسی بنویسید و هر دو در زیرساخت یک زباناند. بیشتر کد موجود در گیتهاب انگلیسی است، اما املای فارسی تا خود پیامهای خطا بهطور کامل پشتیبانی میشود.
زبان سلام کامپایلی است یا تفسیری؟
کامپایلی. salam build یک فایل اجرایی بومی میسازد. یک مفسر به نام salam exec هم برای آزمایشهای سریع روی ماشینهایی که کامپایلر C ندارند وجود دارد.
آیا زبان برنامهنویسی سلام رایگان است؟
بله. کامپایلر، کتابخانهی استاندارد و ابزارها با مجوز GPL-3.0 متنبازند و بهطور عمومی در گیتهاب توسعه داده میشوند.
امروز با زبان سلام چه میتوان ساخت؟
ابزارهای خط فرمان، سرورهای HTTP و gRPC، برنامههای پایگاه داده، صفحههای وب ایستا و تعاملی، برنامههای رومیزی با رابط وب، بازی، و برنامههای مستقلی که بدون سیستمعامل بوت میشوند. دستهی ساختن با سلام هر کدام از اینها را بررسی میکند.