Принцип на компилация

Основни концепции

Принципът на компилация е науката и технологията за превод на езици за програмиране от високо ниво. Всички знаем, че компютърните програми се пишат на езици за програмиране. В ранните дни езиците за компютърно програмиране се развиват сравнително бавно, тъй като данните, съхранявани от компютъра, и програмата, изпълнявана от компютъра, са съставени от кодове 0 и 1, така че в ранните дни, когато програмистите пишат компютърни програми, те трябва да знаят основния код на инструкции на компютъра добре чрез комбиниране и подреждане на тези микропрограмни инструкции за завършване Програма със специфична функция поставя много високи изисквания към програмиста. Хората изучават как ефективно да разработват компютърни програми, за да намалят прага на програмиране.

Компилатор

Компилаторът на език C е вид модерно оборудване, което се нуждае от помощта на компютърен компилатор. Дизайнът на компилатора на език C е сравнително професионална работа. Дизайнерите трябва да вземат предвид тромавия процес на проектиране на компютърни програми, както и нуждите на компютърните потребители. Видовете компютри непрекъснато се увеличават, така че когато проектираме компилатор на език C, трябва да увеличим неговата приложимост. Езикът C има силна процесорна мощ, той е структуриран език и се използва повече в поддръжката на компютърни системи. Езикът C има предимството на висока ефективност и се използва повече в различни видове компютри.

Преден дизайн на компилатор на език C

Процесът на компилиране обикновено се изпълнява в компютърна система, което представлява процес на преобразуване на изходния код в компютърен общ език. Компилаторът съдържа адреса, името и машинния код на входната точка. Компилаторът е инструмент, който се използва широко в компютърните програми. При проектирането на предния край на компилатора трябва да се вземат предвид факторите на влияние, както и лексикален, граматичен и семантичен анализ.

1 Лексикален анализ

Лексикалният анализ е основният етап от дизайна на предния край на компилатора. На този етап компилаторът ще маркира изходната програма според зададените граматически правила. В процеса на маркиране всеки знак представлява вид дума. В процеса на маркиране има основно идентификатори, ключови думи, специални символи и други видове. Компилаторът включва лексикален анализатор, програма за входен източник и разпознаване на изхода. Маркер, използвайте тези функции, за да конвертирате размера на шрифта в познати думи.

2 Анализ на синтаксиса

Синтактичният анализ се отнася до използването на зададени граматически правила за идентифициране на структурата в токена, която включва изречения, фрази и т.н., в процеса на идентификация. Може да се формира специално структурно синтактично дърво. Синтаксисният анализ има важно влияние върху функцията на компилатора. По време на процеса на проектиране трябва да се гарантира точността на логото.

3 Семантичен анализ

Семантичният анализ също изисква използването на граматически правила. При проверка на статичната семантика на граматичните единици е необходимо да се гарантира точността на граматичните правила. Когато трансформираме лексикални или граматически, ние трябва да гарантираме легитимността на настройката на граматичната структура. При проверка на граматиката и морфологията, ако граматичната структура е зададена неразумно, ще възникне проблемът с грешка при компилация. Предният дизайн изисква по-добра точност и дизайнерите могат да извършват коригираща работа, което ще повлияе на точността на компилацията. Ако има грешки в дизайна на предния край, това ще повлияе на ефекта от компилирането на език C.

Цялостният дизайн на компилатора на език C

Компилаторът на език C е усъвършенствано устройство, което може да преобразува досадни и сложни програми в машинен език и има функцията да опростява сложните в процеса на разделяне компилатора на езика C, е необходимо да се разберат принципите на състава на граматиката, дизайнерът трябва гъвкаво да усвои знанията за граматиката на езика и също така да приложи метода за преобразуване на кода на езика C. Когато цялостният дизайн на компилатора на езика C се извършва, е необходимо да се започне от Старт със следните аспекти.

1 Лексикален анализ

Програмите на език C имат известна сложност. Граматическият анализ е основният етап от компилацията. Този процес е главно за сканиране на лексикалните, така че етапът на лексикален анализ, компилация Скенерът се използва и като скенер. Неговата основна задача е да свърже знаците в изходната програма и да разпознае думите в нея и да преобразува речника, да го преобразува във вътрешен код и да анализира неговата граматика с марка. В процеса на компилиране словните символи обикновено се преобразуват в двоична форма. Категориите думи включват главно двоичен код, разделител, дума и т.н. Когато компютърът работи нормално, скенерът автоматично ще завърши работата по лексикалното сканиране и този процес също автоматично ще изтрие коментари, автоматично ще разпознае думи в изходната програма и ще ги конвертира към вътрешни кодове. От гледна точка на работните методи, процесът на компилиране и граматиката принадлежат към два интерфейсни метода. От функционална гледна точка, процесът на лексикален анализ на компилатора е главно да преобразува съответната изходна програма на знаци във формата на низ от думи.

