درس ۴۷ از ۴۹ · مرجع

واژه‌نامه‌ی فارسی و انگلیسی

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

یک برنامه، دو زبان

این دو برنامه یکی‌اند و خروجی یکسانی دارند:

functions.salam
تابع فیبوناچی(ن: صحیح): صحیح:
    اگر ن < ۲:
        برگشت ن
    پایان
    برگشت فیبوناچی(ن - ۱) + فیبوناچی(ن - ۲)
پایان

تابع ریشه:
    تکرار ۱۰ در ک:
        چاپ فیبوناچی(ک), ""
    پایان
    سرچاپ ""
پایان
خروجی0 1 1 2 3 5 8 13 21 34
functions_en.salam
func fibonacci(n: int): int:
    if n < 2:
        ret n
    end
    ret fibonacci(n - 1) + fibonacci(n - 2)
end

func main:
    repeat 10 in i:
        print fibonacci(i), ""
    end
    println ""
end
خروجی0 1 1 2 3 5 8 13 21 34

فرمان salam translate en برنامه.salam کد فارسی را به انگلیسی برمی‌گرداند و salam translate fa برعکس. این فرمان واژه‌های کلیدی، گونه‌ها، تابع ورودی و روش‌های درون‌ساخت را بازنویسی می‌کند. مترجم زبان هر پرونده را از واژه‌های کلیدی‌اش می‌فهمد و هر پرونده سراسر به یک زبان است: در پرونده‌ی فارسی نگارش انگلیسی نام‌های درون‌ساخت خطاست و پیام خطا نام فارسی‌اش را می‌گوید.

واژه‌های کلیدی

فارسیانگلیسیفارسیانگلیسی
تابعfuncبرگشتret
ریشهmainپایانend
اگرifوگرنهelse
تکرارrepeatتاuntil / to
هرeach / byدرin
بشکنbreakگذرcontinue
همخوانmatchترابردswitch
ناپایاmutپایاconst
ساختارstructجداشمارenum
گونهtypeمیانجیinterface
کاربستimplبرon
همگانیpubاینthis
برگردانasدیرکنdefer
درستtrueنادرستfalse
پوچnullورودیinput
چاپprintسرچاپprintln
نادرست‌چاپprinterrنادرست‌سرچاپprinterrln
وandیاor
وارونهnotبرابر / نابرابرeq / neq
کوچکتر / بزرگترlt / gtکوچکتربرابر / بزرگتربرابرlte / gte
بستهpackageواردسازیimport
فراخوانیincludeدرون‌دادextern
برون‌دادexportصفحهpage
بخشcomponentنابpure
درخطinlineنادرخطnoinline
نابرگشتnoretبی‌کارهdeprecated

واژه‌های مقایسه‌ای برابر، نابرابر، کوچکتر، بزرگتر، کوچکتربرابر و بزرگتربرابر به جای ==، !=، <، >، <= و >= می‌نشینند و هر دو شکل در هر دو زبان کار می‌کنند. تا در آغاز دستور همان until است و درون سرآیند تکرار همان to؛ هر هم در آغاز دستور each است و درون سرآیند تکرار گام by. ریشه واژه‌ی کلیدی نیست، نام تابعی است که برنامه از آن شروع می‌شود و در انگلیسی main نام دارد. صفحه فقط در آغاز سطری که به دونقطه ختم می‌شود واژه‌ی کلیدی است، مثل صفحه:، و جای دیگر یک نام معمولی است. واژه‌هایی که نیم‌فاصله دارند، مثل درون‌داد، را با فاصله هم می‌شود نوشت، اما چسبیده نه.

واژه‌های جایگاهی

این واژه‌ها فقط در جایگاه خاصی کلیدی‌اند و جای دیگر می‌شود آن‌ها را نام گذاشت:

فارسیانگلیسیفارسیانگلیسی
ایستاstaticپیوندlink
پویاdynamicچارچوبframework
شاملuseپویاdyn
ناپایا تابعmut funcتعریف‌شدهdefined

ایستا هم در ایستا تابع می‌آید و هم در پیوند ایستا. پویا دو کار دارد: پس از پیوند یعنی dynamic و پیش از گونه‌ی یک میانجی یعنی dyn. تعریف‌شده(نام) مال ترجمه‌ی شرطی است.

