Введение в методы трансляции
Введение в методы трансляции
Введение в методы трансляции
- TAGS
- code
- program
- mzym.susu.ru
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