کتابخانه‌ی استاندارد · سیستم و ابزار

سکو os/platform

شناختن سیستمی که برنامه روی آن اجرا می‌شود: سیستم عامل، معماری پردازنده، تعداد هسته و حافظه.

واردسازی سیستم عامل.سکو

بسته‌ی سکو در زمان اجرا می‌گوید برنامه روی چه سیستمی است: سیستم عامل، خانواده‌ی پردازنده، تعداد هسته‌ها و اندازه‌ی حافظه. جای کاربردش گزارش و لاگ، تنظیم‌های خودکار مثل تعداد کارگرها یا اندازه‌ی حافظه‌ی نهان، و تفاوت‌های کوچک میان سیستم‌ها مثل پسوند پرونده است. برای کدی که فقط روی یک سیستم ترجمه می‌شود، ثابت‌هایی مثل سلام سیستم ویندوز و ترجمه‌ی شرطی را به کار ببرید. برای کاربر و پوشه‌ی خانه‌اش بسته‌ی کاربر و برای متغیرهای محیطی بسته‌ی محیط را ببینید.

تابع‌های ... است، نام سیستم عامل و معماری هنگام ترجمه ثابت می‌شوند و صدا زدنشان هزینه‌ای ندارد. پرسش‌های سخت‌افزاری از سیستمِ در حال اجرا پرسیده می‌شوند و پاسخشان از سیستمی به سیستم دیگر فرق دارد:

تابعلینوکسمک و BSDویندوز
تعداد پردازندهsysconf، فوریاجرای sysctlمتغیر NUMBER_OF_PROCESSORS
کل حافظه/proc/meminfoاجرای sysctlاجرای PowerShell، اغلب یک ثانیه یا بیشتر
حافظه موجود/proc/meminfoنامعلوم، -۱اجرای PowerShell

اشتباه‌های رایج: صدا زدن تابع‌های حافظه درون حلقه (روی ویندوز هر بار PowerShell راه می‌افتد، پس یک بار بپرسید و عدد را نگه دارید)، فراموش کردن این‌که هر تابع سخت‌افزاری وقتی نتواند بفهمد -۱ برمی‌گرداند، و هسته‌ی فیزیکی دانستن تعداد پردازنده. این تابع پردازنده‌های منطقی روشن را می‌شمارد، رشته‌های ابرریسمانی هم، و درون کانتینر کل دستگاه را.

برنامه‌های زیر به‌جای عددهای خام، درستی یک قاعده را چاپ می‌کنند تا خروجی روی هر دستگاهی یکسان باشد.

انتخاب تعداد کارگرها

کاری که به تکه‌های مستقل بخش می‌شود، مثل کوچک کردن تصویرها، با یک رشته یا فرآیند برای هر هسته سریع‌تر پیش می‌رود. تعداد پردازنده شمار هسته‌ها را می‌دهد. نتیجه را میان یک و سقفی که خودتان می‌گذارید نگه دارید، چون دستگاهی با ۱۲۸ هسته به این معنا نیست که کار شما ۱۲۸ رشته می‌خواهد.

os-platform-guide-workers.salam
واردسازی سیستم عامل.سکو

تابع شمار کارگر(سقف: صحیح): صحیح:
    هسته‌ها := سکو.تعداد پردازنده()
    اگر هسته‌ها < ۱:
        برگشت ۱
    پایان
    اگر هسته‌ها > سقف:
        برگشت سقف
    پایان
    برگشت هسته‌ها
پایان

تابع ریشه:
    کارگرها := شمار کارگر(۸)
    سرچاپ "کارگرها میان ۱ و ۸:"، کارگرها >= ۱ و کارگرها <= ۸
    سرچاپ "هرگز بیش از هسته‌ها:"، کارگرها <= سکو.تعداد پردازنده()
    یکی := شمار کارگر(۱)
    سرچاپ "با سقف یک:"، یکی
پایان
خروجیکارگرها میان ۱ و ۸: true هرگز بیش از هسته‌ها: true با سقف یک: 1

درون کانتینر، این عدد مال کل دستگاه است، نه سهمی که کانتینر اجازه دارد. اگر برنامه زیر Docker یا Kubernetes اجرا می‌شود، بگذارید یک پرچم یا متغیر محیطی آن را تغییر دهد.

اندازه‌ی حافظه‌ی نهان بر پایه‌ی حافظه‌ی سیستم

کل حافظه و حافظه موجود اندازه را بر حسب بایت و به شکل صحیح۶۴ برمی‌گردانند. حافظه‌ی نهان (cache) می‌تواند بخشی از کل حافظه را بگیرد، میان یک کف و یک سقف، و هیچ‌گاه بیش از نیمی از حافظه‌ای که همین حالا آزاد است. حافظه موجود روی سیستم‌هایی که این عدد را نمی‌دانند منفی یک برمی‌گرداند، پس پیش از استفاده آن را بررسی کنید.

os-platform-guide-memory.salam
واردسازی سیستم عامل.سکو

پایا مگابایت := ۱۰۴۸۵۷۶ برگردان صحیح۶۴

تابع اندازه حافظه نهان(): صحیح۶۴:
    ناپایا اندازه := سکو.کل حافظه() / ۱۶
    اگر اندازه < ۶۴ * مگابایت:
        اندازه = ۶۴ * مگابایت
    پایان
    اگر اندازه > ۱۰۲۴ * مگابایت:
        اندازه = ۱۰۲۴ * مگابایت
    پایان
    آزاد := سکو.حافظه موجود()
    اگر آزاد > ۰ و اندازه > آزاد / ۲:
        اندازه = آزاد / ۲
    پایان
    برگشت اندازه
پایان

تابع ریشه:
    اندازه := اندازه حافظه نهان()
    سرچاپ "حافظه‌ی نهان حداکثر ۱ گیگابایت:"، اندازه <= ۱۰۲۴ * مگابایت
    سرچاپ "حافظه‌ی نهان مثبت:"، اندازه > ۰
    آزاد := سکو.حافظه موجود()
    سرچاپ "در حافظه‌ی آزاد جا می‌شود:"، آزاد < ۰ یا اندازه <= آزاد
پایان
خروجیحافظه‌ی نهان حداکثر ۱ گیگابایت: true حافظه‌ی نهان مثبت: true در حافظه‌ی آزاد جا می‌شود: true

تفاوت‌های کوچک میان سیستم‌ها

بیشتر تفاوت‌های سیستم‌ها کوچک‌اند: برنامه‌های ویندوز به .exe ختم می‌شوند و هر میزکار پرونده را با فرمان دیگری باز می‌کند. تابعی که ویندوز است یا مک است را می‌پرسد و تکه‌ی درست را برمی‌گرداند، بقیه‌ی برنامه را از این بررسی‌ها خالی نگه می‌دارد.

os-platform-guide-dispatch.salam
واردسازی سیستم عامل.سکو

تابع نام اجرایی(نام: رشته): رشته:
    اگر سکو.ویندوز است():
        برگشت نام + ".exe"
    پایان
    برگشت نام
پایان

تابع فرمان بازکردن(): رشته:
    اگر سکو.ویندوز است(): برگشت "start" پایان
    اگر سکو.مک است(): برگشت "open" پایان
    برگشت "xdg-open"
پایان

تابع ریشه:
    ناپایا جورها := ۰
    اگر سکو.لینوکس است(): جورها += ۱ پایان
    اگر سکو.ویندوز است(): جورها += ۱ پایان
    اگر سکو.مک است(): جورها += ۱ پایان
    اگر سکو.فری‌بی‌اس‌دی است(): جورها += ۱ پایان
    اگر سکو.وب‌اسمبلی است(): جورها += ۱ پایان
    سرچاپ "حداکثر یک سیستم جور شد:"، جورها <= ۱
    سرچاپ "نام پرونده‌ی اجرایی ساخته شد:"، نام اجرایی("salam").شروع با("salam")
    سرچاپ "فرمان بازکردن انتخاب شد:"، فرمان بازکردن().طول() > ۰
پایان
خروجیحداکثر یک سیستم جور شد: true نام پرونده‌ی اجرایی ساخته شد: true فرمان بازکردن انتخاب شد: true

زمان اجرا یا زمان ترجمه

پاسخ تابع‌های این بسته هنگام اجرای برنامه معلوم می‌شود، پس هر دو شاخه‌ی یک اگر روی همه‌ی سیستم‌ها ترجمه می‌شوند. اگر یکی از شاخه‌ها تابعی را صدا بزند که فقط روی یک سیستم هست، مثل یک API ویندوز، ترجمه شکست می‌خورد. آن‌وقت خود ثابت را به کار ببرید: یک اگر سلام سیستم ویندوز: ساده هنگام ترجمه تصمیم گرفته می‌شود و شاخه‌ی دیگر کنار گذاشته می‌شود. فهرست کامل ثابت‌ها در کد زمان ترجمه آمده.

os-platform-guide-compile.salam
واردسازی سیستم عامل.سکو

تابع لینوکس هنگام ترجمه(): منطقی:
    اگر سلام سیستم لینوکس:
        برگشت درست
    وگرنه:
        برگشت نادرست
    پایان
پایان

تابع ریشه:
    سرچاپ "زمان ترجمه و زمان اجرا هم‌نظرند:"، لینوکس هنگام ترجمه() == سکو.لینوکس است()
    اگر سلام سیستم ویندوز:
        سرچاپ "این سطر فقط روی ویندوز ترجمه می‌شود"
    وگرنه:
        سرچاپ "این سطر روی همه‌ی سیستم‌های دیگر ترجمه می‌شود"
    پایان
