Кіріспе
PL/I бағдарламалау тілінің диалектісі
PL/I бағдарламалау тілінің диалектісі XPL, «сарапшылардың бағдарламалау тілі» – PL/I негізінде құрылған бағдарламалау тілі, өзінде жазылған портативті, бір реттік өңдеуден өтетін компилятор және басқа тілдер үшін ұқсас компиляторларды оңай жасауға арналған талдау генераторы құралы. XPL 1967 жылы компилятор жасау принциптерін оқыту және студенттерге өз тілдері үшін компилятор құруға бастапқы нүкте ретінде әзірленді. XPL-ді Стэнфорд университетінің Уильям М. МакКимэн, Дэвид Б. Вортман, Джеймс Дж. Хорнинг және басқалар жобалап, іске асырды. XPL алғаш рет 1968 жылғы күзгі бірлескен компьютерлік конференцияда таныстырылды. Әдістер мен компилятор 1971 жылғы «A Compiler Generator» оқулығында толық сипатталған. Олар бұл жұмысты «компилятор генераторы» деп атады. Бірақ бұл жаңа тіл немесе жаңа платформа үшін компилятор жасау үшін көп жаңа немесе өзгертілген бағдарламалау кодын қажет етеді дегенді білдіреді. XPL үшін дұрыс атау – аудармашы құрастыру жүйесі. Ол жаңа немесе өзгертілген бағдарламалау кодын аз қолданып компилятор жасауға көмектеседі.
a dialect of the PL/I programming language
XPL, for expert's programming language is a programming language based on PL/I, a portable one pass compiler written in its own language, and a parser generator tool for easily implementing similar compilers for other languages. XPL was designed in 1967 as a way to teach compiler design principles and as starting point for students to build compilers for their own languages. XPL was designed and implemented by William M. McKeeman, David B. Wortman, James J. Horning and others at Stanford University. XPL was first announced at the 1968 Fall Joint Computer Conference. The methods and compiler are described in detail in the 1971 textbook A Compiler Generator. They called the combined work a 'compiler generator'. But that implies little or no language or target specific programming is required to build a compiler for a new language or new target. A better label for XPL is a translator writing system. It helps to write a compiler with less new or changed programming code.
Тіл
XPL тілі - PL/I-нің қарапайым, шағын, тиімді диалектісі, негізінен компиляторларды жазу үшін арналған. XPL тілі қолжетімді болғаннан кейін басқа да мақсаттарда қолданылды. XPL-ді қарапайым компилятор арқылы қазіргі заманғы көптеген машиналарға оңай компиляциялауға болады. Компилятордың ішкі құрылымын XPL-де оңай жазуға болады, ал кодты оқу да жеңіл. PL/I тілі 1964 жылы IBM комитеті тарапынан Fortran, COBOL және ALGOL тілдерін алмастыратын, сондай-ақ клиенттердің және ішкі қажеттіліктердің барлығын қанағаттандыратын, кең ауқымды тіл ретінде әзірленді. Бұл амбициялы мақсаттар PL/I-ді күрделі, тиімді жүзеге асыру қиын және кейде күтпеген нәтижелерге әкелді. XPL – толық тілдің кіші диалектісі. XPL-де PL/I-де жоқ бір қосымша мүмкіндік бар: динамикалық ұзындығы бар STRING дерек типі. Сызықтық мәндер жеке мәтіндік жад кеңістігінде сақталады және ескі мәндер автоматты түрде жинақталатын болады. Қарапайым компилятордың көп бөлігі кіріс мәтінін және шығыс байт ағынын өңдеуге қатысты болғандықтан, бұл мүмкіндік XPL негізіндегі компиляторларды жеңілдетуге көмектеседі.
XCOM
XCOM деп аталатын XPL компиляторы – кестелік талдаушыны және қарапайым кодты жасау әдістерін қолданатын бір өткелді компилятор. XCOM-ның әртүрлі машина архитектуралары үшін нұсқалары бар, олар сол мақсаттар үшін қолмен жазылған әртүрлі кодты жасау модульдерін пайдаланады. Алғашқы мақсат IBM System/360 болды, ол IBM System/370, IBM System/390 және IBM System z-дың дұрыс кіші жиыны болып табылады. XCOM XPL бастапқы кодынан компиляциялайды, бірақ XCOM өзі XPL-де жазылғандықтан, ол өзін-өзі компиляциялай алады – ол басқа компиляторларға тәуелді емес, өзін-өзі компиляциялайтын компилятор. Burroughs B5000 Algol, PL/I, C, LISP және Java сияқты бірнеше танымал тілдерде өзін-өзі компиляциялайтын компиляторлар бар. Мұндай компиляторларды жасау – «тауық пен жұмыртқа» сияқты қиын мәселе. Тіл алдымен басқа тілде жазылған уақытша компилятормен немесе тіпті интерпретатормен (көбінесе BCPL-дің intcode немесе O кодымен жасай алатын аралық кодтың интерпретаторы) іске асырылады. XCOM Burroughs машиналарында жұмыс істейтін Algol бағдарламасы ретінде басталды, XPL бастапқы кодын System/360 машиналық кодына аударды. XPL командасы Algol бастапқы кодын қолмен XPL бастапқы кодына айналдырды. XCOM-ның XPL нұсқасы кейін Burroughs-те компиляцияланды, бұл System/360 машиналары үшін өзін-өзі компиляциялайтын XCOM-ды жасады. Алголь нұсқасы кейін тасталды, ал барлық келесі жақсартулар тек XPL нұсқасында жасалды. Бұл компиляторды «жүктеу» деп аталады. XPL авторлары «жүктеу» процесін көрсету үшін «могилалық диаграмманы» немесе T-диаграммасын ойлап тапты. Компиляторды жаңа машина архитектурасына қайта бағыттау да ұқсас жұмыс, тек кодты жасау модульдерін өзгерту қажет. XCOM – бір өткелді компилятор (бірақ алға бағытталған тармақтар, циклдар және басқа анықталған жағдайлар үшін шығарылған кодты түзету процесімен). Ол әрбір оператор үшін машиналық кодты әрбір оператордағы әрбір грамматикалық ереже танылғанда шығарады, процедураның немесе бағдарламаның толық талдануын күтпейді. Парсинг ағаштары немесе басқа қажетті аралық бағдарламалық формалар жоқ, сондай-ақ циклдық немесе процедуралық оптимизациялар да жоқ. Дегенмен, XCOM «көз тесігінен» оптимизация жасайды. Әрбір грамматикалық ережеге кодты жасау жауабы тіркелген. Бұл тікелей тәсіл кодтың тиімсіздігіне және машиналық регистрлерді тиімсіз пайдалануға әкелуі мүмкін. Алайда, бұл жоғарыда айтылған динамикалық жолдарды пайдаланудың тиімділігімен өтеледі: компиляция кезінде мәтінді өңдеу кезінде жиі ішкі жолдармен операциялар орындалады. Бұл бүтін санға мән беру сияқты жылдам; ішкі жолдардың өзі жылдырылмайды. Қысқасы, ол жылдам, қысқа курста оқыту оңай, шағын көлемді жадқа сыяды және әртүрлі тілдерге немесе әртүрлі мақсатты машиналарға оңай өзгертіледі.
XCOM compiles from XPL source code, but since XCOM itself is written in XPL it can compile itself – it is a self compiling compiler, not reliant on other compilers. Several famous languages have self compiling compilers, including Burroughs B5000 Algol, PL/I, C, LISP, and Java. Creating such compilers is a chicken and egg conundrum. The language is first implemented by a temporary compiler written in some other language, or even by an interpreter (often an interpreter for an intermediate code, as BCPL can do with intcode or O code). XCOM began as an Algol program running on Burroughs machines, translating XPL source code into System/360 machine code. The XPL team manually turned its Algol source code into XPL source code. That XPL version of XCOM was then compiled on Burroughs, creating a self compiling XCOM for System/360 machines. The Algol version was then thrown away, and all further improvements happened in the XPL version only. This is called bootstrapping the compiler. The authors of XPL invented the tombstone diagram or T diagram to document the bootstrapping process. Retargeting the compiler for a new machine architecture is a similar exercise, except only the code generation modules need to be changed. XCOM is a one pass compiler (but with an emitted code fix up process for forward branches, loops and other defined situations). It emits machine code for each statement as each grammar rule within a statement is recognized, rather than waiting until it has parsed the entire procedure or entire program. There are no parse trees or other required intermediate program forms, and no loop wide or procedure wide optimizations. XCOM does, however, perform peephole optimization. The code generation response to each grammar rule is attached to that rule. This immediate approach can result in inefficient code and inefficient use of machine registers. Such are offset by the efficiency of implementation, namely, the use of dynamic strings mentioned earlier: in processing text during compilation, substring operations are frequently performed. These are as fast as an assignment to an integer; the actual substring is not moved. In short, it is quick, easy to teach in a short course, fits into modest sized memories, and is easy to change for different languages or different target machines.
АНАЛИЗЕР
XCOM компиляторы қолмен жазылған лексикалық сканерге және механикалық түрде жасалған парсерге ие. Компилятордың кіріс тілінің синтаксисі (осы жағдайда, XPL) қарапайымдалған BNF грамматикасымен сипатталады. XPL-дің грамматикалық талдау құралы ANALYZER немесе XA осыны синтаксис ережелерінің барлық заңды комбинацияларын және оларды қалай анықтауға болатынын сипаттайтын үлкен деректер кестелері жиынтығына түрлендіреді. Бұл кесте жасау қадамы тек тіл өзгерген кезде ғана қайта орындалады. Компилятор жұмыс істеген кезде, осы деректер кестелері кіріс тілін талдау және оған жауап беру үшін кішкентай, тілге тәуелсіз парсинг алгоритмімен қолданылады. Мұндай кестеге негізделген парсерді толыққанды қолмен жазылған рекурсивті түсу парсерінен жасау әдетте оңайырақ. XCOM төменнен жоғарыға қарай парсинг әдісін қолданады, онда компилятор сол тіркестің оң жақ соңына дейін көріп, қай синтаксистік ережеге тап болғаны туралы шешімін кейінге қалдыра алады. Бұл, тіркестің сол жағын ғана көргенде белгілі бір синтаксистік ережеге бірден шешім қабуға мәжбүр болатын жоғарыдан төменге қарайғы әдістерге қарағанда, бағдарламалау тілдерінің кең ауқымын қамтиды.
Орындау уақыты
XPL тізбектік мәндерін бөлу және қоқыс жинау үшін минималды орындалу уақыты қолдау кітапханасын қамтиды. XPL тілінде жазылған көптеген бағдарламаларға осы кітапхананың бастапқы коды қосылуы тиіс.
СКЕЛЕТОН
XPL компиляторын жазу жүйесінің соңғы бөлігі – SKELETON деп аталатын мысал компилятор. Бұл XPL-дің толық грамматикасының орнына, қарапайым грамматика үшін талдау кестелері бар XCOM-ның өзі. Егер жаңа тіл XPL-ден едәуір өзгеше болса, сол тіл үшін компилятор құрудың бастапқы нүктесі болып табылады.
XMON
XPL монитордың, XMON, бақылауы астында жұмыс істейді, бұл жүйенің операциялық жүйеге тән жалғыз бөлігі болып табылады және ол XCOM-ның өзі немесе XCOM қолданысын пайдаланып жасалған кез келген бағдарламалар үшін «жүктеп алушы» рөлін атқарады, сондай-ақ XCOM пайдалануы үшін үш қосымша сақтау құрылғысын ұсынады, оларға блок нөмірі арқылы тікелей қол жеткізуге болады. Алғашқыда жарияланған XMON IBM 2311 үшін оңтайландырылған. XMON FILE= параметрі мониторға үлкен блок өлшемдері бар басқа дискілерді тиімді пайдалануға мүмкіндік берді. XCOM-да жұмыс істейтін дискі блогының мөлшері де компиляция уақытындағы тұрақты шама болды. XMON дискіге тікелей кіру үшін өте қарапайым стратегия қолданды. NOTE дискілік жолдың мекенжайын көрсетті. POINT келесі дискілік жолдың орнын NOTE бұрын қайтарған мекенжайға орнатты. Бұл стратегия XMON-ды басқа операциялық жүйелерге оңай көшіруге және сол кездегі дискіге тікелей кірудің күрделірек мүмкіндіктерінен аулақ болу үшін қабылданды. XMON-ды NOTE, POINT және READ/WRITE дискілік операцияларын бастапқы пайдаланудан (бір жолға дәл 1 блок) EXCP (жаңа жазбаларды жазу/жасау) және XDAP (ескі жазбаларды оқу/жаңарту) арқылы n блокпен түрлендіру (мұнда n мақсатты құрылғының физикалық сипаттамаларынан орындалу кезінде есептеледі және 1-ден әлдеқайда жоғары болуы мүмкін) қолданбаның өнімділігін едәуір жақсартты және операциялық жүйенің жүктемесін азайтты. Алғашында OS/360 үшін әзірленгенімен, XMON (NOTE, POINT және READ/WRITE бастапқы іске асырылуы; немесе EXCP және XDAP жақсартуы) кейіннен шығарылған IBM операциялық жүйелерінде, соның ішінде OS/370, XA, OS/390 және z/OS, көбінесе ешқандай өзгерістерсіз жұмыс істейді.
XCOM. XMON used a very simple strategy for disk direct access. NOTE provided the address of a disk track. POINT set the location of the next disk track to be the address previously returned by NOTE. This strategy was adopted to allow easy porting of XMON to other OSes, and to avoid the much more complicated disk direct access options available at that time. Converting XMON from its primitive use of NOTE, POINT and READ/WRITE disk operations—with precisely 1 block per track—to EXCP (i. e., write/create new records) and XDAP (i. e., read/update old records)—with n blocks per track, where n was computed at run time from the target device's physical characteristics and could be significantly greater than 1—achieved significantly improved application performance and decreased operating system overhead. Although originally developed for OS/360, XMON (either the original NOTE, POINT and READ/WRITE implementation; or the EXCP and XDAP enhancement) will run on subsequently released IBM OSes, including OS/370, XA, OS/390 and z/OS, generally without any changes.
Талдау
XCOM бастапқыда XPL тобы ойлап тапқан, қазір ескірген төменнен жоғарыға қарай талдау кестесі әдісін қолданды (бірақ ресми түрде шығарылған нұсқада MSP талдаушысы сақталғанмен, кейіннен шығарылған "көзқарас оптимизациялары" және бастапқы іске асыру тобынан тыс жасалған қосымша дерек түрлері кірмейді). MSP – Niklaus Wirth PL360 үшін ойлап тапқан қарапайым басымдық талдау әдісінің жалпылауы. Қарапайым басымдық өзі A+B*(C+D)E сияқты өрнектер үшін жақсы жұмыс істейтін қарапайым оператор басымдық әдістерінің жалпылауы болып табылады. MSP кестелері тіл символдарының күтілетін үштігінің тізімін қамтиды. Бұл тізім грамматика өлшемі кубикалық түрде өседі және әдеттегі толық бағдарламалау тілдері үшін өте үлкен болады. XPL-дан туындаған компиляторларды 1970 жылдардағы шектеулі жадысы бар шағын компьютерлерге орналастыру қиын болды. MSP сонымен қатар барлық мүмкін грамматикаларды өңдеуге жеткіліксіз. Бұл тек тілді жасаушы тілдің анықтамасын MSP шектеулеріне сәйкес келтіре алса ғана қолданылады, тіл кеңінен қолданысқа түспей тұрып. Кейіннен Торонто университеті XCOM және XA-ны Дональд Кнуттың LR талдаушының төменнен жоғарыға қарай әдісінің бір түрін пайдалану үшін өзгертті. XCOM-ның түрі Simple LR немесе SLR деп аталады. Ол MSP-ге қарағанда көбірек грамматиканы өңдейді, бірақ LALR немесе толық LR(1)-ге қарағанда азырақ грамматиканы өңдей алады. LR(1)-ден айырмашылықтар негізінен кесте генераторының алгоритмдерінде, ал емес компиляция уақытындағы талдау әдісінде. XCOM және XA Unix-тің және оның yacc талдаушы генератор құралының кеңінен қолданысқа түсуінен бұрын пайда болды. XA және yacc ұқсас мақсаттарға ие. XPL ашық кодты. XPL-дің System/360 нұсқасы IBM SHARE пайдаланушылар ұйымы арқылы таратылды. Басқа топтар XPL-ді 1970 жылдардың көптеген үлкен машиналарына көшірді. Әр түрлі топтар XPL-ді кеңейтті немесе басқа орташа көлемді тілдерді іске асыру үшін XPL-ді пайдаланды.
Ағымдағы жағдай
XPL қазіргі компьютерлерге көшірілуде және жалғастырылуда. 2000 жылы x86/FreeBSD нұсқасы, 2015 жылы x86/Linux нұсқасы жасалды, сондай-ақ 2017 жылы XPL-ді C тіліне аударатын аудармашы құрылды.