<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مصطفی جعفری</title>
        <link>https://virgool.io/feed/@mostafajafari</link>
        <description>علاقه‌مند به مباحث مهندسی نرم‌افزار</description>
        <language>fa</language>
        <pubDate>2026-06-16 15:23:57</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/44585/avatar/aEdn31.jpg?height=120&amp;width=120</url>
            <title>مصطفی جعفری</title>
            <link>https://virgool.io/@mostafajafari</link>
        </image>

                    <item>
                <title>چرا راست اینقدر محبوبه؟</title>
                <link>https://virgool.io/@mostafajafari/%DA%86%D8%B1%D8%A7-%D8%B1%D8%A7%D8%B3%D8%AA-%D8%A7%DB%8C%D9%86-%D9%82%D8%AF%D8%B1-%D9%85%D8%AD%D8%A8%D9%88%D8%A8%D9%87-eiygadbgdnx5</link>
                <description>سال 2022 هفتمین سال متوالی بود که زبان راست در نظرسنجی سایت stackoverflow به عنوان محبوب‌ترین زبان برنامه‌نویسی انتخاب می‌شد و 86 درصد از توسعه‌دهندگان علاقه‌مندی خود را به ادامه با این زبان نشان می‌دادند.راست نه تنها ترکیب خاصی از کارایی و امنیت را برای توسعه‌دهندگان فراهم می‌کند بلکه ابزارهایی را نیز در اختیار آنان‎ قرار می‌دهد تا کد را سریع‌تر به محیط محصول انتقال دهند.راست به‌طور رسمی در سال 2015 منتشر شد و از آن زمان تا به امروز تغییرات و به‌روزرسانی‌های زیادی را از سر گذرانده تا تبدیل به محبوب‌ترین زبان برنامه‌نویسان شود. در این مقاله، بحث می‌کنیم که زبان راست چیست و چه مزیت‌هایی دارد و همچنین در چه نوع پروژه‌هایی بیشتر مورد استفاده قرار می‌گیرید.راست یک زبان برنامه‌نویسی چند الگویی و از نوع ایستایی است که متمرکز بر ایمنی و کارایی است. راست از ابتدا با ذهنیت مبتنی بر سرعت، ایمنی و بازدهی بالا ساخته شد.این زبان انتزاع بدون-هزینه، جنریک‌ و یک سری ویژگی‌های کاربردی را ارائه می‌دهد که بیشتر مشکلات دیگر زبان‌های سطح-پایین، مانند خطا‌های حافظه و ساخت برنامه‌های هم‌زمان، را برای توسعه‌دهندگان حل کند.از زبان راست برای توسعه محصولات و وب‌سایت‌های خیلی معروف و بزرگی مانند Password1, Figma, NPM Coursera, Mozilla, Atlassian, Dropbox استفاده شده است.اگر علاقه‌مندید که محصولات شگفت‌انگیز دیگری که با این زبان توسعه پیدا کرده‌اند را ببینید، می‌توانید این لینک را، در سایت رسمی راست، بررسی کنید.توسعه‌دهندگان بیشتر از زبان راست به عنوان یک انتخاب برای برنامه‌نویسی سیستمی یاد می‌کنند زیرا که بیشترین امکان سرعت را با استفاده از منابع بسیار کم ممکن می‌سازد و درعین‌حال ایمنی را در حد یک زبان سروری فراهم می‌کند. این نکته قابل توجه است که راست مشکلات موجود در زبان‌های سی و سی‌پلاس‌پلاس مانند ایمنی (حافظه) و زباله‌روبی را نیز حل می‌کند.خب بیاییم صحبت کنیم که چرا راست در سال‌های اخیر این‌قدر محبوب شده است.مزیت‌های راستانتزاعات بدون-هزینه (zero-cost abstractions)یکی از بهترین ویژگی‌های راست داشتن انتزاعات بدون-هزینه است. به این معنا که شما برای ویژگی‌هایی که استفاده نمی‌کنید هزینه‌ای نمی‌پردازید، پس چه از انتزاعات برای پیاده‌سازی کدتان استفاده کنید یا به‌طور دستی  این کار را انجام دهید، هزینه سرعت، مصرف حافظه و ... یکسان است.راست با داشتن انتزاعات بدون-هزینه، بررسی‌‌های حافظه در زمان کامپایل و استفاده از زباله‌روب‌ها، دیگر حافظه را در زمان‌اجرا (Runtime) بررسی و جمع‎‌آوری نمی‌کند، بلکه طول ‌عمر کد را در زمان کامپایل (compiletime) ردیابی می‌کند. برای مهندسین نرم‌افزار، بسیاری از مسائل مربوط به برنامه‌نویسی سیستم‌ها، خطاهای حافظه هستند. هدف آن‌ها طراحی یک پروژه با مدیریت کیفیت کد، خوانایی و کیفیت کارایی در زمان‌اجرا است.برای انجام این کار، مهندسین سعی می‌کنند که بهینه‌سازی کد و سربار حافظه را محدود کنند، که این امر بخاطر دسترسی غیرمستقیم به حافظه باعث تحت تأثیر قرار گرفتن کارایی در زمان اجرا می‌شود. راست این مشکل را با استفاده از انتزاعات بدون-هزینه حل می‌کند.پشتیبانی ذاتی از هم‌زمانی (concurrency)به زبان ساده هم‌زمانی هنگامی رخ می‌دهد که چندین کپی از یک برنامه در یک زمان اجرا شود و در حین اجرا، کپی‌های برنامه با یکدیگر ارتباط برقرار کنند.راست از ویژگی چند نخی (multi-threading) به‌طور ذاتی و درونی پشتیبانی می‌کند و با استفاده از قواعد «مالکیت (ownership)» و «قرض‌گرفتن (borrowing)» توسعه‌دهندگان را قادر می‌سازد که کد‌های هم‌زمان بهتری بنویسند. این نکته مهم است بدانید که تمامی این‌ها بخاطر این است که راست در زمان کامپایل اجازه به وجود آمدن داده رقابتی (data races) را نمی‌دهد.ارائه مالکیت (ownership) و امنیتبه‌جرئت می‌توان گفت که «مالکیت» منحصربه‌فرد‌ترین ویژگی زبان راست است. این ویژگی، راست را قادر می‌سازد تا ایمنی حافظه (memory safety) را بدون نیاز به زباله‌روب تضمین کند. وقتی در مورد حافظه در زبان‌های برنامه‌نویسی بخصوص از نوع سطح-پایین صبحت می‌کنیم، دو نوع حافظه مورد توجه است: اِستَک (Stack) و هیپ (Heap).استک نوعی از حافظه است که برای تخصیص حافظه پویا، مانند اعداد و رشته‌ها، استفاده می‌شود. هیپ برای حافظه‌ای استفاده می‌شود که ممکن است در آینده تغییر کند، به این معنا که بیشتر توسعه‌دهندگان تخصیص حافظه‌ برای آیتم‌ها را در یک هیپ در نظر می‌گیرند و سپس آن‌ها را در یک استک ارجاع می‌دهند. در مثال زیر مشاهده می‌کنید که برنامه، شی ساخته شده از آیتم Class1 (از نوع حافظه هیپ) را در حافظه استک ارجاع می‌دهد. یکی از مشکلات این روش زمانی است که بخواهیم دو متغیر را به یک قطعه داده در حافظه هیپ ارجاع دهیم.برای حل این مسئله، راست فقط اجازه می‌دهد یک متغیر مالک یک قطعه داده باشد. وقتی‌که داده به یک متغیر دیگر تخصیص پیدا کند، دو اتفاق می‌افتد: یا مالکیت آن داده به متغیر جدید منتقل می‌شود یا از داده یک کپی گرفته می‌شود.در چارچوب بحث امنیت و ایمنی، همیشه از راست به عنوان یکی از برترین زبان‌های متمرکز-بر-ایمنی یاد می‌شود. برخلاف دیگر زبان‌ها، راست مدیریت حافظه را در زمان کامپایل انجام می‌دهد که اغلب از بروز باگ‌ها و خطاهایی که ممکن است بخاطر مدیریت ضعیف حافظه باشد، جلوگیری می‌کند. بنابراین وجود زباله‌روب، در یک برنامه راست، ضرورتی ندارد.البته راست به توسعه‌دهندگان نیز اجازه می‌دهد در شرایطی که بخواهند ایمنی حافظه را خودشان مدیریت کنند، و این کار توسط کامپایلر به آن‌ها متحمل نشود، می‌توانند از کلمه کلیدی unsafe استفاده کنند.داشتن مستندات کامل و جامعمعمولاً راست جز آن دسته از زبان‌های قرار می‌گیرد که فراگیریش کمی دشوار و زمان‌بر است. باوجوداین، توسعه‌دهندگان زیادی از مستندات کامل و جامع راست به عنوان دلیلی برای فراگیری این زبان یاد کردند.تعدادی از افرادی که در نظرسنجی StackOverflow شرکت کرده بودند، برنامه نویسان متوسطی بودند که تازه وارد دنیای راست شده بودند. آن‌ها بیان می‌کردند که استفاده از مستندات، راهی بوده که باعث بهبود و افزایش دانش آن‌ها در مورد این زبان شده است.جامعه در حال رشدزبان‌های برنامه‌نویسی و ابزارها زمانی رشد می‌کنند که کاربران و افراد با آن‌ها تعامل داشته باشند. ازآنجایی‌که Rust محبوبیت زیادی دارد، باعث به وجود آمدن یک حس اجتماعی قوی در بین کاربران خود شده است. و هم‌اکنون تعداد زیادی از کاربران، متخصصین و مشتاقان وجود دارند که تازه‌کاران می توانند با کمک گرفتن از آن‌ها مشکلات و مسائل خود را آسان‌تر حل کنند.در چه پروژه‌هایی از راست استفاده کنیم؟راست برای موارد زیر مناسب است:ساخت سیستم‌های تعبیه‌شده: راست زبانی فوق‌العاده برای ساخت سیستم‌های تعبیه‌شده است بخاطر اینکه ترکیبی از ایمنی، کارایی، کنترل سطح-پایین و پشتیبانی چند سکویی را فراهم می‌کند. مهم‌ترین پروژه‌هایی که با زبان راست در این حوزه توسعه‌ پیدا کرده‌اند، بدین ترتب‌اند:سیستم‌عامل Tock OS: سیستم‌عاملی متن‌باز برای سیستم‌های تعبیه‌شدهابزارهای Dronecode SDK: مجموعه از ابزارهای و کتابخانه‌ها برای توسعه نرم‌افزارهای پهبادیسیستم‌عامل ferrOS: سیستم‌عاملی بلادرنگ برای سیستم‌های تعبیه‌شدهبرنامه‌های بلاک‌چینی: راست زبان پشت‌صحنه بسیاری از برنامه‌های بلاک‌چینی است که این بخاطر توانایی این زبان در پردازش بسیار زیادی درخواست در شبکه، بدون بار محاسباتی یا بسیار کم، است. راست در برنامه‌های بلاک‌چینی زیر مورد استفاده قرار گرفته است:پلتفرم Polkadot: پلتفرمی بلاک‌چینی که از راست برای هسته توسعه خود استفاده کرده است.پلتفرم Parity Ethereum: پیاده‌سازی پروتکل اتریوم با زبان راست.پلفرم Substrate: یک پلتفرم توسعه بلاک‌چین است که کاملا با راست نوشته شده و به توسعه‌دهندگان کمک می‌کند تا پلتفرم بلاک‌چینی سفارشی شده خود را بسازند.موتور مرورگرهای وب: شرکت Mozilla برای نوشتن Servo، موتور مرورگر برای رندرینگ صفحات وب، از راست استفاده کرده است.سیستم‌عامل ها: چند سسیستم‌عامل کامپیوتری کاملاً با راست نوشته‌شده است ازجمله ردوکس، که  یک سیستم‌عامل میکروکرنل شبه یونیکس است و  FireCracker، یک ابزار مجازی‌سازی متن-باز است که برای ساخت کانتینرهای با امنیت بالا و ماشین‌های مجازی، برای رایانش‌های بی‌سرور، استفاده می‌شود.ساخت پروژهای وبی: از راست برای توسعه پروژهای مبتنی بر وب بسیار جالبی استفاده شده و از وب فریم‌ورک های rocket و gotham برای پروژهای در سطح Dropbox و Coursera استفاده شده است.ساخت ابزارهای خط-فرمان: راست بخاطر سرعت، ایمنی و پشتیبانی چند سکویی یک زبان بسیار خوب برای ساخت برنامه‌های خط-فرمان است.جمع‌بندیاز قابلیت استفاده تا نیاز روزافزون به ویژگی‌هایی که ارائه می‌کند، می‌توانیم ببینیم که چرا محبوبیت راست در حال افزایش است و به این زودی‌ها از بین نخواهد رفت.انجمن راست به‌طور باورنکردنی فعال است و همچنان به انتشار به‌روزرسانی‌ها و ابزارهایی برای قوی‌تر شدن زبان راست ادامه می‌دهد. راست به دلیل توانایی و شهرتش در ایجاد سیستم‌های ایمن، در سال‌های آینده محبوبیت خود را حفظ خواهد کرد.ایمنی، سرعت و کارایی (یعنی توانایی آن در کمک به توسعه‌دهندگان برای نوشتن سرعت‌تر کدهای کارمدتر) دلایلی هستند که در سال‌های آینده راست همچنان موردعلاقه جامعه توسعه‌دهندگان خواهد بود.مقاله اصلی</description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Sun, 05 Mar 2023 12:04:22 +0330</pubDate>
            </item>
                    <item>
                <title>بیت‌کوین؛ داستان اولین پول دیجیتال (قسمت دوم)</title>
                <link>https://virgool.io/@mostafajafari/%D8%A8%DB%8C%D8%AA-%DA%A9%D9%88%DB%8C%D9%86-%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D9%BE%D9%88%D9%84-%D8%AF%DB%8C%D8%AC%DB%8C%D8%AA%D8%A7%D9%84-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-eesptdjv2f1b</link>
                <description>در مقاله قبلی در مورد ایده ساخت بیت کوین، اولین شبکه بانکی و مالی غیرمتمرکز در تاریخ، صحبت کردیم و بررسی کردیم که ساتوشوی ناکوموتو، خالق بیت‌کوین، چگونه با معرفی تکنولوژی بلاک‌چین که یک دفترکل غیرمتمرکز است عملا توانست چالش‌های موجود برای ساخت شبکه را حل کند. همچنین در مورد یکی از مهمتر‌ین الگوریتم‌‌های بلاک‌چین یعنی ماینینگ به روشی اثبات کار توضیحات مختصر و پایه‌ای را دادیم. در این مقاله هم قصد داریم علاوه بر آشنایی کلی با مباحث هش، درخت مرکل و ساختمان بلوک در بلاکچین، بحث ماینینگ را به صورت الگوریتمیک و مفصل‌تر مورد بررسی قرار دهیم. بیت‌کوین؛ داستان اولین پول دیجیتال (قسمت دوم)تابع هش SHA-256تابع هش SHA-256 یک تابع رمزنگاری یک‌طرفه است که هر نوع داده ورودی دیجیتالی (متن، عکس و نرم‌افزار) را در یک فرآیند پیچیده محاسباتی و ریاضیاتی به یک خروجی عددی ثابت 32 بایتی یکتا تبدیل می‌کند. به این خروجی اصطلاحاً «هش» می‌گویند. بلاک‌چین از الگوریتم SHA-256 برای کاربردهای زیادی از جمله عملیات ماینینگ، آدرس کیف پول و هش کردن تراکنش‌ها استفاده می‌کند. در زیر چند نمونه هش را می‌بینیم.درخت مرکلدرخت مرکل، یک ساختمان داده است که در برنامه‌های کامپیوتری استفاده می‌شود. در شبکه بیت‌کوین و دیگر رمزارزها از درخت مرکل برای رمزگذاری کارآمد و ایمن‌تر تراکنش‌ها در بلاک‌چین استفاده می‌شود. به نمودار زیر نگاه کنید، در درخت مرکل ابتدا تراکنش‌ها هش می‌شود. بلاک‌چین برای هش از الگوریتم SHA-256 استفاده می‌کند. سپس هر جفت هش به‌دست‌آمده را به هم چسبانده ‌می‌شود و یک‌بار دیگر هش گرفته می‌شود (مانند هش A و B) و این فرآیند آن‌قدر برای هر جفت هش انجام می‌شود تا در انتها یک هش باقی بماند که به آن اصطلاحاً «ریشه درخت مرکل» می‌گویند. بلاک‌چین هش «ریشه درخت مرکل» را در «هدر بلوک» قرار می‌دهد.نمودار درخت مرکل درخت مرکل در بلاک‌چین بسیار کاربردی است چرا که این امکان را می‌دهد تا تراکنش‌ها را بدون آنکه نیاز به دانلود کل بلاک‌چین (تا این تاریخ، حدوداً 500 گیگابایت) باشد بررسی و تائید کنیم. برای این کار فقط نیاز است هدر بلوک‌ها (تا این تاریخ، حدوداً 100 مگابایت) را داشته باشیم. برای مثال، فرض کنیم می‌‎خواهیم درستی تراکنش D را، در نمودار بالا، تائید کنیم. ازآنجایی‌که هدر بلوک‌ها را داریم پس روت درخت مرکل H(ABCDEFGH) را نیز داریم. فقط نیاز داریم از شبکه بخواهیم H(D)، H(C)، H(AB) و H(EFGH) را برای‌مان فراهم کند تا بتوانیم با محاسبه آن‌ها به هش روت برسیم. اگر هش محاسبه شده با  هش روت مرکل در بلوک هدر یکسان باشد به این معنا است که تراکنش D درست بوده است.درخت مرکل ساختمان بلوکبلوک‌ها از اساسی‌ترین سازه‌ها در بلاک‌چین هستند. هر بلوک متشکل از هدر و بدنه است. در هدر، متاداده و اطلاعات مربوط به پارامترهای ماینینگ قرار می‌گیرد. بدنه بلوک محل قرارگیری تراکنش‌ها و پیام ماینر است. تراکنش کوین‌بیس همیشه اولین تراکنش است که بدنه قرار می گیرد؛ این تراکنش نشان دهنده پاداش ماینر است. تراکنش‌ها از Mempool انتخاب می‌شود؛ Mempool یک فضای موقت است که تراکنش‌های دریافت شده توسط هر نود در آن قرار می‌گیرد و هر ماینری می‌تواند به‌دلخواه یک سری تراکنش را از آنجا انتخاب کند و داخل بلوک قرار دهد. این نکته هم قابل‌توجه است که معمولاً تراکنش‌هایی که fee بیشتری (پاداش اضافه) برای ماینر در نظر گرفته باشند شانس بیشتری برای قرار گرفتن در بلوک را دارند.تمرکز ما در این مقاله بر روی هدر بلاک‌چین است و اینکه بفهمیم چگونه میانرها با استفاده از هدر بلوک و تغییراتی در فیلدهای آن می‌توانند ماینینگ را انجام دهند. از اینجا به بعد برای ملموس‌تر شدن مفاهیم و الگوریتم ماینینگ از یک مثال واقعی استفاده می‌کنیم. به نحوی که می‌خواهیم خود را بجای یک نود بگذاریم و با قراردادن پارامترهای هدر در الگوریتم، بلوک ساخته شده توسط ماینر را تائید کنیم. قصد داریم بلوک شماره 69990 بلاک‌چین بیت کوین را مورد بررسی قرار می‌دهیم که در تاریخ 24 جولای 2010 ساخته شده است. در تصویر زیر بلوک شماره 69990 را می‌بینیم.بلوک بلاک‌چین بیت‌کوین  هدر بلوک و ماینینگ:اندازه هدر بلوک در بلاک‌چین بیت‌کوین 80 بایت است و از شش فیلد مجزا تشکیل شده است. بلاک‌چین برای ذخیره‌سازی هدر بلوک فیلدهای آن را به فرمت هگزادسیمال و به چینش لیتل-‌اندین تبدیل در می‌آورد. لیتل-اندین یک نوع چینش بایت در حافظ جانبی کامپیوتر است که کم ارزش‌ترین بایت متغیر را در ابتدایی‌ترین خانه حافظه ذخیره می‌دهد.اما هدر بلوک چگونه ساخت می‌شود و مقادیر فیلدهای آن چگونه تعیین می‌شود. برای پاسخ به این سؤال باید بدانیم که ساخت هدر بلوک مستقیماً مرتبط با بحث ماینینگ است زیرا که بعضی از فیلدهای آن مانند مرکل روت، زمان و نانس از متغییرهای الگوریتم ماینینگ محسوب می‌شوند و مقادیر نهایی آن‌ها زمانی مشخص می‌شود که ماینر برنده بتواند بلوک را بسازد. بدین منظور برای شناخت بهتر فیلدهای هدر بلوک ابتدا می‌بایست باید با خود الگوریتم ماینینگ آشنا شویم.الگوریتم ماینینگ:به طور خلاصه  الگوریتم ماینینگ این‌گونه کار می‌کند: ماینر هدر بلوک را با انتخاب یک نانس تصادفی می‌سازد و دو بار از آن هش می‌گیرد تا هش بلوک ساخته شود. او هش بلوک را با «سختی شبکه» مقایسه می‌کند. اگر مقدارش کوچک‌تر باشد مانیر بلوک را می سازد و برای تائید به دیگر نودها شبکه ارسال می‌کند. اما اگر شرط بر قرار نشد ماینر دوباره عملیات ماینینگ را با پارامترهای جدید مانند تغییر نانس، عوض کردن تراکنش برای محاسبه جدید مرکل روت و بروزراسنی زمان انجام می‌دهد تا شاید شانس موفقیت را به دست آورد. اگر در این میان هر ماینری در شبکه زودتر بتواند به شرط مورد نظر برسد، عملیات ماینینگ برای بلوک جاری متوقف می شود و عملیات بر روی بلوک بعدی شروع می‌شود.سختی شبکهدر بلاک‌چین «سختی شبکه» یعنی متغیری که تضمین می‌کند هر بلوک حدودا در مدت زمان 10 دقیقه ساخته شود. این متغیر هر دو هفته که معادل 2016 بلوک است به‌ روز می‌شود. اگر نودهای زیادی به شبکه وارد شود و باعث شود بلوک‌ها در کمتر از 10 دقیقه ساخته شوند عدد سختی شبکه کوچک‌تر خواهد شد و همین‌طور برعکس. به تصویر زیر نگاه کنید. فرض کنیم می خواهیم سختی شبکه را برای بلوک‌های 4032 تا 6048 محاسبه کنیم. برای این کار باید مدت زمان ساخت بلوک برای 2016 بلوک قبل از آن (یعنی از 2016 تا 4032) را بدست آوریم و آن را تقیسم بر عدد ثابت 20160، که نشان دهنده زمان استاندارد و ایده آل برای ساخت بلوک است، تقسیم کنیم و خروجی را در مقدار سختی شبکه ضرب کنیم تا سختی شبکه برای دو هفته آینده تعیین شود.محاسبه سختی شبکه در بلاکچین‌بیت‌کوینفلوچارت الگوریتم در نمودار زیر فلوچارت الگوریتم ماینینگ به روش اثبات کار را مشاهده می‌کنید.فلوچارت الگوریتم ماینینگ به روش اثبات کار در بلاکچین بیت‌کوین مراحل فلوچارت الگوریتم ماینینگ:1- انتخاب ورژن فعلی؛ ورژن فیلدی است که تغییرات و بروزرسانی پروتکل بیت کوین را  نشان می‌دهد.2- پیدا کردن هش بلوک قبل با بررسی زنجیره بلاک‌چین؛3- انتخاب تعدادی تراکنش از حافظه mempool و قرار دادن در بلوک کاندید4- ساخت تراکنش کوین‌بیس؛ تراکنش پاداش ماینر5- محاسبه مرکل روت؛ با ‌تراکنش کوین‌بیس و مجموعه تراکنش‌های انتخاب شده6- محاسبه سختی شبکه.7- ثبت زمان جاری؛ زمان جاری نشان دهنده زمان شروع عملیات ماینینگ بلوک است و با فرمت یونیکس تایم ذخیره ‌می‌شود.8- به هم پیوستن فیلد‌های اشاره شده در مراحل قبل و ساخت «مسیج بلوک»9- انتخاب نانس؛ نانس یک عدد 4 بایتی است و مقدارش می‌تواند از صفر تا چهار میلیارد باشد. ماینر یک عدد رندم را انتخاب می‌کند.10- چسباندن مقدار نانس به انتهای پیام بلوک و ایجاد یک هدر پیشنهادی برای بلوک  11- انجام دو بار هش SHA-256 بر روی هدر برای ساخت هش بلوک12- مقایسه هش بلوک با سختی شبکه.13- اگر هش خروجی از سختی شبکه بزرگ‌تر باشد، دوباره از مرحله 9 الگوریتم را تکرار می‌کنیم. اگر تمامی مقادیر نانس را چک کردیم و هنوز نتوانستم به شرط ساخت بلوک برسیم می‌بایست با تغییر در زمان جاری و همچنین تغییر در تراکنش‌های انتخابی یک مرکل روت جدید بسازیم و عملیات را دوباره تکرار کنیم14- اگر هش خروجی کوچک‌تر از سختی شبکه بود، ماینر می‌تواند بلوک را بسازد. و بعد از آنمی‌بایست سریعاً بلوک را برای دیگر نودهای شبکه بفرستد تا آن‌ها صحت کارش را نیز تائید کنند.بررسی بلوک شماره 69990به تصویر زیر نگاه کنید، هدر بلوک شماره 69990 به همراه فیلدهای تشکیل دهنده آن را می‌بینید. ماینر توانسته با این پارامترها موفق به ساخت این بلوک شود. خب فرض کنیم ما یک نود هستیم و می‌خواهیم کار این ماینر را بررسی کنیم که آیا درست بوده است یا خیر!تبدیل به فرمت استاندارددر ابتدا، «زمان ساخت بلوک» را به فرمت یونیکس تایم تبدیل می‌کنیم که می‌شود: «1279982980»سپس هر فیلد را به فرمت هگزادسیمال و چینش لیتل-اندین در می‌آوریم و به ترتیب به هم می‌چسبانیم. در تصویر زیر خروجی نهایی را می‌بینید.از هدر بلوک دو بار هش SHA-256 می گیریم تا هش بلوک به دست آید.SHA-256 محاسبه هش بلوک پس از دو بار هش گرفتنخب از آنجایی که ورودی در چینش لیتیل-اندین بود. خروجی هم این چینش است. اما برای مقایسه با سختی شبکه باید هش بلوک را تبدیل به چینش بیگ-اندین کنیم که می‌شود:همان جور دیدیم سختی شبکه برای این بلوک برابر با 1c0168fd است. اما این مقدار در واقع نسخه کوچک فیلد 32 بیتی آن است. بدین گونه نسخه کوچک را به مقدار واقعی تبدیل می‌کنیم:خب با یک مقایسه ساده می‌بینیم که هش خروجی ماینر کوچک‌تر از سختی شبکه است، پس کار او درست بوده و می‌توانسته بلوک را بسازد.حرف پایانیدر این مقاله به صورت الگوریتمیک بررسی کردیم که ساتوشی ناکوموتو چگونه توانست، با استفاده از بلاکچین و الگوریتم ماینینگ به روش اثبات کار، ساختاری غیرمتمرکز برای ثبت تراکنش‌ها و مفهوم پول به‌وجود آورد. یکی از نقاط ضعف الگوریتم روش اثبات کار این است که احتیاج به منابع زیادی برای محاسبات هش دارد و خیلی دوست دار طبیعت نیست. برای همین بلاک‌چین‌های مدرن به سراغ روش‌های دیگری، مانند اثبات‌ سهام، رفتند که به مراتب نقاط قوت بیشتری نسبت به روش‌اثبات کار دارند. منابع:https://learnmeabitcoin.com</description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Sat, 18 Feb 2023 11:51:22 +0330</pubDate>
            </item>
                    <item>
                <title>بیت‌کوین؛ داستان اولین پول دیجیتال (قسمت اول)</title>
                <link>https://virgool.io/@mostafajafari/%D8%A8%DB%8C%D8%AA-%DA%A9%D9%88%DB%8C%D9%86-%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D9%BE%D9%88%D9%84-%D8%AF%DB%8C%D8%AC%DB%8C%D8%AA%D8%A7%D9%84-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-iltrkoomnzlx</link>
                <description>در اکتبر سال 2008 فردی با نام مستعار ساتوشی ناکوموتو مقاله‌ای منتشر کرد با عنوان: «بیت‌کوین: یک سیستم پرداخت الکترونیکی همتا-‌به-‎همتا». او در این مقاله می‌گفت: ما می‌توانیم یک شبکه مالی و بانکی غیرمتمرکز بسازیم که قائم به فرد یا سازمان نباشد. چند ماه پس از انتشار مقاله، شبکه بیت‌کوین را راه‌اندازی کرد و سورس‌کد آن را در اختیار عموم قرار داد.این برای اولین بار بود که فردی ایده ساخت یک شبکه بانکی غیرمتمرکز را مطرح می‌کرد زیرا تا قبل از آن تصور ساخت چنین شبکه‌ای به خاطر چالش‌ها و مسائل پیچیده‌ای که داشت، ناممکن به نظر می‌رسید. برای درک بهتر این چالش‌ها و مسائل بهتر است ابتدا با معماری یک سیستم بانکی متمرکز آشنا شویم.اگر فرض کنیم که بانک یک موجود زنده است و نفس می‌کشد، می‌بایست «دفترکل» را قلب آن در نظر بگیریم. دفترکل در واقع مکانیزمی است که تمامی تراکنش‌ها ورودی را پردازش، ثبت و نگهداری می‌کند. مثلاً فرض کنید که می‌خواهید با کارت بانکی‌تان یک کالا را از فروشگاهی خریداری کنید وقتی‌ که واریز را انجام می‌دهید اطلاعات شما برای بانک فرستاد می‌شود و پس از احراز هویت در دفترکل بانک بررسی می‌شود که آیا مبلغ کافی در حساب شما موجود است؛ اگر بلی، سپس دو رکورد در دفترکل ایجاد می‌شود که اولین رکورد نشان دهنده کسر موجودی از حساب شما و دومین رکورد افزایش موجودی حساب فروشنده است. پس متوجه شدیم که دفترکل نقش کلیدی و مهمی را در یک سیستم بانکداری بازی می‌کند و نگهداری از آن امری حیاتی و واجب برای بانک است. امروزه دفترکل در دیتابیس‌های مدرن نرم‌افزاری نگهداری می‌شود که معمولاً در دیتاسنترهای تحت نظارت بانک مرکزی خدمات خود را ارائه می‌دهند.اما داشتن یک سیستم بانکداری غیرمتمرکز به این راحتی‌ها نیست و از جهات بسیاری چالش‌برانگیز است. معمولاً در یک شبکه غیرمتمرکز چندین هزار نود (سرور‌ها، کامپیوتر‌های شخصی، موبایل و ...) وجود دارد که با استفاده از اینترنت و یک پروتکل مشترک به هم متصل می‌شوند. در این شبکه هیچ دیتابیس یا نود مرکزی وجود ندارد چون اگر این طور باشد غیرمتمرکز بودن آن زیر سوال خواهد رفت.ساتوشی ناکوموتو هم از ابتدا قصد داشت شبکه‌ بیت کوین را به‌گونه‌ای طراحی کند که نه تنها ساختار فیزیکی آن غیرمتمرکز باشد بلکه مدیریت و نگهداریش هم بدین گونه باشد. ولی او برای پیاده‌سازی ایده‌اش با چندین چالش روبرو بود که مهم‌ترین آن‌ها را در این مقاله بررسی می‌کنیم.اولین چالش، مفهوم پول بود. احتیاج به گفتن نیست که اصلی‌ترین هدف هر شبکه بانکی و مالی انتقال یا نگهداری پول است. اما پول از کجا می‌آید! آیا غیر از این است که همیشه پول توسط دولت‌ها و بانک‌های مرکزی صادر می‌شود که خودشان از ساختاری متمرکز هستند. آیا می‌توانیم از پول‌های موجود (دلار، یورو و ...) در یک شبکه مالی غیرمتمرکز استفاده کنیم. در صورت استفاده آیا دوباره به همان ساختار متمرکز بر نگشته ایم!چالش بعدی که در طراحی این نوع شبکه‌ها روبرو هستیم این است که چگونه یک دیتابیس غیرمتمرکز پیاده‌سازی کنیم که نقش دفترکل را در سیستم بانکداری ما بر عهده بگیرد. و اینکه چه افراد یا گروه‌هایی می‌توانند تراکنش‌ها را پردازش، ثبت و نگهداری کنند به نحوی که خصوصیت غیرمتمرکز بودن آن زیر سوال نرود.ساتوشی ناکوموتو برای حل این چالش‌ها یک تکنولوژی جدید را معرفی کرد که به «بلاک‌چین» معروف است. در ادامه با بررسی معماری و ساختمان بلاک‌چین می‌توانیم جواب عمیق‌تر و بهتری به چالش‌های مطرح شده، بدهیم.بلاک‌چیندر اصل بلاک‌چین (به فارسی زنجیره‌بلوکی) یک دیتابیس توزیع‌شده غیرمتمرکز است که تمامی نودهای شبکه می‌توانند یک نسخه از آن را داشته باشند. اصلی‌ترین تفاوت‌ بین دیتابیس‌های عادی و بلاک‌چین نحوه ذخیره‌سازی داده است. یک بلاک‌چین دسته‌ای از داده‌ها را (مثلاً چند تراکنش) در قالب «بلوک‌» ذخیره می‌کند. هر بلوک ظرفیت محدودی را برای ذخیره‌سازی دارد و زمانی که پُر شود، بسته می‌شود و به بلوک قبل از خود متصل می‌شود.بلاک چینهدف بلاک‌چین این است که بتوانیم اطلاعات را در ساختاری غیرمتمرکز به شیوه‌ای ذخیره کنیم که تغییرناپذیر باشد. بنابراین، بلاک‌چین بنای را ایجاد می‌کند که بتوانیم یک دفترکل توزیع‌شده تغییرناپذیر داشته باشیم که امکان تغییر و حذف تراکنش‌ها در آن وجود نداشته باشد. برای همین هم است که به بلاک‌چین «دفترکل توزیع‌شده» هم می‌گویند.بلوک توسط چه کسی ساخته می‌شود؟از آنجایی که معماری بلاک‌چین غیرمتمرکز است و همان‌طور که قبلاً گفتیم هیچ نود خاص یا یک سرور مرکزی وجود ندارد که بلوک را ایجاد کند، بنابراین هر بلوک می‌بایست توسط یکی از نود‌ها، که علاقه‌مند به این کار است، ساخته شود. این نود‌ها را اصطلاحاً «ماینر» می‌نامیم و به کاری که انجام می‌دهند اصطلاحاً «ماینینگ» می‌گوییم.پاداش ماینر و لحظه خلق پول دیجیتالیک قانون در بلاک‌چین است که می‌گوید: هر چه تعداد ماینر بیشتری وجود داشته باشد، جنبه غیرمتمرکز بودن شبکه قوی‌تر می‌شود. بنابراین شبکه سعی دارد نودهای بیشتری را برای ماینر شدن ترغیب کند و هم‌چنین انگیزه کافی را برای آن‌ها به وجود آورد تا بلوک‌ها را به درستی بسازند و شبکه را مختل نکنند. بدین منظور شبکه برای سازنده بلوک یا ماینر «پاداش» در نظر گرفته است. پاداش در واقع واحدی است که قرار است نقش پول را در شبکه مالی بیت کوین بازی کند. هر وقت ماینری پاداشش را برای ساخت بلوک بگیرد آن لحظه خلق پول در شبکه است. ارزش این پول توسط مردم و بر اساس اعتمادی که به شبکه دارند تعیین می شود. به عنوان نمونه، اگر قیمت بیت کوین در سال اول ظهورش فقط چند دلار بود اما 12 سال بعد قیمتش به 70 هزار دلار رسید. همچنین بدانیم که پاداش در بلاک‌چین  محدود است و هر 4 سال یک بار در پروسه‌ی هاوینگ نصف می شود. پاداش  ماینر در طول زمانمکانیزم انتخاب ماینرمنطقاً از آنجایی که تعداد زیادی ماینر، به خاطر پاداش، علاقه‌مند به ساخت بلوک هستند و تنها یکی از آن‌ها شناس این کار را دارد می‌بایست به‌گونه‌ای و با یک مکانیزم عادلانه یکی از آن‌ها را برای ساخت بلوک انتخاب کنیم. یک راه‌حل این است که می‌توانیم رقابتی بین‌شان برگزار کنیم و در این رقابت ماینری که، بر اساس قوانین، زودتر برنده شود می‌تواند بلوک را بسازد. بیت کوین برای برگزاری این رقابت (ماینینگ) از روش «اثبات‌کار» استفاده می کند.روش اثبات‌کار و اجماعبه زبان ساده «اثبات‌کار» رقابتی است که ماینرها می بایست، برای ماینینگ، در آن شرکت کنند. ماینرها با اجرای یک الگوریتم مشخص و با تغییر در پارامترهای ورودی آن، تعداد زیادی هش (عدد تصادفی) تولید می‌کنند تا درنهایت یک هشی پیدا کنند که از یک حد آستانه (سختی شبکه) مقدارش کمتر باشد و هر ماینری که زودتر به این هش دست پیدا کند برنده خواهد شد. برا ملوس‌تر شدن فرض کنید که داریم چند تاس را با هم می‌ریزیم و شرط برنده شدن این است که مجموع اعداد روی تاس از یک عدد که از ابتدا تعیین کردیم کوچک‌تر باشد. مطمئناً فرد یا افرادی که بتوانند تعداد بار بیشتر تاس‌ بریزند شانس برنده شدنشان بیشتر است. در ماینینگ به روش اثبات کار هم همین‌طور است. هر نودی که سخت‌افزار و قدرت محاسبات بالاتری برای تولید هش داشته باشد شانسش از بقیه بیشتر خواهد بود.درنهایت ماینر برنده برای تکمیل کارش پارامترهایی مربوط به ماینینگ را در هدر بلوک قرار می‌دهد و بلوک جدید را در سراسر شبکه منتشر کند تا هر نود با بررسی صحت و درستی آن، مطمئن شود که تقلبی صورت نگرفته است. هر بلوک بعد از اطمینان از درستی کار ماینر آن بلاک را به زنجیره بلاک‌چین خود اضافه می‌کند و سریعا به سراغ بلوک بعدی می رود که شانسش را دوباره امتحان کند. این کار نودها برای تایید بلوک نوعی رائ گیری است. درواقع هر نود با بررسی بلوک و انجام دوباره ماینینگ با پارامترهای ماینر نهایتاً می تواند رأی به تائید یا عدم تائید آن ‌دهد و اگر فقط 50 درصد نودهای شبکه، بلوک ماینر را قبول کنند به این معنی است که ماینر کارش را به درست انجام داده است و می‌تواند از پاداشش استفاده کند. به این مکانیزم رائ گیری در بلاک‌چین اصطلاحاً «اجماع» می‌گویند.حرف پایانیتا اینجا متوجه شدیم که بیت‌کوین با استفاده از فناوری بلاک‌چین، ایده ماینینگ و دادن پاداش به ماینر دو چالش اصلی شبکه بانکی خود را حل کند بدون اینکه نیاز باشد خصوصیت غیرمتمرکز بودن شبکه به خطر بیفتد. اما در مورد اینکه بلاکچین در دنیای نرم‌افزاری چگونه پیاده سازی شده و عملیات ماینینگ به‌طور واقعی و الگوریتمی چگونه کار می‌کند و یا اینکه پاداش در چه شکلی به ماینر تعلق می‌گیرید، صبحت نکردیم. در مقاله بعدی به طور مفصل در مورد این مباحث به همراه بررسی واقعی ساخت یک بلوک در بلاکچین بیت کوین صحبت خواهیم کرد. ادامه: بیت‌کوین؛ داستان اولین پول دیجیتال (قسمت دوم)</description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Sun, 12 Feb 2023 19:57:33 +0330</pubDate>
            </item>
                    <item>
                <title>تابع هش SHA-256؛ تحلیل خط به خط الگوریتم</title>
                <link>https://virgool.io/@mostafajafari/%D8%AA%D8%A7%D8%A8%D8%B9-%D9%87%D8%B4-sha-256-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AE%D8%B7-%D8%A8%D9%87-%D8%AE%D8%B7-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-h8a5m3zoza7e</link>
                <description>در دنیای واقعی از اثر انگشت هر فرد برای تعیین هویت استفاده می‌شود چرا که اثر انگشت هر فردی منحصربه‌فرد است. در دنیای دیجیتال هم نیاز مشابه‌ای وجود داشت برای همین توابع هش رمزنگاری به وجود آمدند. این توابع هر نوع داده ورودی دیجیتالی (متن، عکس، نرم‌افزار و ...) را در یک فرآیند پیچیده محاسباتی و ریاضیاتی به یک خروجی منحصربه‌فرد تبدیل می‌کنند. این خروجی را هش، اثر انگشت دیجیتال یا امضای دیجیتال می‌نامند. توابع هش یک‌طرفه عمل می‌کنند؛ یعنی به‌گونه‌ای طراحی شده‌اند که نمی‌توان از خروجی یا همان هش به داده ورودی اصلی رسید. توابع هش رمزنگاری استانداردهای متنوعی دارد که خانواده SHA-2 یکی از مهم‌ترین آن‌ها است. استاندارد SHA-2 مجموعه‌ای از توابع هش رمزنگاری مشابه است که تابع SHA-256 از همه محبوب‌تر و پرکاربردتر است. از جمله مهم‌ترین کاربردهای آن می‌توان به استفاده در بلاک‌چینِ بیت‌کوین، ساخت امضای دیجیتال در گواهینامه‌های SSL و هش کردن گذرواژه در سیستم‌عامل‌های لینوکس و یونیکس اشاره کرد. در این مقاله قصد داریم، علاوه بر آشنایی کلی، با تحلیل الگوریتم‌ SHA-256، به درک کامل و عمیقی از روش رمزنگاری این تابع هش برسیم.تابع هش SHA-256؛ پیاده‌سازی خط به خط الگوریتمتابع هش SHA-256 تابع هش SHA-256 هر نوع داده ورودی را به یک خروجی عددی با طول ثابت 256 بیت (32 بایت) هش می‌کند. احتمال تصادم، به وجود آمدن هش یکسان برای دو ورودی غیریکسان، تقریباً صفر است. زیرا که خروجی «2 به توان 256» حالت را می‌تواند داشته باشد که تقریباً معادل تعداد اتم‌های جهان هستی است که دانشمندان بین «10 به توان 79» تا «10 به توان 82»  تخمین زده‌‌اند. این تابع برای ورودی‌های مشابه دو هش کاملاً متفاوت تولید می‌کند به‌طوری‌که نمی‌توان به الگوی قابل‌تشخیصی پی ‌برد. در کنار امنیت بالا، ویژگی مهم دیگر این تابع سرعت هش کردن آن است که ورودی را در کسری از ثانیه هش می‌کند. همه این موارد در کنار هم باعث شده که این تابع بسیار کاربردی باشد. برای استفاده آنلاین از تابع هش SHA-256 می‌توانید از این لینک استفاده کنید. در ادامه چند نمونه هش را می‌بینیم:نمونه هش‌های تابع هش SHA-256 تابع هش SHA-256 چگونه کار می‌کند؟برای اینکه ساده‌تر بفهمیم که تابع هش SHA-256 چگونه کار می‌کند و چه مراحلی را برای رسیدن به هش از سر می‌گذراند می‌خواهیم همراه با  توضیحات، یک مثال را هم جلو ببریم تا ملموس تر بفهمیم چه اتفاقاتی در هر مرحله الگوریتم بر روی داده ورودی می‌افتد. در این مثال می‌خواهیم از عبارت متنی &quot;!Hello World&quot; استفاده کنیم تا در نهایت به هش زیر برسیم:7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069تبدیل به باینریاولین اتفاقی که پس از ورود داده به تابع هش می‌افتد تبدیل آن به فرمت باینری است. برای تبدیل حروف، اعداد و علائم به فرمت باینری باید از کد اسکی استفاده کنیم. مثلاً حرف «H» دارای کد اسکی 01001000 است یا «خط‌فاصله» کد اسکی 00100000 را دارد. در این لینک می‌توانید جدول کامل کد اسکی را ببنید.ورودی &quot;!Hello World&quot; پس از تبدیل به فرمت باینری می‌شود:&quot;Hello World!&quot; -&gt;  01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 00100001پیش‌پردازشاکنون که داده ورودی به فرمت باینری درآمده، قدم بعدی استاندارد کردن آن برای پردازش توسط الگوریتم است. به این کار پیش‌پردازش می‌گویند. مهم‌ترین مرحله پیش‌پردازش «پَدینگ پیام» است.پَدینگ پیام:هر داده ورودی باید قبل از محاسبه هش پَد شود؛ یعنی می‌بایست یک سری داده‌های اضافی به داده ورودی اصلی اضافه شود تا به یک اندازه‌ی ثابت برسد. در الگوریتم SHA-256 داده ورودی باید ضریبی از 512 بیت باشد زیرا که الگوریتم داده‌ها را در بلوک‌های 512 بیتی (64 بایتی) پردازش می‌کند.در مثال &quot;!Hello World&quot;، داده ورودی 96 بیت دارد که کمتر از 512 بیت است. پس نیاز داریم آن را پَد کنیم. اگر داده ورودی ما بزرگ‌تر از 512 بیت می‌بود، می‌بایست آن را به بلوک‌های 512 بیتی تقسیم می‌کردیم.اکنون می‌بایست 416 بیت دیگر به داده باینری &quot;!Hello World&quot; اضافه کنیم تا به یک بلوک کامل 512 بیتی تبدیل شود. الگوریتم SHA-256 برای این کار از روش زیر استفاده می‌کند:بعد از داده ورودی باینری شده، عدد «1» را اضافه می‌کنیم.سپس، به تعدادی عدد «0» (بعد از عدد «1») اضافه می‌کنیم تا 448 بیت از بلوک پر شود.&quot;Hello World!&quot; پدینگ داده ورودیدر انتها، 64 بیت باقی‌ می‌ماند تا بلوک کامل (512 بیت) شود. در این 64 بیت می‌بایست مقدار طول داده‌ ورودی را قرار دهیم. در مثال ما، همان‌طور که قبلاً دیدیم طول داده ورودی 96 بیت است که عدد 96 به فرمت باینری  01100000 است. طول ورودی را در انتهایی‌ترین قسمت بلوک قرار می‌دهیم و قبل از آنقدر صفر اضافه می‌کنیم تا 64 بیت کامل شود. &quot;Hello World!&quot; بلوک 512 بیتی الگوریتم اصلی SHA-256در تصویر زیر، نمودار گرافیکی الگوریتم SHA-256 را مشاهده می‌کنید:نمودار الگوریتم اصلی SHA-256اگر قبلاً با الگوریتم‌های مشابه کار نکرده باشید، به نظر پیچیده و غیر قابل فهم می‌رسد. اما قصد داریم با تشریح آن و توضیح جزئیات به فهم آسان‌تری از ساختار این الگوریتم برسیم.ورودی پیام (M)اگر به سمت چپ بالای نمودار نگاه کنید، ورودی پیام، The message input (M)، را خواهید دید. ورودی پیام در مثال ما، بلوک 512 بیتی &quot;!Hello World&quot; است که در زیر می‌بینید. ما نیاز داریم برای پردازش، داده ورودی آن را به آرایه‌ 16 خانه‌ای از کلمات 32 بیتی تبدیل کنیم و از W0 تا W15 آن را برچسب بزنیم.تبدیل داده ورودی به 16 کلمه  32 بیتیتبدیل به هگزادسیمالاین مسئله گفتن ندارد که هگزادسیمال، دستگاه اعداد پایه ۱۶، به طور گسترده توسط طراحان و برنامه‌نویسان کامپیوتری استفاده می‌شود. هر رقم هگزادسیمال، نشان‌دهندهٔ چهار بیت باینری است. این سیستم از ۰ تا ۹ برای مقادیر صفر تا نه و از حروف A, B, C, D, E, F برای مقادیر ده تا پانزده استفاده می‌کند. از طرفی، همان‌طور که قبلاً دیدیم، هش خروجی SHA-256 به فرمت هگزادسیمال است. برای همین از اینجا به بعد برای ساده‌تر شدن، فرمت باینری &quot;!Hello World&quot; را تبدیل به هگزادسیمال می‌کنیم.W0 = 48656C6CW1 = 6F20576FW2 = 726C6421W3 = 80000000W4 تا W14 = 00000000W15 = 00000060ساخت Message Scheduleاگر به تصویر زیر دقت کنید، متوجه می‌شوید که یکی از ورودی‎‌ها به Round 63 کلمه W63 است. این در حالی است که ما فقط، تا الان، مقادیر W0 تا W15 را داریم. پس نتیجه می‌گیرم نیاز به 48 کلمه‌ی «W» دیگر هم داریم تا آرایه 64 خانه‌ای «W» کامل شود. در ادامه درباره الگوریتمی صحبت خواهیم کرد که مقادیر W16 تا W63 را محاسبه می‌کند.Message Scheduleتمامی کلمات W16 تا W63 در کادر Message Schedule، نمودار بالا، محاسبه می‌شود. برای محاسبه از معادله زیر استفاده می‌شود:خُب، بیایم کمی این معادله ریاضی را بشکافیم تا آسان‌تر شود. در این معادله، حرف t اشاره به عدد Round می‌کند. اگر ما در Round اول هستیم، که از دید برنامه‌نویسی یعنی Round 0، مقدار t عدد 0 است. بنابراین اگر W0 را دیدید، به این معنی است که این مقدار برای W در Round 0 است.معادله σ1(x)نماد ریاضیاتی که کمی مبهم در معادله به نظر مــی‌رسد σ1(x) است. این نماد معروف به سیگما1 است. معادله آن با این تابع محاسبه می‌شود.قبل از اینکه  بفهمیم که Message Schedule چگونه کار می‌کند نیاز داریم ابتدا با روش محاسبه σ1(x) آشنا شویم. عملیات‌ جابجایی (Shift operations):عملیات «RTOR» در معادله σ1(x) دو بار استفاده شده است. RTOR که با عنوان جابجایی چرخشی به راست (circular right-shift) شناخته می‌شود، مقدار ورودی را به اندازه ‌ای که در خود نماد مشخص شده به سمت راست، به شکل چرخشی، جابجا می‌کند. به عنوان نمونه، در عملیات ROTR17(x) می‌بایست  مقدار X را به اندازه 17 بیت به سمت راست به شکل چرخشی جابجا کنیم. مثلا مقدار 10001001 را اگر به این عملیات بدهیم خروجی آن 11000100 می‌شود. برای دیدن جزئیات روی این لینک کلیک کنید.عملیات بعدی در معادله «SHR» است که با نام جابجایی منطقی به چپ (logical left-shift) شناخته می‌شود. در  عملیات «SHR10(x)»  مقدار X به اندازه 10 بیت به سمت چپ جابجا می‌شود. برخلاف عملیات جابجایی چرخشی، در این عملیات داده در هر حرکت به سمت چپ از بین می‌رود. مثلاً اگر مقدار X را 10010010 در نظر بگیریم و در  عملیات «SHR10(x)» قرار دهیم به مقدار 00000000 می‌رسیم. برای دیدن جزییات می‌توانید روی این لینک کلیک کنید.عملیات XOR:سومین و آخرین عملیاتی که احتیاج به توضیح دارد XOR است. XOR یک عملگر منطقی است که با سمبل ⊕ شناخته می‌شود. این عملگر به گونه‌ای عمل می‌کند که اگر هر دو ورودی «0» یا «1» باشد، خروجی «0» است. در غیر این صورت خروجی «1» خواهد بود. از آنجایی که این مبحث مرتبط با جبر بولی است و توضیحاتش فراتر از این مقاله است برای اطلاعات بیشتر می‌توانید از این لینک استفاده کنید. جدول XORمحاسبه معادله Message Schedule:تا اینجا برخی از جزییات مربوط به معادله را بررسی کردیم. یک نگاه دیگری به معادله اصلی بیندازیم:از آنجایکه مقدار W0 تا W15 مشخص است می‎‌خواهیم مقادیر W16 تا W63 را از طریق معادلات بالا بدست آوریم. به عنوان نمونه، در مثال &quot;!Hello World&quot; می‌خواهیم مقدار W16 را محاسبه کنیم. پس معادله را بدین‌گونه می‌نویسیم:از قبل داریم که:W0 =  48656C6C  OR  01001000 01100101 01101100 01101100W1 =  6F20576F   OR  01001000 01100101 01101100 01101100W9 =  00000000   OR  00000000 00000000 00000000 00000000W14 = 00000000  OR  00000000 00000000 00000000 00000000خب، ابتدا بیایم مقدار σ1(W14) را محاسبه کنیم، محاسبات با فرمت هگزادسیمال انجام می‌شود:σ1(W14) = ROTR17(W14) ⊕ ROTR19(W14) ⊕ SHR10(W14)σ1(00000000) = ROTR17(00000000) ⊕ ROTR19(00000000) ⊕ SHR10(00000000)σ1(W14) = 00000000در قدم بعدی می‌بایست σ0(W1) را محاسبه کنیم که با معادله زیر بدست می‌آید:σ0(x) = ROTR7(x) ⊕ ROTR18(x) ⊕ SHR3(x)همان‌طور که می‌دانیم W1 برابر است با 48656C6C، پس داریم:σ0(48656C6C) = ROTR7(48656C6C)⊕ROTR18(48656C6C)⊕SHR3(48656C6C)σ0(48656C6C) = DEDE40AE ⊕ 15DBDBC8 ⊕ DE40AEDσ0(W1) = C6E1918Bجمع پیمانه‌ای:ما الان مقادیر σ1 (W14) و σ0 (W1)  را داریم و وقتش رسیده تا W16 را حساب کنیم:W16 = σ1 (W14) + W9 + σ0 (W1) + W0W16 = 00000000 + 00000000 + C6E1918B + 48656C6Cمعادله بالا به نظر چند جمع ساده می‌رسد. اما نکته مهمی دارد. محاسبه جمعی که در معادله بالا است در اصل جمع پیمانه‌ای است نه جمع معمولی!برای فهم بهتر جمع پیمانه‌ای، یک عدد 8-رقمی دسیمال (در مبانی 10) را فرض کنید. مثلاً اگر عدد 1 را با عدد 8-رقمی  99.999.999 جمع پیمانه‌ای کنیم، جواب مورد انتظار 100.000.000 نخواهد بود. بلکه جواب 0 است. چرا؟ قبلاً گفتیم عدد ما باید 8 رقمی باشد و نمی‌تواند 9 رقمی شود. مثل ساعت که عقربه‌ها بعد از 12 به 1 می‌رسد نه به 13! برای مطالعه بیشتر می‌توانید در این لینک به طور خلاصه با نظریه همنهشتی و حساب پیمانه‌ای آشنا شوید.الان می‌توانیم محاسبه w16 را انجام دهیم. برای جمع از ماشین‌حساب آنلاین استفاده می‌کنیم.W16 = 00000000 + 00000000 + C6E1918B + 48656C6Cجواب ماشین‌حساب می‌شود:W16 = 10f46fdf7اما از آنجایی که قرار بود جمع پیمانه‌ای باشد و از 8 رقم بیشتر نشود. نیاز داریم تا چپ‌ترین رقم را آن‌قدر حذف کنیم تا طول عدد به 8 رقم برسد. پس مقدار درست W16 برابر می‌شود با:W16 = 0f46fdf7برای مقداردهی W17 تا W63 به همین روشی که توضیح دادیم محاسبات را انجام می‌دهیم.مقداردهی اولیه متغیرها:تا الان بررسی کردیم که ورودی‌های W چگونه بدست می‌آید. دوباره برگردیم به نمودار:اگر به نمودار بالا نگاه کنید، هشت متغییر a, b, c, d, e, f, g, h را می‌بینید که وارد هر Round شده‌ و از آن خارج می‌شوند. در ادامه متوجه خواهید شد که این هشت متغییر نقش کلیدی و مهمی را، در فرآیند ساخت هش توسط الگوریتم، ایفا می‌کنند. اما این هشت متغییر چیست و مقادیر اولیه آنها چگونه بدست می آید؟در نمودار بالا، این هشت متغییر در (i-1)H نشان داده شده است که در شروع (0)H است. برای مقداردهی این هشت متغیر در (0)H داریم:H(0)a = 6a09e667H(0)b = bb67ae85H(0)c = 3c6ef372H(0)d = a54ff53aH(0)e = 510e527fH(0)f = 9b05688cH(0)g = 1f83d9abH(0)h = 5be0cd19اما این مقادیر از کجا می‌آید؟ در واقع این مقادیر در استاندارد الگوریتم SHA-256 به عنوان مقادیر اولیه تعریف شده‌اند و همیشه ثابت هستند. بر اساس استاندارد FIPS 180-4 این مقادیر از جذر 8 عدد اول بدست می‌آیند. به عنوان نمونه، برای بدست آوردن متغیر H(0)a داریم:جذر اولین عدد اول برای بدست آوردن مقدار H(0)aمقدار ثابت Kبعد از محاسبه W و مقدار دهی هشت متغیر a تا h، حالا نوبت به بررسی متغیر K می‌رسد. همان‌طور که در نمودار زیر می‌بینید، 64 متغیر 32 بیتی K داریم که هر کدام برای یک Round است.بر اساس استاندارد FIPS 180-4 مقادیر K از ریشه سوم، 64 عدد اول بدست می‌آید. مقادیر K بدین ترتیب‌اند: مقادیر K در الگوریتم SHA-256به عنوان نمونه، اولین متغیر،k0، به این روش محاسبه می‌شود: ریشه سوم  اولین عدد اول برای محاسبه K0 در الگوریتم SHA-256محاسبه هش SHA-256تا اینجا تمامی ورودی‌های Round را بررسی کردیم. اما خود Round چیست؟ Round درواقع محاسبه هش SHA-256 است. یا به زبانی دیگر، یک انتزاع از مجموعه‌ معادلات ریاضیاتی است که خروجی آن هشت متغیر بروزرشده‌ی a, b, c, d, e, f, g, h است. در نهایت پس از انجام 64 بار Round، به یک قدمی هش خروجی خواهیم رسید.در تصویر زیر الگوریتم داخلی Round را می‌بینید:الگوریتم محاسبه هش SHA-256اگر بخواهیم الگوریتم بالا را به زبان ریاضی بنویسیم، می‌شود:معادلات ریاضیاتی محاسبه هش SHA-256 در الگوریتم بالا، مهم‌ترین معادلاتی که نیاز داریم محاسبه کنیم T1و T2 است. مقادیر ورودی‌های W، هشت متغیر a تا h و همچنین K را از قبل بدست آورده‌ایم. در معادلات T1 و T2 چند عملیات و نماد جدید ریاضیاتی می‌بینیم که قرار است در موردشان صحبت کنیم و مثال &quot;!Hello World&quot; را جلو ببریم.عملیات (x)∑دو سمبل (0)∑ و (1)∑ که در معادله T1 و T2 است از معادلات زیر بدست می‌آید. سمبل (0)∑ و (1)∑ در الگوریتم SHA-256در مورد ROTR و ⊕ قبلاً صحبت کرده‌ایم و روش محاسبات‌شان مشخص است.عملیات Majتابع Maj (a,b,c) که در معادله T2 استفاده شده، از معادله زیر بدست می‌آید:Maj (a,b,c) = (a ^ b) ⊕ (a ^ c) ⊕ (b ^ c)در معادله Maj تنها عملگری که معرفی نکرده‌ایم And است که با سمبل «^» نمایش داده می‌شود. And، هم مانند XOR، یکی دیگر از عملگرها در جبر بولی است. And به زبان ساده یعنی اینکه اگر خروجی 1 باشد ورودی‌های هم حتماً 1 هستند. در جدول زیر تمامی حالت‌های این عملگر را می‌بینید.جدول حالت‌های Andتابع شرطیتابع Ch(e, f, g) که در معادله T2 استفاده شده است از معادله زیر بدست می‌آید:Ch(e, f, g) = (e ^ f) ⊕ (~ e ^ g)تنهای عملگری که در این تابع معرفی نشده است، اپراتور Not است که با نماد «~» نمایش داده می‌شود. Not هم یکی دیگر از عملگرها در جبر بولی است. Not یعنی اینکه اگر ورودی 0 باشد خروجی 1 می‌شود و برعکس.محاسبه هش &quot;!Hello World&quot;قصد داریم که Round 0 را برای مثال &quot;!Hello World&quot;  محاسبه کنیم. مقادیر زیر را داریم:W0= 48656C6Ck0 = 428A2F98a = 6a09e667b = bb67ae85c = 3c6ef372d = a54ff53ae = 510e527ff = 9b05688cg = 1f83d9abh = 5be0cd19این مقادیر را در معادلات زیر جایگذاری می‌کنیم:T1= 5be0cd19 +  ∑1(510e527f) + ch(510e527f, 9b05688c, 1f83d9ab) + 428A2F98 +48656C6CT2 = ∑0(6a09e667) + Maj(6a09e667, bb67ae85, 3c6ef372)پس از محاسبه معادله بالا، مقادیر T1 و T2 را بدست می آوریم و می توانیم با استفاده از آنها بقیه محسابات را به راحتی انجام دهیم تا مقادیر a تا h به‌روز شوند. به‌روزرسانی متغیرهای a تا h در هر Round اتفاق می افتد. الگوریتم Round را 63 بار دیگر انجام می‌دهیم تا در نهایت مقدار خروجی‌ متغیرهای a تا h می‌شود:a = 1579CAFEb = C48A4DCEc = 7CBECE0Fd = A351E123e = AB1EF8A0f = 08D10E9Cg = 2B59F855h = B68CC350جمع نهایی:به تصویر زیر نگاه کنید:جمع متغیرهای a تا h از 63 Round با متغیرهای a تا h از Round 0 - الگوریتم SHA-256در این مرحله که آخرین مرحله الگوریتم SHA-256 است، می‌بایست هشت متغیر a تا h که از خروجی 63 Round بدست آمده را با متغیرهای a تا h که در ابتدا یعنی Round 0 داشتیم، جمع پیمانه‌ای کنیم. این عملیات ریاضی به ما مقادیر H0 تا H7 را می دهد که در نهایت با چسباندن آنها در کنار هم به هش تابع می‌رسیم.در مثال “!Hello World” بعد از جای‌گذاری مقادیر اشاره شده و انجام محاسبات جمع، به مقادیر زیر برای H0 تا H7 می‌رسیم:H0 = 7F83B165H1 = 7FF1FC53H2 = B92DC181H3 = 48A1D65DH4 = FC2D4B1FH5 = A3D67728H6 = 4ADDD200H7 = 126D9069با چسباندن مقادیر H0 تا H7 در کنار هم به هش تابع می رسیم که در مثال “!Hello World”، همان‌طور که انتظار هم داشتیم، می‌شود:7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069</description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Sat, 14 Jan 2023 13:30:16 +0330</pubDate>
            </item>
                    <item>
                <title>چرا بیشتر بازی‎‌ها با سی‌پلاس‌پلاس نوشته شده؟</title>
                <link>https://virgool.io/@mostafajafari/%DA%86%D8%B1%D8%A7-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1-%D8%A8%D8%A7%D8%B2%DB%8C-%D9%87%D8%A7-%D8%A8%D8%A7-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3-%D9%86%D9%88%D8%B4%D8%AA%D9%87-%D8%B4%D8%AF%D9%87-qw394n1hdrgt</link>
                <description>تا بحال فکر کرده‌‌اید بازی‌های پرطرفداری مثل کالاف دیوتی، فارکرای یا جی‌تی‌ای چگونه توسعه پیدا کرده‌اند و از چه زبان برنامه‌نویسی استفاده می‌کنند؟ امروزه، صنعت بازی بیش از میلیاردها دلار ارزش دارد. استودیوهای پیشرفته بازی‌سازی، مثل راکسترگیم، پرشده از توسعه‌دهندگان و طراحان بااستعداد که در این صنعت فعال‌ا‌ند و همچنین تعداد بی‌شماری از گیمرها که با تمام وجود دل‌بسته بازی‌ها هستند. انتظار می‌رود صنعت بازی‌سازی، در مقایسه با 173 میلیارد دلار سال 2021، در انتهای سال 2026 به عدد 314 میلیارد دلار برسد. با رشد بازار بازی‌سازی، سالانه استودیوهای بازی‌سازی جدیدی به این اکوسیستم وارد می‌شوند و به گیمرها تجربه بازی لذت‌بخش‌تر و فراگیرتری ارائه می‌دهند. سی‌پلاس‌پلاس نقش مهمی در اکوسیستم بازی‌سازی ایفا می‌کند. این زبان در سورس کد بیشتر موتورهای بازی‌سازی، مثل آنریل، یونیتی و موتور بازی‌سازی پیشرفته راکستر، استفاده‌ شده است و به توسعه‌دهندگان اجازه می‌دهد تا بازی‌هایی با کارایی بالا بسازند. خب ببینم چرا سی‌پلاس‌پلاس زبان بهتری برای بازی‌سازی است.چرا بیشتر بازی‎‌ها با سی‌پلاس‌پلاس نوشته شده؟تاریخچه سی‌پلاس‌پلاسسی‌پلاس‌پلاس یکی از اولین زبان‌های سطح بالا است که توسط بی‌یارنه استراس‌تروپ، دانشمند دانمارکی، در سال 1979 ایجاد شد. این زبان بر اساس زبان سی توسعه یافت و قابلیت‌های شیءگرا را معرفی کرد. در ابتدا، به‌عنوان یک افزونه برای زبان سی شناخته می‌شد و از نام &quot;سی با کلاس‌ها&quot; به‌جای &quot;سی‌پلاس‌پلاس&quot; تا سال 1983 استفاده می‌کرد. از آن زمان به بعد، سی‌پلاس‌پلاس تغییرات زیادی را شاهد بود. اولین استاندارد‌ سی‌پلاس‌پلاس در سال 1998 منتشر شد که با نام سی‌پلاس‌پلاس 98 شناخته می‌شد. در ابتدا، مشکلات زیادی برای این زبان گزارش می‌شد، که کمیته استانداردهای سی‌پلاس‌پلاس آن‌ها را در سال 2003 رفع‌ورجوع کرد و این استانداردها را در زبان سی‌پلاس‌پلاس 03 به‌روزرسانی کرد. بعد از مدتی، کمیته استانداردهای سی‌پلاس‌پلاس ارتقاءت جدید زبان را اعلام کرد، که در نسخه سی‌پلاس‌پلاس 11 پیاده‌سازی شد. به‌روزرسانی‌های کند زبان برای توسعه‌دهندگان موجب نگرانی بود. بعد از 2011، سی‌پلاس‌پلاس به‌روزرسانی‌هایش را سریع‌تر کرد که این امکان را فراهم می‌کرد با دیگر زبان‌های سطح بالا رقابت بهتری کند.سی‌پلاس‌پلاس در صنعت بازی‌سازیبازی‌سازی یک فرآیند پیچیده است و نیاز به زبانی دارد تا بتواند قابلیت‌های خاصی را در اختیار داشته باشد. سی‌پلاس‌پلاس به خاطر ویژگی‌های زیر مناسب برای توسعه بازی است:· سی‌پلاس‌پلاس یک زبان خاص و استثنایی برای مدیریت حافظه است که کنترل، انعطاف‌پذیری، و بهینه‌سازی منابع بازی را بیشتر می‌کند.· سی‌پلاس‌پلاس با موتورهای بازی معروف مانند آنریل و یونیتی سازگارا است.· سی‌پلاس‌پلاس با داشتن به‌روزرسانی‌های سریع و مکرر پاسخگوی نیازمندی‌های بازی‌های مدرن است.· سی‌پلاس‌پلاس با زبان سطح پایین سی و اسمبلی سازگارا است و این امکان را به توسعه‌دهندگان می‌دهد تا با مؤلفه‌ها و اجزای سطح سخت‌افزار تعامل داشته باشند.· سی‌پلاس‌پلاس یک زبان کامپایلری است که کارایی بالاتری را نسبت به زبان‌های مفسری ارائه می‌دهد.· سی‌پلاس‌پلاس تعداد بی‌شماری کتابخانه برای توسعه بازی دارد که باعث می‌شود ساخت بازی برای بازی‌سازان آسان‌تر باشد.مقایسه سی‌پلاس‌پلاس با دیگر زبان‌هاسی‌پلاس‌پلاس یکی از پراستفاده‌ترین زبان‌ها برای بازی‌سازی است. فهمیدن شباهت‌ها و تفاوت‌ها بین زبان‌های برنامه‌نویسی می‌تواند از این جهت مهم باشد که برای انواع بازی‌ها برخی از زبان‌ها نسبت به دیگری انعطاف‌پذیری و بهینه‌سازی بیشتری فراهم می کنند. در اینجا قصد داریم به مقایسه سی‌پلاس‌پلاس با چند زبان‌ برنامه‌نویسی بپردازیم:سی‌پلاس‌پلاس – سی‌شارپهر دو زبان متعلق به خانواده زبان سی هستند. در اینجا به برخی از شباهت‌ها و تفاوت‌ها این دو زبان در صنعت بازی‌سازی می‌پردازیم. ازجمله شباهت‌های این دو زبان می‌توان به رویکرد شیءگرا اشاره کرد و اینکه ساختار کدی مشابه ای دارند. بنابراین فهمیدن یکی کمک به درک دیگری نیز می‌کند. همچنین هر دو زبان از کامپایلر برای تبدیل زبان سطح بالا به سطح پایین استفاده می‌کنند. از تفاوت‌های این دو زبان می‌توان به این اشاره کرد که سی‌پلاس‌پلاس کارآمدتر با زبان‌های سطح پایینی مانند سی و اسمبلی است که باعث می‌شود بازی‎‌ها با سرعت بیشتری اجرا شوند. سی‌پلاس‌پلاس به توسعه‌دهندگان اجازه می‌دهد تا حافظه را به‌طور دستی اختصاص دهند که آزادی بیشتری در هنگام برنامه‌نویسی به آن‌ها می‌دهد. بااین‌حال، سی‌شارپ از زباله روب استفاده می‌کند که از پشتیبانی تخصیص حافظه خودکار بهره می‌برد و بازی‌سازان برای بهینه‌سازی منابع بازی با محدودیت‌هایی روبرو هستند.سی‌پلاس‌پلاس – لوآ لوآ یک زبان برنامه‌نویسی است که برای بازی‌سازی معروف شده است. پلتفرم معروف روبلاکس، که اجازه می‌دهد کاربران بازی‌های خود را بسازند، از لوآ به‌عنوان زبان اسکریپت‌نویسی استفاده می‌کند. در اینجا به برخی از شباهت‌ها و تفاوت‌های این دو زبان می‌پردازیم. در سورس کد لوآ از سی هزار خط زبان سی استفاده شده است، که آن را بسیار شبیه به سی‌پلاس‌پلاس می‌کند. یک توسعه‌دهنده سی‌پلاس‌پلاس می‌تواند نوشتن کد لوآ را به سرعت شروع کند. اما تفاوت عمده این دو زبان این است که لوآ یکی از سریع‌ترین زبان‌های اسکریپت‌نویسی است که احتیاج به کامپایل ندارد، درحالی‌که سی‌پلاس‌پلاس برای تبدیل کد به زبان ماشین به آن نیازمند است. لوآ  قابلیت جاسازی با دیگر زبان‌های سطح بالا را دارد به این معنی که می‌تواند از کتابخانه‌های آن استفاده کند و کتابخانه‌های خود را به‌منظور بهبود قابلیت‌هایش گسترش دهد. سی‌پلاس‌پلاس دسترسی به مدیریت حافظه را حتی در زبان‌های سطح پایین آسان‌تر می‌کند، درحالی‌که لوآ فقط با زبان‌های سطح بالا سروکار دارد.سی‌پلاس‌پلاس – پایتونپایتون یک زبان قدیمی و قدرتمند است که بیشتر برای ساخت وب اپلیکیشن‌ها، مدل‌های یادگیری ماشین و تحلیل داده استفاده می‌شود. بااین‌حال، محبوبیت پایتون در بازی‌سازی به اندازه سی‌شارپ و سی‌پلاس‌پلاس نیست، اما به سرعت در حال بدست آوردن نگاه‌ها در میان بازی‌سازان است. پای‌گیم یک کتابخانه قدرتمند و برنامه‌نویس پسند برای بازی‌سازی است. در اینجا به بررسی شباهت‌ها و تفاوت‌های این زبان با سی‌پلاس‌پلاس می‌پردازیم. هر دو زبان پارادایم شیءگرا را پشتیبانی می‌کنند که از نظر برنامه‌نویسی شبیه به هم‌اند. همچنین مفسر معروف پایتون سی‌پایتون بر مبنای زبان‌های سی/سی‌پلاس‌پلاس ساخته شده است. برخلاف سی‌پلاس‌پلاس، ساختار کدنویسی پایتون سرراست‌تر و آسان‌تری است و نزدیک به ساختار نحوی زبان انگلیسی است که باعث می‌شود توسعه‌دهنده راحت‌تر کد بنویسد و آن را به خاطر بسپارد. سی‌پلاس‌پلاس یک زبان کامپایلری است، و پایتون یک زبان اسکریپت‌‌نویسی مثل لوآ است. بااین‌حال، سی‌پلاس‌پلاس به بازی‌سازان امکان تخصیص حافظه به طور دستی را می‌دهد که آن را بسیار انعطاف‌پذیر‌تر از پایتون می‌کند.کدام یک از موتورهای بازی از سی‌پلاس‌پلاس استفاده می‌کنند؟موتورهای بازی نقش مهمی را در ایجاد تجربه لذت‌بخش از بازی دارند. آن‌ها یک مجموعه از ویژگی‌های توکار مانند فیزیک، ورودی، و رندرینگ را فراهم می‌کنند که برای ساخت سریع بازی‌ها مورد استفاده قرار می‌گیرد. توسعه‌دهندگان از موتورهای بازی متنوعی برای نیازمندی‌هایشان استفاده می‌کنند. اما بیشتر موتورهای بازی از سی‌پلاس‌پلاس استفاده می‌کنند که این به خاطر مدیریت بهتر حافظه و سازگاری این زبان با کد سطح ماشین است. در اینجا فهرستی از موتورهای بازی آورده شده است که از سی‌پلاس‌پلاس استفاده می‌کنند یا اینکه پایگاه ‌کدشان با این زبان سازگار است.· Unreal Engine· Unity Engine· CryEngine· 4A Engine· Antiyard Gx 3D· C4 Engine· Godot· Torque3D· OGREآیا علاقه‌مند به شروع توسعه بازی‌سازی با سی‌پلاس‌پلاس هستید؟وقتی در مورد زبان برنامه‌نویسی توسعه بازی صحبت می‌کنیم، سی‌پلاس‌پلاس غیر قابل مقایسه با دیگر زبان ها است. جامعه بازی‌سازی علاقه‌مند به سی‌پلاس‌پلاس است و از آن پشتیبانی می‌کند. این زبان به بازی‌سازان انعطاف پذیری بیشتری، برای طراحی ویژگی‌های پیشرفته و ایجاد تجربه لذت‌بخش‌تر بازی، می‌دهد. یادگیری سی‌پلاس‌پلاس برای نوآموزان بسیار مفید است زیرا که سی‌پلاس‌پلاس یک زبان همه‌کاره است که برای برنامه‌نویسی همه‌منظوره بخصوص بازی‌سازی مورد استفاده قرار می‌گیرد. اگر شما علاقه‌مندید که بازی‌‎سازی را با سی‌پلاس‌پلاس یاد بگیرید، ما استفاده از Virtual Assistرا پیشنهاد می‌کنیم تا بتوانید کدهای سی‌پلاس‌پلاس کارآمدتری با پشتیبانی موتور بازی آنریل انجین بنویسید.مقاله اصلی</description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Sun, 01 Jan 2023 14:30:24 +0330</pubDate>
            </item>
                    <item>
                <title>گولنگ: چرا باید گولنگ را در 1400 یاد بگیرید.</title>
                <link>https://virgool.io/golangpub/%DA%AF%D9%88%D9%84%D9%86%DA%AF-%DA%86%D8%B1%D8%A7-%D8%A8%D8%A7%DB%8C%D8%AF-%DA%AF%D9%88%D9%84%D9%86%DA%AF-%D8%B1%D8%A7-%D8%AF%D8%B1-1400-%DB%8C%D8%A7%D8%AF-%D8%A8%DA%AF%DB%8C%D8%B1%DB%8C%D8%AF-foq7ylithmje</link>
                <description>گولنگ زبان نسبتا جوان اما محبوب بین برنامه نویسان است. بنابر نظرسنجی سایت StackOverflow، گولنگ سومین زبانی است که توسعه دهندگان علاقه به مطالعه دارند.در این مقاله، سعی خواهیم کرد دلایل محبوبیت گو را بیان کنیم و همچنین ببینیم در چه جاهایی از این زبان استفاده می شود و چرا ارزش یادگرفتن دارد. اگر شما تازه وارد دنیای برنامه نویسی شده‌اید می توانید گولنگ را به عنوان اولین زبان برنامه‌نویسی‌یتان یاد بگیرید.خلاصه ای از تاریخچه گوگولنگ در شرکت گوگل مفهوم‌سازی و طراحی شد و اسمش را هم از دو حرف اول نام این شرکت (گوگول) گرفته است. این زبان توسط Robert Griesemer، Rob Pike (یکی از خالقان UTF8)، وKen Thompson  افسانه‌ای، خالق Unix و زبان B (جد C)، طراحی و بنا گذاشته شد.گولنگ شباهت‌هایی به زبان C، و مانند C، دارد و یک ابزار برای برنامه‌نویسان حرفه‌ای است. با گو، بیشترین اثر و نتیجه را با کمترین تلاش بدست می آورید. بنابراین، این زبان بسیار فراتر از یک نسخه بروزشده زبان C است. گو در اصل جایگزینی برای ++C بود چرا که ++C زبانی بسیار عریض‌وطویل و دشوار است بخصوص فهمیدن آخرین استانداردهای آن. در مقایسه با ++C، گو زبانی راحت‌تر و آسان‌تر برای یادگیری است.گو از ایده های خوب زبان‌های مختلف برنامه‌نویسی استفاده و اقتباس می کند، این در حالی است که از ویژگی‌هایی که منجر به پیچیدگی، نامطمئنی و ناپایداری کد می شود تا حدی دوری می‌کند. ابزارهای گو نیز برای مسئله همروندی جدید است و به منظور بهره‌وری بیشتر است.گولنگ بخصوص مناسب برای توسعه زیرساخت، مانند سرورهای شبکه، و همچنین ابزارها و سیستم‌ها برای برنامه‌نویسان است. بااین‌حال این زبان برنامه نویسی یک زبان هم منظوره است و در حوزه‌هایی مانند گرافیک، اپلیکیشن‌های موبایل، و یادگیری ماشین استفاده می‌شود.گولنگ به شما این توانایی را می دهد تا یک پروژه را سریع، راحت و قابل استفاده در شکل میکروسرویس پیاده‌‎سازی کنید. این یک مزیت برای شرکت‌هایی است که می خواهند محصولات تخصصی خود را در سرویس‌های کوچک تولید کنند. در این مورد دیگر توجیه ندارد از فریم‌ورک‌هایی استفاده کنند که در سیستم های یکپارچه قابل استفاده است.برنامه‌هایی که با گولنگ نوشته شده‌اند به طور معمول سریع‌تر از برنامه‌‎های نوشته شده با دیگر زبان‌های برنامه‌نویسی هستند و به شما کمک می کنند تا نرم‌افزهای پیچیده و جالب را توسعه دهید.از آنجایی که گولنگ یک زبان برنامه نویسی متن باز است، سورس‌کد آن به طور آزاد و رایگان قابل دسترس است. کامپایلر، کتابخانه‌ها، و ابزار آن نیز به طور رایگان برای همه قابل استفاده است.مزایای زبانگولنگ مزایای زیادی، هم شناخته شده و هم کمتر شناخته شده، دارد.لیستی بعضی از این مزایا:سادگی کدتعداد بی‌شماری از کتابخانه‌هاانعطاف‌پذیریروند ساخت مستقیم و سرراستدر واقع، سادگی هدف اصلی ایجاد زبان گو بود، که حاصل شد. گو ساختار نحوی (سینتکس) بسیاری ساده‌ای دارد که این امکان را می‌دهد تا اپلیکیشن‌ها را سریع‌تر از دیگر زبان‌ها توسعه دهید.دو مسئله جالب در مورد گولنگ وجود دارد.اولا، گولنگ توسط تازه‌کاران، افرادی که چیزی از زبان برنامه‌نویسی نمی‌دانند و می‌خواهند یک توسعه دهنده شوند، به راحتی قابل یادگرفتن است. گو تقریبا به راحتی پی‌اچ‌پی یا حتی پاسکال است، اما در عین حال به قدرت‌مندی سی‌پلاس‌پلاس.بله، ساختار نحوی در گولنگ بسیار نحیف و ناچیز است؛ و خبری از پیاده سازی تمام عیار شی‌گرایی در آن نیست. گو یک زبان تابعی است که می توان از آن برای حل مسائل در هر سطح پیچیدگی، مانند صنایع و کسب‌کارها، استفاده کرد.دوما، گولنگ توسط حرفه‌ای‌ها، که یک زبان یا چندین زبان برنامه‌نویسی را می‌دانند، می تواند فراگرفته شود. اغلب، توسعه‌دهندگان گو را بعد از تسلط یافتن در پایتون، پی‌اچ‌پی، سی‌پلاس‌پلاس، جاوا و سی‌شارپ یاد می‌گیرند.گولنگ همچنین شناخته شده برای داشتن تعداد عظیمی از کتابخانه‌ها و پکیج‌ها است که باعث می‌شوند بهره‌وری بیشتری با گو داشته باشید.مزیت شگفت‌انگیز بعدی، انعطاف‌پذیری این زبان است. روش گولنگ در انتزاع کردن داده‌ها و توسعه شی‌‎گراء به طرز قابل‌ توجهی انعطاف‌پذیر است.این زبان برنامه‌نویسی به نحوی طراحی شده که بتوان در آن سریع تسلط پیدا کرد و مسائل را به طور کارآمدتر حل کرد.در این زبان تنها 25 کلیدواژه وجود دارد و هیچ احتیاجی به مدیریت حافظه و نخ‌ها نیست، برای این کار از بازیافت حافظه یا زباله روبی (GC) و زمان‌بند (scheduler) استفاده می‌شود.25 کلیدواژه زبان گوآیا گولنگ میان شرکت‌ها بزرگ معروف است؟بدون هیچ شکی، گو تقریبا در تمامی شرکت‌ها و صنایع عظیم مورد استفاده است و تقاضا برای توسعه‌دهندگان آن بسیار است.این شرکت‌ها و صنایع، تبدیل‌کنندگان ویدیو، سرویس‌های استریمینگ، کسب‌وکارهای تجمعی، فروشگاه‌های آنلاین، پیام‌رسان‌های فوری (مثل تلگرام و واتس‌آپ) هستند. شما می توانید سطح تقاضا برای توسعه‌دهندگان گولنگ را با ارزیابی کردن فهرست سازمان‌هایی که پروژه‌ها/نرم‌افزارهایشان  با گو کار می‌کند، تخمین بزنید.لیستی از معرف‌ترین شرکت‌هایی که از گولنگ استفاده می‌کنند.GoogleTwitch (پلتفرم استرمینگ بازی)SendGrid (سرویس ابری ایمیل)Dropbox (یکی از پیشروترین شرکت ‌ها در خدمات رایانش ابری)SoundCloud (پلتفرم توزیع صدا به صورت آنلاین)گولنگ برای سیستم های پوش ‌نوتیفیکشن خوب، برای استریمیگ ایده‌آل، و بسیار سریع است چون زبانی ساده و کامپایل شده است. در نتیجه، شرکت‌های زیادی به دنبال توسعه‌دهندگانی هستند که حداقل کمی آشنایی با گو داشته باشند و آماده برای سوییچ کردن به این زبان برای یادگیری باشند.بنا بر آخرین تحقیقات، تمایل زیادی برای توسعه نرم‌افزازهایی که قبل با سی‌پلاس‌پلاس نوشته شده با زبان گو وجود دارد: مانند ‌سیستم‌های بک‌اند، ریاضیاتی، پردازش داده و منطق‌های کلیدی در حوزه کسب و کار.گولنگ برای ایجاد سیستم‌هایی با معماری میکروسرویس‌ها عالی است، بنابراین در آینده، تقاضا برای چنین برنامه‌نویسانی رشد خواهد کرد. از آنجایی که گو توسعه‌دهنده‌گان زیادی ندارد، بنابراین بیشتر به برنامه نویسان آن پرداخت خواهد شد.در جمع‌بندی، باید اقرار کنیم که گولنگ هم در روند توسعه و هم رشد شغلی یک زبان برنامه‌نویسی امیدوار‌کننده است. بدون شک، گولنگ زبان برنامه‌نویسی آینده است.خب اگر جذب گولنگ شده‌اید. باید اولین قدم‌ها را بردارید و سعی کنید آن را یادبگیرید. در سال‌های آینده، نیاز برای متخصصین در این صنعت رشد خواهد کرد.بهترین منبع که برای اطلاعات بیشتر در مورد زبان پیشنهاد می‌شود سایت رسمی گولنگ است. سایت رسمی دسترسی به داکیومنت ها، مشخصات زبان، پکیج های استاندارد و... را فراهم می‌کند. همچنین می توانید از آخرین آموزش‌ها چه به صورت متنی و ویدیویی بر روی وب استفاده کنید.شما می توانید برای گذاشتن قدم اول از اینجا گو را دانلود و نصب کنید.گو روز به‌ روز در حال محبوب شدن بین برنامه نویسان است، خب از شناس‌تان استفاده کنید و از امروز شروع به یادگیری آن کنید.مقاله اصلی </description>
                <category>مصطفی جعفری</category>
                <author>مصطفی جعفری</author>
                <pubDate>Wed, 23 Jun 2021 10:09:37 +0430</pubDate>
            </item>
            </channel>
</rss>