کتابخانهی استاندارد زبان برنامهنویسی سلام مجموعه بستههایی است که همراه کامپایلر عرضه میشوند، پس برنامه میتواند آنها را بدون دانلود، بدون مدیر بسته و در بیشتر موارد بدون نصب هیچ کتابخانهی C وارد کند. کتابخانهی استاندارد سلام بیش از ۱۷۰ بستهی مستند دارد که متن و قالبهای داده، پروندهها و فرایندها، HTTP و شبکه، رمزنگاری و TLS، پایگاه داده، ریاضیات، یادگیری ماشین، صدا، تصویر و رابطهای کاربری گرافیکی را پوشش میدهند. هر کدام صفحهای در مرجع کتابخانه دارد با یک نمونه برای هر تابع همگانی، و هر بسته و هر تابع یک نام فارسی هم دارد.
این مقاله یک نقشه است. کتابخانه را حوزه به حوزه مرور میکند، چند بسته را اجرا میکند تا ببینید کد معمولی با آنها چه شکلی دارد، و به صفحهی مرجع هر بستهای که نام میبرد پیوند میدهد. در پایان نگاهی صادقانه به بدهبستانهای یک کتابخانهی «همهچیز همراه» (batteries included) در یک زبان جوان دارد.
کتابخانهی استاندارد سلام چطور سازمان یافته است
بستهها با مسیرشان وارد میشوند و با آخرین جزء نامشان بهعنوان پیشوند به کار میروند. در کد انگلیسی import encoding.json و سپس json.Marshal مینویسید، و در کد فارسی واردسازی کدگذاری.جیسون و سپس جیسون.سریال سازی؛ net.http هم در فارسی شبکه.اچ تی تی پی است. مرجع بستهها را در این گروهها مرتب کرده است: پایهها، متن، عددها و مجموعهها، کدگذاری و داده، سیستم و ابزارها، زمان و همزمانی، شبکه، امنیت و رمزنگاری، پایگاه داده، وب و سرویسها، گرافیک و بازی، صدا و هوش مصنوعی، و چند گروه کوچکتر.
سه ویژگی در کل کتابخانه برقرار است که پیش از استفاده دانستنشان میارزد:
- بیشترش به خود سلام نوشته شده است. HTTP، TLS نسخهی ۱٫۳، پروتکلهای PostgreSQL و MySQL، JSON، فشردهسازی، اجرای مدلهای ONNX و موتور چیدمان رابط کاربری بومی، کد سلاماند که همراه برنامهی شما کامپایل میشوند. چند بسته کتابخانههای C موجودی را میپیچند که بازنویسیشان معقول نیست: db.sqlite، gui.raylib، ai.opencv و نمای وب سیستم در gui.webview.
- آزاد کردن مقدارهای هیپ با شماست. بستههایی که یک
وکتور، یک بافر یا یک رشتهی مالکیتدار برمیگردانند این را میگویند، و شما آن را با.آزادکن()یا تابع آزادسازی خود بسته آزاد میکنید، معمولاً بادیرکن. درس حافظه قاعدهها را توضیح میدهد. - خطاها از سازوکارهای خود زبان استفاده میکنند. تابعهایی که ممکن است شکست بخورند یا وضعیتی برمیگردانند که فراخواننده بررسی میکند، یا
خطادار(throws) علامت خوردهاند و کامپایلر شما را مجبور میکند آنها را باتلاش(try) مدیریت کنید.
متن، قالبهای داده و کدگذاریها در سلام
بستههای متن جاییاند که بیشتر برنامهها از آن شروع میکنند: str برای جستوجو، برش، جایگزینی و ساختن رشتهها، regex برای الگوها، unicode برای ویژگیهای نویسهها و template برای قالبهای متنی و HTML با گریز خودکار. چون سلام دوزبانه است، کتابخانه برای متن راستبهچپ عمق کمنظیری دارد: bidi الگوریتم دوسویهی یونیکد را پیاده میکند، arabic متن خط عربی و فارسی را یکدست میکند (گونههای «ی» و «ک»، اعراب، کشیده و نیمفاصله)، conv رقمهای فارسی را میخواند، calendar میان تقویمهای جلالی، قمری و میلادی تبدیل میکند و i18n پیامهای ترجمهشده و صورتهای جمع را مدیریت میکند.
قالبهای داده هم به همین گستردگیاند: encoding.json از رشتههای ساده تا تبدیل ساختارها و پردازش جریانی، YAML، TOML، CSV، XML با XPath، MessagePack، Protocol Buffers با تجزیهی .proto و تولید کد، serde برای تبدیل میان آنها، excel برای صفحهگستردههای xlsx و ods، و npy برای آرایههای NumPy.
واردسازی کدگذاری.جیسون
واردسازی عبارت باقاعده
واردسازی تقویم
ساختار فاکتور:
@جیسون "number"
همگانی شماره: رشته = ""
@جیسون "total"
همگانی مبلغ: صحیح = ۰
@جیسون "paid"
همگانی پرداختشده: منطقی = نادرست
پایان
تابع ریشه خطادار:
ف := فاکتور { شماره = "INV-1403-0042"، مبلغ = ۱۲۵۰۰۰ }
متن := جیسون.سریال سازی(ف)
سرچاپ متن
ناپایا خوانده := فاکتور {}
تلاش جیسون.واسریال سازی آسان گیر(`{"number":"INV-7","total":99,"paid":true,"extra":1}`، خوانده)
سرچاپ خوانده.شماره، خوانده.مبلغ، خوانده.پرداختشده
رقمها := تلاش عبارت باقاعده.کامپایل("[0-9]+")
سرچاپ عبارت باقاعده.یافتن همه(رقمها، ف.شماره)
تاریخ := تقویم.تاریخ جلالی { سال = ۱۴۰۳، ماه = ۱۲، روز = ۲۹ }
سرچاپ تقویم.قالب جلالی(تقویم.افزودن روز جلالی(تاریخ، ۱))، تقویم.نام ماه جلالی(۱۲)
پایانجیسون.سریال سازی نامهای @جیسون روی فیلدها را به کار میبرد، پس فیلدها در کد فارسیاند و کلیدهای JSON هماناند که API انتظار دارد. واسریال سازی آسان گیر کلید ناشناختهی extra را نادیده میگیرد، و عبارت باقاعده و تقویم بی هیچ تنظیمی کار میکنند. خط آخر جزئیاتی را نشان میدهد که فقط کتابخانهی تقویمی که تاریخ شمسی را جدی میگیرد درست درمیآورد: ۱۴۰۳ در تقویم جلالی کبیسه است، پس اسفند روز سیام دارد.
پروندهها، فرایندها و سیستمعامل
برای برنامهنویسی سیستمی، کتابخانه os و fs را برای پروندهها، پوشهها و متغیرهای محیطی دارد، fs.path را برای مسیرها، os.process را برای اجرای برنامهها با لولهها و مهلت زمانی، os.pty را برای راندن برنامههای تعاملی روی یک شبهپایانه، os.dl را برای بار کردن کتابخانههای اشتراکی در زمان اجرا و os.mmap را برای صفحههای حافظه با مجوزهای دسترسی.
ابزارهای خط فرمان flag را برای گزینهها دارند، cli را برای برنامههایی با زیرفرمان مثل git commit، term را برای رنگ، جابهجایی نشانگر، نوار پیشرفت و ورودی کلید، log را برای گزارشهای سطحدار و ساختیافته، config و env را برای تنظیمات و testing را برای ادعاهای آزمون. زمان با time و cron پوشش داده میشود که کارها را از روی عبارتهای cron زمانبندی میکند.
همزمانی هم همینجاست: thread، sync، atomic، chan، pool و ctx که در مقالهی برنامهنویسی همزمان در سلام توضیح داده شدهاند. در پایینترین سطح، mem تخصیص مستقیم حافظه، آرنا، استخر و بررسی نشت حافظه را فراهم میکند.
شبکه، سرویسهای وب و پایگاه داده
شبکه بزرگترین گروه است. پشتهی وب شامل net.http (سرور و کلاینت)، net.router، میانافزار، نشستها، اعتبارسنجی، مستندسازی OpenAPI، HTTP/2، WebSocket، gRPC، JSON-RPC و GraphQL است. net.httpd سرور وبی است که با پیکربندی کار میکند، با میزبانهای مجازی و FastCGI، و salam serve همان را اجرا میکند. مقالهی ساخت سرور وب سریع با سلام این پشته را با کد و عددهای بنچمارک پوشش میدهد.
پایینتر net.tcp، net.udp، net.dns و DNS رمزگذاریشده در net.doh قرار دارند. کلاینتهای پروتکل شامل net.email (SMTP، IMAP و POP3)، ssh با SFTP، ftp، net.nats با JetStream و net.socketio هستند. کلاینتهای سرویس شامل aws (S3، SQS و STS با امضای نسخهی ۴)، حسابهای سرویس google، telegram.bot و webpush برای اعلانهای مرورگرند. خانوادهای از بستههای پراکسی، از net.socks تا net.vpn، پراکسیهای SOCKS و HTTP و پروتکلهای تونل به سبک VPN را پیاده میکنند.
پایگاههای داده درایورهایی برای SQLite، MySQL و MariaDB، PostgreSQL، Redis و ClickHouse دارند، کلاینتهای جستوجو برای Elasticsearch، OpenSearch، Meilisearch و Typesense، و db.sql که SQL را بدون پایگاه داده با طرحوارهی شما میسنجد. جزئیات در مقالهی برنامههای پایگاه داده در سلام آمده است.
امنیت، رمزنگاری و فشردهسازی
crypto چکیدههای SHA-1، SHA-2 و MD5، HMAC، عدد تصادفی امن و درهمسازی گذرواژه را دارد. jwt توکنها را امضا و بررسی میکند و از مسیرهای API محافظت میکند. tls نسخههای ۱٫۳ و ۱٫۲ پروتکل TLS را بدون وابستگی به OpenSSL پیاده میکند و ssl یک میانجی آشنا به سبک OpenSSL روی آن میگذارد. در سمت داده، compress الگوریتمهای DEFLATE، gzip، bzip2 و zstd و چکسامها را دارد، و archive پروندههای zip، tar و tar فشرده را میسازد و باز میکند و بایگانیهای RAR را میخواند، از جمله رمزدار و چندجلدی.
واردسازی رمزنگاری
واردسازی جی دبلیو تی
واردسازی فشرده سازی
تابع ریشه خطادار:
سرچاپ رمزنگاری.شا۲۵۶ شانزدهی("salam")
سرچاپ رمزنگاری.اچ مک شا۲۵۶ شانزدهی("server-key"، "order=42&amount=1250")
درهمشده := رمزنگاری.درهم گذرواژه("correct horse battery staple")
سرچاپ رمزنگاری.تایید گذرواژه("correct horse battery staple"، درهمشده)، رمزنگاری.تایید گذرواژه("wrong"، درهمشده)
ناپایا ادعاها := جی دبلیو تی.ادعاهای جدید()
ادعاها.موضوع = "42"
ادعاها.زمان انقضا = ۱۹۰۰۰۰۰۰۰۰
توکن := تلاش جی دبلیو تی.امضای اچ اس۲۵۶(ادعاها، "a-long-random-secret")
ناپایا گزینهها := جی دبلیو تی.گزینه های پیش فرض()
گزینهها.اکنون = ۱۸۰۰۰۰۰۰۰۰
نتیجه := تلاش جی دبلیو تی.تایید(توکن، "a-long-random-secret"، گزینهها)
سرچاپ نتیجه.معتبر، نتیجه.ادعاها.موضوع
متن := "salam salam salam salam salam salam salam salam"
فشرده := فشرده سازی.فشرده سازی جی زیپ رشته(متن)
ناپایا سالم := نادرست
بازشده := فشرده سازی.کدگشایی جی زیپ بافر(فشرده، سالم)
سرچاپ متن.طول()، "بایت ->"، فشرده.طول، "بایت gzip، رفت و برگشت:"، سالم و فشرده سازی.بافر به رشته(بازشده) == متن
پایانچکیده و HMAC با آنچه sha256sum و openssl dgst -hmac برای همین ورودی چاپ میکنند یکی است، و این نخستین چیزی است که دربارهی هر کد رمزنگاری باید بررسی کرد. ورودیها عمداً لاتین ماندهاند تا بتوانید همین مقایسه را خودتان تکرار کنید. رمزنگاریای که به یک زبان جوان نوشته شده احتیاط میطلبد: پیادهسازیها آزمون شدهاند، ولی سالها بازبینی مستقلی را که OpenSSL، BoringSSL یا بستههای crypto در Go پشت سر گذاشتهاند نداشتهاند.
عدد، ریاضی و ساختمان داده
math تابعهای معمول را دارد، rand عدد تصادفی و بُر زدن، و sort مرتبسازی و جستوجوی دودویی. collections پشته، صف، صف دوسر، مجموعه، فهرست پیوندی، صف اولویت و شمارنده را روی وکتور و نگاشت توکار اضافه میکند. برای حساب دقیق decimal برای پول و bigint برای عددهای صحیح با هر اندازهای هست. برای تحلیل stats، matrix برای جبر خطی و graph برای کوتاهترین مسیر، جریان و مرکزیت.
واردسازی اعشاری
واردسازی عدد بزرگ
واردسازی آمار
تابع ریشه:
قیمت := اعشاری.از مقیاس(۱۹۹۹، ۲)
مالیات := اعشاری.درصد(قیمت، اعشاری.از صحیح(۹)، ۲)
سرچاپ "0.1 + 0.2 با اعشار۶۴:"، 0.1 + 0.2
سرچاپ "قیمت"، اعشاری.به رشته(قیمت)، "مالیات"، اعشاری.به رشته(مالیات)، "جمع"، اعشاری.به رشته(اعشاری.جمع(قیمت، مالیات))
سرچاپ "30! ="، عدد بزرگ.به رشته(عدد بزرگ.فاکتوریل(۳۰))
ناپایا زمانها := وکتور {} برگردان وکتور<اعشار۶۴>
دیرکن زمانها.آزادکن()
هر م در [12.0، 15.0، 11.0، 48.0، 13.0]:
زمانها.بیفزا(م)
پایان
سرچاپ "میانگین"، آمار.میانگین(زمانها)، "میانه"، آمار.میانه(زمانها)
پایانخط اول دلیل وجود decimal است: ممیز شناور دودویی نمیتواند ۰٫۱ را دقیق نمایش دهد، و پول هرگز نباید در آن نگه داشته شود. خط آخر یادآوری کوچکی است که چرا وقتی یک مقدار پرت است، میانه اهمیت دارد.
هوش مصنوعی، تصویر و صدا
گروه هوش مصنوعی برای یک زبان سیستمی بهطور غیرمعمولی بزرگ است. ai.tensor آرایههای چندبعدی را فراهم میکند، ai.autograd مشتقگیری خودکار معکوس، ai.nn لایهها از خطی تا ترنسفورمر، ai.optim بهینهسازهای SGD و Adam، و ai.ml یادگیری ماشین کلاسیک مثل رگرسیون، درخت تصمیم و خوشهبندی. برای مدلهای آموزشدیده، ai.onnx مدلهای ONNX را بدون هیچ وابستگی بیرونی اجرا میکند، ai.gguf پروندههای GGUF مربوط به llama.cpp را میخواند و ai.llm مدلهای زبانی Llama و Qwen را از روی آنها اجرا میکند. ai.image تصویر میخواند، ویرایش میکند و مینویسد، و ai.opencv کتابخانهی OpenCV را برای بینایی رایانهای میپیچد. مقالهی یادگیری ماشین با سلام عمیقتر میرود و دربارهی مقیاس صریح است: این کتابخانهای برای پردازندهی مرکزی است، نه جایگزینی برای PyTorch روی خوشهی GPU.
صدا خانوادهی خودش را دارد: audio برای قطعههایی از نمونههای صوتی، خوانندهها و نویسندههایی برای WAV، FLAC، AIFF و قالبهای دیگر، audio.dsp برای تبدیل فوریه و فیلترها، audio.synth برای نوسانسازها و پوشها، audio.midi برای پروندههای MIDI و audio.music برای نتها، گامها و کوکها، از جمله نظام دستگاهی موسیقی ایرانی.
گرافیک، رابط گرافیکی و مرورگر
برای برنامههای رومیزی، gui.webview پنجرهای بومی دور HTML است با یک لایهی کامل برنامه روی آن، و اجرای بومی رابط کاربری در gui.ui صفحههای سلام را بدون مرورگر رسم میکند، با موتور CSS، چیدمان جعبه، شکلدهی متن و رسام خودش. بازیها از gui.raylib استفاده میکنند. در مرورگر، dom با عنصرها و رویدادهای صفحه کار میکند، web.canvas روی بوم نقاشی میکند و web.keys وضعیت صفحهکلید را برای بازیها دنبال میکند. مقالههای برنامههای رومیزی و رابط گرافیکی و بخشهای تعاملی رابط کاربری اینها را پوشش میدهند.
بدهبستانهای یک کتابخانهی استاندارد بزرگ
کتابخانهی استاندارد بزرگ یک انتخاب آگاهانه است و هم سود دارد و هم هزینه.
سودها ملموساند. یک پروژهی تازه میتواند JSON تجزیه کند، HTTPS ارائه دهد، با PostgreSQL حرف بزند و گذرواژه درهم کند، بی آنکه میان بستههای رقیب شخص ثالث انتخاب کند یا درخت وابستگیهایشان را ممیزی کند. هر بسته در یک جا با نمونههای اجرایی مستند شده است و همهی بستهها از یک قرارداد نامگذاری و حافظه پیروی میکنند. نامهای فارسی یعنی برنامهنویس فارسیزبان میتواند کل کتابخانه را به زبان خودش به کار ببرد، چیزی که هیچ اکوسیستم شخص ثالثی فراهم نمیکرد.
هزینهها هم واقعیاند:
- عمق یکسان نیست. بعضی بستهها، مثل
net.http،encoding.jsonوdb.sql، در مرکز پروژهاند و خوب آزموده شدهاند. بقیه تازهتر و کمعمقترند. پیش از تکیه بر یک بستهی تخصصی، صفحهی مرجع و آزمونهایش را ببینید. - کد جوان. بخش زیادی از کتابخانه تازه است. پیادهسازیهای پروتکل مثل TLS، PostgreSQL و SSH تجربهی میدانی بسیار کمتری از همتاهای جاافتادهشان در C، Go یا Rust دارند.
- یک چرخهی انتشار. اصلاح یک بسته با انتشار بعدی کامپایلر عرضه میشود. بستههای شخص ثالث، که با
salam addاز GitHub اضافه میشوند و صفحهی بستهها آنها را توضیح میدهد، جای کدیاند که سریعتر تغییر میکند. - اکوسیستمی کوچک در اطرافش. کتابخانهی استاندارد بزرگ است، ولی جامعهی گستردهتر و شمار بستههای شخص ثالث در مقایسه با پایتون، Go یا Rust کوچک است.
پرسشهای پرتکرار
کتابخانهی استاندارد سلام چند بسته دارد؟
بیش از ۱۷۰ بستهی مستند که هر کدام صفحهی خودش را در مرجع کتابخانه دارد. بعضی حوزهها، مثل شبکه، به بستههای کوچک فراوان تقسیم شدهاند، پس این شمار به همان اندازه که بزرگی را نشان میدهد، شیوهی سازماندهی را هم نشان میدهد.
آیا کتابخانهی استاندارد سلام به کتابخانههای C وابسته است؟
بیشترش نه. HTTP، TLS، درایورهای MySQL و PostgreSQL، فشردهسازی و اجرای مدل ONNX به خود سلام نوشته شدهاند. چند بسته عمداً کتابخانههای جاافتادهی C را میپیچند، از جمله SQLite، raylib، OpenCV و نمای وب سیستم.
آیا میتوانم کتابخانهی استاندارد را با کد فارسی به کار ببرم؟
بله. هر بسته و هر تابع همگانی نام فارسی دارد، پس برنامهی فارسی میتواند کل کتابخانه را به فارسی صدا بزند؛ نمونههای همین مقاله همین کار را میکنند. مقالهی یک زبان، دو خط توضیح میدهد چطور.
نمونهی هر بسته را کجا پیدا کنم؟
هر صفحه در مرجع کتابخانه بخشهای راهنما با برنامههای کامل و یک نمونه برای هر تابع همگانی دارد، و آموزش رایگان در طول مسیر از بسیاری از این بستهها استفاده میکند.