Кіріспе

PL/I бағдарламалау тілінің диалектісі
PL/I бағдарламалау тілінің диалектісі XPL, «сарапшылардың бағдарламалау тілі» – PL/I негізінде құрылған бағдарламалау тілі, өзінде жазылған портативті, бір реттік өңдеуден өтетін компилятор және басқа тілдер үшін ұқсас компиляторларды оңай жасауға арналған талдау генераторы құралы. XPL 1967 жылы компилятор жасау принциптерін оқыту және студенттерге өз тілдері үшін компилятор құруға бастапқы нүкте ретінде әзірленді. XPL-ді Стэнфорд университетінің Уильям М. МакКимэн, Дэвид Б. Вортман, Джеймс Дж. Хорнинг және басқалар жобалап, іске асырды. XPL алғаш рет 1968 жылғы күзгі бірлескен компьютерлік конференцияда таныстырылды. Әдістер мен компилятор 1971 жылғы «A Compiler Generator» оқулығында толық сипатталған. Олар бұл жұмысты «компилятор генераторы» деп атады. Бірақ бұл жаңа тіл немесе жаңа платформа үшін компилятор жасау үшін көп жаңа немесе өзгертілген бағдарламалау кодын қажет етеді дегенді білдіреді. XPL үшін дұрыс атау – аудармашы құрастыру жүйесі. Ол жаңа немесе өзгертілген бағдарламалау кодын аз қолданып компилятор жасауға көмектеседі.

Тіл

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 компиляторы қолмен жазылған лексикалық сканерге және механикалық түрде жасалған парсерге ие. Компилятордың кіріс тілінің синтаксисі (осы жағдайда, 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 бастапқыда 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 тіліне аударатын аудармашы құрылды.