Codoloper

آموزش برنامه‌نویسی به فارسی

یاد بگیر، پیشرفت کن، بساز.

منبع آموزشی برنامه‌نویسی به زبان فارسی - مستندات، دوره‌ها و مطالب کاربردی برای همه سطوح.

داکیومنت ها:

JavascriptJetpack ComposeHTMLCSSبیشتر
1// برنامه‌نویسی به فارسی
2import { learn } from 'codoloper'
3
4const developer = learn({
5"lang": "فارسی"
6"level": "همه سطوح"
7free: true
8})
240+
صفحه مستندات
6+
زبان ها / فریمورک ها
رایگان
دسترسی کامل
چرا کدلپر؟

ارزش‌های ما

یادگیری برنامه‌نویسی نباید پیچیده باشد - ما مسیر را ساده می‌کنیم.

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

مطالب جدید

تازه‌ترین مطالب آموزشی و خبرهای مرتبط.

مدل پیش‌فرض چت‌جی‌پی‌تی عوض شد: GPT-5.5 Instant جای GPT-5.3 رو گرفت نوشته شده توسط عرفان دهقانی

مدل پیش‌فرض چت‌جی‌پی‌تی عوض شد: GPT-5.5 Instant جای GPT-5.3 رو گرفت

اگه این چند روز یه سوال ساده از چت‌جی‌پی‌تی پرسیده باشی و جوابش یه‌کم کوتاه‌تر و دقیق‌تر از قبل به نظر رسیده، تخیلاتت دروغ نگفته. OpenAI مدل پیش‌فرض Instant رو از GPT-5.3 به GPT-5.5 تغییر داده، و این یعنی برای صدها میلیون کاربری که هر روز بدون انتخاب مدل خاصی فقط سوال می‌پرسند، تجربه‌ی استفاده عوض شده، چه متوجه باشند چه نباشند.

نکته‌ی اصلی که OpenAI روی آن تاکید دارد، کاهش توهم (hallucination) است. طبق اعلام خودشان، روی پرامپت‌های حساس در حوزه‌هایی مثل پزشکی، حقوق و مالی، تعداد ادعاهای اشتباه مدل ۵۲.۵ درصد کمتر از نسخه‌ی قبلی شده. روی مکالماتی که کاربران قبلاً خودشان به‌خاطر اشتباه فکتی فلگ کرده بودند، این عدد ۳۷.۳ درصد است. این چیزی نیست که فقط روی کاغذ خوب به نظر برسد؛ برای کسی که از چت‌جی‌پی‌تی برای کارهای واقعی استفاده می‌کند، یعنی کمتر مجبور است هر جواب را دوباره چک کند.

در آزمون‌های استاندارد هم پیشرفت محسوس است: روی GPQA (سوالات سطح دکترا در علوم) دقت از ۷۸.۵ به ۸۵.۶ درصد رسیده، روی AIME 2025 (مسائل ریاضی سطح مسابقه) از ۶۵.۴ به ۸۱.۲ درصد، و روی MMMU-Pro که استدلال چندوجهی (تصویر + متن) را می‌سنجد، از ۶۹.۲ به ۷۶ درصد. روی OmniDocBench هم که دقت تشخیص اسناد را اندازه می‌گیرد، نرخ خطا کمتر شده، که برای هرکسی که از این مدل برای خواندن عکس یا اسکن سند استفاده می‌کند خبر خوبی است.

یک چیز که توی نمونه‌های منتشرشده جالب بود این بود که مدل جدید همیشه از همان ابتدا درست جواب نمی‌دهد، اما در مسیر حل مسئله خودش را بیشتر چک می‌کند. در یکی از مثال‌های ریاضی که OpenAI منتشر کرده، هر دو مدل ابتدا یک پاسخ نادرست را تایید می‌کنند، اما GPT-5.5 وقتی متوجه می‌شود جواب با معادله‌ی اصلی جور نیست، برمی‌گردد، اشتباه جبری را پیدا می‌کند، و معادله را درست حل می‌کند؛ در حالی که نسخه‌ی قبلی زودتر تسلیم می‌شود و نتیجه می‌گیرد جوابی وجود ندارد. این دقیقاً همان چیزی است که از یک مدل «بهتر» انتظار داری: نه این‌که هیچ‌وقت اشتباه نکند، بلکه این‌که اشتباهش را خودش پیدا کند.

کم‌حرف‌تر شده، نه کم‌محتوا

OpenAI روی این موضوع هم تاکید زیادی دارد که جواب‌ها کوتاه‌تر و کمتر فرمت‌زده شده‌اند؛ یعنی کمتر بولت‌پوینت، کمتر هدر اضافه، کمتر سوال تکمیلی غیرضروری در انتهای جواب. در یکی از مثال‌های منتشرشده (یک سوال ساده درباره‌ی نحوه‌ی صحبت با یک همکار پرحرف)، پاسخ مدل جدید حدود ۳۰ درصد کوتاه‌تر بوده، بدون این‌که چیزی از کاربردی بودن جواب کم شود. اگر تا الان از طولانی‌شدن بی‌دلیل جواب‌های چت‌جی‌پی‌تی خسته شده بودی، این بخش از آپدیت احتمالاً برایت ملموس‌تر از هر بنچمارکی خواهد بود.

شخصی‌سازی بیشتر، با کنترل بیشتر

بخش دیگری از این به‌روزرسانی به نحوه‌ی استفاده از تاریخچه‌ی مکالمات، فایل‌ها، و در صورت اتصال، جیمیل مربوط می‌شود. مدل جدید سریع‌تر تشخیص می‌دهد که چه زمانی شخصی‌سازی به جواب کمک می‌کند و چه زمانی نه، و چه‌بسا لازم نباشد چیزی را که قبلاً گفته‌ای دوباره تکرار کنی.

همراه این تغییر، یک قابلیت به اسم «منابع حافظه» (memory sources) هم به همه‌ی مدل‌ها اضافه شده: می‌توانی ببینی هر پاسخ شخصی‌سازی‌شده دقیقاً از چه چیزی (مکالمه‌ی قبلی، فایل، یا حافظه‌ی ذخیره‌شده) استفاده کرده، و در صورت نیاز آن را حذف یا اصلاح کنی. این یعنی شخصی‌سازی دیگر یک جعبه‌ی سیاه نیست؛ هرچند OpenAI خودش هم گفته این نمایش هنوز کامل نیست و ممکن است همه‌ی منابعی که واقعاً استفاده شده‌اند را نشان ندهد.

از کی در دسترسه

GPT-5.5 Instant از همین حالا به‌عنوان مدل پیش‌فرض برای همه‌ی کاربران چت‌جی‌پی‌تی فعال شده و در API هم با نام chat-latest در دسترس است. کاربرانی که پلن پولی دارند، تا سه ماه دیگر همچنان می‌توانند از طریق تنظیمات مدل به GPT-5.3 Instant دسترسی داشته باشند، قبل از این‌که این نسخه کاملاً بازنشسته شود.

شخصی‌سازی پیشرفته‌تر (با فایل‌ها و جیمیل) فعلاً برای کاربران Plus و Pro روی وب در حال رول‌اوت است و به‌زودی به موبایل و بقیه‌ی پلن‌ها هم می‌رسد. قابلیت منابع حافظه هم به‌مرور برای همه‌ی پلن‌ها فعال می‌شود، با این تفاوت که سرعت دسترسی ممکن است بسته به منطقه‌ی جغرافیایی فرق کند.

تفاوت React Element، JSX Element و React Node چیست؟ نوشته شده توسط Haleh Nakisa

تفاوت React Element، JSX Element و React Node چیست؟

اگر در حال توسعه پروژه‌های ری‌اکت یا نکست‌جی‌اس با TypeScript هستید، قطعا موقع نوشتن کامپوننت‌ها یا تعریف تمپلیت‌ها، به این سه تایپ (Type) برخوردید: ReactNode ،ReactElement و JSX.Element.

در این مقاله می‌خوایم به زبون ساده و با مثال‌های واقعی بررسی کنیم که این سه مفهوم دقیقاً چی هستن، چه تفاوتی با هم دارن و در چه سناریویی باید از کدومشون استفاده کنیم.
۱. مفهوم React Element:
یک React Element کوچک‌ترین واحد سازنده در یک اپلیکیشن ری‌اکت هستش. از نظر فنی، این تایپ یک شیء (Object) ساده و جاوااسکریپتیه که توصیف می‌کنه یک جزء از پورتال یا UI شما چطور باید به نظر برسه (مثلاً نوعش چیه، چه Propsهایی داره و فرزندانش کدوم هستن).
وقتی شما یک کامپوننت یا تگ HTML رو می‌نویسین، ری‌اکت در پشت صحنه اون رو به یک الگو تبدیل می‌کنه.
چه زمانی تولید می‌شه؟ هر زمانی که تابع React.createElement() فراخوانی شه.
ویژگی مهم: این تایپ نمی‌تونه شامل متن ساده (String)، عدد یا آرایه باشه؛ بلکه فقط و فقط یک آبجکت معتبر ری‌آکتیه.

// این یک ReactElement است
const element: React.ReactElement = <h1>سلام کادولوپر!</h1>; 

// این خطا ایجاد می‌کند چون رشته متنی به تنهایی ReactElement نیست
const invalidElement: React.ReactElement = "Hello World"; // Error!
۲. مفهوم JSX.Element:
JSX.Element و React Element: این دو تقریباً یک چیز هستن! در واقع JSX.Element یک متغیر سراسری (Global) هستش که توسط خود زبان جاوااسکریپت/تایپ‌اسکریپت (درست خارج از هسته ری‌اکت) تعریف میشه تا خروجی سینتکس‌های JSX رو تایپ‌دهی کنه. از نظر ساختاری، JSX.Element چیزی نیست بجز یک اینترفیس که مستقیماً از ReactElement ارث‌بری می‌کنه، اما با این تفاوت که تایپِ فیلدهای props و type اون به صورت پیش‌فرض any در نظر گرفته شده تا منعطف‌تر باشه.
// هر دو خط زیر از نظر عملکردی کاملاً یکسان هستند:
const buttonOne: React.ReactElement = <button>کلیک کنید</button>;
const buttonTwo: JSX.Element = <button>کلیک کنید</button>;
۳. مفهوم React Node:
می‌رسیم به بزرگ‌ترین تایپ در ری‌آکت: React Node.
تایپ ReactNode در واقع یک ابرمجموعه (Superset) هستش؛ یعنی هر چیزی که ری‌آکت توانایی رندر کردن اون رو روی صفحه داشته باشه، زیرمجموعه ReactNode قرار می‌گیره. به تعریف تایپ اون در هسته ری‌آکت نگاه کنید:
type ReactNode = ReactElement | string | number | Iterable<ReactNode> | ReactPortal | boolean | null | undefined;
همون‌طور که می‌بینید، یک ReactNode می‌تونه یک آبجکت ری‌اکتی، یک متن ساده، یک عدد، آرایه‌ای از المان‌ها، یا حتی مقادیر خالی مثل null و undefined باشه.
// تمام موارد زیر به عنوان ReactNode کاملاً معتبر هستند:
const nodeText: React.ReactNode = "یک متن ساده";
const nodeNumber: React.ReactNode = 1405;
const nodeElement: React.ReactNode = <div>یک المان کامپوننت</div>;
const nodeNull: React.ReactNode = null;
کجا از کدوم استفاده کنیم؟
الان که با ماهیت هرکدوم آشنا شدیم، بیاید ببینیم در پروژه‌های واقعی (مخصوصا موقع تعریف ابزارهای کاستوم و پروژه‌های تیمی) بهترین انتخاب کدوم میشه.
سناریوی اول: تعریف فیلد children در کامپوننت‌ها (Best Practice: ReactNode)
اگر در حال ساخت یک کامپوننتِ Wrapper مثل دکمه‌های عمومی، Layout اصلی سایت یا کامپوننت‌های Card هستید که قراره محتوای مختلفی درون خودش جا بده، همیشه از ReactNode استفاده کنید. این کار به بقیه برنامه‌نویسها اجازه میده تا هر چیزی (از متن ساده تا چند تگ تو در تو) رو داخل کامپوننت شما بفرستند:
type LayoutProps = {
  children: React.ReactNode; // بهترین انتخاب برای دریافت هر نوع محتوا
};

export default function Layout({ children }: LayoutProps) {
  return <main className="main-container">{children}</main>;
}
سناریوی دوم: محدود کردن خروجی به تگ‌های ساختاریافته (Best Practice: ReactElement)
تصور کنید در حال ساخت کامپوننتی به نام List هستید و می‌خواید کاربر فقط و فقط تگ‌های <ListItem /> رو به عنوان فرزند ارسال کنه و اجازه نداشته باشه رشته متنی ساده یا عدد خالی بفرسته. در این سناریو، ReactElement انتخاب بهتری هست:
type ListProps = {
  // کاربر نمی‌تواند متن ساده بفرستد، حتماً باید یک کامپوننت یا تگ معتبر باشد
  children: React.ReactElement; 
};
سناریوی سوم: تایپ‌دهی خروجی توابع یا هوک‌های کاستوم (Best Practice: JSX.Element)
اگر متدی نوشتید که وظیفه‌ش تولید و برگردوندن یک قطعه کد HTML یا کامپوننت هستش، تعیین JSX.Element به عنوان تایپ خروجی، خوانایی کد شما رو بالا می‌بره و مشخص می‌کنه که خروجی این تابع یک سینتکس JSX هستش:
const renderStatusIcon = (status: string): JSX.Element => {
  if (status === "success") return <SuccessIcon />;
  return <ErrorIcon />;
};
جمع‌بندی
انتخاب درست بین این سه تایپ، بستگی به میزان سخت‌گیری یا انعطاف‌پذیری لازم در کدهای شما داره. اگر دنبال انعطاف زیاد برای رندر انواع داده‌ها باشید، ReactNode انتخاب خوبیه. اما اگر می‌خواید ساختار رو محدود به آبجکت‌های معتبر طراحی UI کنید، ReactElement و JSX.Element بهترین گزینه‌ها هستن.
شما در پروژه‌های خودتون بیشتر با کدوم‌ از این تایپ‌ها سر و کار دارید؟ تا حالا به خاطر استفاده جابجا از اون‌ها به باگ‌های تایپ‌اسکریپتی خوردید؟ تجربیات خودتون رو در بخش نظرات با ما در میون بذارید!
انواع API ها - REST، GraphQL، gRPC: کدومش رو واقعاً باید انتخاب کنی؟ نوشته شده توسط عرفان دهقانی

انواع API ها - REST، GraphQL، gRPC: کدومش رو واقعاً باید انتخاب کنی؟

یه روز یکی از بچه‌های تیم اومد گفت «بیا کل بک‌اند رو GraphQL کنیم، REST قدیمیه». دو هفته بعد، همون آدم داشت با N+1 query کلنجار می‌رفت و آرزو می‌کرد کاش همون REST قدیمی رو نگه داشته بودیم. این داستان رو احتمالاً قبلاً جایی شنیدی، چون تقریباً هر تیمی یه نسخه از آن را تجربه کرده.

واقعیت این است که هیچ‌کدام از این سه‌تا «بهتر» نیستند؛ هرکدام برای یک نوع درد طراحی شده‌اند.

REST: همون که همه می‌شناسن

REST رو همه به‌خاطر سادگی‌اش دوست دارن. منبع‌محور است: هر URL یک resource را نشان می‌دهد و متدهای HTTP (GET، POST، PUT، DELETE) کاری که می‌خواهی روی آن انجام دهی را مشخص می‌کنند. کتابخانه‌ها همه‌جا هستند، کش کردن با HTTP caching معمولی کار می‌کند، و هر کسی که یک بار با API کار کرده، REST را بدون توضیح زیاد می‌فهمد.

مشکلش از

 همان‌جایی شروع می‌شود که اپلیکیشن‌ها پیچیده‌تر می‌شوند. فرض کن صفحه‌ی پروفایل کاربر را داری که هم اطلاعات کاربر، هم پست‌های اخیرش، هم تعداد فالوورها را نیاز دارد. در REST کلاسیک، این می‌شود سه (یا بیشتر) درخواست جدا، یا یک endpoint سفارشی که فقط برای همین صفحه ساخته‌ای و جای دیگری استفاده نمی‌شود. این پدیده اسم دارد: over-fetching وقتی داده‌ی اضافه می‌گیری، و under-fetching وقتی کم می‌گیری و باید درخواست دوم بزنی.

GET /users/42
GET /users/42/posts?limit=5
GET /users/42/followers/count

برای یک اپ ساده مشکلی نیست. برای یک اپ موبایل با شبکه‌ی ضعیف که هر round-trip اضافه چند صد میلی‌ثانیه هزینه دارد، همین چیزی است که کاربران را اذیت می‌کند.

GraphQL: یک endpoint، دقیقاً همون چیزی که خواستی

GraphQL همین مشکل را حل می‌کند با این ایده که فقط یک endpoint داشته باشی، و کلاینت دقیقاً مشخص کند چه فیلدهایی را می‌خواهد:

query {
  user(id: 42) {
    name
    posts(limit: 5) { title }
    followersCount
  }

یک درخواست، دقیقاً داده‌ای که لازم داری، نه کمتر نه بیشتر. تیم‌های فرانت‌اند معمولاً عاشق این می‌شوند چون دیگر برای هر تغییر کوچک در UI نباید از بک‌اند بخواهند یک endpoint جدید بسازد.

اما این آزادی قیمتی دارد. همان مثال N+1 که اول گفتم: اگر برای هر post بخواهی اطلاعات نویسنده‌اش را هم بگیری، resolver پیش‌فرض می‌تواند به‌ازای هر پست یک کوئری جدا به دیتابیس بزند. ده پست یعنی ده کوئری اضافه. راه‌حلش وجود دارد (مثل DataLoader برای batch کردن)، ولی این یعنی یک لایه‌ی پیچیدگی که در REST اصلاً مجبور نبودی به آن فکر کنی. کش کردن هم سرراست نیست؛ چون همه‌چیز از یک endpoint با متد POST می‌آید، کش‌های HTTP معمولی که برای REST جا افتاده‌اند، اینجا کار نمی‌کنند و باید کش را خودت در سطح اپلیکیشن مدیریت کنی.

gRPC: وقتی سرعت بین سرویس‌ها مهم‌تر از خوانایی است

gRPC داستان متفاوتی دارد. این یکی اصلاً برای مرورگر طراحی نشده (هرچند gRPC-Web هم هست)؛ هدف اصلی‌اش ارتباط بین سرویس‌ها در یک سیستم میکروسرویس است. به‌جای JSON متنی، از Protocol Buffers استفاده می‌کند که باینری و فشرده است، و روی HTTP/2 کار می‌کند که چندین استریم را روی یک کانکشن همزمان می‌برد.

نتیجه‌اش سرعت است؛ هم در حجم داده، هم در latency. قیمتش این است که دیگر نمی‌توانی با مرورگر یا curl ساده پاسخ را بخوانی؛ باید فایل .proto را داشته باشی و کد را generate کنی. برای ارتباط بین دو سرویس داخلی که هیچ‌کدام انسان نیست که مستقیم پاسخ را بخواند، این مشکلی نیست. برای یک API عمومی که توسعه‌دهنده‌های بیرونی باید با آن کار کنند، احتمالاً تجربه‌ی بدتری می‌سازد.

پس کدوم رو انتخاب کنیم؟

اگر یک API عمومی یا نسبتاً ساده می‌سازی که کلاینت‌های مختلف (وب، موبایل، شاید حتی توسعه‌دهنده‌های بیرونی) با آن کار می‌کنند و نیازهای داده‌ای‌شان شبیه هم است، REST هنوز انتخاب امن‌تری است. کسی که برای اولین‌بار با API‌ات روبه‌رو می‌شود، سریع‌تر می‌فهمدش.

اگر چند کلاینت با نیازهای داده‌ای خیلی متفاوت داری (مثلاً اپ موبایل که می‌خواهد کمترین داده ممکن را بگیرد، و داشبورد ادمین که می‌خواهد همه‌چیز را یک‌جا ببیند)، GraphQL این مشکل را با هزینه‌ی پیچیدگی بیشتر در بک‌اند حل می‌کند. فقط حواست به N+1 باشد.

و اگر صحبت از ارتباط داخلی بین سرویس‌هاست، جایی که سرعت مهم‌تر از قابل‌خواندن‌بودن است، gRPC معمولاً برنده است.

نکته‌ی آخر: هیچ قانونی نمی‌گوید باید فقط یکی را انتخاب کنی. خیلی از سیستم‌های واقعی، REST را برای API عمومی نگه می‌دارند و gRPC را برای ارتباط داخلی بین سرویس‌ها به کار می‌برند. انتخاب درست همیشه یکی نیست؛ گاهی سه‌تاست، هر کدام جایی که واقعاً مزیت دارد.

زبان برنامه‌نویسی Verse, انقلاب در توسعه متاورس و بازی‌سازی؟ نوشته شده توسط عرفان دهقانی

زبان برنامه‌نویسی Verse, انقلاب در توسعه متاورس و بازی‌سازی؟

دنیای بازی‌سازی و اینترنت سه‌بعدی (متاورس) با سرعتی سرسام‌آور در حال حرکت است. تا پیش از این، توسعه‌دهندگان بازی‌ها مجبور بودند میان زبان‌های پیچیده و سطح پایینی مثل C++ (برای کارایی بالا) یا ابزارهای اسکریپت‌نویسی بصری و محدود، دست به انتخاب بزنند. اما کمپانی اپیک گیمز (Epic Games) با معرفی ابزار Unreal Editor for Fortnite (UEFN) از یک برگ برنده رونمایی کرد: زبان برنامه‌نویسی ورس (Verse).

ورس تنها یک زبان اسکریپت‌نویسی ساده برای یک بازی نیست؛ این زبان با دیدگاهی بلندمدت و با مشارکت دانشمندان بزرگی چون سایمون پیتون جونز (یکی از خالقان اصلی زبان هسکل) طراحی شده تا زبان آیندهٔ وبِ سه‌بعدی و متاورس باشد. در این مقاله، عمیقاً بررسی می‌کنیم که Verse چیست، چه ویژگی‌های منحصربه‌فردی دارد و چرا باید یادگیری آن را از همین امروز شروع کنید.

زبان Verse چیست و چرا متولد شد؟

زبان Verse یک زبان برنامه‌نویسی چندپارادایمی (Multi-Paradigm) است که ویژگی‌های برنامه‌نویسی تابعی (Functional)، منطقی (Logic) و امری (Imperative) را به شکلی نوآورانه با هم ترکیب کرده است. اپیک گیمز این زبان را با سه اصل بنیادی طراحی کرده است:

  1. فقط کد است (It's just code): پیچیده‌ترین مفاهیم بازی و شبیه‌سازی، در قالب ساختارهای اولیه و خوانای متنی بیان می‌شوند.

  2. یک زبان برای همه چیز (Just one language): ساختارهای یکسانی برای زمان کامپایل (Compile-time) و زمان اجرا (Run-time) استفاده می‌شود.

  3. اول متاورس (Metaverse first): این زبان از پایه برای یک محیط شبیه‌سازی جهانی، توزیع‌شده و زنده طراحی شده است؛ جایی که کدهای نوشته شده باید سال‌ها بدون مشکل و با حفظ سازگاری عقب‌رو (Backward Compatibility) اجرا شوند.

ویژگی‌های کلیدی و انقلابی زبان Verse

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

۱. همه چیز یک «عبارت» است (Everything is an Expression)

در زبان‌های سنتی، ما بین دستورات (Statements - مانند حلقه‌ها که مقداری برنمی‌گردانند) و عبارات (Expressions - که مقدار تولید می‌کنند) تفاوت قائل می‌شویم. در Verse این مرز وجود ندارد؛ همه چیز یک عبارت است و یک مقدار تولید می‌کند.

به عنوان مثال، یک شرط ساده یا حتی یک حلقه در ورس می‌تواند مستقیماً به یک متغیر نسبت داده شود:

Result := if (Condition[]) then "yes" else "no"
Multiply := for (X : Array) { X * 42 }

این ویژگی باعث می‌شود کدها فوق‌العاده ترکیب‌پذیر (Composable) و خلاصه شوند.

۲. سیستم شکست به جای مقادیر بولی (Failure as Control Flow)

یکی از جذاب‌ترین بخش‌های فنی ورس، سیستم شکست (Failure System) آن است. در ورس چیزی به نام مقدار Boolean (True/False) سنتی برای کنترل جریان برنامه وجود ندارد. در عوض، عبارات یا «موفق» می‌شوند و مقداری را برمی‌گردانند، یا «شکست» می‌خورند.

توابعی که ممکن است شکست بخورند با براکت [] مشخص می‌شوند. اگر عبارتی در یک محیط failable (قابل شکست) اجرا شود و شکست بخورد، تغییرات آن بخش از کد به صورت خودکار به حالت قبل برمی‌گردد (Speculative Execution). این یعنی دیگر نیازی به نوشتن ساختارهای تکراری try-catch برای مدیریت خطاها ندارید.

۳. همزمانی ساختاریافته (Structured Concurrency)

برنامه‌نویسی بازی‌های آنلاین و چندنفره به شدت به مدیریت زمان و رویدادهای همزمان وابسته است. ورس با معرفی مفاهیمی چون sync ،race ،rush و branch برنامه‌نویسی ناهمگام (Async) را به بازیچه تبدیل کرده است. شما می‌توانید چندین کار را به طور همزمان اجرا کنید، مشخص کنید که کدام یک باید منتظر دیگری بماند، یا در صورت برنده شدن یک پردازش در مسابقه (race)، بقیه پردازش‌ها را فوراً لغو کنید؛ همه این‌ها بدون ریزش حافظه یا تداخل‌های رایج شبکه!

جایگاه Verse در اکوسیستم Unreal Editor for Fortnite (UEFN)

در حال حاضر، دروازه ورود به دنیای ورس، ابزار UEFN یا همان محیط توسعه فورتنایت است. پیش از این، کاربران در بخش Fortnite Creative تنها می‌توانستند دستگاه‌های بازی (Devices) را با خطوط بصری و محدود به هم متصل کنند. اما ورس به شما قدرت مطلق می‌دهد.

با استفاده از Verse در UEFN می‌توانید:

  • تعاملات پیچیده بسازید: رفتار بازیکنان، قوانین بازی و محیط را با دقت میلی‌ثانیه‌ای کنترل کنید.

  • منطق‌های داینامیک خلق کنید: بازی‌هایی بسازید که بر اساس وضعیت فعلی جهان بازی یا مشخصات بازیکن، به صورت زنده تغییر می‌کنند.

  • محدودیت ابزارهای بصری را بشکنید: ساخت سیستم‌های امتیازدهی پیشرفته، هوش مصنوعی شخصی‌سازی‌شده برای NPCها و مکانیزم‌های خلاقانه که تا پیش از این غیرممکن بود.

مقایسه اجمالی: Verse در برابر زبان‌های دیگر

ویژگیزبان Verseزبان‌های سنتی (C++/C#)
هدف اصلیشبیه‌سازی متاورس و بازیتوسعه عمومی و سیستم
مدیریت خطاسیستم شکست (Failure Contexts)استثناها (Exceptions / Try-Catch)
نوع پارادایمتابعی - منطقی - امریشیءگرا یا امری
امنیت شبکهبالا و بومی (بدون Desync)نیازمند کدنوسی دستی پیچیده

چگونه یادگیری Verse را شروع کنیم؟

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

گام اول: نصب ابزارها

ابتدا باید نرم‌افزار Epic Games Launcher را نصب کرده و از درون آن Unreal Editor for Fortnite (UEFN) را دریافت کنید. ورس به صورت بومی در این ادیتور ادغام شده است.

گام دوم: استفاده از قالب‌های آماده (Templates)

مستندات رسمی اپیک گیمز شامل پروژه‌های آماده‌ای مانند Verse Starter Template است. با باز کردن این پروژه‌ها، می‌توانید کدهای نوشته شده برای هدایت یک NPC یا تغییر یک دستگاه در بازی را ببینید، آن‌ها را دستکاری کنید و نتیجه را فوراً در بازی مشاهده کنید.

گام سوم: مطالعه منبع اصلی (Book of Verse)

اگر برنامه‌نویس هستید و می‌خواهید مستقیماً به سراغ مفاهیم عمیق مانند سیستم افکت‌ها (Effects)، کلاسیفیکیشن تایپ‌ها (Type System) و مدیریت حافظه بروید، کتاب آنلاین ورس (Book of Verse) که در آدرس verselang.github.io/book در دسترس است، بهترین و دقیق‌ترین مرجع برای شماست.

آینده زبان Verse؛ فراتر از فورتنایت

شاید بپرسید: «آیا ارزش دارد زبانی را یاد بگیرم که فقط در فورتنایت کاربرد دارد؟» پاسخ کوتاه این است: ورس محدود به فورتنایت نخواهد ماند.

تیم سویینی (مدیرعامل اپیک گیمز) بارها اشاره کرده است که هدف نهایی ورس، تبدیل شدن به زبان استاندارد موتور بازی‌سازی Unreal Engine و در نهایت کل اینترنت سه‌بعدی است. پتانسیل این زبان در هندل کردن پروژه‌های MMO (بازی‌های آنلاین انبوه) با هزاران بازیکن در یک سرور واحد، بدون ناهماهنگی (Desync)، توجه بسیاری از نظریه‌پردازان زبان‌های برنامه‌نویسی را جلب کرده است.

کلام آخر

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