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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Языки программиро<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 />

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

Program Hello;<br />

begin<br />

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

end.<br />

HELLO_TEXT CODE<br />

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

+t<br />

+@ О++p &¦<br />

3э.О С +l +r ш¦ _<br />

6s _6q _6<br />

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

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

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

+} А~ t<br />

&¦ -Gў+ў+Г+<br />

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

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

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

ЛV<br />

ЛF<br />

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

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

3<br />

1


Типы языко<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>ания © М.Л. Цымблер<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>ания © М.Л. Цымблер<br />

5<br />

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

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

блок<br />

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

блок<br />

Таблицы<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

6<br />

2


Таблицы<br />

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

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

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

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

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

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

7<br />

Лексический блок<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 />

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

блок<br />

myprog.pas Лексемы<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

8<br />

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

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

Лексема Класс Значение<br />

if if –<br />

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

>= Операции отношения Больше либо ра<strong>в</strong>но<br />

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

then then –<br />

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

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

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

9<br />

3


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

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

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

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

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

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

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

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

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

Лексемы<br />

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

блок<br />

Атомы<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

10<br />

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

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

� 2<br />

� 2<br />

Лексема Класс Значение<br />

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

+ Аддити<strong>в</strong>ные операции Сложить<br />

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

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

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

Атом Класс Значение<br />

УМНОЖ(B,C,R1) Умножить Индексы B, C, R1 (системная переменная) <strong>в</strong><br />

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

СЛОЖ(R1,A,R2) Сложить Индексы A, R1 и R2 (системные переменные)<br />

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

11<br />

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

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

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

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

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

Атомы<br />

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

кода<br />

HELLO_TEXT CODE<br />

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

+t<br />

+@ О++p &¦<br />

3э.О С +l +r ш¦ _<br />

6s _6q _6<br />

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

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

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

+} А~ t<br />

&¦ -Gў+ў+Г+<br />

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

12<br />

4


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

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

блок<br />

Таблицы<br />

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

блок<br />

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

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

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

кода<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<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>ания © М.Л. Цымблер<br />

14<br />

Блок оптимизации<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>ания © М.Л. Цымблер<br />

15<br />

5


Проходы компилятора<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>ания © М.Л. Цымблер<br />

16<br />

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

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

блок<br />

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

блок<br />

Таблицы<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

17<br />

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

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

блок<br />

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

блок<br />

Таблицы<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

18<br />

6


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

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

блок<br />

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

блок<br />

Таблицы<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

19<br />

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

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

блок<br />

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

блок<br />

Таблицы<br />

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

кода<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

20<br />

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

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

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

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

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

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

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

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

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

21<br />

7


Заключение<br />

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

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

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

транслятор. Трансляторы разделяются на<br />

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

�� Компиляция осущест<strong>в</strong>ляется тремя последо<strong>в</strong>ательно<br />

соединенными блоками: лексический блок,<br />

синтаксический блок и генератор кода, которые<br />

имеют доступ к общему набору таблиц.<br />

� В за<strong>в</strong>исимости от способа передачи упра<strong>в</strong>ления от<br />

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

однопроходные, д<strong>в</strong>ухпроходные и трехпроходные.<br />

Языки программиро<strong>в</strong>ания © М.Л. Цымблер<br />

22<br />

8

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

Saved successfully!

Ooh no, something went wrong!