payamvha/North_RAG huggingface dataset:
منظومه به برخی از شخصیت‌های غیرمنتظره شرکت‌کننده در این جنگ همچون تافورس، اشاره می‌شود که رهبر گروه نیمه‌مختار بودند که تحت فرماندهی پادشاه خود، صلیبیون را همراهی می‌کردند. منظومه از نگاه متخصصان. متأسفانه هیچ‌یک از مضمون‌های اشعار این منظومه را نمی‌توان به عنوان مدرکی برای جنگ صلیبی اول به کار برد. علت این امر به دو عامل بازمی‌گردد: به تعبیر سوزان ادگینتون، با وجود این، "منظومه انطاکیه"، احتمالاً به عنوان عاملی محرک در تجدید نیروها و سربازگیری در نیمه جنگ صلیبی سوم در حدود سال ۱۱۹۰ میلادی، به کار برده شده
سوم در حدود سال ۱۱۹۰ میلادی، به کار برده شده و فواید قابل ملاحظه‌ای در این زمینه نصیب صلیبیون نمود. همچنین این منظومه دارای ویژگی‌های زبان‌شناسی منطقه پیکاردی است و از سوی شوالیه‌های و نجیب‌زادگان شمال شرقی فرانسه ــ که اعمال اجدادشان در این اثر مورد تقدیس قرار گرفته‌است ــ از بر خوانده‌اند. به علاوه در منظومه انطاکیه، افکار و عقاید مذهبی و رویاهای برخی کشیشان همزمان با جنگ صلیبی اول و نقش و عملکرد زنان در این دوره نیز بیان شده‌است.
تکستران اوییشن شرکت سازنده هواگردهای عمومی شرکت خوشه‌ای تکستران است که از سال ۲۰۱۴ درپی خریداری شرکت‌های بیچ‌کرفت و هاوکر ایرکرفت شکل گرفت. این شرکت همچنین در برگیرنده برند سسنا نیز می‌باشد. اما بعد از خریداری شرکت هاوکر این مجموعه محصول جدیدی تحت برند هاوکر عرضه ننموده و فقط خدمات پس از فروش این برند ادامه دارد.
یک ترکیب کننده تجزیه‌گر در برنامه‌نویسی رایانه ای، یک تابع مرتبه بالا است که چندین تجزیه کننده (یا پارسر) را به عنوان ورودی می‌پذیرد و یک پارسر جدید را به عنوان خروجی برمی‌گرداند. در این زمینه، یک پارسر تابعی است که رشته‌هایی را به عنوان ورودی می‌پذیرد و ساختارهایی را به عنوان خروجی برمی‌گرداند، به عبارتی پارسر یک درخت تجزیه یا مجموعه ای از شاخص‌هایی است که نمایانگر مکان‌هایی در رشته‌است که تجزیه آن با موفقیت متوقف شده‌است. ترکیب کننده‌های پارسر از استراتژی تجزیه کننده کاهشی بازگشتی استفاده می‌کنند که ساخت
تجزیه کننده کاهشی بازگشتی استفاده می‌کنند که ساخت و آزمایش ماژولار را تسهیل می‌کند. به این تکنیک تجزیه، تجزیه کننده ترکیبی می‌گویند. پارسرهای ساخته شده با استفاده از ترکیب کننده‌ها، خوانا، ماژولار و ساختار یافته و همچنین ساده در مراحل ساخت و نگهداری هستند. از کاربردهای گسترده آن نمونه سازی کامپایلرها و پردازنده‌ها برای زبان‌های خاص دامنه (به انگلیسی: DSL) مانند واسط‌های زبان طبیعی به پایگاه‌داده‌ها، که در آن اقدامات معنایی پیچیده و متنوعی به همراه پردازش نحوی انجام می‌شوند، می‌باشد. در سال ۱۹۸۹، ریچارد
نحوی انجام می‌شوند، می‌باشد. در سال ۱۹۸۹، ریچارد فراست و جان لانچبروری نشان دادند که از ترکیب کننده‌های تجزیه گر می‌توان برای ساختن مفسرهای زبان طبیعی استفاده‌کرد. همچنین گراهام هاتن در سال ۱۹۹۲ از توابع مرتبه بالا در تجزیه کننده‌های پایه استفاده کرد. به علاوه S.D. Swierstra جنبه‌های عملی ترکیب کنندهٔ تجزیه گر را در سال ۲۰۰۱ به نمایش گذاشت. در سال ۲۰۰۸، فراست، هافیز و کالاهان مجموعه ای از ترکیب کننده‌های تجزیه گر را در زبان هسکل که مشکل دیرینه تطابق بازگشت چپ را حل می‌کرد، و به عنوان یک ابزار کامل تجزیه
چپ را حل می‌کرد، و به عنوان یک ابزار کامل تجزیه کننده از بالا به پایین در زمان و فضای چند جمله ای کار می‌کرد را تعریف کردند. ایده اولیه. در هر زبان برنامه‌نویسی دارای توابع کلاس اول، می‌توان از ترکیب کننده‌های تجزیه گر با ترکیب پارسرهای پایه برای ساخت پارسرهایی با قوانین پیچیده‌تر استفاده کرد. به عنوان مثال، یک قاعده تولید از یک دستور زبان مستقل از متن (به انگلیسی: CFG) ممکن است یک یا چند جایگزین دیگر داشته باشد و هر جایگزین ممکن است شامل یک توالی از غیرپایانه(ها) و پایانه(ها) باشد یا این که می‌تواند یک
و پایانه(ها) باشد یا این که می‌تواند یک غیرپایانه یا پایانه یا یک رشته خالی باشد. اگر یک پارسر ساده برای هر یک از این جایگزین‌ها وجود داشته باشد، می‌توان از یک ترکیب کنندهٔ تجزیه‌گر برای ترکیب هر یک از این پارسرها استفاده کرد و یک پارسر جدید که می‌تواند هر جایگزینی را تشخیص دهد را برگرداند. در زبانهایی که از سربارگذاری عملگرها پشتیبانی می‌کنند، یک ترکیب کننده تجزیه‌گر می‌تواند به صورت یک عملگر میانود که برای به‌هم پیوستن چند پارسر مختلف که جهت ایجاد یک قانون کامل از آن استفاده می‌شود، به کار برود. بدین جهت
کامل از آن استفاده می‌شود، به کار برود. بدین جهت ترکیب کننده‌های تجزیه‌گر پارسرها را به سبکی تعبیه شده، مشابه ساختار قواعد دستور زبان صوری تعریف می‌کنند. ترکیب کننده‌ها. برای ساده نگه داشتن بحث، ترکیب کننده‌های تجزیه‌گر را فقط به عنوان تشخیص‌دهنده‌ها بررسی می‌کنیم. اگر رشته ورودی از طول codice_1 و حرف‌های آن از طریق شاخص codice_2 قابل دسترسی باشند، تشخیص دهنده یک پارسر است که به عنوان خروجی مجموعه ای از شاخص‌هایی را برمی‌گرداند که نمایانگر موقعیت‌هایی هستند که پارسر دنباله‌ای از توکن‌ها را که از شاخص j
که پارسر دنباله‌ای از توکن‌ها را که از شاخص j شروع می‌شود را با موفقیت تشخیص داده‌است؛ بنابراین اگر خروجی یک مجموعهٔ خالی باشد، نشان می‌دهد که تشخیص دهنده نتوانسته هیچ دنباله ای را که از شاخص codice_2 شروع می‌شود، تشخیص دهد. در غیر این صورت خروجی نشان‌دهندهٔ آن است که تشخیص دهنده در موقعیت‌های متفاوت به پایان می‌رسد. باید در نظر گرفت که ممکن است چندین روش متمایز برای تجزیه یک رشته وجود داشته باشد به صورتی که به یک شاخص مشترک منتهی می‌شوند؛ این اتفاق نشان می‌دهد گرامر مبهم است. تشخیص دهنده‌های ساده این
می‌دهد گرامر مبهم است. تشخیص دهنده‌های ساده این ابهامات را نمی‌توانند شناسایی کنند چون هر شاخص انتهایی احتمالی فقط یک بار می‌تواند در مجموعه نتایج خروجی ذکر شود؛ به همین دلیل برای داشتن نتایج کامل تر، باید یک ساختار پیچیده‌تر مانند یک درخت تجزیه به عنوان خروجی برگردانده شود. در ادامه دو ترکیب کننده تجزیه گر برای جایگزینی و توالی یابی تعریف کنیم، ابتدا فرض می‌کنیم codice_10 و codice_11 ، دو تشخیص دهنده پایه باشند: مثال. یک گرامر مستقل از متن مبهم را در نظر بگیرید، codice_18 . با استفاده از ترکیب کننده ای که
codice_18 . با استفاده از ترکیب کننده ای که بالاتر تعریف کردیم، می‌توانیم به صورت ماژولار، نمادهای اجرایی این دستور زبان را با استفاده از یک زبان کاربردی مدرن (مثلاً هسکل) به صورت codice_19 تعریف کنیم. وقتی که تشخیص دهنده codice_20 بر روی یک دنباله ورودی codice_21 در موقعیت codice_22 اعمال شود با توجه به تعاریف فوق، خروجی codice_23 را برمی‌گرداند. کاستی‌ها و راه حل‌ها. ترکیب کننده‌های تجزیه‌گر، مانند همه تجزیه کننده‌های کاهشی بازگشتی، محدود به دستور زبان‌های مستقل از متن نیستند، بنابراین هیچ جستجوی سراسری
مستقل از متن نیستند، بنابراین هیچ جستجوی سراسری برای ابهامات موجود در مجموعه Firstk و Followk در تجزیه کننده ال ال انجام نمی‌دهد؛ بنابراین، ابهامات فقط در زمان اجرا و زمانی که ورودی‌ها مقدار دهی می‌شوند، مشخص می‌شوند. در چنین مواردی، تجزیه کننده کاهشی بازگشتی می‌تواند به صورت پیش فرض (که ممکن است برای طراح گرامر ناشناخته باشد) به یکی از مسیرهای مبهم احتمالی منجر شود و باعث سردرگمی معنایی در استفاده از زبان شود. این موضوع باعث ایجاد اشکالاتی توسط کاربران زبان‌های برنامه‌نویسی مبهم می‌شود، که در زمان کامپایل
برنامه‌نویسی مبهم می‌شود، که در زمان کامپایل گزارش نشده‌اند، و به‌عنوان خطای انسانی معرفی نمی‌شوند بلکه به‌عنوان دستور زبان مبهم معرفی می‌شوند. تنها راه حلی که این اشکالات را از بین می‌برد، رفع ابهامات و استفاده ازدستور زبان‌های مستقل از متن است. پیاده‌سازی‌های ساده ترکیب کننده‌های تجزیه‌گر دارای کاستی‌هایی هستند که در تجزیه کنندهٔ بالا به پایین هم رایج است. تجزیه‌کننده ترکیبی ساده (به انگلیسی: Naïve combinatory parsing)، هنگام تجزیهٔ دستور زبان مستقل از متن مبهم به زمان و فضای نمایی نیاز دارد. در سال
متن مبهم به زمان و فضای نمایی نیاز دارد. در سال ۱۹۹۶، فراست و Szydlowski نشان دادند که با مموایز کردن در استفاده از ترکیب کننده‌های تجزیه‌گر می‌توان پیچیدگی زمانی را به چند جمله ای کاهش داد. مدتی بعد فراست از مونادها برای ساخت ترکیب کننده‌ها در ریسه (به انگلیسی: thread)های قاعده دار و درست جدول یادداشت‌ها در طول محاسبه استفاده کرد. مانند هر تجزیه کننده کاهشی بازگشتی از بالا به پایین، ترکیب کننده‌های تجزیه‌گر معمولی (مانند ترکیب کننده‌های ذکر شده در بالا) در هنگام پردازش یک دستور زبان بازگشتی چپ خاتمه
در هنگام پردازش یک دستور زبان بازگشتی چپ خاتمه نمی‌یابند (به عنوان مثال codice_24). در سال ۲۰۰۶ یک الگوریتم تشخیص که دستور زبان مبهم را با قوانین مستقیم بازگشتی چپ تطبیق می‌داد ارائه شد. این الگوریتم تجزیه جداکننده بازگشتی چپ که نامتنهی است با تحمیل محدودیت‌های عمق، ساده کرد. در سال ۲۰۰۷، فراست، هفیز و کالاهااین الگوریتم را به یک الگوریتم تجزیه کننده کامل توسعه دادند، که در آن بازگشتی چپ غیرمستقیم مانند مستقیم در زمان چندجمله ای تطبیق می‌دهد، و هم چنین تعداد نمایی ای از درختان تجزیه برای گرامرهای مبهم را
نمایی ای از درختان تجزیه برای گرامرهای مبهم را در فضای چندجمله ای و متراکم نمایش می‌دهد. این الگوریتم گسترش یافته، بازگشتی چپ غیرمستقیم را با مقایسه «متن محاسبه شده» با «متن فعلی»، مطابقت می‌دهد. همین نویسندگان همچنین پیاده‌سازی خود را در مورد مجموعه ای از ترکیب کننده‌های تجزیه‌گر که به زبان برنامه‌نویسی هسکل نوشته شده بودند رابر اساس همان الگوریتم توصیف کردند.
بهینه‌سازی حلقه در تئوری کامپایلر، فرایند افزایش سرعت اجرا و کاهش سربارهای مربوط به است. این فرایند نقش بسزایی در بهبود عملکرد حافظه نهان و استفاده مؤثر از قابلیت‌های پردازش موازی ایفا می‌کند. در واقع بیشترین زمان اجرای یک برنامه علمی در حلقه‌ها صرف می‌شود؛ و از این رو تکنیک‌های متعدد بهینه سازی کامپایلر برای اجرای سریعتر ایجاد شده‌اند. نمایش محاسبه‌ها و تبدیل‌ها. از آنجا که دستورالعمل‌های داخل حلقه‌ها می‌توانند به‌طور مکرر اجرا شوند، در اغلب موارد ارائهٔ یک کران برای تعداد اجراهای متأثر از بهینه‌سازی حلقه
کران برای تعداد اجراهای متأثر از بهینه‌سازی حلقه غیرممکن است. این مشکل بررسی به‌جا بودن و درستی بهینه‌سازی حلقه و مزایای آن را در سناریوهای مختلف، چالش‌برانگیز کرده‌است. بهینه سازی با انجام دنباله ای از تبدیل‌های حلقه. درعمل فرایند بهینه‌سازی حلقه را می‌توان اعمال دنباله‌ای از تبدیل‌های حلقه روی بازنمایی میانی دانست که هریک دارای محکی برای سنجش درستی و به‌جابودن هستند. یک تبدیل (یا دنباله‌ای از تبدیل‌ها) برای اینکه بتواند تضمین کند که کد حاصلش، نتیجهٔ کد اولیه را تولید خواهد کرد، به صورت کلی باید دنبالهٔ
را تولید خواهد کرد، به صورت کلی باید دنبالهٔ تمام وابستگی‌هایی که در ابتدا در کد بوده را حفظ کند. علاوه بر آن بررسی مفید بودن یک تبدیل در این روش دشوار است چراکه ممکن است بکارگیری یک تبدیل نیازمند انجام چندین تبدیل دیگری باشد که خود آن‌ها سربار محاسباتی ایجاد کنند. در ادامه تبدیل‌های متداول حلقه به صورت فهرست‌وار آمده‌اند. چهارچوب تبدیل تکپیمانه‌ای. روش تبدیل تکپیمانه‌ای از یک ماتریس تک پیمانه‌ای برای توصیف نتیجهٔ اعمال دنباله‌ای از تبدیل‌های مذکور استفاده می‌کند. ایدهٔ اصلی این روش توصیف مجموعهٔ تمام
می‌کند. ایدهٔ اصلی این روش توصیف مجموعهٔ تمام اجراهای یک دستور در formula_1 حلقه به صورت یک مجموعه از نقاط با مختصات صحیح در فضای formula_1 بعدی است که این نقاط به ترتیب الفبایی اجرا می‌شوند. به عنوان مثال اجراهای یک گزاره که در دو حلقهٔ تودرتو با متغیر پیمایندهٔ بیرونی i و درونی j به صورت دوتاییformula_3 مدل می‌شود. یک تبدیل تک پیمانه‌ای متناظر با ضرب نقاط این فضا توسط ماتریس‌های تبدیل است. مثلاً ماتریس مربوط به جابه‌جایی حلقهٔ بیرونی با درونی formula_4 است. به صورت کلی یک تبدیل تک پیمانه‌ای زمانی صحیح
است. به صورت کلی یک تبدیل تک پیمانه‌ای زمانی صحیح است که تمام دنباله وابستگی‌های زمانی را حفظ کند. دشوارتر از آن، بررسی تأثیر تبدیل تک پیمانه‌ای را روی کارایی است. به این دلایل حلقه‌های تودرتوی معیوب و تبدیل‌هایی مثل بخشبندی به راحتی در این چهارچوب قابل انجام نیستند. چهارچوب چندوجهی یا مبتنی بر شرط. مدل چندوجهی گسترهٔ وسیعتری از کدها و تبدیل‌ها را درمقایسه با چهارچوب تک پیمانه‌ای پوشش می‌دهد. در این چهارچوب مجموعه اجراهای یک دسته از دستورها داخل حلقه‌های تودرتوی معیوب به صورت اجتماعی از چندوجهی‌هایی مدل
تودرتوی معیوب به صورت اجتماعی از چندوجهی‌هایی مدل می‌شود که اجرای دستورها را نشان می‌دهند. در ادامه تبدیل‌های آفین، روی این چندوجهی‌ها اعمال می‌شود و توصیفی از ترتیب اجرای جدید بدست می‌آید. مرزهای چندوجهی‌ها، وابستگی‌های داده‌ای و تبدیل‌ها معمولاً توسط تعدادی شرط بیان می‌شوند و از این رو این چهارچوب را مبتنی بر شرط می‌نامند. برای مثال یک دستور در حلقهٔ تودرتو با حلقهٔ بیرونی " و حلقهٔ داخلی " را درنظر بگیرید که به ازای هر جفت formula_3 که formula_6 و formula_7 اجرا شود. مجدداً تکرارمی‌شود که یک تبدیل زمانی
اجرا شود. مجدداً تکرارمی‌شود که یک تبدیل زمانی به‌جا است که دنبالهٔ زمانی وابستگی‌ها را حفظ کند. همچنین تخمین بهره‌وری یک تبدیل یا یافتن بهترین تبدیل برای یک مجموعه کد روی یک کامپیوترکماکان موضوع پژوهش‌های امروزه است (زمان نوشتار متن ۲۰۱۰).
در گراف های جهت دار، زمانی می‌گوییم گره formula_1 بر گره formula_2 غلبه می‌کند که به ازای هر گره formula_3 همه مسیر ها از formula_3 به formula_2، از گره formula_1 عبور کند. در نتیجه می‌توان گفت هر گره بر خودش غلبه می‌کند. با توجه به تعریف می‌توان برای هر گره مجموعه‌ای از گره های سلطه گر در نظر گرفت که بر این گره غلبه می‌کنند. همچنین می‌توان برای هر گراف یک درخت سلطه گر تعریف کرد که به ازای هر گره در گراف، اجداد این گره در درخت، گره های سلطه گر بر این گره در گراف هستند. بنابر تعریف می‌توان برای سلطه گری اکید
هستند. بنابر تعریف می‌توان برای سلطه گری اکید نتیجه گرفت که نزدیک گره سلطه گر اکید برای هر گره یکتا بوده و یک گره برای آن وجود دارد. تاریخچه و کاربرد. تعریف گره سلطه گر یا غالب برای اولین بار توسط ریس پروسر در مقاله‌ای تحت عنوان کاربردهای ماتریس بولی برای تحلیل نمودارهای جریان ارائه شد. او در این مقاله الگوریتمی برای پیدا کردن گره های سلطه گر ارائه نکرد و صرفاً آن را تعریف کرده. اولین الگوریتم برای این مساله ده سال بعد توسط ادوارد لوری و مدلاک ارائه شد. از کاربرد های آن می‌توان به زمینه های بهینه سازی
از کاربرد های آن می‌توان به زمینه های بهینه سازی برنامه، تولید کد، تست مدار اشاره کرد. همچنین در کامپایلر ها از اطلاعات حاصل از سلطه گری گره‌ها استفاده زیادی می‌شود. برای مثال یک کاربرد آن در کامپایلر برای پیدا کردن حلقه ها در بهینه سازی کد به کمک بلوک های پایه است. الگوریتم پیدا کردن گره‌های سلطه گر. با توجه به تعریف برای هر گره formula_3 اگر formula_17 برابر با مجموعه گره‌های سلطه گر بر گره formula_3 در نظر بگیریم آنگاه رابطه زیر را خواهیم داشت. formula_19در اینجا formula_20 برابر است با مجموعه تمام
اینجا formula_20 برابر است با مجموعه تمام گره‌هایی که وارد گره formula_3 می‌شوند یعنی یک یال از سمت آنها به formula_3 وجود دارد. همچنین برای گره شروع در گراف داریم formula_23 با داشتن این اطلاعات برای پیدا کردن گره‌های سلطه گر هر گره در گراف می‌توان الگوریتم زیر را پیاده سازی کرد. // n0 : start node for n in graph - {n0}: Dom[n] = graph changed = True while changed: changed = False for n in graph: new = [] for p in preds(n): new = intersection(new, Dom[p]) new = new + [n] if new != dom[n]: dom[n] = new
new = new + [n] if new != dom[n]: dom[n] = new changed = True این الگوریتم در زمان اجرای formula_24 تمام مجموعه های سلطه گر را می‌یابد که می‌توان با استفاده از داده ساختار های خاص زمان اجرا را بهتر کرد. الگوریتم دیگری توسط رابرت تارجان و توماس لینگوار ارائه شده که به وسیله الگوریتم جستجوی اول عمق (الگوریتم dfs) در زمان تقریباً خطی این کار را انجام می‌دهد. الگوریتم پیدا کردن گره‌های سلطه گر مرزی. با توجه به تعریف برای گره سلطه گر مرزی می‌توان رابطه های زیر را بدست آورد. formula_25 که در اینجا formula_26
را بدست آورد. formula_25 که در اینجا formula_26 همان مجموعه گره‌های سلطه گر مرزی formula_2 است و formula_28 برابر مجموعه گره‌هایی است که formula_2 بر آن‌ها غلبه می‌کند و formula_30 برابر است با formula_31. همچنین برای formula_32 که formula_33 یک مجموعه است داریم formula_34 که اینجا formula_35 برای گره formula_36 برابر است مجموعه تمام گره هایی که از formula_36 به آنها در گراف جهت دار مسیر وجود دارد. با این رابطه ها می‌توان رابطه زیر را بدست آورد. formula_38 که در اینجا formula_39 فرزندان formula_2 در درخت
که در اینجا formula_39 فرزندان formula_2 در درخت سلطه گر اند. formula_41 برابر است با تمام formula_42 که formula_2 بر آنها را به صورت اکید غلبه نمی‌کند. formula_44 زیر مجموعه‌ای از formula_45 است که formula_2 بر آنها به صورت اکید غلبه نمی‌کند. با توجه به این رابطه الگوریتم زیر بدست می‌آید. def FindDF(v): DF[v] = [] for w in children(v): FindDF(w) for u in DF[w]: if not strictly_dom(v,u): DF[v].append(u) for w in succ(v): if not strictly_dom(v,w): DF[v].append(w)
بافندهٔ جوانب ابزاری برای زبان‌های جنبه گرا هست که وظیفه دارد های برنامه را در ورودی بگیرد و کد نهایی را با استفاده از آنها تولید کند. بافنده با تلفیق جنبه‌ها و کلاس‌ها، ساختاری جدید به نام کلاس‌های بافته شده تولید می‌کند. استفاده این ابزار در مرحله پیش از کامپایل می‌باشد. دستورهای داده شده به بافنده‌ها نام دارند. این صوابدیدها با استفاده از ترکیبی از تعریف می‌شوند که تعیین می‌کنند کدام توابع باید توسط کد جنبه‌ها تکمیل شود. شیوهٔ دقیق تکمیل این توابع به خود جوانب برمیگردد. با این کار بافنده‌ها ابزاری
خود جوانب برمیگردد. با این کار بافنده‌ها ابزاری ارزشمند برای ارتقای پودمانی هستند. انگیزه. زبان‌های متعدد وجود دارد که شناخته شده باشند اما انگیزه کافی برای طراحی و ساخت زبان‌های جنبه گرای جدید به علل اقتصادی وجود ندارد. استفاده از تکنولوژی کاملاً متفاوت نیاز به این دارد که شرکت‌ها برنامه نویسان جدید استخدام کنند، زنجیره ابزار های متفاوتی برای توسعه تهیه کنند و همچنین کدهای قبلی خود را رها کنند که همگی خرج‌های زیادی دربردارد. برای حل این معضلات در کنار داشتن برنامه‌نویسی جنبه گرا بافنده‌ها به ما این اجازه
برنامه‌نویسی جنبه گرا بافنده‌ها به ما این اجازه را می‌دهند که با اندکی تعمیم مانند از زبان پرکاربردی مانند جاوا استفاده کنیم. بجای طراحی یک زبان کاملاً جدید، بافنده پسوندهای تعریف شده توسط AspectJ را تفسیر می‌کند و کد جاوا را «می بافد» تا بتواند توسط هر جاوا کامپایلری استفاده شود. این تضمین می‌کند که هر کد شی گرا موجود، یک کد معتبر جنبه گرا نیز باشد و توسعه مانند روال عادی توسعه شیء گرا انجام شود. مثالی دیگر از اینگونه تعمیمات زبان است که تعمیمی جنبه گرا برای زبان ++C می‌باشد. پیاده‌سازی. همانطور که گفته
زبان ++C می‌باشد. پیاده‌سازی. همانطور که گفته شد، کار بافنده این است که با گرفتن دستورالعمل‌هایی از جنبه برنامه (همان صوابدید)، به صورت خودکار این دستورالعمل‌ها را در بین کلاس‌های موجود اعمال کند. در نتیجه کلاس‌هایی خواهیم داشت همنام کلاس‌های اصلی برنامه، اما با کدی متفاوت برای توابع. محل اضافه شدن این دستورالعمل‌ها توسط صوابدید تعیین می‌شود. در طی این عملیات بافنده‌ها اجازه اضافه‌شدن کدهایی را به برنامه می‌دهند که در غیر اینصورت به صورت اضافی در برنامه قرار می‌گرفتند. در نتیجه دیگر نیازی به دخالت
قرار می‌گرفتند. در نتیجه دیگر نیازی به دخالت برنامه‌نویس در پخش این کدها نیست. مثال. در کد AspectJ زیر، نقاط پیوست و کد کلاس شده جنبه، در قالبی شبیه کلاس جاوا پیاده شده‌اند. وظیفه بافنده این است که تنها یک کلاس در انتها تولید کند که جنبه تعریف شده را در خود اعمال کرده باشد. مثال زده شده، قصد لاگ اندازی ورود به توابع را دارد. بدون وجود بافنده، برنامه‌نویس باید به صورت دستی تمام این لاگ‌ها را در توابع مورد نیاز قرار می‌داد، که مشخصا در یک برنامه‌ی واقعی امری به مراتب زمانگیر و کلافه‌کننده است. در هر تابع، با
مراتب زمانگیر و کلافه‌کننده است. در هر تابع، با توجه به صوابدید کدی مختص آن تابع تولید می‌شود. برای افزایش کارایی کد، می‌توان آن را مستقیماً تبدیل به bytecode کرد، در واقع بافنده در نقش کامپایلر نیز عمل می‌کند. اما کار بافنده در این حالت پیچیده‌تر و زمانگیرتر می‌شود طبق انتظار. aspect Logging { pointcut method() : execution(* *(..)); before() : method() { System.out.println("Entering " + thisJoinPoint.getSignature().toString()); public class C { public void first() { System.out.println("Executing
void first() { System.out.println("Executing C.first()"); public void second() { System.out.println("Executing C.second()"); کد AspectJ بالا تبدیل به کد جاوای پایین می‌شود: public class C { public void first() { System.out.println("Entering C.first()"); System.out.println("Executing C.first()"); public void second() { System.out.println("Entering C.second()"); System.out.println("Executing C.second()"); کارایی. عملکرد زمان کامپایل با استفاده بافنده‌ها به دلیل کار اضافی لازم برای پیدا کردن توابع مطابق با
دلیل کار اضافی لازم برای پیدا کردن توابع مطابق با نقاط پیوست، به طور کلی از کامپایلر های سنتی معادل آنها بدتر است. یک مطالعه نشان داد که کامپایلر ajc که برای زبان AspectJ هست، حدود ۳۴٪ کندتر از کامپایلر Java 1.3 و حدود ۶۲٪ کندتر از کامپایلر جاوا ۱.۴ است.
گریندر د دوئال، شاعر و گردآورنده سه منظومه تاریخی «"منظومه انطاکیه"»، «"منظومه اورشلیم"» یا «فتح اورشلیم» و «"منظومه ناچیزان [اسیران مسیحی]"» است. از شرح حال وی اطلاع چندانی در دسترس نیست جز آن که وی در قرن ۱۲ میلادی و همزمان با لوئی هفتم، پادشاه فرانسه، زندگی می‌کرده و این سه منظومه بدو منسوب هستند. در واقع گریندر، اطلاعات بسیاری را از برخی وقایع‌نامه‌های جنگ صلیبی همچون "گشتا فرانکاروم" اقتباس نمود و در ویرایش. تدوین سه منظومهٔ مزبور به کار برد. همچنین، وی برخی از این اشعار حماسی را که به شکل شفاهی بر
وی برخی از این اشعار حماسی را که به شکل شفاهی بر زبان مردم جاری بود، جمع‌آوری و مکتوب کرد و آنها را بازنگری نمود و به صورت متونی مدون درآورد که امروزه به "نخستین سیکل جنگ‌های صلیبی" معروف هستند. این سه اثر، شرح منظوم اعمال نخستین لشکرکشی صلیبیون به شرق هستند که عمدتاً با استفاده از اطلاعات و مشاهدات عینی سربازان صلیبی بازگشته به اروپا سروده شده‌اند.
گرامر صفت یک روش رسمی برای تعریف صفات متغیرها یا غیر پایانه‌های موجود در قواعد تولید یک دستور زبان رسمی می‌باشد، این صفات دامنه مقادیر غیر پایانه‌های قواعد تولید را تعیین می‌کنند. تعیین مقدار صفت در گره‌های درخت نحو تجزیه، هنگامی که زبان توسط برخی از تحلیلگرهای نحوی یا کامپایلر پردازش می‌شود، صورت می‌گیرد. این صفات دامنه مقادیر غیر پایانه‌های قواعد تولید را تعیین می‌کنند. بر اساس اینکه گره‌ها در درخت نحو از چه روشی برای گرفتن مقادیر خود استفاده می‌کنند، صفات به دو گروه ترکیبی و موروثی تقسیم می‌شوند. صفت‌های
به دو گروه ترکیبی و موروثی تقسیم می‌شوند. صفت‌های ترکیبی مقادیر خود را از مقدار صفات گره‌های فرزند خود می‌گیرند، در حالیکه صفت‌های موروثی مقادیر خود را از گره‌های والد یا گره‌های هم نیای خود دریافت می‌کنند. صفات ترکیبی اطلاعات معنایی را به گره‌های بالایی درخت تجزیه منتقل می‌کنند، در حالی که صفات موروثی به انتقال اطلاعات معنایی به گره‌های پایین و در سراسر آن کمک می‌کنند. به عنوان نمونه، هنگام ساختن یک ابزار ترجمه زبان، مانند کامپایلر، ممکن است برای اختصاص مقادیر معنایی به ساختارهای نحوی از این صفات استفاده
معنایی به ساختارهای نحوی از این صفات استفاده شود. همچنین، می‌توان تحلیل معنایی دستور زبان را بررسی و مورد ارزیابی قرار داد. تحلیل معنایی گرامر زبان، قواعدی از زبان را نشان می‌دهد که به‌طور واضح با تعریف نحوی قابل بیان نمی‌باشد. از گرامر صفت نیز می‌توان به‌طور مستقیم برای ترجمه درخت نحو به کد برای برخی از زبان‌های میانی استفاده کرد. یکی از نقاط قوت دستور زبان صفت این است که آنها می‌توانند اطلاعات را به روشی کنترل شده و رسمی از هر کجای درخت نحو تجزیه به هر جای دیگر، منتقل کنند. تاریخچه. دستور زبان صفت توسط
دیگر، منتقل کنند. تاریخچه. دستور زبان صفت توسط دونالد نوت (به انگلیسی: Donald Knuth) و پیتر وگنر (به انگلیسی: Pete Wegner) اختراع شده‌است. درحالیکه دونالد نوت مفهوم کلی گرامر صفت را مطرح کرده بود، پیتر وگنر مفهوم صفت موروثی را اختراع کرد. مثال. در ادامه یک گرامر مستقل از متن را مشاهده می‌کنید که زبان حاصل از آن، ضرب و جمع اعداد صحیح را توصیف کند. دستور زبان صفت زیر را می‌توان برای محاسبه نتیجه عبارتی که در دستور زبان نوشته شده‌است، استفاده کرد. توجه داشته باشید که این گرامر فقط از مقادیر صفات ترکیبی
باشید که این گرامر فقط از مقادیر صفات ترکیبی استفاده می‌کند و به همین دلیل به آن گرامر صفت S می‌گویند. صفت ترکیبی. یک صفت ترکیبی از مقادیر صفات گره‌های فرزندانش محاسبه می‌شود. از آنجا که ابتدا باید مقدار صفت گره‌های فرزند محاسبه شود، این فرایند به شکل پایین به بالا است. برای تعریف رسمی یک صفت ترکیبی، فرض کنید:formula_1 تعریف صوری یک دستور زبان باشد، تفسیر هر یک از نمادها به شرح زیر است: حال یک رشته از نمادهای غیر پایانه یا متغیرها(A) و یک صفت به نام a را در نظر بگیرید، A.a در صورت برقراری هر سه شرط زیر یک
نظر بگیرید، A.a در صورت برقراری هر سه شرط زیر یک صفت ترکیبی است: صفت موروثی. صفت موروثی در یک گره درخت تجزیه با استفاده از مقادیر صفت در والدین یا خواهران و برادران بدست می‌آید. صفت‌های موروثی برای بررسی ساختار در یک زبان برنامه‌نویسی که در قالب قواعد تولید بیان شده‌است، مناسب می‌باشند. به عنوان مثال، می‌توانیم از یک صفت موروثی برای بررسی اینکه آیا یک شناسه در سمت چپ یا سمت راست یک رابطه نسبت دادن ظاهر می‌شود استفاده کنیم، تا تصمیم بگیریم که آیا آدرس یا ارزش شناسه لازم است یا خیر. برخلاف صفات ترکیبی، صفات
شناسه لازم است یا خیر. برخلاف صفات ترکیبی، صفات موروثی می‌توانند مقادیر گره‌های والدین یا خواهران و برادران را بگیرند. برای مثال قاعدهٔ تولید زیر را در نظر بگیرید: در این قاعده، A می‌تواند مقادیر S ,B و C را بدست آورد، B می‌تواند مقادیر S ,A و C را بدست آورد. به همین ترتیب C می‌تواند مقادیر S ,A و B را بگیرد.
در سال ۱۹۲۹ بورس اوراق بهادار نیویورک تنزل کرد. این تنزل، آغاز یک رکود اقتصادی بود که تا انتهای دهه ۱۹۳۰ ادامه داشت. خیلی زود، میلیون‌ها نفر بیکار شدند، بانک‌ها اعتبارات را محدود ساختند و بسیاری از مشاغل تعطیل شد. فاجعه‌ی کم‌وبیش همزمان و همپوشان و هم‌افزا با این بحران، خشکسالی طولانی و داست‌بول بود، که دشت بزرگ آمریکا را به آستانه‌ی نابودی کشاند و بیابان برهوت بزرگی از تگزاس تا داکوتای شمال و جنوبی ایجاد کرد. رکورد گسترده اقتصادی ایالات متحده در سال های ۱۹۳۵ تا ۱۹۴۳، فرانکلین دی. روزولت، رئیس جمهور آمریکا
تا ۱۹۴۳، فرانکلین دی. روزولت، رئیس جمهور آمریکا را ترغیب کرد تا از عملیات عکاسی فدرال حمایت مالی بکند تا دامنه‌ی کامل ویرانگری اقتصادی در ایالات متحده ثبت شود. او امیدوار بود که این تصاویر، حمایت وی از کشاورزان را تقویت نماید. چشمگیرترین نمونه‌ی این اقدامات به سال ۱۹۳۵ یعنی هنگامی که وزارت کشاورزی، روی استرایکر را برای بخش تاریخی اداره‌ی اسکان مجدد استخدام کرد برمی‌گردد. دو سال بعد، این عملیات تحت عنوان اداره حفاظت از مزارع یا FSA شناخته شد (FSA در سال 1942 به اداره‌ی اطلاعات جنگ یا OWI منتقل شد). استرایکر
به اداره‌ی اطلاعات جنگ یا OWI منتقل شد). استرایکر برنامه عکاسی را تا اکتبر ۱۹۴۳ رهبری کرد. عکاسانی نظیر: واکر ایوانز، دوروتیا لنگ، راسل لی، بن شان، جان واشون، ماریون پست ولکات، کارل میدانز، گوردون پارکس، جان کالیر پسر و جک دلان در این فرایند مشغول به عکاسی مشغول بودند.