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

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

در علوم کامپیوتر یک مفسر[۱]، (به انگلیسی: Interpreter) یک برنامهٔ کامپیوتری است که دستورات نوشته شده در یک زبان برنامه نویسی را اجرا می‌کند. با وجود اینکه تفسیر کردن و ترجمه کردن[۲]، دو وسیلهٔ اصلی هستند که از طریق آنها زبان‌های برنامه نویسی اجرا می‌شوند، دو مقولهٔ کاملاً مجزا نیستند. یکی از دلایل این است که اغلب سیستم‌های مفسر برخی از کارهای ترجمه را انجام می‌دهند. یک مفسر می‌تواند برنامه‌ای باشد که:

  1. مستقیماً کد منبع[۳] را اجرا می‌کند.
  2. کد منبع را به یک رابط میانجی مناسب[۴] (کد) تبدیل می‌کند و بلا فاصله آن را اجرا می‌کند.
  3. ازآن کمک گرفته می‌شود تا کدهای آماده به اجرایی که توسط مترجم -که قسمتی از سیستم مفسر است- ساخته شده را اجرا کند.

پرل[۵]، پایتون[۶]، روبی[۷] و متلب[۸] همه نمونه‌هایی از نوع ۲ هستند، در حالی که پاسکال (زبان برنامه‌نویسی)[۹] و ماشین مجازی جاوا[۱۰] نوع ۳ هستند. برنامه‌های نوشته شده با جاوا از قبل ترجمه شده و به عنوان کدهای مستقل از ماشین، ذخیره می‌شوند و بعد در زمان اجرا[۱۱] توسط یک مفسر (ماشین مجازی) اجرا می‌شوند. برخی سیستم‌ها، مانند اسمال تاک[۱۲] و غیره ممکن است ترکیبی از نوع ۲ و ۳ باشند. لفظ‌های زبان مفسر و زبان مترجم صرفاً به این معنا هستند که اساس پیاده سازی یک زبان برنامه نویسی یک مفسر است یا یک مترجم؛ یک زبان سطح بالا زبانی است که مستقل از پیاده سازی مشخصی است.

کارایی[ویرایش]

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

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

سازش‌های زیادی بین سرعت تولید به هنگام استفاده از مفسر و سرعت اجرا به هنگام استفاده از مترجم وجود دارد. برخی سیستم‌ها (برای مثال، [[ال آی اس پی‌ه

  1. REDIRECT [[نام صفحه مقصدمتن بالانویس]]

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

مفسرهای بایت کد[ویرایش]

طیفی[۲۳] از احتمالات بین تفسیر کردن و ترجمه کردن وجود دارد که به مقدار تحلیل انجام شده قبل از اجرای برنامه بستگی دارد. برای مثال، ایماکس لیسپ[۲۴] به بایت کد -که نمایندهٔ بسیار بهینه شده و فشرده شده‌ای از منبع لیسپ است، ولی کد ماشین نیست (و در نتیجه وابسته به سخت‌افزار مشخصی نیست) -ترجمه می‌شود. این کد «ترجمه شده» بعداً توسط یک مفسر بایت کد[۲۵] -که خود آن توسط زبان سی نوشته شده است- تفسیر می‌شود. کد ترجمه شده در این حالت، یک کد ماشین برای یک ماشین مجازی است، که در سخت‌افزار پیاده سازی نشده و در مفسر بایت کد پیاده سازی شده‌است. همین شیوه در کد فورت[۲۶] -که در سیستمهای میان افزار باز[۲۷] استفاده می‌شود- به کار برده می‌شود: زبان منبع به «اف کد»[۲۸] (یک بایت کد) ترجمه می‌شود، که بعداً توسط یک ماشین مجازی تفسیر می‌شود.

مفسرهای درخت انتزاعی ترکیب[ویرایش]

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

ترجمه داخل زمانی[ویرایش]

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

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

مفسر کارت منگنه[ویرایش]

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

پانوشت‌ها[ویرایش]

  1. interpreter
  2. compile
  3. source code
  4. efficient intermediate representation
  5. Perl
  6. Python
  7. Ruby
  8. MATLAB
  9. UCSD Pascal
  10. Java virtual machine
  11. run-time
  12. Smalltalk
  13. order
  14. edit-interpret-debug
  15. edit-compile-run-debug
  16. analyze
  17. interpretive overhead
  18. LISPs
  19. jump table
  20. lexical analyzer
  21. parser
  22. abstract syntax tree
  23. spectrum
  24. Emacs Lisp
  25. Bytecode interpreter
  26. Forth
  27. Open Firmware
  28. F code
  29. just-in-time compilation (or JIT)
  30. native
  31. Adaptive optimization
  32. .NET Framework
  33. punched cards
  34. character
  35. IBM ۵۵۷
  36. IBM ۵۵۰

منابع[ویرایش]

نسخه انگلیسی