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

بندانگشتی|نمونه ای از نمودار کلاس و شی برای الگوی طراحی مترجم

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

پرل، پایتون، روبی، متلب و پی اچ پی جزو زبان‌های برنامه‌نویسی، از نوع ۲ هستند، در حالی که پاسکال و ماشین مجازی جاوا نوع ۳ هستند. برنامه‌های نوشته شده با جاوا از قبل ترجمه شده و به عنوان کدهای مستقل از ماشین، ذخیره می‌شوند و بعد در زمان اجرا توسط یک مفسر (ماشین مجازی) اجرا می‌شوند. برخی سیستم‌ها، مانند اسمال تاک و غیره ممکن است ترکیبی از نوع ۲ و ۳ باشند. لفظ‌های زبان مفسر و زبان مترجم صرفاً به این معنا هستند که اساس پیاده‌سازی یک زبان برنامه‌نویسی یک مفسر است یا یک مترجم؛ یک زبان سطح بالا زبانی است که مستقل از پیاده‌سازی مشخصی است.

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

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

سازش‌های زیادی بین سرعت تولید به هنگام استفاده از مفسر و سرعت اجرا به هنگام استفاده از مترجم وجود دارد. برخی سیستم‌ها (برای مثال، ال آی اس پی) به کدهای ترجمه شده و تفسیر شده اجازه می‌دهند تا یکدیگر را فراخوانی کنند و متغیرهایشان را به اشتراک بگذارند. به این معنا که هنگامی که یک روال تحت یک مفسر مورد تست قرار گرفت و اشکال‌زدایی شد، می‌تواند ترجمه شود و بنابراین، در حین اینکه روال‌های دیگر در حال تولید شدن هستند، اجرای سریعتری داشته باشد. تعداد زیادی از مترجم‌ها کد منبع را همان گونه که هست اجرا نمی‌کنند بلکه آن را به نوع فشرده تر داخلی تبدیل می‌کنند. برای مثال، برخی از مفسرهای ابتدایی، کلمات کلیدی را با نشانه‌های تک بایتی -که می‌توانند برای یافتن دستورالعمل‌ها در یک میز جامپ استفاده شوند- جایگزین می‌کنند. یک مفسر ممکن است از همان نوع تحلیل گر واژگانی و تجزیه‌کننده ای استفاده کند که مترجم از آن استفاده می‌کند و سپس درخت انتزاعی ترکیب را تفسیر کند.

## مفسرهای بایت کد
طیفی از احتمالات بین تفسیر کردن و ترجمه کردن وجود دارد که به مقدار تحلیل انجام شده قبل از اجرای برنامه بستگی دارد. برای مثال، ایماکس لیسپ به بایت کد -که نمایندهٔ بسیار بهینه شده و فشرده شده‌ای از منبع لیسپ است، ولی کد ماشین نیست (و در نتیجه وابسته به سخت‌افزار مشخصی نیست) -ترجمه می‌شود. این کد «ترجمه شده» بعداً توسط یک مفسر بایت کد -که خود آن توسط زبان سی نوشته شده است- تفسیر می‌شود. کد ترجمه شده در این حالت، یک کد ماشین برای یک ماشین مجازی است، که در سخت‌افزار پیاده‌سازی نشده و در مفسر بایت کد پیاده‌سازی شده است. همین شیوه در کد فورت -که در سیستم‌های میان افزار باز استفاده می‌شود- به کار برده می‌شود: زبان منبع به «اف کد» (یک بایت کد) ترجمه می‌شود، که بعداً توسط یک ماشین مجازی تفسیر می‌شود.

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

## ترجمه داخل زمانی
ترجمه داخل زمانی باعث کم شدن فاصله بین مفسرها، مفسرهای بایت کد و مترجم‌ها شده است و تکنیکی است که در آن بایت کد در زمان اجرا به شکل کد ماشین بومی ترجمه می‌شود. این برمی گردد به کارایی اجرای کد بومی در سریع کردن زمان بالا آمدن و افزایش استفاده حافظه، هنگامی که در ابتدا بایت کد ترجمه می‌شود. بهینه‌سازی توافقی یک تکنیک ترکیبی ای هست که در آن مفسر، برنامهٔ در حال اجرا را شکل می‌دهد و قسمت‌هایی که بیشتر استفاده شده‌اند را به کد بومی ترجمه می‌کند. هر دو تکنیک بیش از چند دهه سن ندارند، به‌طوری‌که نخستین بار در زبان‌هایی مانند اسمال تاک در ۱۹۸۰ بکار برده شدند.

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

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

## پانوشت‌ها

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

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