2 Семантичен анализ

След като преобразуваме компилираната програма във вътрешно представяне, ние наричаме това вътрешно представяне междинен език или междинен код, който има ясно значение. Структурата е проста и принадлежи към система за маркиране. Например, някои компилатори по същество нямат междинен код, но за да се осигури независима работа на машината в практически приложения и за да се улесни оптимизирането на целевия код, в много компилатори е зададен междинен език. Този междинен език е между машинния език и изходния език за програмиране и програмата е сравнително сложна, но компилаторът на езика C промени горния статус до голяма степен. Неговият семантичен анализ и синтаксисен анализ са относително зрели, а теорията и алгоритъмът са относително завършени. Проблемът е, че няма призната формална система и междинният код все още е близо до формален метод.

3 Анализ на синтаксиса

Анализът на синтактиката се основава главно на изходната програма под формата на низове от думи като анализ и входни обекти. Неговата най-фундаментална цел и задача е да използва граматичните правила на езика за проектиране като стандарти, специфичен анализ на граматичната структура на изходната програма, според граматичните правила на езика за проектиране, анализ на граматичните компоненти на тези изходни програми, като функции, индексни променливи, различни програмни изрази, различни изрази и т.н. И за да премине коректността на проверката на граматиката, междинният код се обработва на етапи. Въпреки това, едно нещо, което трябва да се отбележи, е, че процесът на намаляване се извършва според нуждите и трябва да има съответните граматически грешки. След това можете да изтриете всички входни символи, да промените горния модел, да извършите анализ на преместване и намаляване и на тази основа да продължите да търсите подходяща стратегия за формиране на ефективен метод за граматичен анализ.

Курс по принцип на компилация

Като важен професионален курс за компютърни специалности, „Принципи на компилация“ е основата за задълбочено изучаване на знания в професионална област в бъдеще. Като професионален курс по компютърни науки и технологии, този курс съчетава познанията по множество дисциплини като дискретна математика, структура на данните, операционна система и принципи на компютърна композиция. Това е изчерпателен и теоретичен курс. Поради съдържанието на принципа на компилация С горните характеристики все още има някои проблеми в експерименталното обучение. Ако искате да проектирате и произведете пълен компилатор в експерименталната част на принципа на компилация, периодът на експеримента е дълъг, участват много модули и връзката между модулите е по-сложна и не е лесно да се види цялостната ефект веднага.

Проблеми при преподаването на курса по традиционните принципи на компилация

Първият езиков курс за студенти със специалност компютърни науки е езикът C. Езикът C е склонен към някои неуловими грешки поради неговата несигурност на типа, което затруднява учениците да откриват и решават проблеми. Ако студентите могат точно да локализират вида и местоположението на грешките в програмата според бързата информация, предоставена от компилатора, и да приложат наученото в принципите на компилирането към действителните нужди на програмирането на език C, това не само ще завърши обучението, съдържанието на курса, но също така подобряват възможностите на студентите за софтуерно програмиране и системен анализ.

Започвайки от действителното преподаване на принципите на компилация в обикновените колежи и университети, обхватът на покритието на учебната програма обикновено е ограничен до предния край на компилатора, тоест лексикален анализ, граматически анализ и превод с граматически насоки. Това включва голям брой абстрактни и логически сложни теоретични знания, като теория на формалния език, формални форми, крайни автомати, граматика без контекст, граматика на атрибути и превод, управляван от граматика. Традиционният метод на преподаване набляга на внушаването на точки от знания, което позволява на учениците да решат един изолиран проблем, без връзката между точките от знания. Този метод на преподаване „да се виждат само дърветата, а не гората“ значително ще отслаби ентусиазма на учениците за учене, което ще доведе до лоши общи резултати.

Практически ориентирано преподаване на принципите за съставяне на взаимопомощ

(1) Връзката между теория и практика

Източникът на теоретични знания обикновено има определени проблеми Предистория. Не е полезно да се подобри практическата способност на студентите да водят теоретично обучение изолирано от практически проблеми. Големият обем от теоретични знания в курса Compiler Principles има сплотена и прогресивна връзка. Въвеждането и разширяването на всяка точка от знания е възпроизвеждането на пътя на решението на проблемите, срещани в реалността. Следователно целият процес на обучение възпроизвежда еволюцията на това решение. Ключът към постигането на тази цел е, че сега учителят се е променил от „стоящ пред трибуната“ към „седнал сред учениците“. Тази промяна не просто оставя всички въпроси на учениците, от „преподаване“ до „отговаряне на въпроси“, но също така повишава изискванията към учителите от всички аспекти на проектиране на проблеми, мислене и просветление, дискусия и насоки до управление на процеса. По-специално, развитието на съвременните езици на високо ниво се променя с всеки изминал ден и различни нови въпроси възникват в безкраен поток. Когато се сблъсквате с открити и неизвестни проблеми, как да дадете на учениците начин за решаване на проблема от систематична и цялостна гледна точка, вместо да давате конкретни отговори на всеки въпрос, Това е нов тест за способностите на учителите.

(2) Дизайн на компилатора и план за внедряване

В идеалната ситуация на преподаване на принципи на компилиране, студентите трябва да могат самостоятелно да завършат изграждането на малка система за компилиране. В действителното преподаване студентите трябва само да разберат ключовите принципи на знанието, като детерминирането на NFA, изграждането на FIRST и FOLLOW набори в LL (1) граматиката и идентифицирането на живата префикс DFA структура в LR (1) граматиката . Отговарят на изискванията за изпита на курса. Самото теоретично обучение обаче далеч не е достатъчно, за да се приложи основен компилатор. В сравнение с приемането на теоретичните знания от студентите, липсата на способност на студентите да попълнят системата за компилиране по собствена инициатива е още по-очевидна. Как да се обърнем към всички студенти и да разработим набор от приложими практически програми е ключът към действителната ефективност на курса.

Развитието на технологията за компилиране

В ранните дни на компютъра на фон Нойман (1940 г.) програмите са били написани на машинен език и машинният език всъщност е съхранявал 01 код, написан. Процедурата е много скучна. По-късно асемблерният език замени машинния език със символна форма на инструкции за работа и адресно кодиране. Асемблерният език обаче все още има много недостатъци. Трудно е за четене и разбиране и трябва да зависи от конкретна машина. Ако искате да накарате написана програма да работи на друг компютър, трябва да я пренапишете. През 50-те години на миналия век Джон Бекъс от IBM ръководи изследователски екип за разработване на езика от високо ниво FORTRAN и неговия компилатор. Инструментите за автоматично генериране за компилатори започват да се оформят и сега много инструменти за автоматично генериране са широко използвани, като инструмента за синтаксисен анализ LEX, програмата за езиков анализ YACC и т.н. През 60-те години хората продължават да използват технологията за самокомпилиране за конструиране на компилатори, тоест самият компилиран език се използва за имплементиране на компилатора на езика, но неговите основни принципи и структура са приблизително същите. След непрекъснато развитие, съвременната технология за компилиране стана по-зряла и бързото развитие на много езици на високо ниво е неделимо от напредъка на технологията за компилиране.

Основният процес на компилиране

Компилирането може да бъде разделено на пет основни стъпки: лексикален анализ, синтаксисен анализ, семантичен анализ и генериране на междинен код, оптимизация и генериране на целеви код. Това са основните стъпки и процеси, които всеки компилатор трябва да въведе изходни програми на високо ниво от изходния език и изведе кодовете на целевия език.

1 Лексикален анализ

Лексикалният анализатор сканира низа, съставляващ изходната програма, отляво надясно чрез програмата за лексикален анализ, чете символ по знак и разпознава всеки символ на думата. Разпознатият символ обикновено се извежда в двоична форма, която включва кода на тип символ и стойността на символа. Лексикалните анализатори обикновено съществуват под формата на функции, които анализаторът да извиква. Разбира се, може да съществува и независима програма за лексикален анализатор. Програмата, която изпълнява задачата за лексикален анализ, се нарича програма за лексикален анализ или лексикален анализатор или скенер.

2 Анализ на синтаксиса

Синтактичният анализ е вторият етап от процеса на компилиране. Задачата на този етап е да комбинира разпознатата последователност от символи на думи в различни граматически фрази въз основа на лексикален анализ, като „изречение“, „израз“ и т.н. Основната стъпка на програмата за граматичен анализ е да определи дали изречението на изходната програма отговаря на определението Граматичните правила на граматиката са правилни в граматичната структура. А граматическото правило се нарича още граматика. Чомски разделя граматиката на тип 0, тип 1, тип 2 и тип 3 граматика въз основа на различни наложени ограничения. Граматиката от тип 0 се нарича още граматика на фрази, а тип 1 се нарича контекстно-чувствителна граматика. , тип 2 се нарича безконтекстна граматика, а граматиката от тип 3 се нарича обикновена граматика и условията на ограничаване нарастват последователно.

3 Семантичен анализ

Лексикалният анализ се фокусира върху това дали всяка дума е легална и към коя част от езика принадлежи думата. Безконтекстната граматика на граматическия анализ се фокусира върху това дали въведеното изречение може да съответства на продукцията според граматиката. След това семантичният анализ е да се разбере дали връзката между всяка граматична единица е законна. В реално приложение това е да се извърши контекстно-чувствителен преглед на природата и преглед на типа на изходни програми, които са структурно правилни.

4 Генериране и оптимизиране на междинен код

След фазите на синтактичен и семантичен анализ на работа, някои компилатори превръщат изходната програма във вътрешно представяне. Вътрешното представяне се нарича междинен език или междинно представяне или междинен код. Така нареченият "междинен код" е символна система с проста структура и ясно значение. Сложността на тази символна система е между изходния програмен език и машинния език и е лесно да се преведе в обектен код. В допълнение, машинно-независима оптимизация може да се извърши и на ниво междинен код.

5 Генериране на целеви код

Съгласно оптимизирания междинен код може да се генерира ефективен целеви код. Обикновено компилаторът го превежда в асемблен код и в този момент асемблерният код трябва да бъде асемблиран в машинния език на целевата машина от асемблера.

6 Обработка на грешки

На всеки етап от компилирането могат да бъдат открити грешки в изходния код, особено по време на етапа на анализ на синтаксиса, могат да бъдат открити голям брой грешки, така че компилаторът трябва да направи обработка на грешките. Докладвайте информация като вида на грешката и местоположението на грешката.

Общ преглед на процеса на компилиране

Текущата структура в паметта, когато се изпълняват изходната програма на езика C и съответната изпълнима програма, най-важният процес за реализиране на това преобразуване е компилирането.

Изходната програма е за хората да я видят. По същество това е текстов файл. Тя може да бъде отворена и написана с програма за редактиране на текст като vi в Linux или Notepad в Windows, но компютърът не може директно да изпълни програмата източник. , Необходимо е изходната програма да се компилира в компютърно изпълнима програма чрез специална програма и тази специална програма е компилаторът. Процесът на компилиране се разделя основно на лексикален анализ, синтактичен анализ, генериране на междинен код и генериране на целеви код (игнорирайки предварителна обработка, семантичен анализ, оптимизация и т.н.). По-долу обясняваме накратко основния процес на компилиране на свой ред.

Лексикален анализ

Изходният код, който се вижда в човешките очи, е следният:

int fun(int a,int b); int m=10 ;Int main(){int int i=4;int j=5;m=fun(i,j);return 0;int a,int bun(int a,int c=0;c =a+b;return c;_}

И съхранената му форма в компютъра е показана на Фигура 1-36.

Фигура 1-36 Шестнадесетичната форма на програмата за казус

Няма ключови думи, оператори, идентификатори или дори кои знаци принадлежат към един и същи символ. Първият етап на компилация е лексикален анализ, чиято цел е да идентифицира символите един по един в последователни знаци и да идентифицира атрибутите на символите, доколкото е възможно.

Когато хората гледат изходната програма на езика C, те могат да видят идентификатори и ключови думи с един поглед с помощта на интервали и скоби. В сравнение с хората, интелигентността на компютрите в днешно време е все още доста ниска. Той не може да чете няколко знака едновременно, както правят хората. Той може само да разпознава символи един по един въз основа на много механична "електронна версия" на морфологията. Морфологията на "електронната версия" е въплътена чрез интегриране на идеите на диаграмата на прехода на състоянието в кода на лексикалния анализатор. Лексикалният анализатор разпознава токени от низа на изходната програма и ги записва в ред.

Резултатът от лексикалния анализ е показан на фигура 1-37.

Фигура 1-37 Резултати от лексикален анализ

В етапа на лексикалния анализ значението на някои символи може да бъде разпознато, включително ключови думи, числа и знаци, низ, разделител, значението на тези символи може да бъде определено без помощта на други символи. Например "int" трябва да представлява тип цяло число. Не може да бъде име на променлива или оператор.

Другите символи трябва да предават други символи преди и след, за да се определи точното значение. Например „m“ може да се прецени само като идентификатор в лексикалния етап, но ако изречението не се анализира, е невъзможно да се знае дали идентификаторът представлява променлива или функция. По-подробна информация може да бъде получена само чрез анализ на модела на изречението, в което се намира символът. Тази част от работата се извършва чрез граматичен анализ.

Анализ на синтаксиса

Ако функцията на лексикалния анализ е да идентифицира идентификатори, ключови думи, числа и оператори от последователни знаци и да ги съхранява като поток от токени, граматиката Функцията на анализа е да идентифицира изречения които съответстват на граматиката на езика C от символния поток, идентифициран чрез лексикален анализ.

Тъй като компютърът не може да разглежда множество идентификатори, ключови думи, числа и оператори едновременно като човек, той не може да види с един поглед, че това е декларация на функция, това е оператор if и може да бъде само много тромаво идентифицира един символ по символ. Подобно на лексикалния анализатор, граматичният анализатор също се основава на граматиката, представена от компютъра, който разпознава изреченията, съответстващи на граматиката на езика C, символ по символ. Компютърното представяне на граматиката е производството. В синтактичния анализатор граматиката на езика C, генерирана от продукцията, се преобразува в набор от шаблони и този набор от шаблони е интегриран в програмата на синтактичния анализатор. Функцията на граматичния анализатор е да съпоставя лексемите, разпознати от лексикалния анализатор, с този набор от шаблони един по един. Ако определена граматика в този набор от шаблони е съпоставена, може да бъде идентифицирано и определено пълно изречение. Синтаксисът на изречението.

Взимаме оператора за деклариране на функцията "int fun(int a, int b);" в случая като пример за описание на този процес. Сценарият за съвпадение с шаблона на извлечение е показан на Фигура 1-38.

Фигура 1-38 Резултатът от съпоставянето на израза за деклариране на забавна функция с шаблона

Този поток от токени най-накрая съвпада с шаблона за декларация на функция и съвпадението е успешно. По-късно компютърът разглежда този израз като израз за декларация на функция и го записва в паметта под формата на синтактично дърво, както е показано на Фигура 1-39 .

Фигура 1-39 Синтаксисното дърво, генерирано от израза за декларация на забавната функция

Много гениално и далновидно е да се запише анализираното твърдение в дървовидна структура, изборът на цялостно разглеждане. От една страна, дървовидната структура може да "запомни" целия "смисъл" на изходната програма. От друга страна, дървовидната структура по-лесно съответства на структурата по време на изпълнение.

От синтактичното дърво през междинния код до целевия код

Досега синтактичното дърво пренасяше цялата информация на изходната програма и последващата работа по преобразуване няма нищо общо с изходния програма.

Ако искате да конвертирате от синтактичното дърво към целевия код в една стъпка, това е осъществимо както на теория, така и на практика. Компютрите обаче имат множество процесорни хардуерни платформи. Като се има предвид преносимостта на програмите между различни процесори, те първо се преобразуват в обща и абстрактна "инструкция на процесора". Това е оригиналната идея за дизайн на междинния код. След това в зависимост от конкретния избран процесор, междинният код се внедрява в целевия код на конкретния процесор.

Синтактичното дърво е двуизмерна структура. Междинният код е квазиедномерна структура. Процесът на преобразуване от синтактичното дърво към междинния код по същество е процес на преобразуване на двумерната структура в квазиедномерна структура. Междинният код, особено RTL, вече може да съответства едно към едно на структурата на времето за изпълнение. Както е показано на фигура 1-40.

Фигура 1-40 показва сценария, при който междинният код съответства на целевия код

Структурата по време на изпълнение също е едномерна, както е показано в лявата част на Фиг. 1-40. Резултатът от преобразуването ще бъде по-близо до структурата по време на изпълнение.

След като изберете конкретния процесор и операционна система, междинният код може да бъде преобразуван в кода за сглобяване на целевия код (ние конфигурираме сглобяването на AT&T), в този момент влиянието на операционната система е сравнително малко. След това асемблерът преобразува .s файла в конкретен обектен файл според формата на обектния файл на избраната операционна система, който е .o файл за Linux и .obj файл за Windows. Машинните инструкции на избрания CPU вече са в целевия файл.

Накрая, линкерът свързва един или повече обектни файлове (библиотечните файлове също са обектни файлове по природа) в изпълними файлове, които отговарят на посочения формат на избраната операционна система.

Чрез операционната система изпълнимите програми могат да бъдат заредени в паметта за изпълнение, образувайки структурата за изпълнение, която видяхме в предишните два раздела.

Последващото съдържание на тази книга ще обясни подробно основния процес на компилация: лексикален анализ, анализ на синтаксиса, междинен код към целевия код, след това асемблиране и свързване и накрая ще обясни предварителната обработка.

Related Articles
TOP