زبان برنامهنویسی سلام میتواند در سه مرحله از آموزش برنامهنویسی با یک زبان واحد به کار رود: درس نخست برنامهنویسی که به زبان مادری دانشآموز تدریس میشود، برنامهی درسی علوم کامپیوتر که به یک زبان کامپایلی واقعی نیاز دارد، و درس کامپایلر که کامپایلری را بررسی میکند که با همان زبانی نوشته شده که دانشجویان از قبل بلدند. سلام زبانی ایستاگونه و کامپایلی است که واژههای کلیدی، کتابخانهی استاندارد و پیامهای خطایش هم به فارسی و هم به انگلیسی وجود دارند؛ همین آن را برای فارسیزبانان به زبان نخست مناسبی تبدیل میکند و پلی به زبانهای صنعتی با واژههای کلیدی انگلیسی میسازد. این نوشته بررسی میکند پروژه امروز چه چیزی به آموزشدهندگان عرضه میکند، در کجای برنامهی درسی جا میگیرد و پیش از آنکه مدرسهها و دانشگاهها بتوانند به آن تکیه کنند، چه چیزهایی هنوز کم است.
یک نکته دربارهی دامنهی بحث: این نوشته در دستهی «آینده» است. هیچجای آن ادعا نمیکند که مدرسه یا دانشگاهی سلام را به کار گرفته است؛ مخزن پروژه هیچ نمونهای از چنین بهکارگیریای را ثبت نکرده است. این نوشته آنچه را وجود دارد توصیف میکند و استدلال میکند که کجا میتواند کمک کند.
چرا زبان آموزش برنامهنویسی اهمیت دارد
بیشتر زبانهای برنامهنویسی فرض میکنند که یادگیرنده انگلیسی میخواند. واژههای کلیدیای مانند while، return و struct واژههای انگلیسیاند و تقریباً همهی پیامهای خطای کامپایلرها هم همینطور. برای کسی که زبان مادریاش انگلیسی است این واژگان رایگان است. برای یک نوجوان چهاردهساله در تهران یا کابل، درس دومی است که روی درس اول سوار شده: دانشآموز باید همزمان واژگانی بیگانه و مفهوم حلقه را یاد بگیرد.
اینکه آموزش به زبان مادری نتیجهی یادگیری برنامهنویسی را بهطور مشخص بهتر میکند یا نه، پرسشی پژوهشی است و شواهدش را باید با دقت خواند؛ نوشتهی آیا برنامهنویسی به زبان مادری آموزش علوم کامپیوتر را تغییر میدهد؟ به آن میپردازد. ادعای محدودتر این نوشته عملی است: زبانی که به معلم اجازه دهد سد واژگان را بردارد، بیآنکه از کامپایلر واقعی، گونههای واقعی و کتابخانهی استاندارد واقعی دست بکشد، گزینهای به معلمان میدهد که پیش از این نداشتند.
آموزش برنامهنویسی به فارسی: درس نخست به زبان خود دانشآموز
تمرین پایهای که هر درس مقدماتی در هفتههای نخستش به آن میرسد، یک حلقه با یک شرط است. این الگوریتم اقلیدس برای بزرگترین مقسومعلیه مشترک است که به فارسی نوشته شده. تابع معادل func، ناپایا معادل mut، تا حلقهای است که تا وقتی شرطش برقرار است تکرار میشود، برگشت معادل ret است و تابع ورودی ریشه نام دارد. عددهای فارسی و ویرگول فارسی همانطور که نوشته شدهاند پذیرفته میشوند.
تابع مقسوم علیه مشترک(الف: صحیح، ب: صحیح): صحیح:
ناپایا ایکس := الف
ناپایا ایگرگ := ب
تا ایگرگ != ۰:
باقی := ایکس % ایگرگ
ایکس = ایگرگ
ایگرگ = باقی
پایان
برگشت ایکس
پایان
تابع ریشه:
سرچاپ «ب.م.م ۸۴ و ۳۶ برابر است با»، مقسوم علیه مشترک(۸۴، ۳۶)
سرچاپ «ب.م.م ۱۷ و ۵ برابر است با»، مقسوم علیه مشترک(۱۷، ۵)
پایاندو جزئیات برای کلاس درس مهم است. نام تابع سه کلمه با فاصله است، مقسوم علیه مشترک، چون مفهومهای فارسی اغلب چندکلمهایاند و فشردن آنها در یک کلمه یا با خط زیر خواندن کد را سختتر میکند. و این برنامه یک گویش اسباببازی نیست: از همان بررسیکنندهی گونه و همان تولیدکنندهی کد سلام انگلیسی میگذرد و یک فایل اجرایی بومی میسازد.
مواد آموزشی اطراف آن از همین حالا قابلتوجه است:
- یک دورهی رایگان ۴۷ درسی به انگلیسی و فارسی، از نخستین برنامه تا ساختارها، گونههای عام، حافظه و نخها، و سپس ساختن صفحههای وب. هر مثال در هر درس هنگام ساخت وبسایت کامپایل میشود و خروجی نشاندادهشده خروجی واقعی است.
- بدون نیاز به نصب. ویرایشگر برخط editor.salamlang.ir کل کامپایلر را از راه وباسمبلی (WebAssembly) در مرورگر اجرا میکند، که در سایتهای رایانهی مدرسهها، جایی که دانشآموزان اجازهی نصب نرمافزار ندارند، اهمیت دارد.
- یک برنامهی اندروید که کامپایلر درونش ساخته شده؛ پس برنامهها بهصورت آفلاین روی گوشی یا تبلت با اندروید ۵٫۰ یا تازهتر اجرا میشوند. برای دانشآموزانی که رایانهی اصلیشان گوشی است، این یک جزئیات ساده نیست.
- یک مفسر (
salam exec) و یک محیط تعاملی (REPL) باsalam cliبرای آزمایشهای سریع بدون نیاز به ابزارهای C.
کامپایلر سختگیر بهعنوان معلمی صبور
مبتدیان از پیامهای خطا به اندازهی کلاس درس یاد میگیرند؛ پس کیفیت پیامهای خطا یک ویژگی آموزشی است. کامپایلر سلام عمداً سختگیر است: متغیرها تغییرناپذیرند مگر آنکه ناپایا تعریف شوند، متغیرهای بیاستفاده بهجای هشدار خطا به حساب میآیند و برای بسیاری از اشتباههای رایج راه اصلاح پیشنهاد میشود. نخستین تلاش یک دانشآموز برای جمع عددهای ۱ تا ۵ را در نظر بگیرید:
تابع ریشه:
جمع := ۰
تکرار ۱ تا ۵ در ای:
جمع += ای
پایان
سرچاپ جمع
پایانsalam check sum.salam پیش از تولید هر کدی متوقف میشود و دقیقاً به محل اشکال اشاره میکند:
خطا[خطا۰۱۳]: نمیتوان متغیر تغییرناپذیر 'جمع' را دوباره مقداردهی کرد؛ برای این کار آن را 'ناپایا' تعریف کنید، یا بهجای آن به عناصر یا فیلدهایش مقدار دهید
--> sum.salam:4:9
|
4 | جمع += ای
| ^
|همین خطا برای برنامهای که به انگلیسی نوشته شده به انگلیسی ظاهر میشود، و معلم میتواند با --error-lang=en آن را برای همین برنامهی فارسی هم به انگلیسی ببیند (و با --error-lang=fa برای یک برنامهی انگلیسی به فارسی):
error[E013]: cannot reassign immutable variable 'جمع'; declare it 'mut' to reassign it, or assign to its elements or fields insteadکامپایلر بیش از ۱٬۳۰۰ پیام خطا و پیام ابزار را در یک فهرست نگه میدارد و هرکدام معادل فارسی دارد. کدهای خطا ثابتاند (اینجا E013)؛ پس معلم میتواند صفحهای از «خطاهای رایج و معنایشان» بسازد که با هر انتشار تازه کهنه نشود. سختگیری برای مبتدیان هزینه دارد، چون ممکن است کامپایلری که متغیر بیاستفاده را نمیپذیرد آزارشان دهد، اما عادت خواندن و اصلاح پیامهای خطا را از همان ابتدا میسازد.
پلی از فارسی به انگلیسی، درون یک زبان
ایراد آشکار به آموزش به فارسی این است که نرمافزار حرفهای با واژههای کلیدی انگلیسی نوشته میشود. پاسخ سلام این است که دانشآموز برای عوض کردن واژگان هرگز مجبور نیست زبان برنامهنویسیاش را عوض کند. همان برنامه با واژههای کلیدی انگلیسی این شکل را دارد:
func gcd(a: int, b: int): int:
mut x := a
mut y := b
until y != 0:
rest := x % y
x = y
y = rest
end
ret x
end
func main:
println "gcd(84, 36) =", gcd(84, 36)
println "gcd(17, 5) =", gcd(17, 5)
endفرمان salam translate واژههای کلیدی، تابع ورودی و نام گونههای داخلی را از یک املا به املای دیگر بازنویسی میکند و نامها و توضیحهای خود دانشآموز را دستنخورده میگذارد. بنابراین یک دوره میتواند با فارسی شروع شود، در میانهی راه واژههای کلیدی انگلیسی را بهعنوان تمرین واژگان معرفی کند و با انگلیسی تمام شود، در حالی که هر مفهوم بدون تغییر منتقل میشود. نوشتهی از کد فارسی به انگلیسی و برعکس این ابزار را با جزئیات شرح میدهد.
از سلام انگلیسی، رفتن به پایتون، Go یا C تغییری در نحو است، نه در مفهوم: گونههای ایستا، تابعها، ساختارها، جداشمارها، گونههای عام، defer و مدیریت صریح حافظه همه خویشاوندان نزدیکی در زبانهای رایج دارند.
آموزش طراحی کامپایلر با کامپایلر خودمیزبان سلام
درسهای کامپایلر معمولاً یک کامپایلر اسباببازی را بررسی میکنند، چون کامپایلرهای واقعی با زبانی غیر از زبانی که کامپایل میکنند نوشته شدهاند و برای خواندن بیش از حد بزرگاند. سلام از هر دو جهت غیرمعمول است. کامپایلرش با خود سلام نوشته شده و ساختارش از خط لولهی کتابهای درسی پیروی میکند: compiler/lexer، compiler/parser، compiler/semantic، سپس تولیدکنندههای کد جداگانه در compiler/codegen (C)، compiler/llvmgen (LLVM IR)، compiler/nativegen (کد ماشین x86-64) و compiler/nativelink (یک پیونددهندهی داخلی)، بهعلاوهی یک مفسر در compiler/interp و یک تولیدکنندهی جاوااسکریپت در compiler/jsgen.
دانشجویان میتوانند هر مرحله را از خط فرمان تماشا کنند. salam inspect جریان توکنها، درخت نحو تزئینشده یا جدول نمادها را به شکل XML بیرون میریزد:
salam inspect tiny.salam --emit-tokens
salam inspect tiny.salam --emit-ast
salam build tiny.salam --emit-c
salam llvm tiny.salam
salam build tiny.salam --backend=native --emit-asmنخستین توکن تابع ریشه: اینطور بیرون میآید:
<token>
<base>token_t</base>
<type>KEYWORD_FUNC</type>
<source>تابع</source>
<location>
<begin_line>1</begin_line>
<begin_column>1</begin_column>
<end_line>1</end_line>
<end_column>9</end_column>
</location>
</token>گونهی توکن همان KEYWORD_FUNC است که func انگلیسی هم به آن تبدیل میشود؛ از این نقطه به بعد، تحلیلگر نحوی (Parser) نمیداند برنامه به کدام زبان نوشته شده بود. سه فرمان آخر همان برنامه را به شکل C، به شکل LLVM IR و به شکل اسمبلی x86-64 نشان میدهند، و همین بدهبستانهای میان کامپایل از راه C، از راه LLVM و مستقیم به کد ماشین را ملموس میکند، نه نظری. یک درس کامپایلر میتواند «افزودن یک هشدار» یا «افزودن یک قاعدهی تاشدن ثابتها (constant folding)» را بهعنوان پروژه در یک کامپایلر واقعی و خودمیزبان تعریف کند و دانشجویان کارشان را با مجموعهی آزمون خود پروژه بیازمایند. نوشتههای خط لولهی کامپایلر سلام و کامپایلر خودمیزبان نقطهی شروع خوبی برای چنین درسیاند. بخش دوزبانهی ابتدای کامپایلر خودش موضوع درسی جداگانه است: جدولهای واژههای کلیدی هر دو زبان در یک پرونده، compiler/langpack.salam، قرار دارند.
اندازهی کار یک هشدار منصفانه است. کامپایلر و ابزارهایش بیش از ۳۰۰ پروندهی منبع دارند، که برای خواندن از اول تا آخر در یک نیمسال بیش از حد بزرگ است. بهتر است بهعنوان کدی برای کاوش و تغییر به کار رود تا بهعنوان کتاب درسی.
تمرین مهندسی نرمافزار از نخستین پروژه
درسهای مهندسی نرمافزار به چیزی بیش از یک کامپایلر نیاز دارند: پروژه، بسته، آزمون، قالببندی، مستندات و کنترل نسخه. سلام همهی اینها را پشت یک فرمان salam گذاشته، که فهرست ابزارهایی را که دانشجو باید یاد بگیرد کوتاه نگه میدارد. پروندهی آزمون هر پروندهی *_test.salam است که تابعهای آزمون دارد؛ در انگلیسی نام این تابعها با test_ و در فارسی با آزمون شروع میشود:
تابع مقسوم علیه مشترک(الف: صحیح، ب: صحیح): صحیح:
ناپایا ایکس := الف
ناپایا ایگرگ := ب
تا ایگرگ != ۰:
باقی := ایکس % ایگرگ
ایکس = ایگرگ
ایگرگ = باقی
پایان
برگشت ایکس
پایان
تابع آزمون عامل مشترک():
آزمایش.ادعای برابری عدد(مقسوم علیه مشترک(۸۴، ۳۶)، ۱۲)
پایان
تابع آزمون اعداد متباین():
آزمایش.ادعای برابری عدد(مقسوم علیه مشترک(۱۷، ۵)، ۱)
پایان$ salam test
=== RUN آزمون عامل مشترک
--- PASS: آزمون عامل مشترک
=== RUN آزمون اعداد متباین
--- PASS: آزمون اعداد متباین
ok bmm_test.salam: 2 tests passed
PASS: 1 test filessalam new پروژهای با مانیفست میسازد، salam format بحثهای سبک کد را پیش از آغاز تمام میکند، salam doc صفحهی API میسازد و salam add بستهها را از مخزنهای گیت با فایل قفل و چکیدهی رمزنگاشتی وارد میکند. بنابراین یک پروژهی گروهی با سلام همان روند کاری را تمرین میدهد که دانشجویان در صنعت خواهند دید، با زبانی که پیامهای خطایش را هم میتوانند بخوانند. نوشتهی ابزارهای برنامهنویسی سلام این فرمانها را پوشش میدهد.
یادگیرندگان کمسنتر: نمونهی اولیهی برنامهنویسی بلوکی
مخزن آزمایشی هم برای کودکان دارد، در پوشهی kids/: یک ویرایشگر بلوکی کشیدن و رها کردن که با خود سلام نوشته شده است. کودکان برنامه را از بلوکهایی مانند «Say»، «Ask»، «Repeat» و «Move» در دو حالت میسازند، «Talk & Print» و یک حالت گرافیک لاکپشتی به نام «Draw & Move»، و یک پنل «Grown-up Code» برنامهی سلامی را که بلوکها با آن متناظرند نشان میدهد. همین ایدهی آخر جالب است: پل میان بلوکها و کد متنی از ابتدا درون ابزار ساخته شده است.
این یک نمونهی اولیه در کد منبع است، نه محصولی منتشرشده، و برچسبهایش انگلیسیاند. یک جهت را نشان میدهد، نه ابزاری کامل را.
برای آموزش با زبان سلام در کلاس درس هنوز چه کم است؟
صادق بودن دربارهی کمبودها همان چیزی است که فرصت را باورپذیر میکند.
- پایداری. سلام هنوز به نسخهی ۱٫۰ نرسیده و نحوش هنوز تغییر میکند. اعلان متغیر محلی با گونهی صریح در سال ۲۰۲۶ حذف شد و خودانتسابیهایی مانند
x = x + 1در نسخهی ۰٫۶٫۳ خطای کامپایل شدند. مطالب درسی که برای یک انتشار نوشته شده ممکن است در انتشار بعدی از کار بیفتد، و این برای معلمانی که سالها از جزوههایشان دوباره استفاده میکنند هزینهای واقعی است. - مواد ویژهی معلم. دوره برای یادگیرندگان نوشته شده است. طرح درس منتشرشده، بانک تمرین با پاسخ، معیار ارزشیابی یا راهنمای معلم وجود ندارد. مخزن کتابهایی با LaTeX به فارسی و انگلیسی هم دارد، اما مرجع زبان خود پروژه هشدار میدهد که آنها قدیمیاند.
- شواهد. هیچ پژوهش منتشرشدهای دربارهی دانشآموزانی که با سلام یاد گرفتهاند وجود ندارد. هر کس آن را برای یک درس به کار بگیرد در واقع آزمایشی انجام میدهد و باید نتیجهاش را اندازه بگیرد.
- اندازهی جامعه. دانشآموزی که گیر کند، پاسخهای بسیار کمتری در انجمنها پیدا میکند تا برای پایتون یا جاوا. کانالهای جامعه (تلگرام، دیسکورد، ایتا، بله) کوچکاند و دستیار هوشمند سلام بخشی از این شکاف را پر میکند.
- معرفی تا امروز اندک بوده است. مخزن اسلایدهای یک ارائهی فارسی را دارد که برای رویداد DSTO در کاشان در اکتبر ۲۰۲۶ آماده شده بود؛ این همان کار مردمیای است که یک زبان آموزشی با آن شروع میکند، نه شاهدی بر بهکارگیری.
فرصت هم به همان اندازه ملموس است: یک زبان رایگان، متنباز و دوزبانه با کامپایلری واقعی، دورهای ۴۷ درسی به دو زبان، یک ویرایشگر مرورگری و یک برنامهی اندروید، پایهی معقولی برای یک دورهی آزمایشی است. معلمی که چنین دورهای را اجرا کند و نتیجهاش را منتشر کند، چیزی به پروژه میدهد که هنوز ندارد.
پرسشهای متداول دربارهی آموزش با زبان برنامهنویسی سلام
آیا زبان سلام برای مبتدیان مناسب است؟
میتواند باشد، بهویژه برای فارسیزبانان، چون واژههای کلیدی، کتابخانهی استاندارد و پیامهای خطا به فارسی هم وجود دارند. سختگیریاش (متغیرهای تغییرناپذیر بهطور پیشفرض و خطا بودن متغیرهای بیاستفاده) به ساختن عادتهای خوب کمک میکند اما در آغاز ممکن است کلافهکننده باشد، و جامعهاش از جامعهی پایتون بسیار کوچکتر است.
آیا میتوان درس طراحی کامپایلر را با سلام تدریس کرد؟
بله، کامپایلر خودمیزبان سلام متنباز است، از ساختار کلاسیک تحلیل واژگانی، تحلیل نحوی، تحلیل معنایی و تولید کد پیروی میکند و salam inspect توکنها، درختهای نحو و نمادها را نشان میدهد. اما بزرگ است؛ پس بهعنوان کدی برای کاوش و پروژههای کوچک بهتر جواب میدهد تا بهعنوان متنی که باید کامل خوانده شود.
آیا دانشآموزان باید چیزی نصب کنند؟
نه. ویرایشگر برخط کامپایلر را در مرورگر اجرا میکند و یک برنامهی اندروید هم هست که کامپایلر درونش ساخته شده. نصب خود کامپایلر روی لینوکس، مک یا ویندوز هم یک فرمان است.
آیا کسی که برنامهنویسی را به فارسی یاد گرفته میتواند به زبانهای انگلیسی برود؟
هدف طراحی دوزبانه دقیقاً همین است. همان برنامه را میتوان با salam translate با واژههای کلیدی انگلیسی بازنویسی کرد و مفهومها (گونهها، تابعها، ساختارها، حلقهها، حافظه) به پایتون، Go، C و زبانهای دیگر منتقل میشوند.