Кіріспе
Компьютерлік бағдарламалау ортасы
Read–eval–print loop (REPL), сондай-ақ интерактивті жоғары деңгей немесе тілдік қабық деп аталатын, пайдаланушыдан жеке кіріс деректерін қабылдап, оларды орындап, нәтижесін пайдаланушыға қайтаратын қарапайым интерактивті компьютерлік бағдарламалау ортасы болып табылады; REPL ортасында жазылған бағдарлама бөлік-бөлікпен орындалады.
Тарих
1964 жылы Л. Питер Дойч және Эдмунд Беркли PDP 1 компьютерінде Lisp іске асыру үшін READ EVAL PRINT циклын қолданды. 1980-жылдардың басынан бері Scheme аясында REP Loop және REPL аббревиатуралары қолданылып келеді.
Шолу
REPL-де пайдаланушы бір немесе бірнеше өрнектерді (толық компиляциялық бірлік емес) енгізеді, ал REPL оларды бағалайды және нәтижелерін көрсетеді. «Оқу-бағалау-басып шығару» циклының атауы осы функционалдықты жүзеге асыратын Lisp-тің бастапқы функцияларының аттарынан шыққан: Оқу функциясы пайдаланушыдан өрнекті қабылдап, оны жадтағы дерек құрылымына түрлендіреді. Мысалы, пайдаланушы `(+ 1 2 3)` s-өрнегін енгізе алады, ол төрт дерек элементінен тұратын тізбекке айналады. Eval функциясы осы ішкі дерек құрылымын қабылдап, оны бағалайды. Lisp-те s-өрнекті функция атынан бастау арқылы бағалау, функцияны өрнектің қалған бөлігін құрайтын аргументтерге қолдануды білдіреді. Осылайша, `+` функциясы `1 2 3` аргументтерімен шақырылып, нәтижесінде `6` шығады. Басып шығару функциясы eval функциясының нәтижесін қабылдап, оны пайдаланушыға көрсетеді. Егер өрнек күрделі болса, оны түсінуді жеңілдету үшін әдемі форматта басып шығаруға болады. Содан кейін даму ортасы оқу күйіне оралып, бағдарлама жабылатынға дейін жалғасатын цикл құрайды. REPL зерттеу бағдарламалау мен қателерді жоюға көмектеседі, себебі бағдарламашы келесі өрнекті енгізбес бұрын басып шығарылған нәтижені қарап, шешім қабылдай алады. «Оқу-бағалау-басып шығару» циклы классикалық «өзгерту-компиляциялау-орындау-қателерді жою» циклына қарағанда бағдарламашыны жиі араластырады. Басып шығару функциясы оқу функциясының кіріс ретінде қолданатын мәтіндік форматта нәтиже шығаратындықтан, көптеген нәтижелерді көшіріп REPL-ге қайтадан енгізуге болады. Дегенмен, кейде сокет дескрипторы немесе күрделі сынып инстанциясы сияқты қайта оқуға болмайтын элементтерді көрсету қажет болады. Мұндай жағдайларда оқылмайтын нысандар үшін синтаксис болуы керек. Python-да бұл `<модуль класының инстанциясы>` белгісі, ал Common Lisp-те `#<не нәрсе>` форматы. CLIM, SLIME және Symbolics Lisp машинасының REPL-дері оқылмайтын нысандарды да оқи алады. Олар әрбір шығыс үшін қандай нысан басылғанын жасайды. Кейін кодты қайта оқығанда, нысан басылған шығыстан алынады. REPL кез келген мәтіндік тілді қолдау үшін құрылуы мүмкін. Компиляцияланған тілдер үшін REPL қолдауы әдетте компиляторға интерфейс беретін виртуалды машинаның үстінде интерпретаторды іске асыру арқылы қамтамасыз етіледі. Мысалы, JDK 9-дан бастап Java JShell-ді тілге командалық жол интерфейсі ретінде қосты. Басқа да көптеген тілдер үшін осыған ұқсас тілмен өзара әрекеттесуді қамтамасыз ететін үшінші тараптың жүктеуге болатын құралдары бар.
The read function accepts an expression from the user, and parses it into a data structure in memory. For instance, the user may enter the s expression (+ 1 2 3), which is parsed into a linked list containing four data elements. The eval function takes this internal data structure and evaluates it. In Lisp, evaluating an s expression beginning with the name of a function means calling that function on the arguments that make up the rest of the expression. So the function + is called on the arguments 1 2 3, yielding the result 6. The print function takes the result yielded by eval, and prints it out to the user. If it is a complex expression, it may be pretty printed to make it easier to understand. The development environment then returns to the read state, creating a loop, which terminates when the program is closed. REPLs facilitate exploratory programming and debugging because the programmer can inspect the printed result before deciding what expression to provide for the next read. The read–eval–print loop involves the programmer more frequently than the classic edit–compile–run–debug cycle. Because the print function outputs in the same textual format that the read function uses for input, most results are printed in a form that could be copied and pasted back into the REPL. However, it is sometimes necessary to print representations of elements that cannot sensibly be read back in, such as a socket handle or a complex class instance. In these cases, there must exist a syntax for unreadable objects. In Python, it is the < module class instance> notation, and in Common Lisp, the #<whatever> form. The REPL of CLIM, SLIME, and the Symbolics Lisp Machine can also read back unreadable objects. They record for each output which object was printed. Later when the code is read back, the object will be retrieved from the printed output. REPLs can be created to support any text based language. REPL support for compiled languages is usually achieved by implementing an interpreter on top of a virtual machine which provides an interface to the compiler. For example, starting with JDK 9, Java included JShell as a command line interface to the language. Various other languages have third party tools available for download that provide similar shell interaction with the language.
Қолданылуы
Қабықша ретінде REPL ортасы пайдаланушыларға бағдарламалау мүмкіндіктерін ұсына отырып, операциялық жүйенің де тиісті мүмкіндіктеріне қол жеткізуге мүмкіндік береді. REPL-дің операциялық жүйе қабықшаларынан тыс кеңінен қолданылатын түрі – интерактивті прототиптеу. Басқа қолданыстар математикалық есептеулер, ғылыми талдауды қосатын құжаттар жасау (мысалы, IPython), бағдарламалық жасақтаманы интерактивті түрде күту, жылдамдық сынақтарын жүргізу және алгоритмдерді зерттеу болып табылады.