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

98 1089 100 1

کامپایلر

کامپایلر در دانشنامه ویکی پدیا

کامپایلر
کامپایلر (به انگلیسی: compiler) برنامه یا مجموعه ای از برنامه|برنامه های کامپیوتری است که متنی از زبان برنامه نویسی سطح بالا (زبان مبدأ) را به زبانی سطح پایین (زبان مقصد)، مثل اسمبلی یا زبان سطح ماشین، تبدیل می کند. خروجی این برنامه ممکن است برای پردازش شدن توسط برنامه دیگری مثل پیونددهنده مناسب باشد یا فایل متنی باشد که انسان نیز بتواند آن را بخواند. به این علت فرودبر نامگذاری شده است که کد با زبان سطح بالا را به کد زبان سطح پایین تبدیل می کند بدون این که در رفتار کد تغییری حاصل شود. به عمل compile کردن فرودش گفته می شود.
توسعه گام به گام برنامه
به کارگیری پارسرهای بازگشتی
استفاده از EBNF جهت تعریف نحو زبان
استفاده از P-Code در جریان تولید کد خروجی قابل حمل
نمایش T-diagram جهت تعارف رسمی
مهم ترین علت استفاده از ترجمه کد مبدأ، ایجاد برنامه اجرایی می باشد. برعکس برنامه ای که زبان برنامه نویسی سطح پایین را به بالاتر تبدیل می کند را مترجم وارون گوییم.
ترجمه کامل کد منبع برنامه ای از یک زبان سطح بالا به کد شیء، پیش از اجرای برنامه را همگردانی یا کامپایل می گویند.
به بیان ساده، کامپایلر برنامه ای است که یک برنامه نوشته شده در یک زبان خاص ساخت یافته را خوانده و آن را به یک برنامه مقصد (Target Language) تبدیل می نماید. در یکی از مهم ترین پروسه های این تبدیل، کامپایلر وجود خطا را در برنامه مبدأ اعلام می نماید.
عکس کامپایلر
یک کامپایلر تابعی، کامپایلری برای یک زبان برنامه نویسی تابعی است. کامپایلر تابعی تغییری در کد منبع ایجاد می کند که آن را به سبک مابعد گذرنده یا فرم نرمال اجرایی تبدیل می کند و لازم است فراخوانی های دم را به درستی بکار بگیرد.
کامپایلر تک گذره (one-pass compiler) به کامپایلری گفته می شود که دقیقاً با یک مرتبه گذر از روی متن داده شده، آن متن را ترجمه کند. این نوع کامپایلرها، در مقابل کامپایلرهای چندگذری هستند که چند بار متن را بررسی می کنند تا آن را ترجمه کنند. سرعت کامپایلرهای تک گذره بسیار بیشتر از کامپایلرهای چندگذری است اما قدرت کمتری دارند و زبان های محدودتری را می توانند پوشش دهند. به عنوان مثال، زبان پاسکال با کامپایلر تک گذره ترجمه می شود اما زبان های پیشرفته تر مانند جاوا، تنها با کامپایلر چندگذری قابل ترجمه هستند. به همین دلیل، به کامپایلرها تک گذره، کامپایلر محدود و به کامپایلرهای چندگذری، کامپایلر نامحدود می گویند. کامپایلرهای تک گذره، به دلیل سادگی، بسیار رایج تر هستند و طراحی آن ها برای برنامه نویسان راحت تر است.
- کامپایلرهای تک گذره، سرعت بیشتری نسبت به کامپایلرهای چندگذری دارند زیرا تنها یکبار متن برنامه را می خوانند و تمام عملیات لازم جهت کامپایل برنامه را در همان گذر اول انجام می دهند.
- کامپایلرهای تک گذره از حافظه کمتری نسبت به کامپایلرهای چندگذری استفاده می کنند. دلیل این امر، این است که کامپایلرهای چندگذری، نیاز دارند اطلاعات هر گذر خود را در حافظه ذخیره کنند تا در گذرهای بعدی بتوانند از آن استفاده کنند. اما این موضوع در کامپایلر تک گذره پیش نمی آید. در نتیجه، در ماشین هایی که حافظه کمی دارند یا دسترسی به حافظه در آن ها بسیار کند است، کامپایلر تک گذره مناسب تر است.
- قابلیت کامپایل شدن کد در یک گذر، معمولاً به عنوان یک نکته مثبت آن کد در نظر گرفته می شود زیرا فرایند نوشتن کامپایلر را برای برنامه نویس آسانتر می کند.
یک کامپایلر چند گذری یک نوع کامپایلر است که کد منبع یا درخت نحو انتزاعی از برنامه را چندین بار پردازش می کند. این نوع کامپایلر برخلاف کامپایلر تک گذری است که فقط یک بار از روی برنامه گذر می کند (برنامه را پردازش می کند). هر گذر نتیجهٔ گذر قبلی را به عنوان ورودی انتخاب می کند و یک خروجی میانی تولید می کند. به این ترتیب کد میانی گذر به گذر بهبود می یابد تا گذر نهایی، کد نهایی را منتشر کند.
کامپایلر
کامپایلرهای چند گذری گاهی اوقات به نام کامپایلرهای گسترده نام گذاری می شوند که به گذرهایی با دامنهٔ وسیع تر اشاره دارند: آنهابه جای دیدن یک بخش کوچک از برنامه می توانند کل برنامهٔ در حال کامپایل را مشاهده کنند. در نتیجه دامنه گسترده تر به این کامپایلرها اجازه می دهد تا کد بهتری نسبت به خروجی کامپایلر یک گذری از لحاظ هزینهٔ زمانی و مصرف حافظه تولید کنند (به عنوان مثال کد با حجم کوچکتر، کد سریع تر). علاوه بر این، برخی از زبان ها را به دلیل نوع طراحیشان نمی توان در کامپایلرهای تک گذری کامپایل کرد.
این مرحله یک مرحله از یک کامپایلر چندگذری است که اطلاعات بی ربطی از برنامه منبع را که تحلیل نحوی قادر به استفاده یا تفسیر آن نخواهد بود را حذف می کند. اطلاعات بی ربط می تواند چیزهایی مانند نظرات و فضای سفید باشد. تحلیل لغوی علاوه بر از بین بردن اطلاعات بی ربط، نشانه های واژگانی از زبان را مشخص می کند. این بدان معنی است که اگر یک کامپایلر چندگذری استفاده شود Forward declaration به طور کلی لازم نیست.
تحلیل نحوی مسئول دنبال کردن قوانین نحوی (معمولاً به صورت گرامرهای مستقل از متن)و ساخت یک ارائه از زبان (مثل یک درخت نحوی انتزاعی یا گراف جهت دار بدون دور)است.
کامپایلر قابل حمل سی (به انگلیسی: Portable C Compiler) یا اختصار pcc یکی از اولین کامپایلرهای زبان برنامه نویسی سی بود که در سال ۱۹۷۳ در آزمایشگاه های بل توسط استفان جانسون و بر اساس ایده های پیشنهاد شده توسط آلن سیندر نوشته شد. یکی از اولین کامپایلرهایی بود که به آسانی می توانست کدهایی برای معماری های مختلف را تولید کند. این کامپایلر عمری طولانی داشت؛ اولین بار در نسخه ۷ یونیکس عرضه شد. بی اس دی یونیکس هم از این کامپایلر استفاده می کرد تا اینکه با انتشار ۴٫۴بی اس دی در سال ۱۹۹۴ توسط کامپایلر سی گنو جایگزین شد. این کامپایلر در زمان خودش بسیار پر نفوذ بود، به طوری که در اوایل دهه ۱۹۸۰، اکثر کامپایلرهای سی بر اساس آن بودند. در سال ۲۰۰۷، آندرس ماگنوسون و پیتر جانسون توسعه پی سی سی را مجدداً آغاز کردند و آن را به طور قابل توجهی بازنویسی کردند تا از زبان سی۹۹ پشتیبانی کند.
در حال حاضر نسخه جدیدی از پی سی سی توسط آندرس ماگنوسون نگه داری می شود. این نسخه بر اساس همان نسخه اصلی است که توسط استیو جانسون نوشته شده. این کامپایلر تحت پروانه بی اس دی در دسترس است و بودجه آن توسط یک نهاد غیر انتفاعی به نام BSD Fund تأمین می شود. بر طبق گفته ماگنوسون:
«مزیت بزرگ این کامپایلر (علاوه بر داشتن پروانه بی اس دی) این است که این کامپایلر ۵ تا ده برابر از جی سی سی سریعتر است، در حالیکه هنوز هم کد قابل قبولی تولید می کند. همچنین پورت کردن آن به یک معماری دیگر بسیار آسان است»
نسخه جدید در سال ۲۰۰۷ به پکیج سورس نت بی اس دی و درخت پورت های فری بی اس دی و اوپن بی اس دی اضافه شد. همچنین نت بی اس دی آن را در درخت اصلی کدهای منبع خود هم قرار داده است. حدس و گمان هایی دربارهٔ جایگزین کردن این کامپایلر با جی سی سی در سیستم عامل های بی اس دی وجود دارد. هرچند که تئو درات عنوان کرد که پی سی سی هنوز برای جایگزین شدن با جی سی سی آماده نشده است و همینطور جایگزین کردن جی سی سی هم از اولویت بالایی برخوردار نیست. نسخه ۱٫۰ پی سی سی نهایتاً در اول آوریل ۲۰۱۱ منتشر شد. نسخه ۱ از معماری های اکس۸۶ و اکس۶۴ پشتیبانی می کند و بر روی فری بی اس دی، اپن بی اس دی، نت بی اس دی، توزیع های مختلف لینوکس و مایکروسافت ویندوز اجرا می شود. توسعه آن همچنان ادامه دارد و قرار است پشتیبانی از سی++ و فرترن ۷۷ و همچنین پشتیبانی از معماری های بیشتر هم اضافه شود.
کامپایلر گنو برای جاوا (به انگلیسی: GNU) (GCJ) یک کامپایلر رایگان برای زبان برنامه نویسی جاوا است. برای بیش از ده سال بخشی از مجموعه کامپایلر گنو بود اما از سال ۲۰۱۷ دیگر حفظ نخواهد شد و بخشی از انتشارات آینده نخواهد بود.
مترجم گنو برای جاوا (GIJ)
Excelsior JET (کامپایلر کد جاوا اسکریپتی Excelsior)
IcedTea
کافه
SableVM
a M آپاچی هماهنگی
جیکس
کامپایلر مجازی ماشین مجازی Java
پیاده سازی جاوا رایگان
Kotlin - Kotlin / Native یک فن آوری برای کامپایل کردن کوتلین به باینری های بومی است که بدون JVM اجرا می شوند. این شامل پسزمینه مبتنی بر LLVM برای کامپایلر کوتلین و اجرای بومی کتابخانه زمان اجرا Kotlin است.
GCJ کد منبع جاوا را به بایت کد ماشین مجازی جاوا یا به کد ماشین برای تعدادی از معماری های پردازنده کامپایل می کند. همچنین می تواند فایل های کلاس و JARهای کامل را که حاوی بایت کد هستند به کد ماشین کامپایل کند.
منبع اصلی کتابخانه های زمان اجرای GCJ از پروژه GNU Classpath است، اما بین کتابخانه های libgcj تفاوت کدی وجود دارد. GCJ 4.3 از کامپایلر Eclipse برای جاوا به عنوان یک جلو-عقب (به انگلیسی: back-end) استفاده می کند.
در سال ۲۰۰۷، برای پیاده سازی پشتیبانی برای دو API گرافیکی در جاوا Classpath GNU: AWT و Swing، کارهای زیادی انجام شد. پشتیبانی نرم افزاری برای AWT هنوز در حال توسعه است. "زمانی که پشتیبانی از AWT کار بکند، پشتیبانی از Swing می تواند مورد توجه قرار گیرد. حداقل یک پیاده سازی نرم افزاری جزئی رایگان از Swing وجود دارد که ممکن است قابل استفاده باشد. ". GNU CLASSPATH حتی به وضعیت جاوا ۱٫۲ هم تکمیل نشد و اکنون به نظر می رسد به طور کامل رها شده است.
کامپایلر-کامپایلر یا کامپایلرساز (به انگلیسی: Compiler-compiler) در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلاً مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه کننده یا کامپایلر می سازد. خروجی به شکل کد منبع کامپایلر یا تجریه کنندهٔ مذکور است و ورودی می تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولاً کد ارائه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد.
ANTLR
اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (Atlas Computer) ابزاری با این نام ساخت. در اصطلاح شناسی امروزی، آنچه بروکر انجام داد بیشتر به یک کامپایلر نوعی با قابلیت گسترش نحوی مطابقت دارد تا کامپایلر-کامپایلر و عموماً کامپایلر-کامپایلرهای امروزی فقط تجزیه کننده می سازند. فراگیر شدن لفظ کامپایلر-کامپایلر بیشتر ناشی از یک (کامپایلر) می باشد تا کار بروکر. از روندهای جدید در این حوزه می توان به تلاش برای پیاده سازی کامپایلر سازهایی بر طبق معناشناسی زبان (Semantics) اشاره کرد. مقالهٔ بدوین که مربوط به ۱۹۸۲ میلادی است، به بررسی این موضوع می پردازد و ادعا می کند که این روش اولین گام برای ساخت خودکار کامپایلرهایی بهینه و مطمین، به معنی اینکه صحت برنامه قابل اثبات باشد، است.
برای نمونه کد زیر جمع یک سری عدد را تجریه می کند: (بعنوان مثال رشته ی: "۰+۱+۲")
// Common options, for example, the target language options { language = "CSharp"; } // Followed by the parser class SumParser extends Parser; options { k = 1; // Parser Lookahead: 1 Token } // Definition of an expression statement: INTEGER (PLUS^ INTEGER)*; // Here is the Lexer class SumLexer extends Lexer; options { k = 1; // Lexer Lookahead: 1 characters } PLUS: '+'; DIGIT: ('0'..'9'); INTEGER: (DIGIT)+; کد بالا برای ANTLR می باشد و گرامر سادهٔ ذکر شده را برای ANTLR توصیف می کند. با مقداردهی به language در بخش options می توان زبان خروجی را تعیین کرد، که ANTLR برنامه تجزیه کننده را با آن زبان به ما می دهد. همچنین با مقداردهی به k می توان الگوریتم تجزیه را تنظیم کرد. ANTLR با LL k کار می کند، و می توان k را به این شکل تعیین کرد. این عدد تعداد توکن هایی که برنامه جلو جلو نگاه می کند را مشخص می کند. سپس می توانیم در برنامه از تجزیه کننده ساخته شده توسط ANTLR کمک بگیریم:
بهینه سازی از مهم ترین وظایف یک کامپایلر است که معمول بعد از تولید کد میانی آغاز می شود. همیشه هنگام کامپایل یک برنامه برای پخش نهایی از بهینه سازی استفاده می شود. هرچند گاهی اوقات بهینه سازی مانع اصلی بعضی اهداف است و باید کنار گذاشته کردن یک کد بهینه شده دشوارتر و شاید غیرممکن شود چرا که debug شود. به عنوان مثال به منظور بهینه سازی بسیاری از کدها حین کامپایل ممکن است جابجا شده باشند یا اصل option ساختار آن ها عوض شده باشد. به همین دلیل بسیاری از کامپایلرها اجازه نمی دهند کامپایل کردن و بهینه سازی هم زمان فعال شوند. همچنین گاهی کد کامپایل debugهای مربوط به یکسان ولی خصوصیات (instruction) شده قرار است روی پردازنده هایی با دستورالعملهای مختلف از حیث زمان بندی، سرعت دسترسی به حافظه و … اجرا شود که در این صورت کامپایلر نباید بهینه سازی های خاص یک ماشین را روی آن اعمال کند. تکنیک های مختلف بهینه سازی می توانند وابسته به زبان منبع، وابسته به ماشین مقصد یا مستقل از هر دو باشند. اغلب روش های بهینه سازی مستقل از زبان منبع می باشند. همچنین برای بسیاری از الگوریتم های بهینه سازی وابسته به مقصد، می توان خصوصیات ماشین مقصد را با یکسری پارامتر معرفی کرد و خود الگوریتم برای مقصدهای مختلف دست نخورده بماند. اهداف کلی یک کیمپایلر هنگام بهینه سازی به صورت خلصه در زیر آمده است که کامپایلر بر اساس نوع بهینه سازی مورد نظرش، به آن ها اولویت می دهد: جا می گیرد وپردازنده برای cache کم کردن حجم کد: هرچه حجم کد کمتر باشد راحتتر در دسترسی به آن نیاز به تعداد کمتری مراجعه به حافظه دارد. کم کرد ن محاسبات: تغییر کد به گونه ای که محاسبات کمتری داشته باشد وقت پردازنده را کمتر می گیرد. پرهیز از پرش های شرطی و غیر شرطی: پردازنده ها در برخورد باانشعاب ها و پرش ها نمی استفاده کنند و در نتیجه زمان بیشتری در این گونه مواقع تلف می شود. pipelining توانند از کامپایلر باید کد را به گونه ای تغییر دهد که حتی المکان تعداد کمتری انشعاب و پرش داشته باشد. نزدیک کردن ارجاعات مشابه: بخش هایی از کد که یک داده خاص را از حافظه می خوانند بهتر است کنار هم باشند تا دسترسی به داده سریعتر برای آن ها انجام گیرد و کامپیوتر مجبور به مراجعه مکرر به حافظه نباشد. ترتیب دهی مناسب داده ها در حافظه: ثباتها باید حاوی داده های پراستفاده تر باشند. موازی سازی: ترتیب دستورها در حافظه باید به گونه ای باشد که به پردازنده حداکثرامکان پردازش موازی دستورات را بدهد.
حلقه ها بهترین کاندیداها برای بهینه سازی هستند چراکه بیشتر وقت برنامه در حلقه ها صرف می شود. تحلیل متغیرهای استقرایی: در هر حلقه اگر متغیری باشد که به صورت حاصل عملیات ریاضی بیان شده باشد، شاید بتوان آن را هربار بدون محاسبه (index variable) بر روی متغیر اندیس دوباره، با یک تغییر کوچک بروز کرد. این کار همچنین می تواند متغیر اندیس را به سمت بی مصرف شدن و در نهیت حذف پیش ببرد. مساوی داشته باشند و با داده (iteration) تلفیق حلقه ها: اگر دو حلقه مجاور تعداد تکرار های یکدیگر کار نکنند، می توان آن ها را تلفیق کرده و به یک حلقه واحد تبدیل کرد تا بدینگونه جلوگیری شود. (توجه داشته باشید که برای loop overhead از پرداخت هزینه اضافی بررسی تساوی تعداد تکرار دو حلقه، نیازی نداریم تعداد دقیق تکرار را بدانیم). هر چند گاهی عکس این عمل نیز (تبدیل یک حلقه به چند حلقه جدا از هم) می تواند باعث بهینه شدن کد شود که این مورد بیشتر در مورد پردازنده های چند هسته ای بکار می رود است while بهتر از حلقه های do/while واژگون کردن حلقه: اغلب استفاده از حلقه های چرا که چک کردن شرط حلقه در آخر حلقه باعث استفاده کمتر از پرش می شود. (به یاد را می گیرند. pipelining داشته باشید در اغلب پردازنده ها دستورات پرش جلوی استفاده از جابجایی کد مستقل از حلقه: اگر مقدار یک عبارتی که باید محاسبه شود در تمام تکرارهای حلقه ثابت باشد، با جابجا کردن کد مربوط به محاسبه حاصل عبارت به بیرون حلقه می توانیم سرعت برنامه را افزایش دهیم. بازکردن حلقه: اگر تعداد تکرار یک حلقه در زمان کامپایل مشخص باشد، می توان کد بدنه حلقه را به آن تعداد کپی کرد تا از چک کردن شرط حلقه و همچنین دستورات پرش جلوگیری می شود و ممکن cache شود. هرچند این کار باعث افزایش طول کد و استفاده کمتر از است حتی برنامه را کندتر هم بکند. در واقع این تکنیک چیزی نیست که بتوان همیشه روی آن حساب کرد. اگر در داخل بدنه یک حلقه، انشعابی داشته باشیم که شرط آن: Loop unswitching مستقل از حلقه است، می توانیم آن را به بیرون حلقه آورده و حلقه را در هر یک از شاخه های انشعاب کپی کنیم. این کار، اگر چه باعث افزایش حجم کد می شود، اما به پردازنده درون حلقه ها را دارند کمک می کند (parallelization)های جدید که قابلیت هم زمان سازی کد را سریعتر اجرا کنند. اگر دستورات درون یک حلقه مجبور باشند پشت سر هم اجرا شوند (نتوان آنها: Pipelining کرد) ولی اجرای آن ها در تکرارهای مختلف حلقه مستقل از هم باشد، می توان pipeline را pipeline کد چند بار اجرای آن (برای تکرارهای بعد) را در بدنه حلقه گذاشت تا با این کار به کردن سخت افزاری کمک کنیم.
حذف زیرعبارت مشترک: اگر یک عبارت ریاضی چند بار در کد تکرار شده باشد می توان حاصل آن را فقط یکبار حساب کرده، در یک ثبات گذاشت و از آن استفده کرد. محاسبه مقادیر ثابت: می توان حاصل عبارتهایی که مقدار آن ها در زمان کامپایل مشخص است را در زمان کامپایل محاسبه و جایگذاری کرد تا نیازی به محاسبه آن ها در زمان اجرا نباشد. اگر دو متغیر به یک مکان از حافظه اشاره کنند،: (alias analysis) تحلیل نام های استعاری می توان گفت دومی یک نام استعاری برای اولی است. اگر بدانیم یک متغیر هیچ نام استعاری دیگری ندارد می توانیم برخی بهینه سازیهایی را انجام دهیم مثل اگر مقدار آن در زمان کامپایل مشخص بود، مقدار آن را جایگزین نام آن کنیم. در زبانهای برنامه نویسی دارای تقریباً هیچ بهینه سازی در این زمینه نمی توأم انجام داد چرا که هر (C اشاره گر (مثل زبان اشاره گری ممکن است به یک متغیر دلخواه اشاره کند و یک نام استعاری برای آن باشد.
تخصیص مناسب ثباتها: برای تخصیص ثباتها به متغیرها معمول از رنگ آمیزی گراف تداخل استفاده می شود. (تعداد رنگ ها به تعداد ثباتها). اگر نتوان گراف را با تعداد رنگ ذکر شده رنگ کرد، یک یا چند متغیر باید در حافظه ذخیره شوند که به منظور بهینه سازی، این متغیرها باید متغیرهای کم استفده تر باشند. بسیاری از عملیاتها را می CISC انتخاب صحیح دستورالعملها: در پردازنده های با معماری توان به چند طریق کد کرد. این که برای هر کاری از چه سلسله دستورالعملهایی استفاده شود در دست کامپایلر است تا با انتخاب صحیح دستورالعملهل، کد را بهینه کند. برای سرعت بخشیدن به pipelining ترتیب دهی بهنه دستورها: بسیاری از پردازنده ها از برنامه استفاده می کنند. اما گاهی اوقات ترتیب قرار گرفتن دستورالعمل ها در حافظه مانع از می شود. به عنوان مثال اگر یک دستور برای اجرا شدن به حاصل دستور قبل از pipelining خود نیاز داشته باشد، می گوییم دستور دوم به اولی وابسته است و باعث جلوگیری از می شود. کامپایلرها برای جابجایی ترتیب دستورات بصورتی که معنی کد عوض pipelining را هم بتوان استفاده کرد از گراف وابستگی استفاده می کنند که pipelining نشود و حداکثر است. هر ترتیب توپولوژیکال رئوس گراف، معرف یک ترتیب (DAG) یک گراف جهتدار بی دور صحیح برای اجرای دستورات است. عبارت است از محاسبه دوباره مقدار متغیرها به جای بارگذاری آن ها از: Rematerialization حافظه، هنگامیکه محاسبه آن ها زمان کمتری می گیرد. اگرچه این عمل ممکن است در نگاه اول بی معنی به نظر برسد، ولی با توجه پیشرفت سریعتر سرعت پردازنده ها نسبت به دسترسی به حافظه، این گونه بهینه سازی ها به مرور اهمیت بیشتری پیدا کرده اند.
مترجم وارون یا دی کامپایلر (به انگلیسی: Decompiler) کد برنامه را که در سطح پایینی از انتزاع قرار دارد (معمولاً طراحی شده اند که رایانه آن را بخواند) را به شکلی تبدیل می کند تا سطح بالایی از انتزاع داشته باشد (معمولاً طراحی شده اند که انسان آن را بخواند). به این علت فرازبر نامگذاری شده است که کد با زبان سطح پایین را به کد زبان سطح بالا تبدیل می کند بدون این که در رفتار کد تغییری حاصل شود. به عمل decompile کردن فرازش گفته می شود.
پیوند دهنده
مفسر (رایانه)
مترجم وارون ها معمولاً به طور کامل کد اصلی را بازسازی نمی کنند، با این حال یک ابزار مهم در مهندسی معکوسند.
مترجم وارون معمولاً کد اجرایی را به کد منبع در زبان برنامه نویسی سطح بالا ترجمه می کند به طوری که اگر کد جدید دوباره ترجمه گشت در اجرا مانند کد اجرایی اصلی عمل کند.
دیکامپایلر: دیکامپایلر به برنامه ای گفته می شود که عمل عکس کامپایلر را انجام دهد. که یعنی کد نزدیک و قابل فهم توسط ماشین را به کد قابل فهم برای انسان تبدیل می کند. دیکامپایلر ها معمولاً نمی توانند کد اصلی برنامه را دقیقاً به شکل اصلی آن برگردانند ، اما یکی از ابزار های اصلی در مهندسی معکوس هستند. از دیکامپایلر برای مباحث امنیت کامپیوتر ، تصحیح خطاها و... استفاده می شود. زبان های کامپایلری مفسری که از کد میانی و ماشین مجازی استفاده می کنند معمولاً به صورت کامل قابل برگشت هستند ، یعنی حتی شماره ی خطوط و نام متغییرهای کد اصلی هم قابل برگشت است.از این دست زبان ها می توان به جاوا و .net اشاره کرد. به عنوان مثال دیکامپایلر jd-gui برای جاوا وجود دارد که کد را به صورت کامل برمی گرداند. برای جلوگیری از دیکامپایل برنامه ها ابزاری با عنوان مبهم کننده ی کد( obfuscated code) وجود دارد که عملیات مهندسی معکوس را مشکل تر می کند.
زبان توصیف کامپایلر یک زبان برنامه نویسی است که برای توسعهٔ کامپایلرها و بر پایهٔ دستور زبان های ضمیمه بنا شده است.
بهینه سازی سراسری
کامپایل های جداگانه
بررسی معنایی ایستا
برنامه نویسی پودمانی
زبان توصیف کامپایلر در سال ۱۹۷۰ طراحی و در سال ۱۹۷۱ توسط Cornelis H. A. Koster در دانشگاه رادبود پیاده سازی شد. ظهور این زبان هم زمان بود با ظهور زبان برنامه نویسی الگول۶۸ و اولین آزمایش زبان توصیف کامپایلر با این زبان انجام شد. این زبان سال ها در دانشگاه صنعتی برلین(غربی) برای درس طراحی کامپایلر تدریس می شد. در کشورهای دیگری نظیر فرانسه، مجارستان و جمهوری دموکراتیک آلمان نیز از این زبان استفاده می شده است. بسیاری از کسانی که از این زبان استفاده می کردند آن را مطابق خواست خود گسترش داده اند.
در سال ۱۹۷۵ با اعمال تغییراتی نسخهٔ جدید این زبان با نام CDL2 تثبیت شد. برای این که این زبان روی ماشین های مختلف قابل اجرا باشد، چند نسخه تولیدکنندهٔ کد برای آن نوشته شد. این زبان ویژگی هایی داشت که نسخهٔ قبلی فاقد آن ها بودند. از قبیل:
این زبان مبانی CDL1 را پابرجا نگه داشته بود، ولی برای اجرای پروژه های بزرگتر مناسب تر بود. بهینه سازی های استفاده شده در این زبان فقط مختص زمان و مکان خود نبودند و در سطح جهانی مطرح شدند.
کامپایلر-کامپایلر یا کامپایلرساز (به انگلیسی: Compiler-compiler) در علوم کامپیوتر ابزاری است که با گرفتن توصیف یک زبان صوری و یک ماشین (مثلاً مجموعه دستورالعمل یک پردازنده) برای آن زبان یک تجزیه کننده یا کامپایلر می سازد. خروجی به شکل کد منبع کامپایلر یا تجریه کنندهٔ مذکور است و ورودی می تواند یک فایل متنی باشد که گرامر زبان را شرح دهد (برای نمونه به شکل فرم باکوس نائور). معمولاً کد ارائه شده توسط این ابزارها به تغییراتی نیاز دارد قبل از آن که آماده استفاده باشد.
ANTLR
اولین استفاده از لفظ کامپایلر-کامپایلر مربوط است به ۱۹۶۰ میلادی. تونی بروکر که در آن زمان در دانشگاه منچستر فعالیت می کرد، برای آسان شدن ساختن کامپایلر برای کامپیوتر اطلس (Atlas Computer) ابزاری با این نام ساخت. در اصطلاح شناسی امروزی، آنچه بروکر انجام داد بیشتر به یک کامپایلر نوعی با قابلیت گسترش نحوی مطابقت دارد تا کامپایلر-کامپایلر و عموماً کامپایلر-کامپایلرهای امروزی فقط تجزیه کننده می سازند. فراگیر شدن لفظ کامپایلر-کامپایلر بیشتر ناشی از یک (کامپایلر) می باشد تا کار بروکر. از روندهای جدید در این حوزه می توان به تلاش برای پیاده سازی کامپایلر سازهایی بر طبق معناشناسی زبان (Semantics) اشاره کرد. مقالهٔ بدوین که مربوط به ۱۹۸۲ میلادی است، به بررسی این موضوع می پردازد و ادعا می کند که این روش اولین گام برای ساخت خودکار کامپایلرهایی بهینه و مطمین، به معنی اینکه صحت برنامه قابل اثبات باشد، است.
برای نمونه کد زیر جمع یک سری عدد را تجریه می کند: (بعنوان مثال رشته ی: "۰+۱+۲")
// Common options, for example, the target language options { language = "CSharp"; } // Followed by the parser class SumParser extends Parser; options { k = 1; // Parser Lookahead: 1 Token } // Definition of an expression statement: INTEGER (PLUS^ INTEGER)*; // Here is the Lexer class SumLexer extends Lexer; options { k = 1; // Lexer Lookahead: 1 characters } PLUS: '+'; DIGIT: ('0'..'9'); INTEGER: (DIGIT)+; کد بالا برای ANTLR می باشد و گرامر سادهٔ ذکر شده را برای ANTLR توصیف می کند. با مقداردهی به language در بخش options می توان زبان خروجی را تعیین کرد، که ANTLR برنامه تجزیه کننده را با آن زبان به ما می دهد. همچنین با مقداردهی به k می توان الگوریتم تجزیه را تنظیم کرد. ANTLR با LL k کار می کند، و می توان k را به این شکل تعیین کرد. این عدد تعداد توکن هایی که برنامه جلو جلو نگاه می کند را مشخص می کند. سپس می توانیم در برنامه از تجزیه کننده ساخته شده توسط ANTLR کمک بگیریم:

چنانچه، معنی واژه بالا (برگرفته از دانشنامه ویکی پدیا)، نادرست یا مخالف قوانین جمهوری اسلامی ایران است، خواهشمند است گزارش دهید تا بررسی و حذف گردد => [گزارش]

کامپایلر در دانشنامه آزاد پارسی

کامْپایلر (compiler)
برنامه ای که متن نوشته شده به زبان برنامه توسط کاربر را به عنوان ورودی می پذیرد و در خروجی آن را به فرمت قابل اجرا توسط ماشین تبدیل می کند. کامپایلر در واقع برنامه مُبدِّلی است که فایل دریافتی آن با فرمت متن (شامل عبارات قابل خواندن و فهم توسط انسان) بوده و خروجی آن فایلی با فرمت کد اجرایی است. در این فرآیند معنای برنامه عوض نمی شود. کار کامپایلر در رایانه شبیه کار مترجم در زبان طبیعی است.

کامپایلر را به اشتراک بگذارید

Telegram Facebook Twitter LinkedIn

معنی یا پیشنهاد شما



نام نویسی   |   ورود

عبارات و کلمات کلیدی مرتبط

• معنی کامپایلر   • مفهوم کامپایلر   • تعریف کامپایلر   • معرفی کامپایلر   • کامپایلر چیست   • کامپایلر یعنی چی   • کامپایلر یعنی چه  

توضیحات دیگر

معنی کامپایلر
کلمه : کامپایلر
اشتباه تایپی : ;hl~hdgv
عکس کامپایلر : در گوگل


آیا معنی کامپایلر مناسب بود ؟     امتیاز مثبت به دیکشنری   امتیاز منفی به دیکشنری     ( امتیاز : 98% )