گونه‌ها

فارسیانگلیسیفارسیانگلیسی
تهیvoidمنطقیbool
نویسهcharیونیکدuchar
رشتهstrصحیح / صحیح۳۲int / i32
صحیح۸ / صحیح۱۶i8 / i16صحیح۶۴i64
طبیعی / طبیعی۳۲uint / u32طبیعی۸ / طبیعی۱۶u8 / u16
طبیعی۶۴u64اندازه مثبتusize
صحیح۱۲۸i128طبیعی۱۲۸u128
اندازهsizeاعشار / اعشار۳۲float / f32
اعشار۶۴f64وکتورVector
نگاشتHashMapپیمایشگرنگاشتMapIter
پروندهFileگوناگونVariant
تابعfunc (در جایگاه گونه)پویاdyn

در گونه‌های اعشاری دقت کنید: اعشار به‌تنهایی همان float سی‌ودو بیتی است و عددی مثل ۲.۵ از گونه‌ی اعشار۶۴. رقم‌های نام گونه می‌توانند فارسی یا لاتین باشند، پس صحیح۶۴ و صحیح64 یک گونه‌اند.

تابع‌های درون‌ساخت

چند تابع بدون واردسازی در دسترس‌اند. برنامه‌ی فارسی باید نام فارسی آن‌ها را به کار ببرد:

فارسیانگلیسیفارسیانگلیسی
طولlenاندازه‌گونهsizeof
آرگومان‌هاargsمتغیر‌محیطیenv
زبانlangدرهمhash
کدنویسهchar_codeنویسه‌ازکدchar_from_code
نخ‌سازspawnنخ‌پیوندjoin
فراخوان‌دستگیرهcallhandlerاتمی‌بخوانatomic_load
اتمی‌بنویسatomic_storeاتمی‌بیفزاatomic_add
اتمی‌جابجاatomic_swapاتمی‌مقایسهatomic_cas

کار با پرونده و محیط در کتابخانه‌ی استاندارد است: open همان fs.Open است (import fs)، env همان os.Env، args همان os.Args، listdir همان os.ListDir و strcmp همان str.Equals یا مقایسه‌ی مستقیم رشته‌هاست. listdir و strcmp دیگر تابع آزاد نیستند.

بیشترشان را در درس‌های پیش دیده‌اید: طول روی آرایه و رشته، نخ‌ساز و نخ‌پیوند در درس کار همزمان. اندازه‌گونه یک گونه می‌گیرد، کدنویسه کد نخستین نویسه‌ی یک رشته را می‌دهد و زبان() به برنامه می‌گوید کد خودش به چه زبانی نوشته شده است. این نمونه چند تا از آن‌ها را همراه چند روش درون‌ساخت نشان می‌دهد:

kw-builtins.salam
تابع ریشه:
    واژه := "salam"
    سرچاپ زبان()، طول(واژه)، اندازه‌گونه(صحیح۶۴)
    سرچاپ کدنویسه("A")، نویسه‌ازکد(۶۶)، "ab" < "ac"

    ناپایا نام‌ها := وکتور {} برگردان وکتور<رشته>
    دیرکن نام‌ها.آزادکن()
    نام‌ها.بیفزا("sara")
    نام‌ها.بیفزا("reza")
    سرچاپ نام‌ها.طول()، نام‌ها.بگیر(۱)، نام‌ها.دربیاور()

    ناپایا سن‌ها := نگاشت {} برگردان نگاشت<رشته، صحیح>
    دیرکن سن‌ها.آزادکن()
    سن‌ها.درج("sara"، ۳۱)
    سرچاپ سن‌ها.دارد("sara")، سن‌ها.بگیر("sara")، سن‌ها.اندازه()

    متن := "  hello world  ".پیراست()
    سرچاپ متن.شروع با("hello")، متن.بیاب("world")، متن.زیررشته(۰، ۵)
    سرچاپ "سلام".طول()، "سلام".شمارنویسه()
پایان
خروجیfa 5 8 65 B true 2 reza reza true 31 1 true 6 hello 8 4

روش‌های درون‌ساخت

رشته، وکتور، نگاشت، پرونده و پیمایشگر نگاشت روش‌هایی دارند که در خود زبان ساخته شده‌اند و نگارش فارسی هم دارند:

فارسیانگلیسیفارسیانگلیسی
بیفزاpushدربیاورpop
بگیرgetارجاعref
بنشانsetطولlen
ظرفیتcapآزادکنfree
درجputداردhas
حذفremoveاندازهsize
پیمایشiterداردبعدیhas_next
کلیدkeyمقدارvalue
بعدیnextخواندنread
خواندن خطreadlineنوشتنwrite
جابجاییseekببندclose
پیوستconcatزیررشتهsubstr
بیابfindبشکافsplit
پیراستtrimبه صحیحto_int
به اعشارto_floatشمارنویسهchar_count
نویسه شمارهchar_atزیررشته نویسهchar_substr
بیاب نویسهchar_findشروع باstarts_with
ختم باends_withدربرداردincludes
رونوشتcopyرونوشت عمیقdeep_copy

دو تا از این‌ها بایت می‌شمارند نه حرف: طول و بیاب روی بایت‌های رشته کار می‌کنند، پس "سلام".طول() برابر 8 است. برای کار حرف به حرف از شمارنویسه، نویسه شماره و بیاب نویسه استفاده کنید، همان‌طور که خط آخر نمونه‌ی بالا نشان می‌دهد.

ثابت‌های زمان ترجمه

ثابت‌های ترجمه‌ی شرطی هم نام فارسی دارند و برنامه‌ی فارسی باید همان‌ها را بنویسد:

فارسیانگلیسیفارسیانگلیسی
سلام سیستم ویندوزSALAM_OS_WINDOWSسلام سیستم ویندوز۶۴SALAM_OS_WIN64
سلام سیستم ویندوز۳۲SALAM_OS_WIN32سلام سیستم وب‌اسمبلیSALAM_OS_WASM
سلام سیستم اندرویدSALAM_OS_ANDROIDسلام سیستم لینوکسSALAM_OS_LINUX
سلام سیستم مکSALAM_OS_MACسلام سیستم بی‌اس‌دیSALAM_OS_BSD
سلام سیستم فری‌بی‌اس‌دیSALAM_OS_FREEBSDسلام سیستم اوپن‌بی‌اس‌دیSALAM_OS_OPENBSD
سلام سیستم نت‌بی‌اس‌دیSALAM_OS_NETBSDسلام سیستم یونیکسSALAM_OS_UNIX
سلام سیستم یوئی‌اف‌آیSALAM_OS_UEFIسلام سیستم سلامSALAM_OS_SALAMOS
سلام معماری ایکس۶۴SALAM_ARCH_X64سلام معماری ایکس۸۶SALAM_ARCH_X86
سلام معماری آرم۶۴SALAM_ARCH_ARM64سلام معماری آرمSALAM_ARCH_ARM
سلام معماری ریسک‌وی۶۴SALAM_ARCH_RISCV64
سلام معماری وب‌اسمبلیSALAM_ARCH_WASMسلام اشکال‌زدایی حافظهSALAM_MEM_DEBUG
سلام پاک‌ساز نشانیSALAM_ASANسلام ایمنSALAM_SAFE
سلام خودایستاSALAM_FREESTANDINGسلام هستهSALAM_KERNEL
سلام جاوااسکریپتSALAM_JSسلام سیستمSALAM_OS
سلام معماریSALAM_ARCHسلام نگارشSALAM_VERSION
سلام کد نگارشSALAM_VERSION_CODEسلام کامیت گیتSALAM_GIT_COMMIT
سلام تاریخ گیتSALAM_GIT_DATEسلام گیت ناپاکSALAM_GIT_DIRTY
سلام تاریخ ساختSALAM_BUILD_DATE

سلام جاوااسکریپت فقط وقتی وجود دارد که برنامه به جاوااسکریپت ترجمه شود، پس به جای آزمودن مستقیمش بپرسید تعریف‌شده(سلام جاوااسکریپت). سلام گیت ناپاک متن است و برای مترجمی که از کد ثبت‌نشده ساخته شده "-dirty" است.

بسته‌های کتابخانه‌ی استاندارد و تابع‌هایشان هم نام فارسی دارند، مثل رشته برای str و ریاضی.جذر برای math.Sqrt. صفحه‌ی هر بسته در مرجع کتابخانه هر دو نام را دارد.