Кіріспе
Паскаль бағдарламалау тілінің іске асырылуы
IP Pascal – IP портативті платформасын қолдана отырып, бірнеше машина, операциялық жүйе және тілді іске асыру жүйесі арқылы Паскаль бағдарламалау тілінің іске асырылуы. Ол "Pascaline" тілін (Блез Паскальдың есептегішінің құрметіне аталған) іске асырады және Паскаль тілінің жарамдылығын тексеру жинағынан өтті.
Шолу
IP Pascal "Pascaline" тілін (Блез Паскальдың калькуляторының құрметіне аталған) іске асырады, ол ISO 7185 Паскаль тілінің кеңейтілген жоғары деңгейлі жиынтығы болып табылады. Ол атау кеңістігін басқару арқылы модулділікті, соның ішінде параллель тапсырмаларды бақылау тұжырымдамасын, динамикалық массивтерді, жүктемелер мен қайта анықтауларды, объектілерді және тілге енгізілген көптеген ұсақ кеңейтулерді қосады. IP портация платформасын ұсынады, оған виджеттер жиынтығы, TCP/IP кітапханасы, MIDI және дыбыс кітапханасы және басқа да функциялар кіреді. Бұл IP Pascal-де жазылған бағдарламалардың да, IP Pascal-дің өзінің де бірнеше операциялық жүйелерге және машиналарға көшірілуіне мүмкіндік береді. IP Pascal – ISO 7185 Паскаль стандатына сәйкестігін растау үшін жасалған үлкен тестілер жиынтығы – Pascal Validation Suite-ті сәтті өткен, қазіргі кезде сақталған Pascal жүзеге асыруларының бірі. Pascaline ISO 7185 Паскаль тілін кеңейткенімен, Паскальдің типтік қауіпсіздігін төмендетпейді (мұндай өзгерістерді жасаған Паскальдің көптеген басқа диалекттерінен айырмашылығы, олар "типтік қашулар" деп аталатын мүмкіндіктерді қосты). Тілдің мүмкіндіктері C# тіліне ұқсас (ол C++ сияқты тілді іске асырады, бірақ типтік қауіпсіздік кемшіліктерінен тазартылған), ал Pascaline басқарылатын бағдарламаларды қолдануға болатын кез келген ортада қолданылуы мүмкін (C# тілінен 30 жыл бұрынғы тілге негізделгенімен).
Ашық немесе жабық күйі
Паскалин тілінің авторы оның жекеменшік тіл ретінде сақталуын қаламайтынын айтты. IP Pascal – Паскалиннің іске асырылуы ретінде сатылады, бірақ тілдің өзі ашық болуы керек және сапалы іске асырылымдары болуы тиіс. Осы мақсатта Паскалиннің толық спецификациясы интернетте жарияланады, ал ұзақ мерзімді жоспар – Паскалинға сәйкестікті қамтамасыз ететін ашық кодты Pascal P5 компилятор-интерпретаторының (Wirth-тің Pascal P4 компилятор-интерпретаторының ISO 7185 нұсқасы) нұсқасын жасау. Бұл Pascal P6 компиляторы деп аталады, ол да ашық түрде жарияланып, таратылады. IP Pascal-дың коммерциялық өнім ретіндегі құны осы жүйенің IDE және компилятор кодировщик ресурстарына негізделеді. Бұл мақала Паскалиннің біршама ескі нұсқасына сәйкес келеді. Паскалиннің жаңа нұсқасы Pascal P6 ретінде бар, ол Pascal P сериясының бір бөлігі. Төмендегі сілтемелерді қараңыз.
Юникод
IP Pascal құрастыру кезінде қарапайым опция арқылы ISO 8859-1 режиміндегі (8 биттік символдар) немесе Unicode режиміндегі бағдарламаларды жасауға болады (көптеген басқа тілдерден өзгеше, Unicode және Unicode емес бағдарламалардың бастапқы кодында ешқандай айырмашылық жоқ). Мәтіндік файлдарда ASCII-ге жоғары қарай үйлесімді UTF-8 форматы қолданылады, ал бұл файлдар бағдарламаның ішкі 8 немесе 16 биттік символдарымен оқылады және жазылады (ISO 8859-1 стандартының жоғары 128 символы мәтіндік файлдарда UTF-8 форматына және одан 8 биттік символдармен кодталған бағдарламада да түрлендіріледі).
Таңбалардың жоғарғы шегі үшін тұрақты
Maxint-ке ұқсас, Паскалинде maxchr бар, ол таңбалар жиынтығындағы ең үлкен таңбаны білдіреді (бірақ оның графикалық бейнесі болмауы мүмкін). Char түрінің диапазоны 0-ден maxchr-ға дейін анықталады. Бұл "таңбалар жиыны" сияқты типтермен жұмыс істеу үшін маңызды қосымша, сондай-ақ әртүрлі таңбалар жиынтығы опцияларымен (мысалы, ISO 8859 1 немесе Unicode) жұмыс істеуге көмектеседі.
Z80-ті іске асыру
Компилятор 1980 жылы Micropolis Disk Operating System жүйесінде басталып, бірақ Z80 процессордағы CP/M жүйесіне жылдам көшірілді. Бастапқы жүйе Z80 ассемблер тілінде жазылған және Z80 үшін тікелей машиналық кодты шығарды. Бұл бір реттік өтетін компилятор болды, линкері болмады, өзінің жүйелік кітапханасын компилятордың ішінде сақтап, оны жасалған кодқа, орындалатын дискілік файлға орналастырды. Компилятор жұмыс істей бастағаннан кейін, 1980 жылдың басында, компиляторға қосымша ассемблер Паскаль тілінде жазылды, содан кейін Z80 ассемблер тілінде линкер жасалды. Бұл ерекше комбинация 64 кб шектеулі Z80 жүйесінде линкер кестелерінің қиындық тудыратынын көрсеткен есептеуге байланысты болды, сондықтан линкердің көлденеңі мүмкіндігінше кіші болуы керек еді. Бұл компилятор мен линкердің Z80 бастапқы кодын Micropolis ассемблерінен (бір шығыс бинарлық файлды құратын линкерсіз ассемблер) жаңа ассемблер-линкер жүйесіне көшіру үшін пайдаланылды. Содан кейін компилятор линкер форматына шығару үшін қайта жабдықталды, ал қолдау кітапханасы жеке файлға көшіріліп, қосылды. 1981 жылы компиляторды жақсарту үшін қайта жаңартылды, мысалы, регистрлерді бөлу, логикалықты секіндіруге айналдыру, пайдасыз кодты жою, тұрақты шамаларды есептеу және басқа да жақсартулар енгізілді. Бұл кез келген қолданыстағы Z80 компиляторларынан, сондай-ақ көптеген 8086 компиляторларынан жақсы нәтижелер көрсеткен Pascal жүзеге асырылымын жасады. Алайда, 46 кб көлемде оны пайдалану қиын болды, өйткені кестелері толып кетуіне дейін тек бірнеше беттік кодты ғана компиляциялауға болады (бұл кішкентай адресті процессорлардағы көптеген Pascal жүзеге асырылымдарында кездесетін жалпы мәселе). Жүйені негізінен осы кішкентай объект файлдарынан үлкен жүйелерді құруға мүмкіндік беретін ықшам линкерді жасау туралы шешімнің арқасында пайдалануға болады. Осыған қарамастан, бастапқы IP Pascal жүзеге асырылымы 1987 жылға дейін жалпы мақсаттағы компилятор ретінде жұмыс істеді. Бұл кезеңде IP Pascal модульдік құрылымымен C тіліне ұқсас болды. Әрбір бастапқы файл бірлік болып табылады және «бағдарлама» модулінен, типтерден, тұрақтылардан, айнымалылардан, процедуралардан немесе функциялардан тұрады. Бұл «еркін форматта» болды. Процедуралар, функциялар, типтер, тұрақтылар мен айнымалылар кез келген блоктан тыс және кез келген ретпен орналасуы мүмкін. Басқа файлдардағы процедуралар, функциялар мен айнымалылар «сыртқы» жарияланымдар арқылы, ал ағымдағы файлдағы процедуралар, функциялар мен айнымалылар «глобал» деп жарияланды. Әрбір файл объект файлына компиляцияланып, содан кейін біріктірілді. Объект файлдары арасында типтік тексеру болған жоқ. Бастапқы компилятордың бір бөлігі ретінде кез келген тізбекті терминалды пайдалануға мүмкіндік беретін құрылғыдан тәуелсіз терминал I/O модулі құрылды (Turbo Pascal CRT бірлігіне ұқсас), ол бүгінге дейін сақталған. 1985 жылы компиляторды Паскаль тілінде қайта жазуға тырысу басталды. Жаңа компилятор екі реттік өтетін, аралық кезеңі бар болады, ол бірінші компилятормен байланысты жад проблемаларын шешу үшін жоспарланған. Компилятордың алдыңғы бөлігі аралық кодты құру мүмкіндіктерісіз (тек талдау) құрылды және сынақтан өтті. 1987 жылы IP үшін пайдаланылған Z80 жүйесі 80386 IBM PC-ге ауыстырылды және жұмыс тоқтатылды. Сол кезден бастап бірнеше ISO 7185 стандартты компиляторлар қолданылды, содан кейін 32 биттік DPMI кеңейтушіге негізделген SVS Pascal компиляторымен аяқталды.
80386 бағдарламасын іске асыру
1993 жылға қарай, ISO 7185 стандартына сәйкес келетін, жоғары сапалы 32 биттік кодты шығаратын компиляторлар құлдырап жатты. Осы кезде таңдау – Pascal-ды пайдалануды тоқтату, немесе бұрынғы IP Pascal жобасын жаңғырту және оны 80386 компиляторы ретінде модернизациялау еді. Сол кезде IBM PC-де қолданылатын Паскаль талдағышы және (Z80 үшін) құрастырушы ғана болды. 1993 жылдан 1994 жылға дейін құрастырушы бірнеше процессорды, соның ішінде 80386-ны қолдану үшін модулдік болды, Z80 ассемблерлік тілінің линкерін алмастыру үшін линкер құрылды, ал Pascal компиляторының алдыңғы бөлігі аралық кодты шығару үшін аяқталды. Соңында, жүйені тексеру үшін Паскаль тілінде аралық кодты симулятор жасалды. 1994 жылы симулятор ISO 7185 IP Pascal “негізгі” тілін динамикалық массивтер сияқты мүмкіндіктерді қосу үшін пайдаланылды. 1995 жылы 80386 машиналық кодын жасау үшін “тексеру кодегі” және шығыс объект файлдарын қабылдап, Windows үшін “Portable Executable” файлын құруға арналған конвертер бағдарламасы жасалды. IP Pascal үшін жүйелік қолдау кітапханасы жасалды, ол өзі IP Pascal-да жазылған. Бұл кітапхананы кейіннен ассемблерден немесе басқа Паскальден IP Pascal-ға қайта жазу қажеттігін болдырмау үшін жасалған ерекше қадам болды, бірақ 80386 код генераторы мен кітапхананы бірге түзету қажеттігі туындады. 1996 жылдың басында бастапқы мақсат – Windows NT екені Windows 95-ке ауыстырылды, және IP Pascal Windows жүйесінде 80386 компиляторы ретінде толыққандай жұмыс істей бастады. Жүйе өзін-өзі іске қосып, қалған Паскаль коды SVS Pascal-дан IP Pascal-ға көшірілді, соның арқасында өзіндік іске қосылу процесі аяқталды. Бұл процеске Windows 95-те DPMI негізіндегі SVS Pascal-дың жұмыс істеу мүмкіндігі көмектесті, бұл DOS пен Windows 95 арасында қайта-қайта жүгіру қажеттігін жойды.
Linux-ты іске асыру
2000 жылы тек мәтіндік режим үшін Linux (Red Hat) нұсқасы құрастырылды. Бұл іске асыру жүйелік шақыруларды тікелей пайдаланады және glibc-ді қолданбауға тырысады, соның салдарынан C үшін қажетті толық қолдау жүйесі қолданғандағыға қарағанда кішірек екілік файлдар жасалады, бірақ екілік файлдардың басқа жүйелерге көшірілу мүмкіндігі төмендейді. Жоспар – мәтіндік кітапхананың termcap ақпаратын пайдаланатын және X11 ортасында графикалық кітапхананы құру.
"Бір рет жаз, кез келген жерге жүгірт" қадамдары
1997 жылы түпнұсқа 1980 жылғы IP Pascal-дың терминал кітапханасы Windows жүйесіне көшірілді және 80386 процессоры үшін соңғы кодтаушы (энкодер) жұмысы басталды. Дегенмен, жақсартылған кодтаушыны қажет етудің басты себебі – орындалу жылдамдығы, IBM PC процессорларының жылдамдығының артуымен көбінесе маңызсыз болып кетті. Осының салдарынан жаңа кодтаушы 2003 жылға дейін аяқталмады. 2001 жылы IP Pascal-ға C тіліндегі бас файлдарды Pascal тіліндегі бас файлдарға аударуға арналған қосымша бағдарлама жасалды. Бұл IP Pascal үшін операциялық жүйе интерфейстерін қолмен жасау әдісін алмастыру мақсатында жасалған. 2003 жылы IP Pascal үшін толыққанды графикалық, операциялық жүйеге тәуелсіз модуль құрылды. 2005 жылы терезелерді басқару және виджеттер жиынтығы қосылды.
Паскалин
2015 жыл шамасында IP Pascal тілінің сипаттамасы жиналып, толықтырылды. Соның нәтижесінде "Паскалин" деп аталатын жаңа тіл құрылды. Паскалин сипаттамасының көп бөлігі IP Pascal-да іске асырылды. Бірақ, тілдің көп бөлігін алдымен Pascal P6 компиляторының код базасында іске қосу туралы шешім қабылданды. Паскаль P сериясы – Вирттің студенттері жасаған ETH Zurich-тің бастапқы компиляторы және бүгінде Pascal P4 (Никлаус Вирт таңдаған атау) ретінде сақталып қалды. Ол ISO 7185 Pascal стандартына Pascal P5-те ауыстырылды, ал қазір Pascal P6-да Паскалин тіліне жаңартылуда. Сонымен қатар, Pascal P6 толыққанды компилятор ретінде дамытылуда, бастапқыда AMD64 процессор моделі үшін код жасаудан басталып, кейін ARM және RISC V сияқты басқа процессорларға қолдау көрсету жоспарлануда. Мақсат – Паскалин сипаттамасы толық іске асырылғанда Pascal P6 1.0 нұсқасына қол жеткізу.
Петит-Ами
2019 жыл шамасында IP Pascal үшін қолдау кітапханасы C тілінде қайта жазылды. Бұл шешімнің екі мақсаты болды: біріншіден, кітапхананы Pascal тілінен бөлек, барлық тілдерде қолдануға мүмкіндік беру, екіншіден, жаңа платформаларда бағдарламалау және қателерді жою процесін оңайлату және жылдамдату. Petit Ami енді Windows, Linux және Mac OS, сондай-ақ BSD Unix жүйелерінде қолжетімді, Mac OS және BSD Unix-тегі нұсқасы толыққанды емес.
Үйренетін сабақтары
Артқа қарап қарағанда, Z80 нұсқасындағы ең ірі қателік – оның бір реттік өңдеу құрылымы болды. Бұған ешқандай нақты себеп болған жоқ; автордың бұрынғы (Basic) компиляторы аралық сақтаумен бірнеше рет өңделген. Бұл үшін жалғыз аргумент – бір реттік компиляция жылдамырақ болуы керек еді. Дегенмен, бір реттік компиляция кішкентай машиналар үшін тиімсіз болып шықты және үлкен машиналардағы кең таралған жетілдірілген оптимизацияға көмектеспеді. Сонымен қатар, бір реттік өңдеу компиляторды Z80 ассемблер тілінен Pascal-ға көшіруді қиындатты немесе тоқтатты. Компилятор монолиттік болғандықтан, Pascal-ға түрлендіруді бір-бір бөлімімен жасау мүмкін болмады, оны бірден толығымен ауыстыру қажет болды. Алмастыру басталғанда, жоба машинаның өмір сүру мерзімінен де ұзаққа созылды. Екі реттік компиляция I80386 іске асыруына ең көп көмек бергені – компилятордың алдыңғы және артқы бөлімдері арасында байланыс құратын аралық нұсқаулардың стандартты жинағын сақтау болды. Бұл жақсы түсінілген «кезең» компиляцияның жалпы күрделілігін азайтты. Екі бірдей программа тығыз байланысқанда, күрделілік қосымша емес, көбейтілген болады, себебі программаның жартылары арасындағы байланыстар бақылаудан шығып кетеді. Z80 шағындағы тағы бір сабақ, 80386 компиляторында түзетілген, – кодтың мүмкіндігінше көп бөлігін Pascal-дың өзіне, тіпті қолдау кітапханасына жазу. 80386 қолдау кодының барлығы Pascal тілінде жазылғандықтан, оның көп бөлігі операциялық жүйеге тән аймақтан «ортақ код» кітапхана бөліміне көшірілді, бұл бөлім әр машина мен операциялық жүйе үшін ешқашан өзгермейтін кодқа арналған. Тіпті «жүйеге тән» кодты да әрбір іске асыруда аздап ғана өзгерту қажет. Нәтижесінде, жүйені көшіру кезінде көптеген жұмыстар сақталды. Соңында, компиляторды бастаудан бұрын екінші рет оптимизациялауға кірісу – қателік болды. Шығыс кодтың жақсаруы айтарлықтай болғанымен, компилятордың күрделілігінің артуы шектеулі адрес кеңістігімен проблемалар тудырды. Сол кезде, жақсырақ оптимизацияланған код Pascal-да кодты бастауға мүмкіндік беретін фактор ретінде қарастырылды. Артқа қарап қарағанда, қалған ассемблерде жазылған бөлімдер – нағыз проблема еді және оларды мүмкіндігінше ертерек жою қажет болды. Басқаша айтқанда, кеңістіктегі проблемалар уақытша болуы мүмкін, бірақ ассемблерде жазылған маңызды программалық бөлімдер – бұл маңызды және тұрақты проблема.