<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ریحانه یعقوب‌زاده</title>
        <link>https://virgool.io/feed/@reihan_ygh</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 15:49:31</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1307111/avatar/8tzH1Z.jpg?height=120&amp;width=120</url>
            <title>ریحانه یعقوب‌زاده</title>
            <link>https://virgool.io/@reihan_ygh</link>
        </image>

                    <item>
                <title>اصول اولیه‌ی جاوا اسکریپت - چینه‌ی فراخوانی و پشته‌ی حافظه</title>
                <link>https://virgool.io/@reihan_ygh/%D8%A7%D8%B5%D9%88%D9%84-%D8%A7%D9%88%D9%84%DB%8C%D9%87-%DB%8C-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%BE%D8%B4%D8%AA%D9%87-%DB%8C-%D8%AA%D9%85%D8%A7%D8%B3-%D9%88-%D9%BE%D8%B4%D8%AA%D9%87-%DB%8C-%D8%AD%D8%A7%D9%81%D8%B8%D9%87-m5uqu6g2jg7o</link>
                <description>موتور جاوا اسکریپت کارهای زیادی رو برای ما انجام می‌ده؛ اما بزرگترین کارش خوندن کد و اجرای اونه. دو مورد مهم در این مرحله عبارتند از:۱. ما به مکانی برای ذخیره و نوشتن داده‌های برنامه (متغیرها، اشیاء و غیره) نیاز داریم.۲. باید خط به خط ردیابی کنیم که چه اتفاقی برای کد ما می افته.اینجاست که یک چینه یا پشته‌ی فراخوانی ( CallStack) و یک پشته‌ی حافظه ( MemoryHeap) وارد می‌شن. ما به پشته‌ی حافظه به عنوان مکانی برای ذخیره و نوشتن اطلاعات نیاز داریم؛ چون در نهایت همه برنامه‌ها فقط عملیات خوندن و نوشتن رو انجام میدن (یعنی تخصیص، استفاده و آزادسازی حافظه). پشته‌ی فراخوانی هم به ما کمک می‌کنه جایی که در کد هستیم رو پیگیری کنیم، تا بتونیم کد رو به ترتیب و خط به خط اجرا کنیم.پشته‌ی حافظه ( MemoryHeap) کد بالا به جاوا اسکریپت می‌گه لطفا یک خانه از حافظه رو به متغیر number با مقدار ۱۱ اختصاص بده.در اینجا ما به موتور جاوا اسکریپت می‌گیم که یک بخش از حافظه رو به آبجکت person و مقادیر اون اختصاص بده. بنابراین هر زمان که person رو صدا کنیم، به ناحیه‌ای در پشته‌ی حافظه‌ی ما برمی‌گرده که کلیدهای name و age اون به مقادیر &quot;Ali&quot; و &quot;22&quot; اشاره می‌کنن.ما می‌تونیم هر نوع داده‌ای رو اینجا ذخیره کنیم. داده‌ها به شکلی نامرتب هستن. از متغیرها برای اشاره به مکان‌های مختلف استفاده می‌کنیم و موتور جاوا اسکریپت داده‌ها رو توی یک‌سری جعبه برای ما قرار میده و نگهداری می‌کنه.پشته‌ی فراخوانی ( CallStack)تابع بالا یک بخش از حافظه رو به خودش اختصاص می‌ده تا هر زمان که ما ()calculate را فراخوانی کنیم؛ فقط اون رو توی حافظه جستجو کنه و این قطعه کد رو اجرا کنه.هر بار که یک تابع رو اجرا می‌کنیم از پشته‌ی فراخوانی استفاده می‌کنیم. ما می‌تونیم پشته‌ی فراخوانی رو به عنوان منطقه‌ای درون حافظه در نظر بگیریم که آخرین ورودی رو اول از همه اجرا می‌کنه. بنابراین در اینجا، تابع calculate رو بالای پشته اضافه می‌کنه و بعد از تموم شدن اِجراش، اون رو حذف می کنه. اگر به developer console بریم و این کد رو در قسمت sources -&gt; snippets -&gt; new snippet وارد کنیم، می‌تونیم مراحل اضافه، اجرا و حذف شدن این توابع رو به پشته‌ی فراخوانی ببینیم.این روشیه که توی بیشتر زبان‌ها کار می‌کنه ( در اکثر زبان‌ها پشته‌های فراخوانی و پشته‌های حافظه داریم). حالا از اونجایی که پیاده‌سازی موتور جاوا اسکریپت متفاوته، جایی که به متغیرها حافظه تخصیص داده می‌شه، همیشه یکسان نیست. فقط باید بدونیم که هر چیزی بالای پشته هست همون چیزیه که در حال اجراست.سرریز پشته (Stack Overflow)سرریز پشته زمانی اتفاق می‌افته که توابع تو در تو رو بارهای بار فراخوانی کنیم. اگر فقط به اضافه کردن توابع به پشته ادامه بدیم بدون اینکه اون‌ها رو از پشته خارج کنیم و به کارشون پایان بدیم، یک سرریز پشته اتفاق می‌افته.ما به راحتی می‌تونیم با توابع بازگشتی یک سرریز پشته ایجاد کنیم. با اجرای این کد، ارور زیر رو داخل developer console می‌گیریم که بهمون میگه اندازه برنامه اجرایی ما از حداکثر اندازه پشته‌ی فراخوانی فراتر رفته.جمع آوری زباله (Garbage Collection) و نشت حافظه (Memory Leak)قبل از صحبت در مورد نشت حافظه، باید مفهوم جمع آوری زباله را درک کنیم.جاوا اسکریپت زبانیه که به‌طور خودکار جمع آوری زباله انجام می‌ده. این به این معنیه که اگر جاوا اسکریپت حافظه رو به متغیری تخصیص بده ( مثلا در داخل یک تابع، یک آبجکت ایجاد می‌کنیم و اون آبجکت در جایی در پشته‌ی حافظه‌ی ما ذخیره میشه)؛ وقتی فراخوانی اون تابع رو به پایان می‌رسونیم و دیگه به اون متغیر هم نیاز نداریم؛ اون مقدار به‌طور خودکار از حافظه حذف میشه.بنابراین، جاوا اسکریپت به طور خودکار این حافظه رو آزاد می‌کنه یا به معنای واقعی کلمه زباله های ما رو جمع می‌کنه.اینطوری فقط داده‌هایی که برای ما مفید هستن باقی می‌مونن و ما مطمئن می‌شیم که از تمام حافظه ای که داریم، استفاده نمی‌کنیم؛ چون همون‌طور که می‌دونیم حافظه‌ی ما محدوده. این روشیه که جاوا اسکریپت، از ایجاد نشتی‌های حافظه جلوگیری می‌کنه؛ درست مثل سرریز پشته.اما احمقانه‌ست که فرض کنیم از اونجایی که ما یک زباله جمع کن داریم که حافظه رو برای ما پاک کنه، نباید نگران مدیریت حافظه باشیم؛ چون هیچ سیستم کاملی وجود نداره!و اگرچه زباله‌گیر به اندازه‌ای باهوش هست که بفهمه به چه چیزهایی نیاز داریم و به چه چیزی نیاز نداریم، اما گاهی اوقات اشتباه می‌کنه و حافظه رو آزاد نمی‌کنه.در زبان های سطح پایین مثل C، شما جمع آوری زباله رو کنترل می‌کنید. این شما هستید که به موتور می‌گید قسمت‌هایی از حافظه رو حذف کنه. این خطرناکه، اما برنامه های C بسیار سریع و کارآمد هستن چون شما جمع آوری زباله رو کنترل می‌کنید.جمع آوری زباله در جاوا اسکریپت از الگوریتم Mark and Sweep استفاده می‌کنه. زمانی‌که یک مرجع به یک متغیر حذف می‌شه، اون رو حذف می‌کنه. https://commons.wikimedia.org/wiki/File:Animation_of_the_Naive_Mark_and_Sweep_Garbage_Collector_Algorithm.gif کد بالا حافظه ما رو پر می‌کنه تا جایی که چیزی از حافظه برای استفاده باقی نمونه؛ و تا زمانی‌که مرورگر ما از کار بیفته، هیچ چیز از پشته خارج نمیشه.۳ دلیل رایج نشت حافظه۱. تعریف متغیرهای سراسری (Global Variables)var a = &#039;1&#039;
var b = &#039;2&#039;
var c = &#039;3&#039;اینجا اگه فقط به افزودن این متغیرها به حافظه ادامه بدیم، تمام حافظه ما در نهایت تموم میشه؛ چون ما فقط در حال استفاده از حافظه هستیم. حالا اگه این متفیرها آبجکت‌های تو در تو باشن، ما مقدار زیادی از حافظه رو مصرف می‌کنیم.۲. تعریف شنونده‌های رویداد (Event Listeners)var element = document.getElementById(‘button’)
element.addeventListener(‘click’, )این یک روش معمول برای نشت حافظه‌ست، چون فقط شنونده‌های رویداد یا همون eventListenerها رو اضافه می‌کنیم و زمانی که دیگه به اون‌ها نیاز نداریم، حذف‌شون نمی‌کنیم. اون‌ها در پس زمینه می‌مونن و قبل از اینکه متوجه بشیم، باعث نشتی حافظه میشن.۳. استفاده از تابع ()setIntervalاگه تابعی رو داخل یک ()setInterval قرار بدیم، هرگز زباله شناخته نشده و حذف نمی‌شن؛ مگر اینکه خود setInterval رو حذف کنیم.setInterval( () =&gt; { //referencing objects })بنابراین چیزی که باید در نظر داشت این هست که حافظه محدوده. بنابراین اگه می‌خوایم کد کارآمدی داشته باشیم، باید مراقب باشیم که نشت حافظه یا سرریز پشته نداشته باشیم.جاوا اسکریپت یک زبان برنامه نویسی تک رشته ای است (synchronous)این به این معناست که در هر زمان تنها یک مجموعه از دستورالعمل‌ها اجرا می‌شن و جاوا اسکریپت نمی‌تونه چندین کار رو همزمان انجام بده. بهترین راه برای بررسی تک رشته‌ای بودن یک زبان این هست که آیا یک پشته‌ی فراخوانی داره یا نه؟ آیا تابع‌ها رو یکی یکی وارد پشته می‌کنیم و بعد بیرون میاریم؟ این‌طوری می‌تونیم نتیجه بگیریم جاوا اسکریپت  یک زبان تک رشته‌ای و همزمانه؛ یعنی فقط یک تابع می‌تونه در یک زمان اجرا بشه.</description>
                <category>ریحانه یعقوب‌زاده</category>
                <author>ریحانه یعقوب‌زاده</author>
                <pubDate>Fri, 27 Oct 2023 19:07:52 +0330</pubDate>
            </item>
                    <item>
                <title>جاوا اسکریپت یک زبان مفسری‌ است یا کامپایلری؟</title>
                <link>https://virgool.io/@reihan_ygh/%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%DB%8C%DA%A9-%D8%B2%D8%A8%D8%A7%D9%86-%D9%85%D9%81%D8%B3%D8%B1%DB%8C-%D8%A7%D8%B3%D8%AA-%DB%8C%D8%A7-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1%DB%8C-ymzalnwrdfwc</link>
                <description>موتور جاوا اسکریپت یک برنامه‌ی کامپیوتری‌ هست که کدِ جاوا اسکریپت رو به اون می‌دیم و اون به کامپیوتر می‌گه که چطور اون رو اجرا کنه. به طور خلاصه این موتور یک مترجم هست برای رایانه، بین جاوا اسکریپت و زبانی که رایانه اون رو درک می‌کنه. اما در داخلِ موتور چه اتفاقی می‌افته؟ خب این به موتور بستگی داره!موتورهای جاوا اسکریپتیِ زیادی وجود دارن و معمولا توسط ارائه دهندگانِ مرورگرِ وب ایجاد می‌شن. همه موتورهای جاوا اسکریپت توسط ECMA Script یا ES استاندارد شدن.عملیات‌های یک موتور جاوا اسکریپتی تجزیه کننده یا Parserکار تجزیه کننده‌ها، تجزیه و تحلیلِ کد، بررسی خطاها و تقسیم کردنِ کد به قسمت‌های کوچک‌تر هست.درختِ نحوی انتزاعی یا ASTتجزیه کننده یا parser، یک ساختار داده‌ی درختی به نام درختِ نحوی انتزاعی (Abstract Syntax Tree) یا AST تولید می‌کنه. در حقیقت، AST یک نمودارِ درختی از کد اصلی هست که تمام جزئیات رو نشون نمی‌ده اما حاوی جزئیاتِ ساختاری یا مرتبط با محتواست. چیزهای خاصی در درختِ اصلی به طور ضمنی وجود دارن که نیازی به نشون دادن ندارن. به همین دلیل، این درخت که چکیده‌ی درخت اصلی‌ هست تولید می‌شه.مفسرها و کامپایلرهایک مفسر مستقیماً کد رو می‌خونه و اون رو خط به خط اجرا می‌کنه؛ بدون اینکه نیازی به کامپایل شدن کد به زبان ماشین داشته باشه. مفسرها می تونن از استراتژی‌های مختلفی برای افزایش عملکرد استفاده کنن. اون‌ها می تونن کد اصلی رو تجزیه و بلافاصله اجرا کنن، اون رو به کد ماشین کارآمدتر ترجمه کنن و کدهای از پیش کامپایل شده و ساخته شده توسط یک کامپایلر یا ترکیبی از این‌ها رو اجرا کنن.کامپایلرها اما زودتر از موعد کار می‌کنن تا دستورالعمل‌ها رو به یک کد ماشین یا فرمِ سطح پایین تبدیل کنن تا کامپیوتر بتونه اون‌ها رو بخونه و اجرا کنه. کامپایلر، ابتدا تمام کدها رو اجرا می‌کنه و سعی می‌کنه بفهمه کد چه کار می‌کنه و بعد اون رو به زبانِ دیگری که خوندنش برای رایانه آسون‌تر هست، کامپایل می‌کنه.معایبِ استفاده از مفسرها چیه؟بیایید با یک مثال توضیح بدیم:فرض کنید کد بالا رو داشته باشیم. اگر از مفسر برای اجراش استفاده کنیم، چون نمی‌تونه کل کد رو تحلیل کنه، توی حلقه هربار که تابع رو می‌بینه از اول اون رو میخونه و اجرا میکنه؛ و خب این باعث کند شدنِ روندِ اجرای برنامه میشه. درحالی‌که اگر از کامپایلرها برای اجرا استفاده می‌کردیم؛ کامپایلر تابع رو میخوند، متوجه می‌شد، ذخیره می‌کرد و هربار از همون استفاده می‌کرد.خب ما تا اینجا نتیجه گرفتیم که گرچه مفسرها و کامپایلرها مزایا و معایبی دارن؛ اما به تنهایی مفید نیستن و ما برای اجرای کد جاوا اسکریپت نمی‌خوایم از یکی از این‌ها استفاده کنیم. پس اومدن و هردوی اینها رو با هم قاطی کردن و چیزی به اسم  JIT Compilerها رو معرفی کردن که ترکیبی از کامپایلرها و مفسرهاست.پروفایلر (Profiler)پروفایلر تمام کدِ ما رو زیر نظر داره. اطلاعاتی از جمله اینکه چطور میتونیم این کد رو بهینه‌تر کنیم، چه بخشی چندبار اجرا میشه، چه انواعی وجود دارند و ... رو یادداشت می‌کنه.این برای ما چطور مفید هست؟ درحالی‌که کد ما داره توسط ‌مفسر اجرا میشه، بخش‌هایی از کد که قابل بهینه سازی هستند توسط پروفایلر شناسایی شده و به compiler فرستاده میشن. این اتفاق در حین اجرا شدنِ کد اتفاق میوفته و به همین دلیل سرعت کار ما رو بیشتر میکنه.حالا سوال نهایی:آیا جاوا اسکریپت یک زبان مفسری است؟وقتی کسی می‌گه جاوا اسکریپت یک زبانِ تفسیر شده‌ست؛ این تا حدی درسته؛ اما در واقع به نحوه‌ی اجرا بستگی داره. شما می‌تونید یک پیاده سازی از موتور جاوا اسکریپت داشته باشید که فقط کامپایل بشه. به هرحال این تنها در مورد جاوا اسکریپت نیست و در مورد زبانی مثل پایتون هم صادقه. پایتون رو می‌شه از طریق یک کامپایلر اجرا کرد یا می‌شه اون رو تفسیر کرد. بنابراین جواب این سوال اینه که همه چیز از نظر فنی به نحوه اجرا بستگی داره.منبع: Advanced JavaScript Concepts</description>
                <category>ریحانه یعقوب‌زاده</category>
                <author>ریحانه یعقوب‌زاده</author>
                <pubDate>Fri, 15 Sep 2023 19:38:45 +0330</pubDate>
            </item>
            </channel>
</rss>