Главная страница Случайная лекция Мы поможем в написании ваших работ! Порталы: БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика Мы поможем в написании ваших работ! |
ПРИНЦИПЫ ТРАНСЛЯЦИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ
Программу, написанную на языке программирования высокого уровня (исходный модуль), необходимо преобразовать в такой вид, чтобы она могла быть исполнена на компьютере, т.е. произвести трансляцию. Программы-трансляторы делятся на два основных вида: интерпретаторы и компиляторы. Интерпретатор последовательно обрабатывает каждое предложение (оператор) исходного модуля и немедленно его исполняет. Компилятор преобразует исходный модуль в машинную программу (исполняемый модуль), состоящий из машинных команд. После этого исполняемый модуль может выполняться на компьютере многократно. Возможен также промежуточный вид транслятора, транслятор интерпретирующего типа, когда вначале исходный модуль преобразуется в программу на некотором промежуточном языке и только потом исполняется интерпретатором. Эффективность транслятора зависит от его типа. Интерпретатор относительно быстро обрабатывает каждое предложение языка программирования, а затем его исполняет. Если сравнить время обработки и исполнения некоторого предложения языка и время исполнения группы машинных команд, эквивалентных этому предложению, то разница может достигать нескольких сот раз. В трансляторе интерпретирующего типа время исполнения команд промежуточного языка может быть в десятки раз больше времени исполнения эквивалентной группы машинных команд. Время исполнения программы, полученной компилятором, обычно больше, чем время исполнения эквивалентной программы в машинных командах, написанной вручную квалифицированным программистом, разница может составлять от полутора до трех раз и более. Однако ввиду чрезмерно большой трудоемкости написания программ непосредственно в машинных командах в настоящее время в подавляющем числе случаев используют языки программирования. Компиляторы более эффективны, чем интерпретаторы, однако их создание требует в десятки раз большего труда, чем создание интерпретаторов. Описание языка программирования состоит из синтаксиса и семантики. Синтаксис, представляющий формальные правила записи предложений языка, задается порождающей грамматикой. Семантика придает смысл предложениям языка, она может быть задана разными способами, в частности, описанием на русском (или английском) языке. Для того чтобы реализовать семантику в трансляторе, достаточно описать только ту ее часть, которую можно задать в виде семантических программ, дополняющих алгоритм грамматического разбора и выполняющих собственно трансляцию. Порождающая грамматика для задания синтаксиса языка программирования (КС-грамматика) обычно имеет довольно большой размер, в частности, количество нетерминальных символов может доходить до несколько сот. В то же время отдельные конструкции языка могут описываться гораздо более простой А-грамматикой. Это лексемы – имена (идентификаторы), служебные слова, константы и др. Поэтому всю грамматику описывают в виде двухуровневой: на нижнем уровне А-грамматика, начальные нетерминалы которой суть распознанные лексемы, а на верхнем уровне КС-грамматика, в которой лексемы используются как терминальные символы. Это позволяет существенно упростить наиболее сложную КС-грамматику и за счет этого не только облегчить создание транслятора, но и ускорить процесс трансляции. В целом работа компилятора содержит следующие этапы: 1) лексический анализ, выделение лексем и формирование таблиц, содержащих информацию о лексемах (типы имен переменных, значения констант); 2) синтаксический анализ, перевод программы во внутреннюю форму; 3) оптимизация внутренней формы программы; 4) генерация машинных команд; 5) оптимизация машинных команд. В простом компиляторе могут отсутствовать этапы оптимизации. Кроме того, этап лексического анализа может выполняться не сразу весь, а совмещаться с синтаксическим анализом, формируя на выходе очередную распознанную лексему. Многие современные компиляторы разрабатываются таким образом, чтобы была возможность генерации машинных команд для нескольких типов процессоров и различных операционных систем. В этом случае для каждого типа процессора достаточно реализовать дополнительно 4-й и 5-й этапы трансляции. Кросс-компилятор реализуется как программа, выполняющаяся на некотором рабочем процессоре (и операционной системе), но генерирующая команды для другого (объектного) процессора. При этом, чтобы отладить такую программу, необходима программа-эмулятор, которая могла бы на рабочем процессоре моделировать выполнение команд объектного процессора. Программа-эмулятор необходима еще и потому, что на ней можно произвести детальную диагностику во время выполнения программы. Это особенно важно, если объектный процессор является встроенным, и в нем и его операционной системе не предусмотрены средства отладки. Заметим, что описать машинный язык, являющийся входным для программы-эмулятора, можно средствами А-грамматик. Транслятор интерпретирующего типа при прочих равных условиях гораздо проще компилятора. Такой транслятор содержит этапы: 1) лексического анализа и выделения лексем; 2) синтаксического анализа и генерации программы на промежуточном языке; 3) исполнения (интерпретации) программы на промежуточном языке. В принципе программу на промежуточном языке можно скомпоновать в виде модуля на промежуточном языке и затем многократно исполнять, запуская ее выполнение под управлением программы-интерпретатора (реализующего 3-й этап трансляции). Тогда такой транслятор можно считать кросс-компилятором промежуточного языка.
Дата добавления: 2015-07-26; просмотров: 118; Нарушение авторских прав Мы поможем в написании ваших работ! |