پایان
خروجیزمان ترجمه و زمان اجرا هم‌نظرند: true این سطر روی همه‌ی سیستم‌های دیگر ترجمه می‌شود
نیازچه به کار ببرید
نشان دادن سیستم در گزارشنام سیستم عامل، معماری
انتخاب مقداری که از سیستمی به سیستم دیگر فرق می‌کندویندوز است، مک است، لینوکس است
صدا زدن کدی که فقط روی یک سیستم ترجمه می‌شوداگر سلام سیستم ویندوز: و ثابت‌های دیگر
تصمیم درباره‌ی این‌که چند کار هم‌زمان انجام شودتعداد پردازنده
تصمیم درباره‌ی مقدار حافظه‌ی مصرفیکل حافظه، حافظه موجود

تابع‌ها

لینوکس است IsLinux

تابع لینوکس است(): منطقی
روی لینوکس درست است.
os-platform-OS.salam
واردسازی سیستم عامل.سکو

تابع ریشه:
    شناخته := سکو.لینوکس است() یا سکو.ویندوز است() یا سکو.مک است() یا سکو.فری‌بی‌اس‌دی است() یا سکو.بی‌اس‌دی است() یا سکو.اندروید است() یا سکو.وب‌اسمبلی است()
    سرچاپ شناخته، سکو.نام سیستم عامل().طول() > ۰
    معماری := سکو.ایکس۶۴ است() یا سکو.آرم۶۴ است() یا سکو.ایکس۸۶ است() یا سکو.آرم است()
    سرچاپ معماری، سکو.معماری().طول() > ۰
    سرچاپ سکو.تعداد پردازنده() >= ۱
    سرچاپ سکو.کل حافظه() > ۰، سکو.حافظه موجود() <= سکو.کل حافظه()
پایان
خروجیtrue true true true true true true

ویندوز است IsWindows

تابع ویندوز است(): منطقی
روی ویندوز درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

مک است IsMac

تابع مک است(): منطقی
روی مک درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

بی‌اس‌دی است IsBSD

تابع بی‌اس‌دی است(): منطقی
روی خانواده‌ی BSD درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

فری‌بی‌اس‌دی است IsFreeBSD

تابع فری‌بی‌اس‌دی است(): منطقی
روی FreeBSD درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

اندروید است IsAndroid

تابع اندروید است(): منطقی
روی اندروید درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

وب‌اسمبلی است IsWasm

تابع وب‌اسمبلی است(): منطقی
وقتی برنامه به وب‌اسمبلی ترجمه شده باشد درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

نام سیستم عامل OS

تابع نام سیستم عامل(): رشته
نام سیستم عامل: linux، mac، windows، freebsd، android، wasm یا unknown. هنگام ترجمه ثابت می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

ایکس۶۴ است IsX64

تابع ایکس۶۴ است(): منطقی
روی پردازنده‌ی ۶۴ بیتی اینتل و AMD درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

آرم۶۴ است IsArm64

تابع آرم۶۴ است(): منطقی
روی پردازنده‌ی ۶۴ بیتی آرم، مثل Apple Silicon، درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

ایکس۸۶ است IsX86

تابع ایکس۸۶ است(): منطقی
روی پردازنده‌ی ۳۲ بیتی اینتل درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

آرم است IsArm

تابع آرم است(): منطقی
روی پردازنده‌ی ۳۲ بیتی آرم درست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

معماری Arch

تابع معماری(): رشته
نام معماری پردازنده: x64، arm64، x86، arm، wasm یا unknown.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

تعداد پردازنده CpuCount

تابع تعداد پردازنده(): صحیح
تعداد پردازنده‌های منطقی روشن (رشته‌های ابرریسمانی هم شمرده می‌شوند)، برای تعیین تعداد کارهای هم‌زمان؛ اگر پیدا نشود -۱. درون کانتینر تعداد کل دستگاه است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

کل حافظه TotalMemory

تابع کل حافظه(): صحیح۶۴
کل حافظه‌ی سیستم بر حسب بایت، یا -۱ اگر نامعلوم باشد. روی ویندوز هر بار PowerShell را اجرا می‌کند، پس یک بار صدایش بزنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam

حافظه موجود AvailableMemory

تابع حافظه موجود(): صحیح۶۴
حافظه‌ای که برنامه‌های تازه می‌توانند بگیرند، بر حسب بایت (MemAvailable در لینوکس). فقط روی لینوکس و ویندوز پشتیبانی می‌شود؛ روی بقیه منفی یک برمی‌گرداند. روی ویندوز هر بار PowerShell را اجرا می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam