مفسر (رایانش)

یک تفسیرگر، مُفَسِر،interpreter یا تَفسیرکننده  در علوم رایانه، یک برنامهٔ رایانه‌ای است که دستورهای نوشته شده در یک زبان برنامه‌نویسی را اجرا می‌کند. با وجود اینکه تفسیر کردن و ترجمه کردن،compile دو وسیلهٔ اصلی هستند که از طریق آن‌ها زبان‌های برنامه‌نویسی اجرا می‌شوند، دو مقولهٔ کاملاً مجزا نیستند. یکی از دلایل این است که اغلب سیستم‌های مفسر برخی از کارهای ترجمه را انجام می‌دهند. یک مفسر می‌تواند برنامه‌ای باشد که:
 تجزیه‌کننده مستقیماً کد منبعsource code را اجرا می‌کند.
 کد منبع را به یک رابط میانجی مناسبefficient intermediate representation (کد) تبدیل می‌کند و بلافاصله آن را اجرا می‌کند.
 از آن کمک گرفته می‌شود تا کدهای آماده به اجرایی که توسط مترجم که قسمتی از سیستم مفسر است ساخته‌شده را اجرا کند.

پرل،Perl پایتون،Python روبی،Ruby متلبMATLAB و پی اچ پی جزو زبان‌های برنامه‌نویسی، از نوع ۲ هستند، در حالی که پاسکالUCSD Pascal و ماشین مجازی جاواJava virtual machine نوع ۳ هستند. برنامه‌های نوشته شده با جاوا از قبل ترجمه شده و به عنوان کدهای مستقل از ماشین، ذخیره می‌شوند و بعد در زمان اجراrun-time توسط یک مفسر (ماشین مجازی) اجرا می‌شوند. برخی سیستم‌ها، مانند اسمال تاکSmalltalk و غیره ممکن است ترکیبی از نوع ۲ و ۳ باشند. لفظ‌های زبان مفسر و زبان مترجم صرفاً به این معنا هستند که اساس پیاده‌سازی یک زبان برنامه‌نویسی یک مفسر است یا یک مترجم؛ یک زبان سطح بالا زبانی است که مستقل از پیاده‌سازی مشخصی است.

 کارایی 
عیب اصلی مفسرها این است که برنامه‌ای که تفسیر می‌شود، نسبت به برنامه‌ای که ترجمه شود، دیرتر اجرا می‌شود. تفاوت سرعت می‌تواند ناچیز یا زیاد باشد. اغلب در مرتبهorder بزرگ و شاید بیشتر. غالباً اجرای یک برنامه تحت یک مفسر نسبت به اجرای کد ترجمه شده وقت بیشتری نیاز دارد. امّا مدت زمان تفسیر یک برنامه از مجموع زمان لازم برای ترجمه کردن و اجرا کردن آن، کمتر است. این موضوع هنگام نمونه‌سازی و تست کردن کد اهمیت ویژه‌ای پیدا می‌کند؛ زیرا یک عملیات ویرایش-تفسیر-خطایابیedit-interpret-debug می‌تواند کوتاهتر از عملیات ویرایش-ترجمه-اجرا-خطایابیedit-compile-run-debug باشد.

تفسیر یک کد کندتر از اجرای کد ترجمه شده است، زیرا مفسر باید هر دفعه که برنامه شروع به اجرا می‌کند، همهٔ عبارت‌های آن را تحلیلanalyze کند و سپس عملیات مورد نظر را اجرا کند در حالی که کد ترجمه شده فقط عبارتها را اجرا می‌کند. این تحلیل زمان اجرا تحت نام «بالاسری تفسیری»interpretive overhead نامیده می‌شود. دسترسی به متغیرها نیز در مفسر کندتر است؛ زیرا مسیردهی شناسه به محل ذخیره‌سازی در زمان اجرا نسبت به زمان ترجمه به دفعات بیشتری صورت می‌گیرد.

سازش‌های زیادی بین سرعت تولید به هنگام استفاده از مفسر و سرعت اجرا به هنگام استفاده از مترجم وجود دارد. برخی سیستم‌ها (برای مثال، ال آی اس پیLISPs) به کدهای ترجمه شده و تفسیر شده اجازه می‌دهند تا یکدیگر را فراخوانی کنند و متغیرهایشان را به اشتراک بگذارند. به این معنا که هنگامی که یک روال تحت یک مفسر مورد تست قرار گرفت و اشکال‌زدایی شد، می‌تواند ترجمه شود و بنابراین، در حین اینکه روال‌های دیگر در حال تولید شدن هستند، اجرای سریعتری داشته باشد. تعداد زیادی از مترجم‌ها کد منبع را همان گونه که هست اجرا نمی‌کنند بلکه آن را به نوع فشرده تر داخلی تبدیل می‌کنند. برای مثال، برخی از مفسرهای ابتدایی، کلمات کلیدی را با نشانه‌های تک بایتی -که می‌توانند برای یافتن دستورالعمل‌ها در یک میز جامپjump table استفاده شوند- جایگزین می‌کنند. یک مفسر ممکن است از همان نوع تحلیل گر واژگانیlexical analyzer و تجزیه‌کنندهparser ای استفاده کند که مترجم از آن استفاده می‌کند و سپس درخت انتزاعی ترکیبabstract syntax tree را تفسیر کند.

 مفسرهای بایت کد 
