Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




ПРИНЦИПЫ ТРАНСЛЯЦИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ

 

Программу, написанную на языке программирования высокого уровня (исходный модуль), необходимо преобразовать в такой вид, чтобы она могла быть исполнена на компьютере, т.е. произвести трансляцию. Программы-трансляторы делятся на два основных вида: интерпретаторы и компиляторы. Интерпретатор последовательно обрабатывает каждое предложение (оператор) исходного модуля и немедленно его исполняет. Компилятор преобразует исходный модуль в машинную программу (исполняемый модуль), состоящий из машинных команд. После этого исполняемый модуль может выполняться на компьютере многократно. Возможен также промежуточный вид транслятора, транслятор интерпретирующего типа, когда вначале исходный модуль преобразуется в программу на некотором промежуточном языке и только потом исполняется интерпретатором.

Эффективность транслятора зависит от его типа. Интерпретатор относительно быстро обрабатывает каждое предложение языка программирования, а затем его исполняет. Если сравнить время обработки и исполнения некоторого предложения языка и время исполнения группы машинных команд, эквивалентных этому предложению, то разница может достигать нескольких сот раз. В трансляторе интерпретирующего типа время исполнения команд промежуточного языка может быть в десятки раз больше времени исполнения эквивалентной группы машинных команд. Время исполнения программы, полученной компилятором, обычно больше, чем время исполнения эквивалентной программы в машинных командах, написанной вручную квалифицированным программистом, разница может составлять от полутора до трех раз и более. Однако ввиду чрезмерно большой трудоемкости написания программ непосредственно в машинных командах в настоящее время в подавляющем числе случаев используют языки программирования. Компиляторы более эффективны, чем интерпретаторы, однако их создание требует в десятки раз большего труда, чем создание интерпретаторов.

Описание языка программирования состоит из синтаксиса и семантики. Синтаксис, представляющий формальные правила записи предложений языка, задается порождающей грамматикой. Семантика придает смысл предложениям языка, она может быть задана разными способами, в частности, описанием на русском (или английском) языке. Для того чтобы реализовать семантику в трансляторе, достаточно описать только ту ее часть, которую можно задать в виде семантических программ, дополняющих алгоритм грамматического разбора и выполняющих собственно трансляцию.

Порождающая грамматика для задания синтаксиса языка программирования (КС-грамматика) обычно имеет довольно большой размер, в частности, количество нетерминальных символов может доходить до несколько сот. В то же время отдельные конструкции языка могут описываться гораздо более простой А-грамматикой. Это лексемы – имена (идентификаторы), служебные слова, константы и др. Поэтому всю грамматику описывают в виде двухуровневой: на нижнем уровне А-грамматика, начальные нетерминалы которой суть распознанные лексемы, а на верхнем уровне КС-грамматика, в которой лексемы используются как терминальные символы. Это позволяет существенно упростить наиболее сложную КС-грамматику и за счет этого не только облегчить создание транслятора, но и ускорить процесс трансляции.

В целом работа компилятора содержит следующие этапы:

1) лексический анализ, выделение лексем и формирование таблиц, содержащих информацию о лексемах (типы имен переменных, значения констант);

2) синтаксический анализ, перевод программы во внутреннюю форму;

3) оптимизация внутренней формы программы;

4) генерация машинных команд;

5) оптимизация машинных команд.

В простом компиляторе могут отсутствовать этапы оптимизации. Кроме того, этап лексического анализа может выполняться не сразу весь, а совмещаться с синтаксическим анализом, формируя на выходе очередную распознанную лексему.

Многие современные компиляторы разрабатываются таким образом, чтобы была возможность генерации машинных команд для нескольких типов процессоров и различных операционных систем. В этом случае для каждого типа процессора достаточно реализовать дополнительно 4-й и 5-й этапы трансляции.

Кросс-компилятор реализуется как программа, выполняющаяся на некотором рабочем процессоре (и операционной системе), но генерирующая команды для другого (объектного) процессора. При этом, чтобы отладить такую программу, необходима программа-эмулятор, которая могла бы на рабочем процессоре моделировать выполнение команд объектного процессора. Программа-эмулятор необходима еще и потому, что на ней можно произвести детальную диагностику во время выполнения программы. Это особенно важно, если объектный процессор является встроенным, и в нем и его операционной системе не предусмотрены средства отладки. Заметим, что описать машинный язык, являющийся входным для программы-эмулятора, можно средствами А-грамматик.

Транслятор интерпретирующего типа при прочих равных условиях гораздо проще компилятора. Такой транслятор содержит этапы:

1) лексического анализа и выделения лексем;

2) синтаксического анализа и генерации программы на промежуточном языке;

3) исполнения (интерпретации) программы на промежуточном языке.

В принципе программу на промежуточном языке можно скомпоновать в виде модуля на промежуточном языке и затем многократно исполнять, запуская ее выполнение под управлением программы-интерпретатора (реализующего 3-й этап трансляции). Тогда такой транслятор можно считать кросс-компилятором промежуточного языка.



<== предыдущая страница | следующая страница ==>
Задача распознавания цепочек языка | Конечный автомат

Дата добавления: 2015-07-26; просмотров: 118; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.