حلقه خواندن–ارزشیابی–چاپ
حلقه خواندن-ارزیابی-چاپ ( REPL )، که به آن زبان تعامل سطح بالا یا زبان شِلْ نیز گفته می شود، یک محیط برنامه نویسی کامپیوتری تعاملی ساده است که ورودی های تکی کاربر را می گیرد، آنها را اجرا می کند و نتیجه را به کاربر برمی گرداند. برنامه ای که در محیط REPL نوشته شده است به صورت بخش بخش اجرا می شود. این اصطلاح معمولاً به رابط های برنامه نویسی با محیط تعاملی (interactive environment) مشابه با ماشین کلاسیک Lisp اشاره دارد. نمونههای رایج شامل رابط خط فرمان و محیطهای مشابه برای زبانهای برنامهنویسی است و این تکنیک برای زبانهای برنامهنویسی بسیار مشخص است.
نمای کلی[ویرایش]
در یک REPL، کاربر یک یا چند عبارت را وارد می کند (به جای یک واحد کامپایل کامل) و REPL آنها را ارزیابی می کند و نتایج را نمایش می دهد. نام حلقه read-eval-print از نام توابع اولیه Lisp می آید که این عملکرد را پیاده سازی می کنند:
- تابع read (خواندن) یک عبارت را از کاربر می پذیرد و آن را به یک ساختار داده در حافظه تجزیه می کند . به عنوان مثال، کاربر ممکن است عبارت s
(+ 1 2 3)
را وارد کند، که در یک لیست پیوندی حاوی چهار عنصر داده تجزیه می شود. - تابع eval این ساختار داده داخلی را می گیرد و آن را ارزیابی می کند. در Lisp، ارزیابی یک عبارت s که با نام یک تابع شروع می شود به معنای فراخوانی آن تابع بر روی آرگومان هایی است که بقیه عبارت را تشکیل می دهند. بنابراین تابع
+
بر روی آرگومان های1 2 3
فراخوانی می شود و نتیجه6
را به دست می دهد. - تابع print نتیجه بدست آمده توسط eval را می گیرد و برای کاربر چاپ می کند. اگر یک عبارت پیچیده است، ممکن است با نمایش فرمت بهتر نشان داده شود تا درک آن آسان تر شود.
سپس محیط توسعه به حالت read(خواندن) باز می گردد و یک حلقه ایجاد می کند که با بسته شدن برنامه پایان می یابد.
REPL ها برنامه نویسی اکتشافی و اشکال زدایی(دیباگ کردن) راتسهیل می کنند، زیرا برنامه نویس می تواند نتیجه چاپ شده را قبل از تصمیم گیری در مورد اینکه چه عبارتی را برای خواندن بعدی ارائه کند، بررسی کنند. حلقه read-eval-print برنامهنویس را بیشتر از چرخه ویرایش-کامپایل-اجرا-دیباگ سابق درگیر میکند.
از آنجا که خروجی تابع print (چاپ) در همان قالب متنی که تابع read(خواندن) برای ورودی استفاده می کند است، اکثر نتایج به شکلی چاپ می شوند که می توان آن را کپی کرد و دوباره در REPL جایگذاری کرد.
به عنوان یک رابط دستوری بین کاربر و سیستم (پوسته) ، یک محیط REPL به کاربران اجازه می دهد تا علاوه بر دسترسی به قابلیت های برنامه نویسی، به ویژگی های مربوطه یک سیستم عامل دسترسی داشته باشند. رایج ترین استفاده برای REPL ها خارج از پوسته های سیستم عامل برای نمونه سازی تعاملی است. کاربردهای دیگر عبارتند از محاسبات ریاضی، ایجاد اسنادی که تجزیه و تحلیل علمی را ادغام میکنند (مثلاً IPython )، نگهداری نرمافزار تعاملی، معیارسنجی ، و کاوش الگوریتم.
مشخصات Lisp[ویرایش]
پیاده سازی[ویرایش]
یک تعریف ساده تر مثل این:
(define (REPL env)
(print (eval env (read)))
(REPL env) )
جایی که env
نمایانگر محیط ارزیابی اولیه است. همچنین فرض بر این است که env
می تواند به طور(Destructive)مخربی توسط eval
به روز شود.
عملکرد[ویرایش]
عملکرد معمول ارائه شده توسط Lisp REPL شامل موارد زیر است:
- تاریخچه ورودی ها و خروجی ها
- متغیرهای تنظیم شده برای عبارات ورودی و نتایج. این متغیرها در REPL نیز موجود هستند. به عنوان مثال در Lisp های معمول
*
به آخرین نتیجه،**
و***
به نتایج قبل از آن اشاره دارد. - سطوح REPL. در بسیاری از سیستمهای Lisp، اگر خطایی در حین خواندن، ارزیابی یا چاپ یک عبارت رخ دهد، سیستم با یک پیام خطا به سطح بالا بازگردانده نمیشود. در عوض یک REPL جدید، یک سطح عمیق تر، در زمینه خطا شروع می شود. سپس کاربر می تواند مشکل را بررسی کند، آن را برطرف کند و در صورت امکان ادامه دهد. اگر خطایی در چنین REPL اشکال زدایی رخ دهد، REPL دیگر، دوباره یک سطح عمیق تر، شروع می شود. اغلب REPL دستورات دیباگ ویژه ای را ارائه می دهد.
- رسیدگی به خطا . REPL راه اندازی مجدد را فراهم می کند. از این راهاندازیها میتوان در صورت بروز خطا برای بازگشت به سطح REPL خاص استفاده کرد.
- ورودی و خروجی اشیاء داده حساس به ماوس .
- ویرایش ورودی و تکمیل متن خاص روی نمادها، نامهای مسیر، نام کلاسها و سایر اشیاء.
- راهنما و مستندات برای دستورات.
- متغیرهایی برای کنترل reader(خواننده). به عنوان مثال، متغیر *read-base* که در آن اعداد پایه به طور پیش فرض خوانده می شوند را کنترل میکند.
- متغیرهایی برای کنترل چاپگر مثال: حداکثر طول یا حداکثر عمق عبارات برای چاپ.
- دستور دستور اضافی برخی از REPL ها دستوراتی دارند که از نحو s-expression پیروی نمی کنند، اما اغلب با داده های Lisp به عنوان آرگومان کار می کنند.
- REPLهای گرافیکی برخی از Lisp REPL ها (مثال CLIM Listener) ورودی و خروجی گرافیکی را نیز می پذیرند.
همچنین ببینید[ویرایش]
مرجع ها[ویرایش]
لینک های خارجی[ویرایش]
- پل گراهام شرحی از اجرای REPL در Common Lisp نوشته است.
- Joël Franusic Online-REPs-and-REPLs list
This article "حلقه خواندن–ارزشیابی–چاپ" is from Wikipedia. The list of its authors can be seen in its historical and/or the page Edithistory:حلقه خواندن–ارزشیابی–چاپ. Articles copied from Draft Namespace on Wikipedia could be seen on the Draft Namespace of Wikipedia and not main one.