طیفیspectrum از احتمالات بین تفسیر کردن و ترجمه کردن وجود دارد که به مقدار تحلیل انجام شده قبل از اجرای برنامه بستگی دارد. برای مثال، ایماکس لیسپEmacs Lisp به بایت کد -که نمایندهٔ بسیار بهینه شده و فشرده شده‌ای از منبع لیسپ است، ولی کد ماشین نیست (و در نتیجه وابسته به سخت‌افزار مشخصی نیست) -ترجمه می‌شود. این کد «ترجمه شده» بعداً توسط یک مفسر بایت کدBytecode interpreter -که خود آن توسط زبان سی نوشته شده است- تفسیر می‌شود. کد ترجمه شده در این حالت، یک کد ماشین برای یک ماشین مجازی است، که در سخت‌افزار پیاده‌سازی نشده و در مفسر بایت کد پیاده‌سازی شده است. همین شیوه در کد فورتForth -که در سیستم‌های میان افزار بازOpen Firmware استفاده می‌شود- به کار برده می‌شود: زبان منبع به «اف کد»F code (یک بایت کد) ترجمه می‌شود، که بعداً توسط یک ماشین مجازی تفسیر می‌شود.

 مفسرهای درخت نحو انتزاعی 
در طیف بین تفسیر کردن و ترجمه کردن، روش دیگری نیز وجود دارد. در این روش، کد منبع به یک درخت نحو انتزاعی بهینه شده تبدیل می‌شود و سپس به تبعیت از این ساختار درختی، برای اجرای برنامه اقدام می‌شود. در این روش هر عبارت فقط باید یک بار تجزیه شود. به عنوان یک مزیت نسبت به بایت کد، این روش ساختار برنامهٔ سراسری و رابطهٔ بین عبارات را (که در بایت کد از بین می‌رود) حفظ می‌کند و یک نمایش فشرده تر را فراهم می‌سازد؛ بنابراین، درخت انتزاعی ترکیب، به عنوان یک قالب میانی بهتر نسبت به بایت کد برای مترجمهای داخل زمانی پیشنهاد شده است. همچنین این روش اجازه می‌دهد، در زمان اجرا تحلیل بهتری انجام گیرد. ثابت شده است که یک مفسر جاوا مبتنی بر درخت انتزاعی ترکیب، از یک مفسر مشابه مبتنی بر بایت کد سریع تر است. این سرعت بیشتر به خاطر بهینه‌سازی قویتر است که این بهینه‌سازی به دلیل برخورداری از ساختار کامل برنامهٔ موجود در حین اجرا، به وجود می‌آید.

 ترجمه داخل زمانی 
ترجمه داخل زمانیjust-in-time compilation (or JIT) باعث کم شدن فاصله بین مفسرها، مفسرهای بایت کد و مترجم‌ها شده است و تکنیکی است که در آن بایت کد در زمان اجرا به شکل کد ماشین بومیnative ترجمه می‌شود. این برمی گردد به کارایی اجرای کد بومی در سریع کردن زمان بالا آمدن و افزایش استفاده حافظه، هنگامی که در ابتدا بایت کد ترجمه می‌شود. بهینه‌سازی توافقیAdaptive optimization یک تکنیک ترکیبی ای هست که در آن مفسر، برنامهٔ در حال اجرا را شکل می‌دهد و قسمت‌هایی که بیشتر استفاده شده‌اند را به کد بومی ترجمه می‌کند. هر دو تکنیک بیش از چند دهه سن ندارند، به‌طوری‌که نخستین بار در زبان‌هایی مانند اسمال تاک در ۱۹۸۰ بکار برده شدند.

ترجمه داخل زمانی در سال‌های اخیر، توجه بسیاری از مهندسان نویسنده زبانهای برنامه‌نویسی را به خود جلب کرده است. به‌طوری‌که هم‌اکنون جاوا، پایتون و چارچوب دات نت.NET Framework از این تکنیک استفاده می‌کنند.

 مفسر کارت منگنه 
کلمه «مفسر» اغلب اشاره دارد به قسمتی از واحد ثبت تجهیزات که می‌تواند کارت منگنهpunched cards را بخواند و علامتcharacter‌ها را به صورت فرم قابل خواندن توسط انسان چاپ کند. ای بی ام ۵۵۰IBM 557 مفسر عددی و ای بی ام ۵۵۷IBM 550 مفسر الفبایی، نمونه‌هایی از این نوع هستند که به ترتیب در سال‌های ۱۹۳۰ و ۱۹۵۴ ساخته شده‌اند.

 پانوشت‌ها 

 منابع 
نسخه انگلیسی

رده:پیاده‌سازی زبان برنامه‌نویسی
رده:مفسرها (رایانش)
رده:نرم‌افزار سیستم