moaminsharifi/fa-wiki-spell-checker huggingface dataset:
در سال ۱۹۸۹، یان لی‌کان و همکاران الگوریتم استاندارد پس‌انتشار را برای یک شبکهٔ عصبی عمیق با هدف تشخیص متن‌های دست‌نویس (به‌طور خاص با هدف بازشناسی کدهای پستی دست‌نویس روی نامه‌های پستی) به کار بست. درحالی که الگوریتم کار می‌کرد، عملیات یادگیری آن به سه روز زمان نیاز داشت. مدل مورد استفاده از یک لایهٔ ورودی با ۲۵۶ واحد (پیکسل‌های یک تصویر مربعی ۱۶×۱۶)، یک لایهٔ خروجی با ۱۰ واحد (که مشخص می‌کرد تصویر رقمی که به ورودی داده‌شده‌است، کدام یک از ارقام ۰ تا ۹ است) و سه لایهٔ پنهان در میان این دو تشکیل شده بود. با ارزیابی مدل بر روی مجموعه‌دادهٔ تست، ۸/۱٪ رده‌بندی اشتباه و ۱۹/۴٪ بازپس‌زنی برای ۱٪ نرخ خطا در میان الگوهای تست باقی‌مانده به دست آمد که نشان می‌داد که این مدل نسبت به مدل‌های ارائه‌شدهٔ پیشین از دقت بالاتری برخوردار است و استفاده از الگوریتم پس‌انتشار، روشی مناسب در فرایند تعلیم شبکه‌های عصبی عمیق است. لازم است ذکر شود که خود الگوریتم پس‌انتشار، از پیش و از ۱۹۷۰ نیز به عنوان حالت معکوس مشتق خودکار وجود داشت.Griewank, Andreas. "Who invented the reverse mode of differentiation." "Documenta Mathematica, Extra Volume ISMP" (2012): 389-400. (PDF) https://www.math.uni-bielefeld.de/documenta/vol-ismp/52_griewank-andreas-b.pdf
تا سال ۱۹۹۱، چنین سامانه‌هایی عموماً برای تشخیص ارقام دوبُعدی دست‌نویس ایزوله‌شده (به این معنا که ارقام به صورت تنها و بدون جزئیات و ویژگی‌های اضافهٔ دیگری در پس‌زمینه - مثلاً متن و حروف اضافه - نوشته‌شده‌اند) به کار می‌رفتند؛ درحالی که بازشناسی اجسام سه‌بُعدی همچنان یک چالش بود. در سال ۱۹۹۲، پژوهشی از جان ونگ و همکاران با توضیح معایب و محدودیت‌های شبکه‌های عصبی سه‌لایه‌ای که برای این منظور به کار می‌رفتند، از مفهوم "شبکهٔ سلسله‌مراتبی" (به انگلیسی: hierarchical network) استفاده کرده و مدلی موسوم به Cresceptron را ارائه دادند که قادر بود اجسام سه‌بعدی در محیط‌های شلوغ را نیز تشخیص دهد.J. Weng, N. Ahuja and T. S. Huang, "Cresceptron: a self-organizing neural network which grows adaptively," "Proc. International Joint Conference on Neural Networks", Baltimore, Maryland, vol I, pp. 576-581, June, 1992.J. Weng, N. Ahuja and T. S. Huang, "Learning recognition and segmentation of 3-D objects from 2-D images," "Proc. 4th International Conf. Computer Vision", Berlin, Germany, pp. 121-128, May, 1993.J. Weng, N. Ahuja and T. S. Huang, "Learning recognition and segmentation using the Cresceptron," "International Journal of Computer Vision", vol. 25, no. 2, pp. 105-139, Nov. 1997. مفهوم تجمیع حداکثری (به انگلیسی: max pooling) نیز نخستین‌بار در همین پژوهش پیاده‌سازی شد. از آن‌جایی که این مدل می‌توانست مستقیماً تصاویر طبیعی (سوژه‌های سه‌بعدی، با حضور عناصر دیگر در پس‌زمینه) را به عنوان ورودی دریافت کند، تبدیل به بنیانی برای یادگیری بصری همه‌منظوره شد.
در سال ۱۹۹۴، آندره د کاروالیو به همراه مایک فیرهورست و دیوید بیسیت، معماری‌ای مبتنی بر یک شبکهٔ عصبی بولی چندلایه را ارائه داد که تحت عنوان شبکهٔ عصبی بی‌وزن نیز شناخته می‌شد. این معماری از یک ماژول شبکهٔ عصبی سه‌لایه‌ای خودسامان‌دهندهٔ استخراج ویژگی (به انگلیسی: self-organising feature extraction یا SOFT) به همراه یک ماژول شبکهٔ عصبی چندلایهٔ رده‌بندی (به‌طور خاص یک شبکه با معماری GSN یا goal-seeking network) تشکیل شده بود که به صورت مستقل عملیات یادگیری را انجام می‌دادند. در ماژول استخراج ویژگی، تصویر ورودی به چند زیرمجموعه تقسیم شده و هر قسمت به یک بلاک از نورون‌ها (که دارای سلسله‌مراتب بوده و در چند لایه تقسیم شده‌بودند) داده می‌شد و هر بلاک به صورت موازی با دیگر بلاک‌ها و مستقل از آن‌ها آموزش می‌دید.
در سال ۱۹۹۵، یوزف زِپ هُخ‌رایتر که پیش‌تر و در ۱۹۹۱ در پایان‌نامهٔ خود - تحت عنوان: "بررسی‌هایی در شبکه‌های عصبی پویا" (به آلمانی: Untersuchungen zu dynamischen neuronalen Netzen) - به بررسی مسئلهٔ گرادیان کاهشی پرداخته بودS. Hochreiter. , "Untersuchungen zu dynamischen neuronalen Netzen," "Diploma thesis. Institut f. Informatik, Technische Univ. Munich. Advisor: J. Schmidhuber", 1991. (که خود پیش‌تر و در ۱۸۴۷مطرح شدهLemaréchal, C. (2012). "Cauchy and the Gradient Method" (PDF). "Doc Math Extra": 251–254. و در ۱۹۴۴ نیز برای مسائل بهینه‌سازی غیرخطی مورد مطالعه قرار گرفته بود) به همراه یورگن اشمیدهوبر، معماری ال‌اس‌تی‌ام را ارائه دادS. Hochreiter, J. Schmidhuber. Long Short-Term Memory. Technical Report FKI-207-95, Technische Universitat München, München, August 1995. URL: http://citeseerx.ist.psu.edu/viewdoc/summary?doi= 10.1.1.51.3117. و در مقالهٔ دیگری در سال ۱۹۹۷، آن را بهبود بخشیدS. Hochreiter, J. Schmidhuber. (1997). "Long Short-Term Memory". "Neural Computation". 9 (8): 1735–1780. doi:10.1162/neco.1997.9.8.1735. PMID 9377276. URL http://www.bioinf.jku.at/publications/ older/2604.pdf. که زمینهٔ بزرگی را برای پیشرفت شبکه‌های عصبی بازگشتی فراهم ساخت. در همان سال ۱۹۹۵، برندن فرِی به همراه جفری هینتون و پیتر دایان نشان دادند که می‌توان با استفاده از الگوریتم بیدار-خواب، شبکه‌ای تشکیل‌شده از شش لایهٔ کاملاً هم‌بند و با چندصد واحد پردازشی مخفی را آموزش داد.Hinton, Geoffrey E. ; Dayan, Peter; Frey, Brendan J. ; Neal, Radford (1995-05-26). "The wake-sleep algorithm for unsupervised neural networks". "Science". 268 (5214): 1158–1161. Bibcode:1995Sci...268.1158H. . PMID 7761831.
تا قبل از پیدایش یادگیری عمیق، روش‌های یادگیری ماشین سنتی، بیش‌از حد به بازنمایی‌هایی (انتخاب ویژگی‌ها) که از داده‌ها بدست می‌آورند، وابسته بودند. این روش‌ها، نیاز به یک متخصص در دامنه موضوع داشت تا استخراج ویژگی‌ها را به‌صورت دستی انجام دهد. حال آن‌که، این استخراج ویژگی‌ها به صورت دستی فرآیندی چالش‌انگیز و زمان‌بر است. پیدایش یادگیری عمیق توانست به‌سرعت جایگزین این روش‌های سنتی شود. چرا که می‌توانست استخراج ویژگی‌ها را به‌صورت خودکار متناسب با هر مسئله بدست آورد.
در حالی‌که مدل‌های یادگیری عمیق در دهه گذشته، در برخورد با ورودی‌هایی به شکل تصاویر، گفتار یا ویدیو که اساس ساختار آن‌ها اقلیدسی است، موفقیت‌آمیز عمل کرده، اخیراً، علاقه محققین در تلاش برای استفاده از یادگیری بر روی داده‌های غیراقلیدسی افزایش یافته‌است. یادگیری عمیق هندسی، زمینه نوظهور تحقیقاتی است که سعی در تعمیم معماری یادگیری عمیق برای کار با داده‌های غیراقلیدسی دارد، تا این شکاف را پر کند.
شبکه‌های عصبی گراف، دسته‌ای از روش‌های یادگیری عمیق هستند که به‌طور خاص، برای استنباط بر داده‌های توصیف‌شده توسط گراف‌ها طراحی شده‌اند. ایجاد مدل‌هایی که مستقیماً بروی گراف‌ها کار می‌کنند، مطلوب‌تر است. چراکه، می‌توانیم اطلاعات بیشتری در مورد ساختار و خصوصیات آن‌ها را بدست آوریم.
شبکه‌های عصبی گراف، به‌طور مستقیم برروی گراف‌ها اعمال می‌شوند و روشی آسان برای انجام وظایفی همانند، پیش‌بینی سطح گره، یال و گراف ارائه می‌کنند. تا پیش از، توسعه شبکه‌های عصبی گراف، روش‌های یادگیری عمیق توانایی اعمال برروی یال‌ها در جهت استخراج دانش و پیش‌بینی را نداشتند. در عوض، تنها بر اساس ویژگی‌های گره عمل می‌کردند.
یکی از نخستین زمینه‌های بسیار موفق برای یادگیری عمیق که پتانسیل بالقوهٔ این روش در حل مسائل را نشان داد، در حوزهٔ بازشناسی تصویر رخ داد.
از سال ۲۰۱۰ و در پروژه‌ای موسوم به ایمیج‌نت مسابقه‌ای سالانه برگزار می‌شود که شرکت‌کنندگان با ارائهٔ الگوریتم‌های کامپیوتری گوناگون، تلاش به بازشناسی تصاویر دیجیتالی در مقیاس کلان کرده و بر سر دست‌یابی به دقّت‌های بالاتر با یک‌دیگر رقابت می‌کنند. حال در سال ۲۰۱۲، یک شبکهٔ عصبی هم‌گشتی به نام الکس‌نت در این رقابت به کار رفت و با کسب نتایجی بسیار چشم‌گیر، توجه‌های گسترده‌ای را به سوی روش یادگیری عمیق جلب کرد؛ به شکلی که به باور برخی، در این سال «انقلاب یادگیری عمیق» رخ داد. لازم است ذکر شود که دقت الکس‌نت در تشخیص تصاویر پایگاه داده‌ی ایمیج‌نت از دقت انسان نیز فراتر بود (هرچند البته حتی پیش از ارائهٔ الکس‌نت نیز الگوریتم‌های دیگری به عملکرد فراانسانی دست پیدا کرده بودند).
امروزه نیز شبکه‌های عصبی در بینایی رایانه دارای نقشی کلیدی بوده و برای اهداف گوناگونی چون بازشناسی تصویر، تشخیص چهره، رهگیری اجسام، حذف نویز، رنگی‌کردن تصاویر سیاه و سفید، ترمیم تصاویر آسیب‌دیده، رده‌بندی تصاویر پزشکی و… به کار می‌رود.
از دیگر زمینه‌های موفق برای یادگیری عمیق، تشخیص و بازشناسی خودکار گفتار در مقیاس گسترده‌است که معمولاً توسط مدل‌های مبتنی بر شبکه عصبی بازگشتی (به ویژه از نوع ال‌اس‌تی‌ام) و شبکه عصبی هم‌گشتی انجام می‌گیرد.
یادگیری عمیق اثر بزرگی در پیشرفت شاخهٔ پردازش زبان‌های طبیعی ایجاد کرده و با ایجاد یک چهارچوب مدل‌سازی قدرتمند، به نتایج چشم‌گیری دست یافته‌است. به عنوان نمونه، مدل زبانی جی‌پی‌تی-۳ از اوپن ای‌آی با بهره‌گیری روش‌های یادگیری عمیق قادر به تولید متونی مشابه متون نوشته‌شده توسط انسان است.
سیگنال‌های الکترومیوگرافی می‌توانند به عنوان رابطی میان انسان و ماشین عمل کرده و با تحلیل آن‌ها از مقصود کاربر جهت کنترل تجهیزات گوناگون بهره برد. به عنوان نمونه، افراد دچار نقص عضو می‌توانند اعضایی مصنوعی را جایگزین عضو قطع‌شدهٔ خود کرده و آن‌ها را به شیوهٔ مؤثری کنترل کنند. یا با همین روش می‌توان اعضایی کمکی و تقویت‌کننده همچون اسکلت خارجی را کنترل کرد. برای تحلیل این سیگنال‌های خام و ارائهٔ خروجی مناسب برای کنترل دستگاه، بهره‌گیری از روش یادگیری عمیق می‌تواند بسیار کاربردی باشد.
سامانه‌های پیشنهادگر از یادگیری عمیق جهت استخراج ویژگی‌های معنادار برای یک مدل فاکتورهای پنهان به منظور پیشنهادهای محتوا-محور موسیقی و مجله بهره برده‌اند. یادگیری عمیق چنددیدگاهی (به انگلیسی: multi-view deep learning) جهت یادگیری ترجیح‌های کاربر از چندین دامنه به کار می‌رود.
در طرح‌های سرمایه‌گذاری، از یادگیری عمیق برای افزایش میزان بازده استفاده می‌شود.
گوگل و تسلا امروزه ثابت کرده‌اند که خودرو‌های بدون سرنشین یا خودران امکان‌پذیر هستند. اما به هرحال باید گفت این خودرو‌ها هنوز نیاز به یادگیری بیشتر و تمرین و آزمایش‌های متفاوتی هستند و فعالیت‌ها و متغیر‌های بسیاری باید مورد بررسی قرار بگیرد.
تشخیص صدا جزئی جدانشدنی از فرایند زبان است. تحلیل صدای ورودی برای یک سامانه هوش مصنوعی بسیار سخت است؛ زیرا که عوامل متعددی در تشخیص درست صدا نقش دارند.
به‌طور مثال وجود نویز در پیش‌زمینه، لهجه‌ها، خلاقیت‌ها و بازی‌های زبانی افراد و همچنین ناتوانی‌های خاص گفتاری و عوامل دیگر تشخیص دقیق واژه‌های به کار رفته در صدای به چیزی که رایانه بتواند آن را تحلیل کند، سخت می‌کند.
استفاده از شبکه‌های «یادگیری عمیق» می‌تواند در نرم‌افزار‌های متعددی با تشخیص الگوی به‌کار رفته توسط کاربر، کیفیت ارائۀ خدمات را بالا ببرد.
هوش مصنوعی‌ای که به خوبی با کاربر خود تطابق یافته باشد، می‌تواند اطلاعات غیر مرتبط را نادیده گرفته و برای کاربر اطلاعات مرتبط ارائه کند. تشخیص الگو همچنین می‌تواند تحلیل کلان داده را موثرتر سازد.
هوش مصنوعی ضعیف، موفقیت‌هایی در حوزه تولید متن با معنا و پیشرفت در حوزه کدنویسی داشته است. به‌طور مثال GPT-۳ از شرکت OpenAI یک نرم‌افزار اوپن سورس زبان تولیدکننده است که می‌تواند با کمترین دستورالعمل از سوی کاربر، کدنویسی کرده و یا برنامه‌های ساده کامپیوتری ایجاد کند. در آینده احتمالاً شاهد حضور نرم‌افزار‌های بیشتری که از این نوع فناوری‌ها بهره‌مندند خواهیم بود و کار با نرم‌افزار‌های تخصصی رنگ و بوی دیگری به خود خواهد گرفت.
هوش مصنوعی نقش مهم‌تری در معیار‌های امنیت سایبری سازمان‌ها، افراد و دولت‌ها به عهده خواهد گرفت که شامل نظارت، شناسایی تهدید‌های اطلاعاتی، اطلاع از نفوذ امنیتی، پاسخ به اتفاقات و تحلیل ریسک خواهد بود. هوش مصنوعی همچنان می‌تواند ابزار‌های نظارتی قدرتمندی در اختیار دولت‌ها قرار دهد تا به‌طور راحت‌تری مخالفان خود را شناسایی کنند.
برنامه‌های رایانه‌ای روزبه‌روز در تولید محتوا بهتر می‌شوند و هوش مصنوعی هم‌اکنون نیز در شناسایی موارد تخلف قانون حق نشر، ساخت بازی‌های ویدیویی و فیلم‌های سینمایی نقش مهمی دارند و در آینده این نقش برجسته‌تر خواهد شد.
شبکه‌های عصبی عمیق (DNNs) مدل‌های یادگیری هستند که دارای محاسبات خیلی زیادی‌اند. این مدل‌ها کاربردهای روزافزونی در بخش‌های مختلف دارند. از آنجا که FPGAها یک زیرساخت قابل‌برنامه‌نویسی برای شتاب‌دادن به محاسبات می‌دهند و همچنین امروزه در بیشتر دنیا به سادگی قابل دسترس‌اند، FPGAها یک انتخاب خیلی خوب برای پیاده‌سازی مدل‌های DNN هستند. اما استفاده از FPGAها به دلیل اینکه به‌دست آوردن کارایی و مصرف انرژی کم آنها به‌طور همزمان کار خیلی سختی است و همچنین DNNها به حافظه زیادی نیاز دارند (در FPGA معمولاً حافظه روی برد کم است)، پیاده‌سازی مدل‌ها با FPGA بسیار دشوار است. نساج یا بافنده شبکه‌های عصبی (DNNWEAVER) یک چارچوب است که به صورت خودکار یک کد قابل‌سنتز برای یک زوج مرتب (DNN, FPGA) تولید می‌کند. مدل DNN را به صورتی که در Caffe معرفی می‌کنند به عنوان ورودی می‌دهند.
روند کلی کار این برنامه به این صورت است که ابتدا مدل ورودی را به یک زبان میانی تبدیل می‌کند که یک گراف از جریان داده کلی را نشان می‌دهد. در این مرحله با الگوریتمهای مختلف مدل داده شده را گروه‌بندی می‌کند تا با توجه به حافظه FPGA و دیگر منابع موجود روی FPGA به حداکثر استفاده مجدد از داده‌ها و بالاترین سطح کارایی برسد. بعد از آن نتیجه نهایی یک کد سنتزپذیر است که با بالاترین کارایی روی FPGA موردنظر تمامی نیازهای مدل ورودی را برآورده می‌سازد.
این کار کمک می‌کند تا چرخه طولانی لازم برای استفاده از FPGA در شبکه‌های عصبی عمیق کوتاه‌تر شود. هدف از این کار تولید یک چارچوب خودکار است که اولاً برنامه‌نویس را از جزییات مربوط به طراحی و بهینه‌سازی سخت‌افزار جدا می‌کند. دوماً خود چارچوب به منابع محدود موجود روی FPGA دست و پنجه نرم می‌کند؛ و در نهایت چارچوب پایدار برای FPGA فراهم می‌کند که کارایی بالایی را برای پیاده‌سازی مدل‌های مختلف شبکه‌های عصبی عمیق روی FPGAهای گوناگون ارائه می‌کند. برای رسیدن به چنین هدف‌هایی DNNWEAVER طراحی شده‌است. در مرحله اول DNNWEAVER نیاز به یک مدل شبکه عصبی عمیق دارد که با استفاده از یک رابط سطح بالا مشخص شده‌است.
ورودی برنامه DNNWEAVER یک توصیف‌گر سطح بالا از شبکه‌های عصبی عمیق است که در دانشگاه برکلی با نام قالب CaffeYangqing Jia, Evan Shelhamer, Jeff Donahue, Sergey Karayev, Jonathan Long, Ross Girshick, Sergio Guadarrama, and Trevor Darrell. Caffe: Convolutional architecture for fast feature embedding. arXiv preprint درست شده‌است.
Caffe یکی از پراستفاده‌ترین چارچوب‌های یادگیری عمیق است که توصیف شبکه را به عنوان ورودی می‌گیرد و به مدلی قابل اجرا روی CPU یا GPU تبدیل می‌کند.
DNNWEAVER به صورت خودکار مدل ورودی را به کد سنتزپذیر زبان وریلاگ تبدیل می‌کند. DNNWEAVER از چهار بخش نرم‌افزاری تشکیل شده‌است:
ترجمه‌گر شبکه عمیق توصیف‌شده را به معماری مجموعه دستورها خاصی که مسیر داده را مشخص می‌کند تبدیل می‌کند. هر دستور در این مجموعه نشان دهنده یک گره در گراف مسیر داده شبکه است. توجه کنید که FPGA مستقیماً این دستورها را اجرا نمی‌کند. کامپایلر DNNWEAVER این دستورها را به سیگنال‌های کنترلی FPGA می‌نگارد و یک تقویم اجرا را درست می‌کند. این روش یک واسط نرم‌افزار-سخت‌افزار یکپارچه را فراهم می‌کند؛ بنابراین به کمک این معماری مجموعه دستورها انواع گوناگونی از پیاده‌سازی شتاب‌دهنده‌ها را که با محدودیت‌های FPGA مقصد سازگار است، امکان‌پذیر می‌کند.
نقشه‌کش طرح دستورها تولید شده در مرحله قبل را به عنوان ورودی می‌گیرد و با کمک الگوریتم بهینه‌سازی منابع الگو قالب‌های سخت‌افزاری را برای FPGA مقصد بهینه می‌کند. نقشه‌کش طرح محاسبات هر لایه را به گروه‌هایی از عملگرها بخش‌بندی می‌کند که داده‌ها را به اشتراک می‌گذارند یا استفاده مجدد می‌کنند. به هرکدام این بخش‌ها تکه می‌گوییم. هر تکه بعد از محاسبه در حافظه ریخته می‌شود و FPGA به سراغ محاسبه تکه بعدی می‌رود. شتاب‌دهنده شبکه‌های عصبی مشکل اساسی با مقدار زیاد حافظه موردنیاز برخلاف حافظه کم FPGA دارد که DNNWEAVER این مشکل را با استفاده از الگوریتم بهینه‌سازی منابع الگو بهبود می‌دهد و به کمک آن یک تعادل بین عملگرهای موازی و استفاده مجدد از داده‌ها با توجه به محدودیت‌های FPGA مقصد برقرار می‌کند.
نسّاجی طرح مرحله یکی‌مانده به آخر از DNNWEAVER است که ورودی آن مقدار منابع موردنیاز و تقویم اجرای تولید شده در مرحله قبل است و به کمک آن هسته شتاب‌دهنده را تولید می‌کند. DNNWEAVER از تعدادی قالب بهینه‌سازی دستی استفاده می‌کند که با توجه به گرفتن منابع و سازمان‌دهی سخت‌افزار که در مرحله قبل تولید شده از آن قالب‌ها استفاده می‌کند.
آخرین قسمت DNNWEAVER مجتمع‌کننده است. در این مرحله کدهای رابط حافظه به کدهای شتاب‌دهنده اضافه می‌شود. از آنجایی که FPGAهای مختلف از رابط‌های مختلفی برای ارتباط با DRAM خارجی استفاده می‌کنند، این بخش شامل کتابخانه‌هایی از رابط‌های DRAM است که در هر بار کد لازم را اضافه می‌کند.
در این حوزه کاری چندین سخت‌افزار با اهداف مختلف ایجاد شده‌است. هر چند که DNNWEAVER یک شتاب‌دهنده نیست، بلکه تولیدکننده کد یک شتاب‌دهنده است.
TablaDivya Mahajan, Jongse Park, Emmanuel Amaro, Hardik Sharma, Amir Yazdanbakhsh, Joon Kyung Kim, and Hadi Esmaeilzadeh. Tabla: A unified template-based framework for accelerating statistical machine یک شتاب‌دهنده FPGA برای فاز آموزش الگوریتم‌های یادگیری ماشین ارائه می‌کند در حالی که DNNWEAVER رو رابط شبکه‌های عصبی تمرکز دارد. Tabla از زبان ریاضیاتی مختص به خودش استفاده می‌کند در حالی که DNNWEAVER از زبان Caffe برای مشخص کردن مدل استفاده می‌کند.
کار انجام شده توسط چن و همکارانشChen Zhang, Peng Li, Guangyu Sun, Yijin Guan, Bingjun Xiao, and Jason Cong. Optimizing fpga-based accelerator design for deep convolutional neural networks. In FPGA, 2015. روی طرحی تحلیلی بر اساس مدل خط بیشترین کار می‌کند تا با استفاده از آن سریع‌ترین طرح را برای شبکه عصبی عمیق مربوطه روی FPGA بیابند. اما این کار برخی لایه‌ها مثل ائتلافی (Pooling) را دربر نمی‌گیرد.
جدول کنترل به دسته‌ای از جداول گفته می‌شود که اطلاعات لازم برای کنترل جریان برنامه یا بخشی از این اطلاعات را در خود ذخیره کرده‌است. اطلاعات این جدول جزء اطلاعات سطح بالای سیستم تعریف می‌شود و معمولاً فقط برنامه‌نویس متخصص یا مدیر سیستم دسترسی تغییر در ساختار آن را دارد.http://wiki.c2.com/?ControlTable جدول کنترل معمولاً به صورت جدول نشان داده می‌شود زیرا دیدن اطلاعات در جدول آسانتر است و ساختار دو بعدی آن مناسب نشان دادن رابطه اطلاعات است، اما جدول کنترل محدود به فقط جدول نیست می‌توان جدول را با استفاده از ماشین حالات متناهی یا ماشین حالات UML نشان داد.https://en.wikipedia.org/wiki/UML_state_machine#Hierarchically_nested_states
در جدول‌های کنترل ساختار مشابه با ساختار شرطی و صدا زدن تابع وجود دارد و با استفاده از این جدول می‌توان از تکرار ساختارهای تکراری جلوگیری کرد.
جدول کنترل می‌تواند یک بعدی، دو بعدی یا چند بعدی باشد. اندازه جدول می‌تواند ثابت یا متغیر باشد. همچنین این امکان وجود دارد که بتوان جدول را برای دستگاه‌های متعدد ساخت به این صورت که الگوریتم در جدول کنترل قرار بگیرد و برای هر دستگاه متناسب با آن دستگاه مفسر مناسب ساخته شود. برای ساخت این جدول می‌توان از روش‌های مختلفی مانند درهم‌سازی یا آدرس‌دهی مستقیم استفاده کرد و برای برنامه جدول می‌توان از هر زبانی از جمله زبان‌های سطح بالا نیز استفاده کرد. می‌توان جدول را روی حافظه اصلی یا حافظه‌های جانبی ذخیره کرد ولی مکان جدول برای اجرای مفسر روی آن باید در کل زمان اجرای برنامه ثابت باشد. برای رسیدن به سرعت مناسب جدول کنترل باید در حافظه اصلی ذخیره شود. از این جدول برای تصمیم‌گیری سریع استفاده می‌کنند که سرعت اجرا را بسیار بالا می‌برد ولی نیاز به حافظه زیاد دارد و ساختارهای پیچیده را نمی‌توان با استفاده از آن تفسیر کرد.
معمولاً جدول‌های ساخته‌شده برای تفسیر زبان‌ها نیاز به مهارت زیادی دارند و قابل استفاده در سیستم‌های مختلف نیستند و برای یک سیستم خاص طراحی می‌شوند، اما در صورت ساخته شدن جدول کنترل کوچک سرعت اجرای برنامه می‌تواند بسیار بهتر شود.
جدول اسکی یک نمونه از جدول کنترل یک بعدی است، این جدول اطلاعات خام عددی را به نمادها و کاراکترها تبدیل می‌کند. همچنین جدول شاخه‌ای که کد زبان ماشین و شاخه‌ها در آن نوشته می‌شود یک نمونه از جدول کنترل یک بعدی است.
از جدول‌های کنترل چند بعدی می‌توان برای پیاده‌سازی درخت‌های تصمیم و تصمیم‌های چند مرحله‌ای استفاده کرد.
جداول کنترل کاربردهای متعددی دارند، یک کاربرد اصلی آن‌هادر طراحی پردازنده‌ها و مفسرهاست، پردازنده‌ها و مفسرها می‌توانند از جداول کنترل برای مدیریت برنامه و کنترل جریان برنامه استفاده کنند. به طراحی پردازنده‌ها و مفسرها از این طریق طراحی با استفاده از جدول می‌گویند."Programs from decision tables", Humby, E. , 2007,Macdonald, 1973 … Biggerstaff, Ted J. Englewood Cliffs, NJ: Prentice-Hall
در موارد دیگر می‌توان از جدول کنترل برای پیاده‌سازی زبان‌های مبتنی بر ماشین‌های حالت متناهی و پیاده‌سازی درخت‌های تصمیم‌گیری استفاده کرد. از جدول کنترل برای ساختن جدول جستجو نیز استفاده می‌شود.
صفحات گسترده که برای ذخیره اطلاعات استفاده می‌شوند نیز می‌توانند یک نمونه از جدول کنترل باشند.
می‌توان ساختار switch که در زبان‌های برنامه‌نویسی متعددی استفاده می‌شود را با استفاده از جدول جستجو که یک مثال از جدول کنترل است ساخت. مثلاً اگر برنامه بخواهد یک حرف ورودی از کنسول بخواند و بر حسب آن تصمیم بگیرد چه عملی انجام بدهد جدول زیر می‌تواند برای انجام این کار کمک کند:
CT1
یک مثال دیگر از کاربرد این زبان ماشین IBM/360 است. این ماشین ۱۶MB حافظه قابل آدرس‌دهی دارد و برای بررسی کردن یک کاراکتر ۲۵۶ حالت مختلف وجود دارد که با استفاده از جدول کنترل بررسی کاراکترها در ۲۶۵ خط کد قابل انجام است اما با استفاده از دستورهای مقایسه و شاخه شاخه کردن نیاز به ۵۱۲ خط کد دارد که با توجه به حجم کم حافظه در این ماشین روش اول بسیار بهتر است.
. default action … none of the values in table match, do something else
. alternatively be in-line code)
. instruction(s) to add
. instruction(s) to subtract
. etc..
از مزایای جدول کنترل می‌توان به تمیز بودن و واضح بودن برنامه، قابلیت پیاده‌سازی روی دستگاه‌های متفاوت، انعطاف‌پذیری زیاد، استفاده مجدد و بهینه از ساختارهای تکراری، قابلیت گسترش، قابلیت فشرده سازی و میزان حافظه مورد نیاز کمتر اشاره کرد. اما در کنار این مزایا این جدول‌ها برخی معایب نیز دارند از جمله این که طراحی جدول‌ها بسیار سخت و وقت‌گیر است و نیاز به مهارت زیادی دارد، برخی تغییرات کوچک برنامه می‌تواند باعث ایجاد تغییرات عمده در ساختار جدول شود، همچنین همه ساختارهای پیچیده قابل پیاده‌سازی با استفاده از جدول کنترل نیستند.
در نظریه کامپایلر، شاخه‌ای از علوم کامپیوتر نظری، حذف کد مرده (به انگلیسی: ) نوعی از بهینه‌سازی کامپایلر (به انگلیسی: ) است، که برای حذف بخشی از کد، که در نتیجهٔ برنامه تأثیری ندارد، استفاده می‌شود. کد مرده شامل بخشی از کد است که هیچ‌گاه اجرا نمی‌شود و یا در صورت اجرا، خروجی آن مورد استفاده قرار نگرفته و در واقع فقط بر روی متغیرهای مرده (متغیرهایی که در بقیه بخش‌های برنامه خوانده نمی‌شوند و از آن‌ها استفاده‌ای نمی‌شود) تأثیر می‌گذارد. به‌طور معمول، کامپایلرها در زمان کامپایل برنامه، به صورت بازگشتی تعیین می‌کنند که کدام متغیرها و بخش‌های برنامه استفاده شده‌اند. متغیرها و بخش‌های استفاده شده علامت گذاری می‌شوند و در نهایت بخش‌های علامت نخورده، از برنامه حذف می‌شوند. اکثر کامپایلرهای پیشرفته، گزینه‌های متعددی را در سطوح مختلف برای حذف کد مرده در اختیار قرار می‌دهند. در سطوح پایین، کامپایلر فقط بخش‌هایی از کد که اجرای آن‌های غیرممکن است را حذف می‌کند. در سطوح بالاتر کامپایلر فضایی را برای ذخیره‌سازی متغیرهای بی‌استفاده در نظر نمی‌گیرد. در سطوح بالاتر از آن نیز، کامپایلر دستورها و توابع بی‌استفاده را شناسایی و حذف می‌کند.
حذف کد مرده مزیت‌های فراوانی دارد که از جملهٔ آن‌ها می‌توان به کم شدن اندازهٔ برنامه اشاره کرد، که بدین ترتیب از اجرا شدن کدی که در نتیجهٔ برنامه تأثیری ندارد و عمل‌هایی که می‌توان بدون انجام آن‌ها به نتیجه رسید، جلوگیری می‌شود. در نتیجه، مدت زمان اجرای برنامه کاهش می‌یابد و این موضوع در بسیاری از اوقات، می‌تواند تأثیر زیادی در بهینه‌تر شدن برنامه داشته باشد. علاوه بر این، حذف کد مرده باعث ساده‌تر شدن ساختار برنامه می‌شود و به این صورت، راه برای انجام دیگر بهینه‌سازی‌ها باز می‌شود.
از طرفی باید در عملیات حذف کد مرده بسیار دقت نمود، چرا که ممکن است نتیجهٔ محاسبات بخشی از کد، در جای دیگری استفاده نشود، ولی آن محاسبات باعث ایجاد تغییر در یک متغیر سراسری و یا تولید استثنا (به انگلیسی: ) شود، که در این صورت حذف آن بخش از کد، باعث ایجاد خطا در عملکرد برنامه می‌شود. به‌طور معمول، کامپایلرها زمانی که در مورد مرده بودن بخشی از کد ابهام هست، به صورت محافظ کارانه عمل می‌کنند.
این برنامه که با زبان سی () نوشته شده‌است را در نظر می‌گیریم.
تحلیلی ساده از کاربرد مقادیر، مشخص می‌کند که متغیر codice_1 بعد از این‌که برای اولین بار در خط چهارم مقداردهی می‌شود، در تابع codice_2 استفاده نمی‌شود. از طرفی، متغیر codice_1 یک متغیر محلی در تابع codice_2 است و به این دلیل نمی‌تواند خارج از codice_2 استفاده شود. بنابراین متغیر codice_1 مرده است و کامپایلر در زمان بهینه‌سازی می‌تواند آن‌را حذف نماید.
همچنین از آن‌جا که تابع همواره در خط هفتم، با دستور بازگشت به کار خود پایان می‌دهد، هیچ مسیر اجرایی به خط هشتم که متغیر codice_1 برای دومین بار در آن مقداردهی می‌شود نمی‌رسد. بنابراین، دسترسی به این مقداردهی امکان‌پذیر نمی‌باشد و این بخش از کد، قابل حذف شدن است. باید دقت شود که اگر برنامه ساختار پیچیده تری داشت، به عنوان مثال بعد از دستور بازگشت از تابع در خط هفتم، برچسبی وجود داشت و از جای دیگری از برنامه دستور codice_8 به آن برچسب بود، آن موقع ممکن بود مسیر اجرایی به دومین مقداردهی متغیر codice_1 وجود داشته باشد و دیگر codice_1 غیرقابل دسترس نبود.
علاوه بر این، با این‌که محاسباتی در این تابع انجام می‌شود، مقدار آن محاسبات در جایی که خارج از حوزهٔ این تابع قابل دسترسی باشد ذخیره نمی‌شود. بنابراین با توجه به اینکه تابع همواره مقدار ۹۶ را بازمی‌گرداند، ممکن است در زمان بهینه‌سازی به مقداری که بازمی‌گرداند ساده شود.
حال برنامهٔ دیگری که با زبان سی نوشته شده‌است را در نظر می‌گیریم.
در این مثال نیز از آنجا که مقدار صفر، همواره برابر با false در نظر گرفته می‌شود، دستور if هیچ‌گاه اجرا نخواهد شد و بنابراین کل بخش if در هنگام بهینه‌سازی از برنامه حذف می‌شود.
گاهی اوقات غیرقابل دسترس و مرده بودن بخشی از کد، در شرایط خاصی اتفاق می‌افتد و در هنگام کامپایل مشخص نمی‌شود. به عنوان مثال این شرایط را ورودی برنامه‌ها می‌توانند ایجاد کنند و باعث شوند بخشی از کد هیچ‌گاه در زمان اجرای برنامه، اجرا نشوند. بخشی از کد به صورت پویا مرده (به انگلیسی: Dynamically dead) است اگر بسته به شرایط برنامه در زمان اجرا، مقادیری که آن بخش از کد تولید می‌کند، در جای دیگری از برنامه استفاده نشود. به بیان دیگر، یک دستور به صورت پویا مرده، نمونه‌ای از یک دستور ایستا (به انگلیسی: Static instruction) است، که یک مقدار ثبات (به انگلیسی: Register) مرده را ایجاد می‌کند. محققان دریافته‌اند که کسر عظیمی از دستورات اجرا شدهٔ برنامه‌ها به صورت پویا مرده‌اند.
قضیهٔ پاریک یکی از قضایای علوم کامپیوتر نظری است که در سال ۱۹۶۱ توسط روهیت پاریک(Rohit Parikh) اثبات شده‌است و در سال ۱۹۶۶ اثبات ساده تری برای آن ارائه شده‌است.[3] اثبات می‌کند که یک زبان مستقل از متن روی یک الفبای تک حرفی باید منظم باشد. از قضیهٔ پاریک می‌توان در اثبات مستقل از متن بودن یا نبودن یک زبان استفاده کرد. علاوه بر این از این قضیه برای اثبات این که یک زبان حاوی رشته‌ای با تعداد برابری از دو پایانه داده شده هست یا خیر.[1] این قضیه بیان می‌کند که اگر توالی نشانه‌ها در نظر گرفته نشود آنگاه زبان‌های مستقل از متن از نظر مجموعه‌های منظم و نشان دادن وجود یک زبان مستقل از متن ذاتاً مبهم غیر متمایزاند.
اگر formula_1 مجموعهٔ یک الفبا باشد، بردار پاریک یک کلمه به صورت یک تابع در قالب formula_2 خواهد بود به‌طوری‌که formula_3 و formula_4 نشان دهندهٔ تعداد حرف formula_5 در کلمهٔ formula_6 است.
می‌گوییم زیرمجموعه‌ای از formula_7 خطی است اگر به ازای بردارهای formula_8 این زیر مجموعه به صورت formula_9 باشد.
می‌گوییم یک زیرمجموعه از formula_7 شبه‌خطی است اگر اجتماعی از چند زیرمجموعهٔ خطی باشد.
فرض کنید formula_11 یک زبان مستقل از متن و formula_12مجموعهٔ بردارهای پاریک کلمات در formula_11باشد که formula_14. آنگاه formula_12 یک مجموعهٔ شبه خطی است.
می‌گوییم دو زبان جابه‌جایی‌پذیرند اگر دارای مجموعهٔ بردارهای پاریک برابر باشند. اگر formula_16 یک مجموعه ی شبه‌خطی باشد، زبان شامل کلماتی که بردارهای پاریک آن‌ها در formula_16 است با بعضی از زبان‌های منطم جابه‌جایی‌پذیرند. در نتیجه هر زبان مستقل از متنی با بعضی از زبان‌های منظم جابه‌جایی‌پذیرند.
در قضیهٔ پاریک اثبات می‌شود که بعضی از زبان‌های مستقل از متن فقط میتوانند گرامرهای مبهم داشته باشند که به این زبان ها، زبان‌های ذاتاً مبهم گفته می‌شود. به عبارتی دیگر بعضی از گرامرهای مستقل از متن را نمی‌توان به گرامر مستقل از متن غیر مبهمی تبدیل کرد.
فرض کنید formula_1 الفبای یک زبان باشد که formula_19 و ترتیب formula_20 دلخواه ولی ثابت است. برای formula_21 تصویر پاریک معادل است با:
که هر formula_23 تعداد formula_5‌ها در formula_6 hsj.
نگاشت پاریک روی یک زبان به صورت مقابل تعریف می‌شود:
برای یک زبان دلخواه مانند formula_11 که formula_27 قرار دهید formula_28
مثال: (نگاشت پاریک کلمات یک گرامر مستقل از متن)
گرامر مستقل از متن formula_29 را با قواعد زیر در نظر بگیرید:
این بدین معناست که زبان تولید شده توسط formula_33 دارای رشته‌هایی است که a و b‌ها میتوانند در آن به صورت درهم آمیخته ظاهر شوند. اما از آنجایی که از تعریف زبان پیداست تعداد آن‌ها در رشته برابر خواهد بود. علاوه بر این همیشه از هر حرف حداقل یکی وجود دارد.
حال اگر formula_34 و formula_35 را با توجه به تعریف بالا به ترتیب formula_36 و formula_37 بگیریم و رشته‌های formula_38 و formula_39 فرض کنیم. هر دو این رشته‌ها دارای نگاشت پاریک یکسان هستند؛ formula_40 که داریم formula_41
این قضیه با استقرا روی یک مجموعه از درخت‌های اشتقاق و با استفاده از نگاشت‌های پاریک به دست آمده از مجموعه ی درخت‌های اشتقاق پایانه‌ها و امکان بزرگ کردن آن‌ها در طول اشتقاق اثبات می‌شود.
محمد خان ایروانی (درگذشت ۱۲۵۵ قمری) همچنین معروف به محمدخان سردار ماکویی از فرماندهان نظامی ایران در دوره محمدشاه قاجار بود که درجه امیرتومانی داشت و بخشی از سپاه ایران را در جنگ هرات فرماندهی می‌کرد.محمدرضا فرهمند "شاه مرید و صدراعظم مرشد". ماهنامه الکترونیکی بهارستان، شماره ۱۰۰، صفحه ۵. ماهنامه الکترونیکی بهارستان
او در سال ۱۲۵۲ قمری به دستور محمدشاه قاجار به حکومت عراق عجم منصوب شد.خورموجی، حقایق‌الاخبار ناصری، زوار (۱۳۴۴). ص ۲۶
پسر او از همسر اولش محمدحسن خان سردار ایروانی بود. محمدخان در سال ۱۲۵۴ قمری باردیگر ازدواج کرد و زینت‌الدوله دختر فتحعلی‌شاه قاجار را به همسری گرفت و یک سال بعد در زمان محاصره شهر هرات درگذشت.خاوری شیرازی، فضل‌الله. "تاریخ ذوالقرنین". جلد دوم، صفحه ۱۰۳۴.
اردوگاه پناهندگان خان‌یونس (به عربی: مخیم خان یونس)؛ (انگلیسی: Khan Yunis Camp) یک منطقهٔ مسکونی در فلسطین است، که در خان یونس واقع در غرب شهر خان یونس و ۲ کیلومتری شرق ساحل مدیترانه که در نوار غزه جنوبی قرار دارد. اردوگاه پناهندگان خان‌یونس ۳۷٬۷۰۵ نفر جمعیت دارد.
در حالی که آژانس امداد و اقدام سازمان ملل متحد برای آوارگان فلسطینی در خاور نزدیک UNRWA اعلام کرده‌است در سال ۲۰۱۰ که حدود ۷۲۰۰۰ پناهنده فلسطینی در اردوگاه زندگی می‌کنند، اداره مرکزی آمار فلسطین در سرشماری سال ۲۰۰۷ آمار جمعیت خان یونس را ۳۷۷۰۵ نفر ثبت کرده‌است.
اردوگاه خان یونس پس از جنگ شش روزه ۱۹۴۸-اعراب- اسرائیل احداث شد و حدود ۳۵٫۰۰۰ پناهنده فلسطینی در آن اسکان داده شدند. در ۳ نوامبر ۱۹۵۶، اردوگاه و شهر خان یونس توسط نیروهای ارتش اسرائیل اشغال شد و در عملیات تهاجمی که صورت گرفت حدود ۲۷۵ نفر کشته شدند که ۱۴۰ پناهنده از اردوگاه را در بر می‌گرفت. ساکنان اردوگاه تصریح کردند که بیشتر تلفات پس از پایان جنگ‌ها رخ داد و آن هنگامی بود که ارتش به خانه‌هایی که مظنون به حضور شورشیان مسلح می‌دید تهاجم کرد. با این حال، مقامات اسرائیلی اعلام کردند که تلفات ناشی از مقاومت ساکنان اردوگاه بوده‌است.
طبق گزارش آژانس امداد و اقدام سازمان ملل متحد برای آوارگان فلسطینی در خاور نزدیک UNRWA، بسیاری از ساکنان این اردوگاه‌ها به دلیل عملیات توسط ارتش اسرائیل، خانه‌های خود را از دست دادند. UNRWA در اوائل دهه ۲۰۰۰ تلاش‌های بازسازی را آغاز کرد اما به دلیل تصرف این منطقه توسط حماس و محاصره اسرائیل در نوار غزه عمدتاً این پروژه متوقف شده‌است. UNRWA می‌گوید که حداقل ۱۰٬۰۰۰ خانه باید ساخته شوند.
در میان استراتژی‌های ارزیابی در نظریهٔ زبان‌های برنامه‌نویسی، ارزیابی کندرو یا فراخوانی به هنگام نیاز استراتژی‌ای برای ارزیابی است که دارای دو ویژگی ارزیابی غیرموکد و اشتراک‌گذاری می‌باشد. ارزیابی غیرموکد موجب می‌شود که محاسبه و ارزیابی یک عبارت تا جای ممکن به تأخیر افتاده و در اولین زمانی که دسترسی به آن نیاز بود، محاسبه شود. ارزیابی کندرو به وسیلهٔ اشتراک‌گذاری از ارزیابی‌های تکراری جلوگیری می‌کند. به کمک اشتراک‌گذاری، زمان اجرای یک تابع به صورت توانی نسبت به دیگر استراتژی‌هایی که ارزیابی غیرموکد دارند کاهش می‌یابد و به این صورت ترکیب این دو ویژگی، ارزیابی کندرو را نسبت به دیگر استراتژی‌ها بهبود می‌بخشد. از جمله این استراتژی‌ها می‌توان استراتژی فراخوانی با نام را نام برد.
در مقابل ارزیابی کندرو، ارزیابی تندرو یا استراتژی موکد قرار دارد. این استراتژی ارزیابی در بیشتر زبان‌های برنامه‌نویسی مورد استفاده قرار می‌گیرد. به‌طور خلاصه، در این ارزیابی برخلاف ارزیابی کندرو، رویهٔ یک تابع، حتی اگر هیچگاه مورد استفاده قرار نگیرد و یا بعد از زمان زیادی به آن نیاز داشته باشد، به محض فراخوانی برای یک یا چندین متغیر با مقادیر مشخص اجرا می‌شود.
ارزیابی کندرو ابتدا برای جبر لاندا توسط کریستوفر وادزورث تعبیه شد. پیتر هندرسون و جیمز هیرام موریس و همچنین دنیل پائول فریدمن و دیوید وایس هر یک این ارزیابی را برای زبان‌های برنامه‌نویسی به‌طور مستقل تعریف کردند.
ارزیابی کندرو طبق شرح جان لوئیس بنتلی در گزارش "«نوشتن برنامه کارآمد»" معمولاً با مموایز کردن ترکیب می‌شود. در عمل به هر عبارت که معادل تابعی از یک یا چند متغیر با مقادیری مشخص می‌باشد، خانه‌ای از حافظه تعلق می‌گیرد که این خانه با داشتن مقادیر متغیرها قابل دسترسی است. در مموایز کردن عبارات به دو دسته تقسیم می‌شوند. دستهٔ اول عباراتی هستند که برای بار اول محاسبه می‌شوند. در این دسته پس از محاسبهٔ عبارت، مقدار حاصل را در خانهٔ مربوطه نیز ذخیره می‌کنند. دستهٔ دوم عباراتی هستند که برای بار دوم و یا بیشتر مورد استفاده قرار می‌گیرند. این عبارات از دفعهٔ دوم به بعد، به جای محاسبهٔ مجدد، به خانهٔ حافظهٔ مربوطه رجوع کرده و مقدار را از خانهٔ حافظه برمی‌دارند. کارکرد مموایز کردن در ارزیابی کندرو تنها این تفاوت را قائل می‌شود که محاسبه و ذخیره‌سازی عبارت را تا اولین زمان نیاز به مقدار عبارت، به تأخیر می‌اندازد. روشن است که ایجاد این تأخیر اثر مخربی بر فرایند مموایز کردن ندارد و سلسله عملکرد آن را حفظ خواهد کرد.
بنابراین در ارزیابی کندرو در صورت مواجه شدن با یک عبارت، ابتدا تا اولین نیاز به مقدار آن هیچ اقدامی صورت نمی‌گیرد. سپس در هنگام نیاز به مقدار عبارت، ابتدا بررسی می‌شود که این اولین باریست که نیاز به محاسبهٔ عبارت وجود دارد یا خیر. اگر اولین بار باشد، مقدار عبارت طبق رویهٔ تابع محاسبه گردیده و مقدار آن در خانهٔ مربوطه نیز ذخیره می‌شود. در غیر این صورت، بدون محاسبهٔ مجدد عبارت، مقدار آن که در مراحل قبل محاسبه شده، از خانهٔ مربوطه برداشته می‌شود و مورد استفاده قرار می‌گیرد. بخشی از حافظه را که به مقادیر عبارات تعلق می‌گیرد، جدول مراجع می‌نامند.
غیرموکد بودن این ارزیابی، با توجه به این که ذخیرهٔ مقدار را تا زمان نیاز به تأخیر می‌اندازد، موجب کاهش حافظهٔ مورد استفاده در هر لحظه خواهد شد. اما با این حال محاسبهٔ حافظهٔ مورد استفاده در این روش ارزیابی قابل پیش‌بینی نیست. علاوه بر این در عبارات ساختاریافته، می‌توان با بخش‌بندی کردن عبارت، تنها بخش‌های مورد نیاز آن را محاسبه کرد و برای سایر بخش‌ها جدول مراجع و مقادیر ثابت را مورد استفاده قرار داد. با توجه به این که ایجاد لیست واسط نیز تا زمان نیاز به تعویق می‌افتد، استفاده از آن لزوماً هزینهٔ زیادی به همراه نخواهد داشت و این هزینه در موارد خاص چشمگیر خواهد بود. همچنین این ارزیابی، به کمک مموایز کردن، محاسبات تکراری را کاهش داده و زمان اجرای برنامه را بهبود می‌دهد.
علی‌رغم وجود این مزایا، غیرموکد بودن ارزیابی موجب بهم ریختن ترتیب اجرای دستورات شده و ترکیب این ارزیابی با ویژگی‌های ضروری دیگر را دشوار می‌سازد. از جمله این ویژگی‌ها می‌توان مدیریت استثناءها و مدیریت ورودی/خروجی را نام برد. علاوه بر این ارزیابی کندرو می‌تواند موجب نشت حافظه شود.
برخی از زبان‌های برنامه‌نویسی به تأخیر انداختن ارزیابی عبارات را به صورت معمول انجام می‌دهند. در عین حال برخی زبان‌های دیگر از توابع و نمادهای خاصی برای این کار استفاده می‌کنند. برای مثال در زبان‌های میراندا و هاسکل این کار به‌طور معمول انجام می‌شود، در حالی که در زبان اسکیم از عباراتی معادل "تاخیر" و "اجرا" و در زبان اکمل از عباراتی معادل "کندرو" و "اجرای کندرو" استفاده می‌شود. برخی دیگر از زبان‌ها، ارزیابی کندرو را تنها برای برخی از ساختمان‌داده‌ها و یا تنها بر روی یک ساختمان‌دادهٔ خودساخته تعریف می‌کنند. برای مثال در زبان پرل۶ ارزیابی کندرو بر روی لیست‌ها تعریف شده، در حالی که این ارزیابی در این زبان برای محاسبهٔ توابع و عملگرهای ریاضی تعبیه نشده‌است.
شرح یک مثال در زبان پایتون نیز عملکرد استراتژی را واضح‌تر خواهد ساخت. تابع formula_1 در زبان پایتون را در نظر بگیرید. این تابع لیستی از اعداد را در بازه‌ای خاص و با فاصلهٔ گام‌های مشخص ایجاد می‌کند. این زبان برای این تابع ارزیابی کندرو را مورد استفاده قرار داده است. این ارزیابی برای فراخوانی تابع در بازه‌های بزرگی از اعداد، موجب کاهش زمان اجرا خواهد شد. همچنین حافظهٔ مورد استفاده نیز کاهش خواهد یافت. چرا که تمامی مقادیر بازه در یک لحظه مورد استفاده قرار نمی‌گیرند و نیاز به دسترسی همزمان به تمام اعداد در یک لحظه نخواهد بود.
تجزیه‌کننده کاهشی بازگشتی (انگلیسی: Recursive descent parser) یک تجزیه‌کننده بالا به پایین است که درخت تجزیه را از بالا و حالت اولیه می‌سازد تا به رشته ورودی کاربر برسد. این تجزیه‌کننده به صورت بازگشتی، ورودی را تجزیه می‌کند تا درخت تجزیه را بسازد.
با ساختن درخت از بالا به پایین، احتمال وجود عقب‌گردی در مراحل وجود دارد که نقطه ضعف این روش برشمرده می‌شود ولی با نوع پیش‌بینی‌کننده آن که از رشته ورودی برای پیش‌بینی اقدام بعدی استفاده می‌کند، می‌توان عقب‌گرد را از میان برداشت.
این تجزیه‌کننده از گرامر مستقل از متن که به صورت بازگشتی پیاده‌سازی می‌شود، استفاده می‌کند.تجزیه‌کننده‌های کاهشی بازگشتی نمی‌توانند دستور زبان‌های چپ‌گرد را تجزیه کنند (چون در حلقهٔ بی‌نهایت گیر می‌کنند) و ابتدا باید این چپ‌گردی را رفع نمود.
برای این تجزیه ابتدا برای همهٔ نمادهای ناپایانی گرامر از جمله نماد شروع، یک تابع در نظر می‌گیریم، که در واقع روند تجزیه آن را شامل می‌شود و همهٔ رشته‌هایی که از آن مشتق می‌شوند در این تابع صدق می‌کنند.
در صورتی که نماد ناپایانی N فقط یک قاعده را در گرامر داشته باشد (در سمت چپ فقط یک قاعده آمده‌باشد) تابع تجزیه آن آسان خواهد بود و به ترتیب نمادها در سمت راست آن پیش می‌رویم. اگر نماد بعدی یک نماد پایانی بود آن را نماد پیش‌رو در ورودی چک می‌کنیم اگر یکسان بود، هم در ورودی و هم در سمت راست قاعده یک نماد جلوتر می‌رویم و اگر نبود، خطا گزارش می‌دهیم. اگر نماد بعد یک نماد ناپایانی بود، تابع متناظر آن نماد ناپایانی را فراخوانی می‌کنیم به این صورت ادامه می‌دهیم تا به انتهای سمت راست قاعده می‌رسیم.
در صورتی که نماد ناپایانی N، در سمت چپ چندین قاعده بود، تابع تجزیه نیاز دارد تصمیم بگیرد از کدام قاعده استفاده کند. در صورتی که تجزیه ما پیش‌بینی‌کننده نباشد یکی از قاعده‌ها را انتخاب می‌کند و در صورت بروز خطا در اجرای این قاعده، قاعده دیگر مشتق شده از N را فراخوانی می‌کند. تا زمانی که یکی از قاعده‌ها به درستی اجرا شود.
ولی در صورتی که تجزیه‌کننده ما قابلیت پیش‌بینی‌کنندگی داشته باشد، براساس نماد پیش‌رو ورودی و مقایسه قواعد مشتق‌شده، یک قاعده را انتخاب می‌کند.
N() {
مثال ساده روبرو که گرامر ساده‌ای از عبارت‌های ریاضی با پرانتز کامل، را نشان می‌دهد. در ادامه طبق تجزیه‌کننده کاهشی بازگشتی به زبان جاوا پیاده‌سازی شده‌است.
<expression> ::= <number> |
<operator> ::= "+" | "-" | "*" | "/"
در تکه کد زیر، تابع ParseError جهت نمایش خطاهای نحوی در رشته ورودی کاربر تعریف شده‌است.
private static class ParseError extends Exception {
تکه کد زیر برای این پیاده‌سازی شده که کاراکتر بعدی در ورودی را بخواند و اگر از جمله عملیات‌های مجاز بود، آن را برگرداند در غیر این صورت خطا دهد.
static char getOperator() throws ParseError {
کد زیر برای خواندن یک عبارت ریاضی از یک خط ورودی و برگرداندن مقدار نهایی آن است. در صورت که ورودی دارای خطای نحوی باشد، خطا برمی‌گرداند.
این تابع تا زمانی اجرا می‌شود که به یک عدد نهایی منجر شود. سپس به صورت بازگشتی به توابع فراخوانی کننده‌اش، نتیجه نهایی هر عبارت در هر مرحله را برمی‌گرداند
private static double expressionValue() throws ParseError {
گرامر محاسبه‌گر روبرو نیز توسط تجزیه‌کننده کاهشی بازگشتی به زبان پایتون که در ادامه آمده، حل شده‌است.
exp ::= term | exp + term | exp - term
term ::= factor | factor * term | factor / term
factor ::= number | ( exp )
پیاده‌سازی در پایتون:
class Calculator():
در علوم رایانه، کد ریسه‌ای به روش برنامه‌نویسی اطلاق می‌شود که در آن، تمامی کد، یا حداقل اکثریت آن، از فراخوانی رویه‌ها تشکیل شده است. در حالت کلی این روش از برنامه‌نویسی در کامپایلرهایی یافت می‌شود که یا خروجی کامپایل آنها به صورت کد ریسه‌ای باشد و یا آنکه پیاده‌سازی کد خود کامپایلر به صورت ریسه‌ای صورت گرفته باشد.
یکی از مهم‌ترین بده‌بستان‌ها در علوم و مهندسی کامپیوتر، مسئله تقابل زمان و حافظه می‌باشد. در این روش سعی بر آن است تا چگالی و حجم کد اشغال شده در ازای افزایش زمان اجرای آن، کاهش پیدا کند. در برخی مواقع این کاهش حجم کد منجر به آن می‌شود که کل کد در حافظه نهان پردازنده قرار گیرد و در این صورت، استفاده از کد ریسه‌ای و کاهش حجم کد منجر به کاهش زمان اجرای آن می‌شود.
از کد ریسه‌ای در طراحی کامپایلر برخی زبان‌های برنامه‌نویسی از جمله Forth و همچنین برخی از پیاده‌سازی‌های بیسیک و کوبول استفاده می‌شود.
رایانه‌های اولیه حافظه به نسبت بسیار کمی داشتند که بعضاً در حد چند کیلوبایت می‌بود و در نتیجه معضل اساسی، یافتن روشی برای کم حجم‌تر کردن کد بود تا بتواند در حافظه ذخیره گردد. از طرف دیگر سرعت رایانه‌ها بسیار کم بود و زمان اجرای کد ماشین بسیار سریعتر از تفسیر عادی کد بود. در اینجا بود که نوشتن توابع و زیرروال‌ها فراگیر شد و به برنامه‌نویسان امکان این را می‌داد که ضمن کاستن از حجم کد، اجرای برنامه‌ها را از طریق کد ماشین تسریع بخشند. چارلز مور روش ریسه‌ای غیرمستقیم را در سال ۱۹۷۰ ابداع کرد ولی جیمز بل در سال ۱۹۷۳ نخستین مقاله مرتبط با این روش را به چاپ رسانید. اصلی‌ترین کاربرد این روش در تولید و پیاده‌سازی مفسرهای ماشین مجازی می‌باشد.
در این بخش عملکرد کد ریسه‌ای را به صورت کلی و به همراه مثال توضیح می‌دهیم. فرض کنید کدی داریم که شامل سه دستورالعمل ماشین مجازی B ،A و C باشد. می‌توانیم برای اجرای این سه دستورالعمل، توابع سطح ماشینی به نام‌های Br ،Ar و Cr را تعریف کنیم و با استفاده از آنها کد مقابل را تولید کنیم.
call Ar
call Br
call Cr
حال با حذف تابع call کد را بازنویسی می‌کنیم.
کد جدید در واقع دنباله‌ای از آدرس‌های کدی می‌باشد که دستورالعمل‌های ماشین را نشان می‌دهند. در نتیجه برای اجرای این تکه کد، نمی‌توانیم به ابتدای آن پرش کنیم. همچنین باید با استفاده از اشاره‌گری در یک ثبات، جدا از ثبات‌های PC و RA، به دستورالعمل فعلی اشاره کنیم. برای این منظور از ثبات اشاره‌گر دستورالعمل (IP) استفاده می‌کنیم. فرض می‌کنیم که IP به کلمه‌ای از دنباله‌ی کدها که دقیقاً بعد از کلمه دستورالعمل فعلی قرار دارد اشاره می‌کند. حال کافی است تا تنها کلمه را بارگیری کرده و با افزایش مقدار آن به اندازه یک کلمه، به رویه‌ای که بدان اشاره می‌کند پرش کنیم. کد مقابل نحوه این عملیات را در زبان اسمبلی MIPS نشان می‌دهد.
lw $2,0($4) #get next instruction, $4=inst.ptr.
addu $4,$4,4 #advance instruction pointer
j $2 #execute next instruction
به متد بالا NEXT نیز گفته می‌شود. این روش اولین بار در مقاله‌ای توسط بل ارائه شد.
در اینجا به تبیین برخی از مدل‌های کد ریسه‌ای می‌پردازیم.
آدرس‌های موجود در ریسه همان آدرس‌های زبان ماشین می‌باشند. این مدل در عین سادگی می‌تواند سربارهایی نیز داشته باشد زیرا از آنجایی که تنها از آدرس‌های ماشین در آن استفاده شده است، برای ورودی دادن پارامترها، باید آنها را به صورت غیرمستقیم از حافظه بارگیری کرد. خروجی این مدل حجمی در حدود یک هشتم تا یک چهارم کد کامپایل شده دارد.
در این مدل از اشاره‌گرهایی استفاده می‌شود که به مکان‌هایی اشاره می‌کنند که آن مکان‌ها خود به کد ماشین اشاره می‌کنند. ممکن است بعد از اشاره‌گر غیرمستقیم تعدادی عملوند که به جای ریسه در بلوک غیرمستقیم ذخیره شده‌اند، نیز قرار داشته باشد. کدهای تولید شده توسط این روش معمولاً کم حجم‌تر از کدهای تولید شده توسط روش ریسیدن مستقیم می‌باشند اما غالباً کندتر نیز می‌باشند.
در این مدل توالی‌ای از دستورالعمل‌های call در زبان ماشین استفاده می‌شود. کامپایلرهای اولیه برای زبان‌هایی همچون فورترن و کوبول از این مدل استفاده می‌کردند. خروجی این مدل و دو مدل ارائه شده در بالا، حجمی در حدود یک هشتم تا یک چهارم کد کامپایل شده دارد.
در این مدل لیستی از نمایه‌های ۸ یا ۱۲ بیتی به جدولی از اشاره‌گرها استفاده می‌شود. این روش معمولاً فشرده شده می‌باشد و حجم کد تولیدی آن چیزی حدود ۵۰ تا ۷۵ درصد کد تولید شده توسط مدل‌های دیگر می‌باشد.
به صورت معمول در یک ماشین مجازی ریسه‌ای چهار ثبات وجود دارند که عبارتند از:
اتوماتای سنگ‌ریزه (به انگلیسی: pebble automaton)، یک درخت را به عنوان ورودی می‌گیرد و روی گره‌های درخت از طریق یال‌ها حرکت می‌کند. به علاوه، این اتوماتا یک مجموعه‌ی متناهی با اندازه‌ی ثابت از «سنگ‌ریزه‌ها» دارد که از 1 تا k شماره‌گذاری شده‌اند و می‌تواند آن‌ها را روی گره‌های درخت بگذارد. در یک گام اتوماتا می‌تواند روی گره فعلی بماند، به گره پدر برود، به گره فرزند چپ یا راست برود. همین‌طور می‌تواند سنگ‌ریزه‌ی iم را بردارد، یا سنگ‌ریزه‌ی i-1م را رو گره فعلی قرار دهد. این که در هر گام اتوماتا چه تصمیمی می‌گیرد، بستگی به حالت فعلی اتوماتا، مجموعه‌ی سنگ‌ریزه‌هایی که روی گره فعلی قرار دارد، برچسب گره فعلی، و نوع گره فعلی (ریشه، فرزند چپ یا راست، برگ یا گره داخلی) دارد.
مجموعه‌ی {TYPE = {r, 0, 1} × {l, i، انواع ممکن برای یک گره را دربردارد. در این‌جا r برای ریشه، 0 فرزند برای فرزند چپ، 1 برای فرزند راست، l برای برگ، و i برای گره درونی در نظر گرفته شده است. مجموعه‌ی {MOVES = {ε, ←, →, ↑, lift, drop، انواع حرکت‌های ممکن را برای اتوماتا دربرمی‌گیرد. در این‌جا ↑ برای رفتن به گره پدر، ← برای رفتن به فرزند چپ، → برای رفتن به فرزند راست، drop برای گذاشتن سنگ‌ریزه، و lift برای برداشتن سنگ‌ریزه در نظر گرفته شده است. همین‌طور مجموعه‌ی توانی یک مجموعه مانند S را با (P(S نشان می‌دهیم.
یک اتوماتای سنگ‌ریزه که k سنگ‌ریزه دارد، یک چندتاییِ (A = (Σ,Q, I, F, δ است، که Q مجموعه‌ای متناهی از حالت‌هاست، I ⊆ Q مجموعه‌ی حالات اولیه، F ⊆ Q مجموعه‌ی حالات پایانی، و δ رابطه‌ی گذر (به انگلیسی: transition relation) است.
(δ ⊆ (Q × TYPES × {1, . . . , k + 1} × P({1, · · · , k}) × Σ) × (Q × MOVES
چندتاییِ q, β, i, S, σ, q′,m) ∈ δ) بیان می‌کند که اگر A در حالت q باشد، سنگ‌ریزه‌های i تا k در درخت باشند، مجموعه‌ی S سنگ‌ریزه‌های گره فعلی را دربرداشته باشد، گره از نوع β باشد و برچسب σ داشته باشد، آن‌گاه A به حالت ′q می‌رود و باتوجه به m حرکت می‌کند.
اتوماتای سنگ‌ریزه بسته به نحوه‌ی برداشتن سنگ‌ریزه‌ها، در دو نوع بررسی می‌شود:
به صورت پیش‌فرض اتوماتا قوی در نظر گرفته می‌شود.
یک اتوماتای سنگ‌ریزه است، اگر δ یک (به انگلیسی: partial function) از Q × types × {1, · · · , k + 1} × P({1, · · · , k}) × Σ به Q × moves باشد.
مجموعه‌ی زبان‌های تشخیص‌پذیر توسط اتوماتای سنگ‌ریزه‌ی قطعیِ قوی با n سنگ‌ریزه با sDPA نشان داده می‌شود. همین طور مجموعه‌ی زبان‌های تشخیص‌پذیر توسط اتوماتای (به انگلیسی: tree walking automaton) با TWA و مجموعه‌ی زبان‌های تشخیص‌پذیر توسط اتوماتای (به انگلیسی: bottom-up tree automaton) با REG نشان داده می‌شود.
اگر formula_9، مجموعه‌ی ویژگی‌های قابل توصیف درخت در (به انگلیسی: transitive closure first-order logic) باشد، و formula_10همان مجموعه در باشد، ثابت می‌شود که formula_11، و در واقع formula_12. یعنی مجموعه‌ی زبان‌های تشخیص‌پذیر توسط اتوماتای سنگ‌ریزه با مجموعه‌ی زبان‎های قابل‌توصیف در برابر است.
اتوماتون بوچی (زبان انگلیسی: Büchi automaton) را می‌توان به عنوان اتوماتونی در نظر گرفت که می‌توانند رشته‌های نامتناهی الفبا را بپذیرد. این اتوماتون اولین بار توسط ژولیوس ریچارد بوچی () منطق‌دان سوئیسی در سال ۱۹۶۲ معرفی شد. اگر ω را به عنوان مجموعه اعداد طبیعی و Σ رابه عنوان الفبا در نظر بگیریم یک کلمه نامتناهی (یا یک ω-کلمه) را می‌توان به عنوان یک تابع از ω به Σ در نظر گرفت به این ترتیب مجموعه تمام کلمه‌های نامتناهی را باformula_1 نشان می‌دهیم.
یک اتوماتون بوچی قطعی ۵ تایی formula_2 است که در ان:
فرض کنید formula_2 یک اتوماتون بوچی متناهی باشد در این صورت یک تعمیم طبیعی از مفهوم اجرا (نسبت به اتوماتون قطعی متناهی) می‌تواند مطرح شود که به این صورت است که یک اجرا روی یک کلمه نامتناهی formula_7 را به صورت دنبالهٔ formula_8 تعریف می‌کنیم که از s شروع می‌کنیم و با formula_9 به formula_10 و سپس با formula_11 به formula_12 و… می‌رویم.
به عنوان مثال در این اتوماتون:
اگر formula_13 در اینصورت formula_14 یه اجرای A است.
در این صورت می‌گوییم ماشین A رشته σ را قبول می‌کند اگر اجرایی وجود داشته باشد که در ان حداقل یکی از حالات قبول را به تعداد نامتناهی دیده باشیم.
در اتوماتون بوچی غیرقطعی به‌جای تابع انتقال، رابطهٔ انتفال مطرح است و مانند NFA هر حالت تحت رابطهٔ انتقال به مجموعه ای از حالات منجر می‌شود و به‌جای حالت آغازی مجموعه از حالات ابتدایی در نظر گرفته می‌شود. در حالت کلی وقتی کلمه اتوماتون بوچی را به تنهایی به کار می‌بریم منظورمان اتوماتون بوچی غیرقطعی است.
مجموعه تمام ω-کلمه‌های را که یک بوچی اتوماتون قبول می‌کند زبان ان بوچی اتوماتون می‌گویند. حالا یک زبان formula_15 را بوچی تشخیص پذیر می‌گوییم اگر بوچی اتوماتون M ای پیدا شود که formula_16 . یک زبان بوچی تشخیص پذیر است اگر و فقط اگر یک زبان امگا‌ی منظم باشد.
مثلاً formula_17 .
فرض کنید A,B دو بوچی اتوماتون باشند و C یک اتوماتون متناهی باشد در این داریم:
از بوچی اتوماتون معمولاً در وارسی مدل به عنوان یه نسخه نظریه ماشینی از یک فرمول در منطق موقت خطی استفاده می‌شود.
Computer and System Sciences 8 (1974) No. 2, 117–141.
این نوشتار به بررسی رویدادها و اتفاقات مهم سینما در سال ۱۹۹۱ می‌پردازد.
ده فیلم پرفروش سال ۱۹۹۱:
شصت و چهارمین دوره جوایز اسکار
چهل و نهمین مراسم گلدن گلوب
نخل طلا (جشنواره فیلم کن):
شیر طلایی (جشنواره فیلم ونیز):
جشنواره بین‌المللی فیلم برلین (جشنواره فیلم برلین):
ایالات متحده unless stated
P-Q
U-V
تحلیل مستعار مجموعه‌ای از روش‌هایی است که تعیین می‌کند که آیا دو اشاره گر به شیء یکسانی در حافظه اشاره می‌کنند یا نه. الگوریتم‌های مختلفی برای تحلیل مستعار و راه‌های زیادی برای دسته‌بندی آن‌ها وجود دارد که عبارت است از: الگوریتم غیرحساس به جریان، الگوریتم حساس به متن و الگوریتم غیر حساس به متن، الگوریتم حساس به میدان و الگوریتم غیر حساس به میدان، مبتنی بر متحدسازی و مبتنی بر زیرمجموعه و غیره. در صورتی که دو اشاره‌گر به یک مکان اشاره کنند به آن‌ها مستعار می‌گویند. در نتیجه هر دو متغیری که می‌توانند مقادیرشان را از دو مقدار رسمی مجزا بگیرند نیز مستعار خواهند بود. در ابتدا تحلیل‌گرهای مستعار به یک جستار با کلماتی مثل: must, may و no جواب می‌دادند که نشان می‌داد که دو اشاره‌گر همیشه به یک شیء یکسان اشاره می‌کنند یا نه.
وجود متغیرهای مستعار عملیات بهینه‌سازی را سخت‌تر می‌کنند زیرا نمی‌توانیم تشخیص دهیم که این کدام متغیر تغییر کرده‌است.
کلاس تحلیل مستعار یک رابط(interface) تعریف می‌کند که پیاده‌سازی های مختلفی از تحلیل مستعار باید آن را پشتیبانی کنند. این کلاس دو enum مهم به نام‌های AliasResult و ModRefResult دارد که به ترتیب نتیجهٔ یک جستار مستعار یا یک جستار mod/ref را نشان می‌دهند.
رابط AliasAnalysis اطلاعات حافظه را به روش‌های مختلف نمایش می‌دهد. به خصوص شی‌های حافظه به عنوان آدرس شروع و اندازه، و فراخوانی توابع به صورت دستور یک فراخوانی واقعی که فراخوانی را انجام می‌دهند نشان داده می‌شوند. علاوه بر این رابط AliasAnalysis چند روش کمک‌کننده که به شما امکان گرفتن اطلاعات mod/ref را برای دستور دلخواه را می‌دهد. در در همهٔ رابط‌های AliasAnalysis باید در جستارهای شامل مقدارهای چندگانه، مقدارهایی که ثابت نیستند باید در همان تابع تعریف شوند. به‌طور کلی تحلیل مستعار تعیین می‌کند که آیا ارجاع به حافظه به قسمت یکسانی اشاره می‌کند یا نه. در نتیجه این اجازه به کامپایلر داده می‌شود که مشخص کند که متغیرهای برنامه توسط یک بخش از برنامه عوض می‌شوند یا خیر. برای مثال قطعه کد زیر را در نطر بگیرید:
سه حالت مستعار برای این کد وجود دارد:
در صورتی که مستعار نباشند آنگاه i برابر ۴ خواهد شد. اگر حالت دوم پیش بیاید i برابر ۵ می‌شود، چون p.foo + 3 = q.foo + 3. در هر دو حالت می‌توانیم بهینه‌سازی را روی آن‌ها اجرا کنیم. از طرفی، اگر نمی‌دانیم که این دو متغیر مستعار هستند یا نه نمی‌توان بهینه‌سازی را انجام داد و کل برنامه باید اجرا شود تا نتیجه به دست آید. در صورتی که وضعیت مستعار بودن دو ارجاع به حافظه نامشخص باشد می‌گوییم رابطهٔ may_alias دارند.
نوشتن یک تحلیل مستعار برای LLVM کار نسبتاً ساده‌ای است. پیاده‌سازی‌های مختلفی وجو دارد که می‌توان از آن‌ها استفاده کرد. در اولین مرحله باید مشخص کنیم چه نوع LLVM pass ای برای استفاده در تحلیل مستعار نیاز داریم. همانند سایر تحلیل‌ها و تبدیل ها، پاسخ باید از نوع مسئله‌ای که می‌خواهیم حل کنیم واضح باشد:
در تحلیل مستعار حافظهٔ برنامه را به کلاس‌های مستعار تقسیم می‌کنیم. کلاس‌های مستعار مجموعه‌های مجزایی از محل‌های حافظه هستند که نمی‌توانند مستعار هم دیگر باشند. در اینجا فرض می‌شود که بهینه‌سازی روی نمایش سطح پایین برنامه اتفاق می‌افتد. چون برنامه‌ای که کامپایل می‌شود اعمال دودویی، پرش‌ها، حرکت بین ثبات‌ها، حرکت بین ثبات‌ها و حافظه، انشعاب و فراخوانی و برگرداندن توابع را انجام می‌دهد.
اگر زبانی که کامپایل می‌شود از نظر نوع امن باشد، بررسی‌کننده نوع(type checker) درست کار می‌کند و برنامه قادر به ایجاد اشاره گرهای اشاره‌کننده به متغیرهای محلی نیست. حال بهینه‌سازی‌های مفیدی می‌توان انجام داد. حالت‌های مختلفی وجود دارد که می‌دانیم دو محل از حافظه باید در کلاس‌های مستعار مختلفی باشند: