20.01.2013 Views

Введение в методы трансляции

Введение в методы трансляции

Введение в методы трансляции

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong><br />

<strong>трансляции</strong><br />

Если <strong>в</strong> <strong>в</strong>ашей программе нет ошибок –<br />

сообщите разработчику транслятора,<br />

чтобы он испра<strong>в</strong>ил ошибку <strong>в</strong> трансляторе.<br />

Из программистского фольклора<br />

Компьютерные науки © М.Л. Цымблер<br />

Содержание<br />

� Понятие языко<strong>в</strong>ого процессора<br />

� Компиляторы как класс программного<br />

обеспечения<br />

� Упрощенная модель компилятора<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 2<br />

Понятие языко<strong>в</strong>ого процессора<br />

� Компьютер <strong>в</strong>ыполняет программы на языке<br />

машинных команд. Программист создает<br />

программы на языке программиро<strong>в</strong>ания.<br />

� Языко<strong>в</strong>ый процессор обеспечи<strong>в</strong>ает <strong>в</strong>ыполнение<br />

на компьютере директи<strong>в</strong> и предложений<br />

программы, написанной программистом.<br />

hello.pas<br />

Program Hello;<br />

begin<br />

WriteLn(‘При<strong>в</strong>ет!’);<br />

end.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Компилятор<br />

HELLO_TEXT CODE<br />

+ X+ -!s щn ¦ - Й БЙ Г<br />

+t +@ О++p &¦ 3э.О С +l +r ш¦ _<br />

6s _6q _6<br />

ў_Г_0 щ¦ d __Й6 +__^]- UЛьVЛv<br />

Vш+_Л¦^]-<br />

Л^ Г_$w\А_ rWЛF ЛN<br />

+} А~ t &¦ -Gў+ў+Г+<br />

ыЁ+-ўє6ИF<br />

+uЇНN_ў+ +№N6К ,<br />

s :ы F ктю_ к ЛV ЛF<br />

_^Лх]- UЛь3+P_v _v _v +<br />

P_ P_aPшb_]- UЛьЛ^ -<br />

hello.exe<br />

© М.Л. Цымблер 3<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 1


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Типы языко<strong>в</strong>ых процессоро<strong>в</strong><br />

� Интерпретатор – <strong>в</strong>ыполняет программу на<br />

исходном языке.<br />

� Транслятор – пере<strong>в</strong>одит программу на<br />

исходном языке <strong>в</strong> язык машинных команд.<br />

� Ассемблер – транслятор языка низкого<br />

уро<strong>в</strong>ня.<br />

� Компилятор – транслятор языка <strong>в</strong>ысокого<br />

уро<strong>в</strong>ня.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 4<br />

Компиляторы как класс программного обеспечения<br />

� Многочисленные реализации из<strong>в</strong>естных языко<strong>в</strong><br />

<strong>в</strong>ысокого уро<strong>в</strong>ня.<br />

� Разработка но<strong>в</strong>ых языко<strong>в</strong> <strong>в</strong>ысокого уро<strong>в</strong>ня<br />

требует разработки компиляторо<strong>в</strong>.<br />

� Разработка но<strong>в</strong>ых аппаратных архитектур<br />

требует разработки но<strong>в</strong>ых компиляторо<strong>в</strong> для<br />

из<strong>в</strong>естных языко<strong>в</strong> <strong>в</strong>ысокого уро<strong>в</strong>ня.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 5<br />

Упрощенная модель компилятора<br />

Лексический<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Таблицы<br />

Генератор<br />

кода<br />

© М.Л. Цымблер 6<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 2


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Таблицы<br />

� Таблицы хранят долго<strong>в</strong>ременную и/или<br />

глобальную информацию о программе.<br />

� Одна из таблиц – таблица имен (таблица<br />

идентификаторо<strong>в</strong>, таблица сим<strong>в</strong>оло<strong>в</strong>), <strong>в</strong><br />

которой накапли<strong>в</strong>ается информация об<br />

идентификаторах программы.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Лексический блок<br />

© М.Л. Цымблер 7<br />

� Лексический блок преобразует последо<strong>в</strong>ательность<br />

сим<strong>в</strong>оло<strong>в</strong> (цепочку) на исходном языке <strong>в</strong><br />

последо<strong>в</strong>ательность лексем.<br />

� Лексема – наименьшая цепочка исходного языка,<br />

имеющая заранее определенный смысл. Лексема<br />

состоит из д<strong>в</strong>ух частей:<br />

� класс – указы<strong>в</strong>ает на характер информации <strong>в</strong> лексеме<br />

� значение – собст<strong>в</strong>енно значение лексемы.<br />

myprog.pas Лексический<br />

Лексемы<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 8<br />

Пример: работа лексического блока<br />

� Цепочка: if B>=2 then A:=0<br />

Лексема<br />

if<br />

B<br />

>=<br />

2<br />

then<br />

A<br />

:=<br />

0<br />

if<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Переменные<br />

Операции отношения<br />

Константы<br />

then<br />

Переменные<br />

Оператор прис<strong>в</strong>аи<strong>в</strong>ания<br />

Константы<br />

Класс<br />

Индекс B <strong>в</strong>таблицеимен<br />

Больше либо ра<strong>в</strong>но<br />

2<br />

–<br />

Индекс A <strong>в</strong>таблицеимен<br />

0<br />

Значение<br />

–<br />

–<br />

© М.Л. Цымблер 9<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 3


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Синтаксический блок<br />

� Синтаксический блок преобразует цепочку<br />

лексем <strong>в</strong> цепочку атомо<strong>в</strong>.<br />

� Атом – элементарная операция;<br />

последо<strong>в</strong>ательность атомо<strong>в</strong> отражает порядок<br />

<strong>в</strong>ыполнения операций.<br />

Атом состоит из д<strong>в</strong>ух частей:<br />

� класс – <strong>в</strong>ид операции<br />

� значение – набор указателей на операнды операции.<br />

Лексемы<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

� Цепочка: A+B*C<br />

� 2Лексема<br />

� 2<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Атомы<br />

© М.Л. Цымблер 10<br />

Пример: работа синтаксического блока<br />

A<br />

+<br />

B<br />

*<br />

C<br />

Атом<br />

УМНОЖ(B,C,R1)<br />

СЛОЖ(R1,A,R2)<br />

Переменные<br />

Аддити<strong>в</strong>ные операции<br />

Переменные<br />

Переменные<br />

Класс<br />

Мультипликати<strong>в</strong>ные операции<br />

Класс<br />

Умножить<br />

Сложить<br />

Генератор кода<br />

Индекс A <strong>в</strong> таблице имен<br />

Сложить<br />

Индекс B <strong>в</strong> таблице имен<br />

Умножить<br />

Значение<br />

Индекс C <strong>в</strong> таблице имен<br />

Значение<br />

Индексы B, C, R1 (системная переменная) <strong>в</strong><br />

таблице имен<br />

Индексы A, R1 и R2 (системные переменные)<br />

<strong>в</strong>таблицеимен<br />

© М.Л. Цымблер 11<br />

� Генератор кода преобразует цепочку атомо<strong>в</strong> <strong>в</strong><br />

цепочку команд машинного языка.<br />

� Генератор кода я<strong>в</strong>ляется машинно-за<strong>в</strong>исимым<br />

блоком компилятора.<br />

Атомы<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Генератор<br />

кода<br />

HELLO_TEXT CODE<br />

+ X+ -!s щn ¦ - Й БЙ Г<br />

+t +@ О++p &¦ 3э.О С +l +r ш¦ _<br />

6s _6q _6<br />

ў_Г_0 щ¦ d __Й6 +__^]- UЛьVЛv<br />

Vш+_Л¦^]-<br />

Л^ Г_$w\А_ rWЛF ЛN<br />

+} А~ t &¦ -Gў+ў+Г+<br />

ыЁ+-ўє6ИF<br />

© М.Л. Цымблер 12<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 4


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Дополнительные блоки компилятора<br />

Лексический<br />

блок<br />

Таблицы<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Блок семантической<br />

обработки<br />

Блок оптимизации<br />

кода<br />

Генератор<br />

кода<br />

© М.Л. Цымблер 13<br />

Блок семантической обработки<br />

� Блок семантической обработки <strong>в</strong>ыполняет<br />

часть работы компилятора, с<strong>в</strong>язанную со<br />

смыслом лексем или атомо<strong>в</strong>.<br />

� Пример:<br />

Порождение команд с фиксиро<strong>в</strong>анной или<br />

пла<strong>в</strong>ающей точкой <strong>в</strong> за<strong>в</strong>исимости от операндо<strong>в</strong><br />

атома УМНОЖ(B,C,R1).<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Блок оптимизации<br />

© М.Л. Цымблер 14<br />

� Блок оптимизации по<strong>в</strong>ышает эффекти<strong>в</strong>ность<br />

машинного кода.<br />

� Пример:<br />

до оптимизации – атомы кода<br />

for i:=1 to 100000 do<br />

K:=K+i*(A+B*C);<br />

после оптимизации – атомы кода<br />

tmp:=A+B*C;<br />

for i:=1 to 100000 do<br />

K:=K+i*tmp;<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 15<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 5


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Проходы компилятора<br />

� Проход компилятора – это работа блока (или<br />

блоко<strong>в</strong>) по <strong>в</strong>ыдаче <strong>в</strong>сей цепочки объекто<strong>в</strong><br />

(лексем, атомо<strong>в</strong> или машинных команд) до<br />

передачи упра<strong>в</strong>ления другому блоку.<br />

� Классификация компиляторо<strong>в</strong> по числу<br />

проходо<strong>в</strong>:<br />

� 1-проходные<br />

� 2-проходные<br />

� 3-проходные<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Однопроходный компилятор<br />

Лексический<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Таблицы<br />

© М.Л. Цымблер 16<br />

Генератор<br />

кода<br />

© М.Л. Цымблер 17<br />

Д<strong>в</strong>ухпроходный компилятор (a)<br />

Лексический<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Таблицы<br />

Генератор<br />

кода<br />

© М.Л. Цымблер 18<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 6


Дисциплина "Компьютерные науки" © М.Л. Цымблер<br />

Д<strong>в</strong>ухпроходный компилятор (b)<br />

Лексический<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Таблицы<br />

Генератор<br />

кода<br />

Трехпроходный компилятор<br />

Лексический<br />

блок<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

Синтаксический<br />

блок<br />

Таблицы<br />

© М.Л. Цымблер 19<br />

Генератор<br />

кода<br />

© М.Л. Цымблер 20<br />

Моти<strong>в</strong>ация разбиения на проходы<br />

� Логика языка – компилятору может<br />

потребо<strong>в</strong>аться информация из еще не<br />

просмотренной части программы.<br />

� Оптимизация кода – машинный код можно<br />

сформиро<strong>в</strong>ать более эффекти<strong>в</strong>ным, если<br />

генератору кода доступна информация обо <strong>в</strong>сей<br />

программе.<br />

<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong><br />

© М.Л. Цымблер 21<br />

Лекция "<strong>В<strong>в</strong>едение</strong> <strong>в</strong> <strong>методы</strong> <strong>трансляции</strong>" 7

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!