یک زبان برنامهنویسی وقتی برای توسعه با کمک هوش مصنوعی آماده است که مولد کد بتواند سریع و دقیق بفهمد آنچه نوشته درست است یا نه، و اگر نیست چرا. دادهی آموزشی به سود زبانهای قدیمی و پرطرفدار است، اما حلقهی پس از پیشنویس اول در اختیار خود زبان است: کامپایلری سختگیر، پیامهای خطایی که یک برنامه بتواند تجزیه کند، یک مرجع معتبر و واحد، و ابزارهایی که همهی اینها را در اختیار مدل میگذارند. زبان برنامهنویسی سلام، زبانی جوان با کد عمومی اندک برای یادگیری، دقیقاً روی همین حلقه سرمایهگذاری کرده است.
این مقاله بررسی میکند چرا ابزارهای کدنویسی هوش مصنوعی با زبانهای تازه مشکل دارند، کدام ویژگیهای یک زبان و ابزارهایش کمک میکنند و سلام هر کدام را چطور پیاده کرده است. همچنین میگوید کدام مشکلها با هیچکدام از اینها حل نمیشوند.
چرا ابزارهای هوش مصنوعی با زبانهای تازه مشکل دارند
مدلهای زبانی بزرگ برنامهنویسی را از کد عمومی یاد میگیرند. پایتون، جاوااسکریپت، جاوا، C و Go در حجم عظیمی دیده میشوند؛ زبانی که چند سال پیش منتشر شده در حجم بسیار کمی دیده میشود و ممکن است نحو قدیمیاش از نحو فعلیاش بیشتر در دسترس باشد. نتیجه قابل پیشبینی است: وقتی از مدلی بخواهید به زبانی بنویسد که بهسختی میشناسد، جاهای خالی را با نحو زبانی پر میکند که خوب میشناسد. صفحهی دستیار هوشمند سلام این مشکل را صریح میگوید: نحو سلام با هیچ زبان رایجی یکی نیست، پس چتباتهای عمومی معمولاً از خودشان میسازند.
قرضگیریهای رایج در سلام را راحت میشود فهرست کرد، چون کامپایلر آنها را میشناسد: حلقهی for به جای each، return به جای ret، while و elif، True و None پایتون، self به جای this، و آکولاد در جایی که سلام بلوک را با end میبندد. هر کدام برای کسی که پایتون یا Go بلد است طبیعی به نظر میرسد و هر کدام در سلام خطاست. در سلام فارسی همینها هر، برگشت، این و پایان هستند.
مشکل زمان هم هست. سلام هنوز به نسخهی ۱٫۰ نرسیده و تغییر میکند؛ اعلانهای محلی با گونهی صریح، مثل x: int = 5، در سال ۲۰۲۶ حذف شدند. مدلی که پیش از این تغییر آموزش دیده همچنان آنها را مینویسد. دانش مدل یک عکس لحظهای است و زبان جلو رفته است.
زبان نمیتواند دادهی آموزشیاش را درست کند. چیزی که میتواند درست کند، اتفاقی است که بعد از آن میافتد.
کامپایلر سختگیر یک حلقهی بازخورد است
تولید کد به شکل یک حلقه بهتر کار میکند: بنویس، بررسی کن، خطاها را بخوان، درست کن، دوباره بررسی کن. ارزش این حلقه به بررسیکننده بستگی دارد. زبانی سهلگیر که اشتباه را میپذیرد و در زمان اجرا شکست میخورد، چیزی به دست مولد نمیدهد؛ کامپایلری سختگیر که اشتباه را همان لحظه با پیامی مشخص رد میکند، حلقه را در چند ثانیه میبندد.
سلام عمداً سختگیر است. متغیرها تغییرناپذیرند مگر با ناپایا (mut) تعریف شوند، و ناپایا گذاشتن روی متغیری که هرگز تغییر نمیکند خطاست، نه هشدار. فیلدهای ساختار خصوصیاند مگر با همگانی (pub) علامت بخورند. یک همخوان روی جداشمار باید همهی عضوها را پوشش دهد. بازههای عددی، تقسیم بر صفر و اندیسهایی که کامپایلر بتواند نادرستیشان را ثابت کند، پیش از اجرای برنامه گزارش میشوند. این تابعی است که یک حالت را فراموش کرده است:
خطا[خطا۰۸۰]: همخوان ناقص روی جداشمار 'وضعیت': عضو(های) بازبینی پوشش داده نشده است
--> م.salam:4:11
|
4 | برگشت همخوان و۱:
| ^
|این قاعدهها پیش از هر چیز برای خوانندهی انسانی وجود دارند. اما بسیاری از پیشنویسهای باورپذیر ولی نادرست را هم به خطای کامپایل با شمارهی خط تبدیل میکنند، که مفیدترین چیزی است که یک مولد میتواند دریافت کند. مقالهی گونهبندی ایستا در سلام سامانهی گونهی پشت این قاعدهها را شرح میدهد.
پیامهای خطایی برای انسان و ماشین
یک پیام خطای خوب برای مدل همان پیام خوب برای انسان است: چه چیزی اشتباه است، کجا، و به جایش چه باید نوشت. کامپایلر سلام گامی اضافه میکند که برای کد تولیدشده مهم است: وقتی یک سطر از نحو زبان دیگری استفاده کرده باشد، همین را میگوید. این قرضگیریها در برنامهی انگلیسی رخ میدهند، پس این نمونه عمداً انگلیسی مانده است. برای تابعی که for و return به کار برده بود، salam check چاپ کرد:
error: Salam has no 'for' loop
--> guess.salam:3:5
|
3 | for x in items:
| ^
|
= help: write 'each item in items:' (or 'each i, item in items:'), or count with 'repeat n in i:'
= fix: Write 'each'
error: Salam spells 'return' as 'ret'
--> guess.salam:6:5
|
6 | return sum
| ^
|
= help: write 'ret value', or a bare 'ret' when the function returns nothing
= fix: Write 'ret'با --error-format=json هر پیام به یک شیء JSON تبدیل میشود که پرونده، سطر، ستون، متن راهنما و فهرستی از اصلاحها را دارد؛ هر اصلاح امن یا ناامن بودنش را مشخص میکند و به شکل ویرایشهایی با جابهجایی بایتی بیان میشود. ابزار لازم نیست متن انگلیسی را تجزیه کند. و salam check --fix اصلاحهای امن را خودش اعمال میکند: روی این پرونده چاپ کرد applied 2 fix(es) و no errors. پس از اصلاح، کد مثل سلام اصیل خوانده میشود. این همان برنامهی اصلاحشده است که حالت جاافتادهی جداشمار هم به آن اضافه شده، این بار به سلام فارسی، و اجرا میشود:
جداشمار وضعیت: پیشنویس، بازبینی، منتشرشده پایان
تابع برچسب(و۱: وضعیت): رشته:
برگشت همخوان و۱:
پیشنویس: "پیشنویس" پایان
بازبینی: "در انتظار بازبینی" پایان
منتشرشده: "منتشرشده" پایان
پایان
پایان
تابع جمع کل(موارد: وکتور<صحیح>): صحیح:
ناپایا جمع := ۰
هر ع در موارد:
جمع += ع
پایان
برگشت جمع
پایان
تابع ریشه:
ناپایا واژهها := وکتور {} برگردان وکتور<صحیح>
دیرکن واژهها.آزادکن()
واژهها.بیفزا(۱۲۰۰)
واژهها.بیفزا(۸۵۰)
سرچاپ برچسب(وضعیت.بازبینی)، جمع کل(واژهها)، "واژه"
پایانکدهای خطا ثابتاند (E012، E080، W147)، پس ابزار میتواند به جای تطبیق متن پیام، کد را جستوجو کند، و وقتی پیامها به فارسی چاپ میشوند همین کدها با رقم فارسی میآیند (خطا۰۸۰ در نمونهی بالا همان E080 است). یک نکته برای کسی که به فارسی مینویسد: در پروندهی فارسی، کلیدواژهی انگلیسی قرضگرفتهای مثل return بهصورت جداگانه شناخته نمیشود؛ چون نامها در سلام میتوانند چندکلمهای باشند، return جمع بخشی از یک نام خوانده میشود و پیامها کمتر سرراستاند. پس نخستین چیزی که در خروجی یک مولد بررسی میکنید، یکدست بودن زبان پرونده است. مقالهی ابزارهای توسعهی سلام نمونههای بیشتری از این پیامها را نشان میدهد.
یک مرجع معتبر به جای انبوهی از آموزشها
مدلی که مستندات کهنه به دستش داده شود، کد کهنه را با اطمینان مینویسد. پاسخ سلام یک پروندهی واحد است: SKILL.md در ریشهی مخزن، که خودش را مرجع معتبر و بهروز معرفی میکند. این پرونده نحو فعلی را به انگلیسی (بخش اول) و فارسی (بخش دوم)، فهرست کتابخانهی استاندارد، قاعدههای سختگیرانهی کامپایلر و رایجترین دامها، زبان صفحه و راهنمای برگردان کد C را در بر دارد. حدود ۲۵۰ کیلوبایت متن است که برای بارگذاری در بافت (context) مدل نوشته شده، و صریحاً میگوید کدام مطالب قدیمیتر کهنه شدهاند، مثل کتابهای آموزشی درون مخزن. بخش فارسی آن همهی کلیدواژهها، گونهها، متدهای درونی و نام فارسی بستههای رایج کتابخانه را فهرست میکند و دامهای مخصوص سلام فارسی را جدا میآورد.
در کنار آن، docs/ai/AGENTS.md جهتیابی کوتاهتری برای عاملها (Agent) است و واقعیتهای پروژه را دارد (نسخهها کجا منتشر میشوند، نسخهها چطور نامگذاری میشوند) تا مدل به پروندههای واقعی اشاره کند و نشانی از خودش نسازد. هر دو در همان مخزنِ کامپایلر نگه داشته میشوند، پس تغییر زبان میتواند در همان کامیت آنها را هم بهروز کند.
llms.txt: نقشهی سایت برای مدلها
llms.txt یک قرارداد پیشنهادی است: پروندهای Markdown در ریشهی سایت که به مدلهای زبانی میگوید سایت چه چیزی دارد و کجا را باید نگاه کنند. وبسایت سلام در زمان ساخت برای هر زبان یکی میسازد: llms.txt با توضیح سایت و همهی صفحهها، درسها و بستههای کتابخانهی استاندارد به شکل پیوند همراه با خلاصه، بهعلاوهی پیوند به مهارت عامل و سرور MCP؛ و llms-full.txt با متن کامل همهی درسها و صفحههای کتابخانه به Markdown، برای بارگذاری یکجا در بافت مدل. نسخهی انگلیسی llms-full.txt حدود ۷ مگابایت است.
چیزی که این پروندهها را قابل اعتماد میکند، شیوهی ساخت سایت است. پیش از تولید صفحهها، فرایند ساخت هر نمونه را اجرا و خروجیاش را با خروجی مورد انتظاری که کنارش ذخیره شده مقایسه میکند، پس سایت هرگز کدی را که کامپایل نمیشود یا خروجیای را که کهنه شده نشان نمیدهد. مجلهای که میخوانید هم از همین قاعده پیروی میکند: هر برنامهی سلام در آن که بلوک خروجی دارد، هنگام ساخت سایت کامپایل و اجرا شده است. مستنداتی که کامپایلر بررسیشان میکند نمیتوانند بیصدا از زبان فاصله بگیرند، و هر چیزی که از آنها ساخته شود، از جمله llms.txt، همین ویژگی را به ارث میبرد.
سرور MCP: دادن کامپایلر واقعی به مدل
پروتکل بافت مدل (Model Context Protocol) یا MCP پروتکلی باز است که به برنامههای هوش مصنوعی اجازه میدهد ابزارهای بیرونی را صدا بزنند. سلام یک سرور MCP دارد که به خود سلام نوشته شده و سه چیزی را که مدل در غیر این صورت باید حدس بزند به آن میدهد:
- زبان: مرجع کامل که با موضوع یا کد خطا جستوجو میشود (
salam_docs)، و جدول کلیدواژههای انگلیسی و فارسی؛ - کتابخانهی استاندارد: جستوجو بر اساس کاری که یک تابع انجام میدهد، همهی بستهها، امضای دقیق تابعهای هر بسته و نمونههای کارا از مجموعهی آزمونها؛
- کامپایلر: بررسی، ساخت، اجرا، قالببندی، ترجمه میان انگلیسی و فارسی، و بازرسی توکنها، درختهای نحو یا LLVM IR.
بررسیِ ناموفق هر پیام را همراه با کد، جایگاه، سطر منبع، راهنمای کامپایلر، یک اشاره وقتی کد از نحو زبان دیگری استفاده کرده، و کوچکترین برنامهی شکستخورده برای آن کد خطا از مجموعهی آزمون برمیگرداند. سرور روی https://mcp.salamlang.ir/mcp میزبانی میشود، پس هر کلاینت MCP بدون نصب چیزی میتواند از آن استفاده کند:
{
"mcpServers": {
"salam": { "type": "http", "url": "https://mcp.salamlang.ir/mcp" }
}
}سرور میزبانیشده پروندههای شما را نمیبیند، پس ابزارهایش متن برنامه را میگیرند، و هرگز کدی اجرا نمیکند: اجرا و ساخت فقط وقتی هست که سرور را روی ماشین خودتان راه بیندازید. با حساب کاربری دستیار هوشمند سلام وارد میشوید، طرح رایگان هم شامل است. مقالهی دستیار هوشمند سلام و دستیار زبان سلام دستیار میزبانیشدهای را که روی همین قطعهها ساخته شده شرح میدهد.
تصمیمهای طراحی زبان که کمک میکنند
بعضی ویژگیها زبان را برای مولدها آسانتر میکنند، و بیشترشان صرفاً طراحی خوباند:
- راههای کم برای گفتن یک چیز. سلام یک حلقه برای پیمایش مجموعه دارد (
هر، در انگلیسیeach)، یک حلقهی شرطی (تا، در انگلیسیuntil، که تا وقتی شرطش برقرار است اجرا میشود) وتکرار(repeat) برای شمردن. سطح کوچکتر یعنی شکلهای نادرستِ باورپذیر کمتر. - ساختار صریح. بلوکها با
پایانبسته میشوند، تغییرپذیریناپایامیخواهد و فیلدهای عمومیهمگانی. هیچ چیز فقط به تورفتگی یا قراردادی ضمنی وابسته نیست. - گونهی ایستا همراه با استنتاج. کامپایلر میتواند فراخوانی نادرست را پیش از اجرای هر چیزی رد کند، اما کد محلی کوتاه میماند:
شمار := ۰به حاشیهنویسی گونه نیاز ندارد. - کتابخانهی استانداردی با نامهای واقعی. وقتی کتابخانه بزرگ است و با همان خط تولید مستند میشود، رایجترین توهم مدل، یعنی تابعی ساختگی، با ابزار جستوجو یا با پیشنهاد «منظورتان این بود؟» کامپایلر گرفته میشود.
- آزمونها بهعنوان مشخصات. خطاهای کامپایلر با برنامههای کوچکی آزمایش میشوند که باید کد مشخصی تولید کنند، و همین برنامهها نمونهی هر خطا هم هستند.
بعضی ویژگیها به ضرر مولدها کار میکنند و سلام آنها را هم دارد. نحوش ناآشناست، پیش از ۱٫۰ هنوز تغییر میکند، و نامهای چندکلمهای مثل زمان مطالعه مجازند، که هر کسی را، انسان یا مدل، که انتظار شناسهی بدون فاصله دارد غافلگیر میکند. مقالهی طراحی نحو سلام توضیح میدهد چرا این انتخابها با وجود این انجام شدند.
آنچه کامپایلر نمیتواند بررسی کند
کامپایل بیخطا ثابت میکند که برنامه خوشساخت و از نظر گونه درست است. ثابت نمیکند که کار درست را انجام میدهد. تابعی تولیدشده میتواند به ترتیب اشتباه مرتب کند، یک حالت مرزی را جا بیندازد یا کار خواستهشده را بد بفهمد و باز هم در اولین تلاش کامپایل شود. پاسخ برای کدی از هر منبعی یکسان است: آزمونهایی که رفتار مورد انتظار را بیان میکنند و با هر تغییر اجرا میشوند. اجراکنندهی آزمون سلام (salam test) نوشتن آنها را ارزان میکند، اما کسی باید آنها را بنویسد.
حافظه محدودیت دوم است. سلام نه زبالهروب (Garbage Collector) دارد و نه وارسیگر قرض (Borrow Checker). بررسیگر مالکیت، استفاده پس از آزادسازی یا آزادسازی دوبارهی قطعی را بهعنوان خطا گزارش میکند و جایی که فقط بعضی مسیرها مقداری را آزاد میکنند هشدار میدهد، اما نمیتواند نبودِ نشت حافظه را آنطور ثابت کند که وارسیگر قرض Rust نبودِ برخی خطاها را ثابت میکند. کد تولیدشدهای که حافظه میگیرد همان بازبینی کد دستنویس را لازم دارد.
سوم، اینجا هیچ ادعایی دربارهی اینکه هر مدل چقدر سلام را درست مینویسد نمیکنیم. این عددها به مدل، درخواست و کار بستگی دارند، با هر نسخه تغییر میکنند و فقط با یک ارزیابی منتشرشده معنا پیدا میکنند.
پرسشهای پرتکرار دربارهی هوش مصنوعی و زبان برنامهنویسی سلام
آیا ابزارهای هوش مصنوعی میتوانند کد سلام بنویسند؟
بله، با کمک. یک مدل عمومی اغلب نحو را از زبانهای دیگر قرض میگیرد، اما با پیامهای کامپایلر، مرجع SKILL.md یا سرور MCP در حلقه، میتواند پیشنویسهای خودش را بررسی و درست کند. دستیار هوشمند سلام دستیاری است که دور همین حلقه ساخته شده است.
llms.txt چیست؟
قراردادی پیشنهادی برای یک پروندهی Markdown در ریشهی سایت که به مدلهای زبانی میگوید سایت چه چیزی دارد. وبسایت سلام هر بار که ساخته میشود برای هر زبان یک llms.txt و یک llms-full.txt با متن کامل تولید میکند.
سرور MCP برای یک زبان برنامهنویسی چیست؟
سروری که ابزارهای زبان، مثل کامپایلر، مستندات و نمایهی کتابخانهی استاندارد، را از راه پروتکل بافت مدل در اختیار برنامههای هوش مصنوعی میگذارد. سرور سلام به خود سلام نوشته شده و روی mcp.salamlang.ir میزبانی میشود.
آیا هوش مصنوعی زبانهای برنامهنویسی تازه را بیفایده میکند؟
هنوز هیچ نشانهای از این نیست. کد تولیدشده همچنان باید به دست انسان خوانده، بازبینی و نگهداری شود، و زبانی که مقصود را صریح میکند به هر سه کمک میکند. آنچه تغییر میکند این است که زبان تازه حالا به ابزارهای ماشینخوان هم نیاز دارد، نه فقط مستندات خوب؛ مقالهی چرا دنیا هنوز به زبانهای برنامهنویسی تازه نیاز دارد را ببینید.