سکو os/platform
شناختن سیستمی که برنامه روی آن اجرا میشود: سیستم عامل، معماری پردازنده، تعداد هسته و حافظه.
واردسازی سیستم عامل.سکو
بستهی سکو در زمان اجرا میگوید برنامه روی چه سیستمی است: سیستم عامل، خانوادهی پردازنده، تعداد هستهها و اندازهی حافظه. جای کاربردش گزارش و لاگ، تنظیمهای خودکار مثل تعداد کارگرها یا اندازهی حافظهی نهان، و تفاوتهای کوچک میان سیستمها مثل پسوند پرونده است. برای کدی که فقط روی یک سیستم ترجمه میشود، ثابتهایی مثل سلام سیستم ویندوز و ترجمهی شرطی را به کار ببرید. برای کاربر و پوشهی خانهاش بستهی کاربر و برای متغیرهای محیطی بستهی محیط را ببینید.
تابعهای ... است، نام سیستم عامل و معماری هنگام ترجمه ثابت میشوند و صدا زدنشان هزینهای ندارد. پرسشهای سختافزاری از سیستمِ در حال اجرا پرسیده میشوند و پاسخشان از سیستمی به سیستم دیگر فرق دارد:
| تابع | لینوکس | مک و BSD | ویندوز |
|---|---|---|---|
تعداد پردازنده | sysconf، فوری | اجرای sysctl | متغیر NUMBER_OF_PROCESSORS |
کل حافظه | /proc/meminfo | اجرای sysctl | اجرای PowerShell، اغلب یک ثانیه یا بیشتر |
حافظه موجود | /proc/meminfo | نامعلوم، -۱ | اجرای PowerShell |
اشتباههای رایج: صدا زدن تابعهای حافظه درون حلقه (روی ویندوز هر بار PowerShell راه میافتد، پس یک بار بپرسید و عدد را نگه دارید)، فراموش کردن اینکه هر تابع سختافزاری وقتی نتواند بفهمد -۱ برمیگرداند، و هستهی فیزیکی دانستن تعداد پردازنده. این تابع پردازندههای منطقی روشن را میشمارد، رشتههای ابرریسمانی هم، و درون کانتینر کل دستگاه را.
برنامههای زیر بهجای عددهای خام، درستی یک قاعده را چاپ میکنند تا خروجی روی هر دستگاهی یکسان باشد.
انتخاب تعداد کارگرها
کاری که به تکههای مستقل بخش میشود، مثل کوچک کردن تصویرها، با یک رشته یا فرآیند برای هر هسته سریعتر پیش میرود. تعداد پردازنده شمار هستهها را میدهد. نتیجه را میان یک و سقفی که خودتان میگذارید نگه دارید، چون دستگاهی با ۱۲۸ هسته به این معنا نیست که کار شما ۱۲۸ رشته میخواهد.
واردسازی سیستم عامل.سکو
تابع شمار کارگر(سقف: صحیح): صحیح:
هستهها := سکو.تعداد پردازنده()
اگر هستهها < ۱:
برگشت ۱
پایان
اگر هستهها > سقف:
برگشت سقف
پایان
برگشت هستهها
پایان
تابع ریشه:
کارگرها := شمار کارگر(۸)
سرچاپ "کارگرها میان ۱ و ۸:"، کارگرها >= ۱ و کارگرها <= ۸
سرچاپ "هرگز بیش از هستهها:"، کارگرها <= سکو.تعداد پردازنده()
یکی := شمار کارگر(۱)
سرچاپ "با سقف یک:"، یکی
پایاندرون کانتینر، این عدد مال کل دستگاه است، نه سهمی که کانتینر اجازه دارد. اگر برنامه زیر Docker یا Kubernetes اجرا میشود، بگذارید یک پرچم یا متغیر محیطی آن را تغییر دهد.
اندازهی حافظهی نهان بر پایهی حافظهی سیستم
کل حافظه و حافظه موجود اندازه را بر حسب بایت و به شکل صحیح۶۴ برمیگردانند. حافظهی نهان (cache) میتواند بخشی از کل حافظه را بگیرد، میان یک کف و یک سقف، و هیچگاه بیش از نیمی از حافظهای که همین حالا آزاد است. حافظه موجود روی سیستمهایی که این عدد را نمیدانند منفی یک برمیگرداند، پس پیش از استفاده آن را بررسی کنید.
واردسازی سیستم عامل.سکو
پایا مگابایت := ۱۰۴۸۵۷۶ برگردان صحیح۶۴
تابع اندازه حافظه نهان(): صحیح۶۴:
ناپایا اندازه := سکو.کل حافظه() / ۱۶
اگر اندازه < ۶۴ * مگابایت:
اندازه = ۶۴ * مگابایت
پایان
اگر اندازه > ۱۰۲۴ * مگابایت:
اندازه = ۱۰۲۴ * مگابایت
پایان
آزاد := سکو.حافظه موجود()
اگر آزاد > ۰ و اندازه > آزاد / ۲:
اندازه = آزاد / ۲
پایان
برگشت اندازه
پایان
تابع ریشه:
اندازه := اندازه حافظه نهان()
سرچاپ "حافظهی نهان حداکثر ۱ گیگابایت:"، اندازه <= ۱۰۲۴ * مگابایت
سرچاپ "حافظهی نهان مثبت:"، اندازه > ۰
آزاد := سکو.حافظه موجود()
سرچاپ "در حافظهی آزاد جا میشود:"، آزاد < ۰ یا اندازه <= آزاد
پایانتفاوتهای کوچک میان سیستمها
بیشتر تفاوتهای سیستمها کوچکاند: برنامههای ویندوز به .exe ختم میشوند و هر میزکار پرونده را با فرمان دیگری باز میکند. تابعی که ویندوز است یا مک است را میپرسد و تکهی درست را برمیگرداند، بقیهی برنامه را از این بررسیها خالی نگه میدارد.
واردسازی سیستم عامل.سکو
تابع نام اجرایی(نام: رشته): رشته:
اگر سکو.ویندوز است():
برگشت نام + ".exe"
پایان
برگشت نام
پایان
تابع فرمان بازکردن(): رشته:
اگر سکو.ویندوز است(): برگشت "start" پایان
اگر سکو.مک است(): برگشت "open" پایان
برگشت "xdg-open"
پایان
تابع ریشه:
ناپایا جورها := ۰
اگر سکو.لینوکس است(): جورها += ۱ پایان
اگر سکو.ویندوز است(): جورها += ۱ پایان
اگر سکو.مک است(): جورها += ۱ پایان
اگر سکو.فریبیاسدی است(): جورها += ۱ پایان
اگر سکو.وباسمبلی است(): جورها += ۱ پایان
سرچاپ "حداکثر یک سیستم جور شد:"، جورها <= ۱
سرچاپ "نام پروندهی اجرایی ساخته شد:"، نام اجرایی("salam").شروع با("salam")
سرچاپ "فرمان بازکردن انتخاب شد:"، فرمان بازکردن().طول() > ۰
پایانزمان اجرا یا زمان ترجمه
پاسخ تابعهای این بسته هنگام اجرای برنامه معلوم میشود، پس هر دو شاخهی یک اگر روی همهی سیستمها ترجمه میشوند. اگر یکی از شاخهها تابعی را صدا بزند که فقط روی یک سیستم هست، مثل یک API ویندوز، ترجمه شکست میخورد. آنوقت خود ثابت را به کار ببرید: یک اگر سلام سیستم ویندوز: ساده هنگام ترجمه تصمیم گرفته میشود و شاخهی دیگر کنار گذاشته میشود. فهرست کامل ثابتها در کد زمان ترجمه آمده.
واردسازی سیستم عامل.سکو
تابع لینوکس هنگام ترجمه(): منطقی:
اگر سلام سیستم لینوکس:
برگشت درست
وگرنه:
برگشت نادرست
پایان
پایان
تابع ریشه:
سرچاپ "زمان ترجمه و زمان اجرا همنظرند:"، لینوکس هنگام ترجمه() == سکو.لینوکس است()
اگر سلام سیستم ویندوز:
سرچاپ "این سطر فقط روی ویندوز ترجمه میشود"
وگرنه:
سرچاپ "این سطر روی همهی سیستمهای دیگر ترجمه میشود"
پایان
پایان| نیاز | چه به کار ببرید |
|---|---|
| نشان دادن سیستم در گزارش | نام سیستم عامل، معماری |
| انتخاب مقداری که از سیستمی به سیستم دیگر فرق میکند | ویندوز است، مک است، لینوکس است |
| صدا زدن کدی که فقط روی یک سیستم ترجمه میشود | اگر سلام سیستم ویندوز: و ثابتهای دیگر |
| تصمیم دربارهی اینکه چند کار همزمان انجام شود | تعداد پردازنده |
| تصمیم دربارهی مقدار حافظهی مصرفی | کل حافظه، حافظه موجود |
تابعها
لینوکس است IsLinux
تابع لینوکس است(): منطقیواردسازی سیستم عامل.سکو
تابع ریشه:
شناخته := سکو.لینوکس است() یا سکو.ویندوز است() یا سکو.مک است() یا سکو.فریبیاسدی است() یا سکو.بیاسدی است() یا سکو.اندروید است() یا سکو.وباسمبلی است()
سرچاپ شناخته، سکو.نام سیستم عامل().طول() > ۰
معماری := سکو.ایکس۶۴ است() یا سکو.آرم۶۴ است() یا سکو.ایکس۸۶ است() یا سکو.آرم است()
سرچاپ معماری، سکو.معماری().طول() > ۰
سرچاپ سکو.تعداد پردازنده() >= ۱
سرچاپ سکو.کل حافظه() > ۰، سکو.حافظه موجود() <= سکو.کل حافظه()
پایانویندوز است IsWindows
تابع ویندوز است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam
مک است IsMac
تابع مک است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam
بیاسدی است IsBSD
تابع بیاسدی است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam
فریبیاسدی است IsFreeBSD
تابع فریبیاسدی است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: 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
تابع ایکس۶۴ است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam
آرم۶۴ است IsArm64
تابع آرم۶۴ است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: 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
تابع کل حافظه(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam
حافظه موجود AvailableMemory
تابع حافظه موجود(): صحیح۶۴MemAvailable در لینوکس). فقط روی لینوکس و ویندوز پشتیبانی میشود؛ روی بقیه منفی یک برمیگرداند. روی ویندوز هر بار PowerShell را اجرا میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: os-platform-OS.salam