Компиляция - это процесс, облегчающий общение программиста и вычислительной машины. Как устроен компилятор

Одной из ключевых характеристик PHP является то, что это интерпретируемый язык программирования. С другой стороны, языки программирования наподобие C , изначально разрабатывались для компиляции. Что это значит?

Компилируется ли язык программирования или интерпретируется, на самом деле это не зависит от природы языка программирования. Любой язык программирования может интерпретироваться так называемым интерпретатором или компилироваться с помощью так называемого компилятора.

Рабочий цикл программы

При использовании любого языка программирования существует определенный рабочий цикл создания кода. Вы пишете его, запускаете, находите ошибки и отлаживаете. Таким образом, вы переписываете и дописываете программу, проверяете ее. То, о чем пойдет речь в этой статье, это «запускаемая » часть программы.

Когда пишете программу, вы хотите, чтобы ее инструкции работали на компьютере. Компьютер обрабатывает информацию с помощью процессора, который поэтапно выполняет инструкции, закодированные в двоичном формате. Как из выражения «a = 3; » получить закодированные инструкции, которые процессор может понять?

Мы делаем это с помощью компиляции. Существует специальные приложения, известные как компиляторы. Они принимают программу, которую вы написали. Затем анализируют и разбирают каждую часть программы и строят машинный код для процессора. Часто его также называют объектным кодом.

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

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

Первые компиляторы были написаны непосредственно через машинный код или с использованием ассемблеров. Но цель компилятора очевидна: перевести программу в исполняемый машинный код для конкретного процессора.

Некоторые языки программирования разрабатывались с учетом компиляции. C , например, предназначался для того, чтобы дать возможность программистам с легкостью реализовать разные вещи. Но в итоге он разрабатывался таким образом, чтобы его можно было легко перевести на машинный код. Компиляция в программировании это серьезно!

Не все языки программирования учитывают это в своей концепции. Например, Java предназначался для запуска в «интерпретирующей » среде, а Python всегда должен интерпретироваться.

Интерпретация программы

Альтернативой компиляции является интерпретация. Основная разница между компилятором и интерпретатором заключается в том, как они работают. Компилятор берет всю программу и преобразует ее в машинный код, который понимает процессор.

Интерпретатор — это исполняемый файл, который поэтапно читает программу, а затем обрабатывает, сразу выполняя ее инструкции.

Другими словами, интерпретатор выполняет программу поэтапно как часть собственного исполняемого файла. Объектный код не передается процессору, интерпретатор сам является объектным кодом, построенным таким образом, чтобы его можно было вызвать в определенное время.

Это ломает рабочий цикл, который был приведен на диаграмме выше. Теперь у нас есть новая диаграмма:


На ней мы видим, что в отличие от компилятора, интерпретатор всегда должен быть под рукой, чтобы мы могли вызвать его и запустить нашу программу. В некотором смысле интерпретатор становится процессором. Программы, написанные для интерпретации, называются «скриптами », потому что они являются сценариями действий для другой программы, а не прямым машинным кодом.

Например, так работают такие языки программирования, как Python . Вы пишете программу. Затем вводите код в интерпретатор Python , и он выполняет все описанные вами шаги. В командной строке вы можете ввести примерно следующее:

C:>python myprogram.py

В этой команде Python — это исполняемый файл. Вы вводите в него все, что находится в файле myprogram.py, и он выполняет эти инструкции. Компьютер не запустит myprogram.py без Python . Это не машинный код, который понимает процессор. Можно скомпилировать программы Python в объектный или машинный код и запустить его непосредственно в процессоре. Но эта процедура включает в себя компиляцию кода и добавление в качестве ее части всего интерпретатора Python .

Природа интерпретатора

Интерпретаторы могут создаваться по-разному. Существуют интерпретаторы, которые читают исходную программу и не выполняют дополнительной обработки. Они просто берут определенное количество строк кода за раз и выполняют его.

Некоторые интерпретаторы выполняют собственную компиляцию, но обычно преобразуют программу байтовый код, который имеет смысл только для интерпретатора. Это своего рода псевдо машинный язык, который понимает только интерпретатор.

Такой код быстрее обрабатывается, и его проще написать для исполнителя (части интерпретатора, которая исполняет ), который считывает байтовый код, а не код источника.

Есть интерпретаторы, для которых этот вид байтового кода имеет более важное значение. Например, язык программирования Java «запускается » на так называемой виртуальной машине. Она является исполняемым кодом или частью программы, которая считывает конкретный байтовый код и эмулирует работу процессора. Обрабатывая байтовый код так, как если бы процессор компьютера был виртуальным процессором.

У меня есть эмулятор для игровой приставки NIntendo . Когда я загружаю ROM-файл Dragon Warrior , он форматируется в машинный код, который понимает только процессор NES . Но если я создаю виртуальный процессор, который интерпретирует байтовый код во время работы на другом процессоре, я могу запустить Dragon Warrior на любой машине с эмулятором.

Это использует концепция компиляции Java , а также все интерпретаторы. На любом процессоре, для которого я могу создать интерпретатор / эмулятор, можно запускать мои интерпретируемые программы / байтовый код. В этом заключается основное преимущество интерпретатора над компилятором.

За и против

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

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

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

С помощью интерпретатора проще добавить дополнительные функции, реализовать такие элементы, как сборщики мусора, а не расширять язык.

Другим преимуществом интерпретаторов является то, что их проще переписать или перекомпилировать для новых платформ.

Написание компилятора для процессора требует добавления множества функций, или полной переработки. Но как только компилятор написан, можно скомпилировать кучу интерпретаторов и на выходе мы имеем перспективный язык. Не нужно повторно внедрять интерпретатор на базовом уровне для другого процессора.

Самым большим недостатком интерпретаторов является скорость. Для каждой программы выполняется так много переводов, фильтраций, что это приводит к замедлению работы и мешает выполнению программного кода.

Это проблема для конкретных real-time приложений, таких как игры с высоким разрешением и симуляцией. Некоторые интерпретаторы содержат компоненты, которые называются just-in-time компиляторами (JIT ). Они компилируют программу непосредственно перед ее исполнением. Это специальные программы, вынесенные за рамки интерпретатора. Но поскольку процессоры становятся все более мощными, данная проблема становится менее актуальной.

Заключение

Имейте всегда в виду, что некоторые языки программирования специально предназначены для компиляции кода, например, C . В то время как другие языки всегда должны интерпретироваться, например Java .

Для меня не имеет значения, скомпилировано что-то или интерпретировано, если оно может выполнить задачу эффективно.

Некоторые системы не предлагают технические условия для эффективного использования интерпретаторов. Поэтому вы должны запрограммировать их с помощью чего-то, что может быть непосредственно скомпилировано, например C . Иногда нужно выполнить вычисления настолько интенсивно, насколько это возможно. Например, при точном распознавании голоса роботом. В других случаях скорость или вычислительная мощность могут быть не столь критичными, и написать эмулятор на оригинальном языке может быть проще.

Информатика, кибернетика и программирование

Компиляция Программа, представленная в виде команд языка программирования, называется исходной программой. Она состоит из инструкций, понятных человеку, но не понятных процессору компьютера. Чтобы процессор смог выполнить работу в соответствии с инс...

Компиляция

Программа, представленная в виде команд языка программирования, называется исходной программой . Она состоит из инструкций, понятных человеку, но не понятных процессору компьютера. Чтобы процессор смог выполнить работу в соответствии с инструкциями исходной программы, исходная программа должна быть переведена на машинный язык – язык команд процессора. Задачу преобразования исходной программы в машинный код выполняет специальная программа – компилятор .

Исполняемая

Программа

исходная программа

Компилятор

Синтаксический контроль текста программы

Генератор машинного

кода

сообщения об

ошибках

Рис. 1.1. Схема работы компилятора

Компилятор, схема работы которого приведена на рис. 1.1, выполняет последовательно две задачи:

  1. Проверяет текст исходной программы на отсутствие синтаксических ошибок.
  2. Создает (генерирует) исполняемую программу – машинный код.

Следует отметить, что генерация исполняемой программы происходит только в том случае, если в тексте исходной программы нет синтаксических ошибок, т.е. программа написана правильно с точки зрения правил данного языка программирования.

Генерация машинного кода компилятором свидетельствует лишь о том, что в тексте программы нет синтаксических ошибок. Убедиться, что программа работает правильно можно только в процессе ее тестирования – пробных запусках программы и анализе полученных результатов.

Например, если в программе вычисления корней квадратного уравнения допущена ошибка в выражении (формуле) вычисления дискриминанта, то, даже если это выражение будет синтаксически верно, программа выдаст неверные значения корней.


А также другие работы, которые могут Вас заинтересовать

75959. 20.83 KB
Правительство Российской Федерации. Исполнительную власть Российской Федерации осуществляет Правительство Российской Федерации. Правительство Российской Федерации состоит из Председателя Правительства Российской Федерации заместителей Председателя Правительства Российской Федерации и федеральных министров. Председатель Правительства Российской Федерации назначается Президентом Российской Федерации с согласия Государственной Думы.
75960. Становление современного российского парламентаризма. Думские выборы 1993 и 1995 годов: сравнительный анализ 22.11 KB
Утвердившийся в 1917 году коммунистический строй на 70 лет прервал формирование в нашей стране демократических институтов, пресек развитие парламентаризма. И все же ростки политической демократии и парламентаризма не были полностью искоренены...
75961. Формирование «олигархических групп», эволюция их отношений с государством в России 26.8 KB
Сейчас он означает небольшую группу финансовых магнатов Большую Восьмерку или Семь Банковских Баронов состоящих в тесных отношениях с президентом и правительством и оказывающих на них влияние. За термином олигархия скрывается некоторая неловкость реальной ситуации: доминирующее положение небольшого числа финансовых групп благодаря симбиозным отношениям с администрацией президента. Рассматривая политическую роль финансовых групп в ельцинской системе и фазы их развития можно отметить что изза слабости органов представительной власти и...
75962. Характерные черты становления рыночной экономики в РФ 19.88 KB
Черты становления рыночной экономики в России: отечественный экономист А. Смирнов на долю частной собственности в экономике России в 1914 г. В России даже в период промышленного подъема 1909 1913 гг. Значительно выросла доля России в мировом промышленном производстве накануне Первой мировой войны она занимала пятое место в мире после США Германии Англии Франции.
75963. Эволюция партийно-политической системы РФ в начале 21 века 18.23 KB
Резкий рост численности партий. При этом реальное влияние на политический процесс, включая законотворческую деятельность, оказывали не более пяти-шести партий. Как показала практика избирательных кампаний, многие партии изначально создавались для сугубо политтехнологических целей
75964. Беловежские соглашения - исторический смысл и дискуссионные проблемы 19.6 KB
БЕЛОВЕ́ЖСКИЕ СОГЛАШЕ́НИЯ термин используемый для обозначения соглашения подписанные 8 декабря 1991 высшими руководителями России Белоруссии и Украины о роспуске СССР и образовании Содружества независимых государств СНГ. Смысл: После попытки ГКЧП в августе 1991 реальная власть перешла в руки республиканских правящих элит и президент СССР М. а 5 декабря Кравчук объявил что Украина денонсирует договор 1922 о создании СССР. Тогда Кравчук Ельцин и Шушкевич собрались в Беловежской пуще для решения вопроса о сохранении СССР.
75965. Декларация о государственном суверенитете РСФСР - условия принятия и исторический смысл 17.91 KB
Декларация о государственном суверенитете РСФСР политикоправовой акт ознаменовавший начало конституционной реформы в РСФСР где суверенитет рассматривается как естественное и необходимое условие существования российской государственности. Условия: Декларация была принята Первым Съездом народных депутатов РСФСР 12 июня 1990 года и подписана Председателем Верховного Совета РСФСР Б. Значение исторический смысл: Помимо провозглашения суверенитета РСФСР и намерения создать демократическое правовое государство в составе обновлённого Союза...
75966. Шоковая терапия и ее исторические последствия 53 KB
Шоковая терапия - пропагандистское (газетное) название, с легкой руки некоторых публицистов приклеившееся к политике, которую начало проводить, придя к власти, реформаторское правительство Ельцина-Гайдара – политике стабилизации экономики. (попытка России перейти к Рыночной Экономике)

Общие замечания к интерпретаторам

Разработка интерпретаторов для интерпретации программ на заданном исходном языке является одной из основных задач информатики. Сте­пень трудности проблемы реализации интерпретатора зависит от сложно­сти исходного языка и степени его отличия от базисного языка, на кото­ром должен быть записан сам интерпретатор.

Чтобы обеспечить корректность интерпретатора, при его проектиро­вании мы должны исходить из семантического определения интерпрети­руемого языка или по меньшей мере верифицировать его на соответствие этому. Обратим внимание на то, что математическое определение семан­тики ЯП аналогично интерпретирующим программам.

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

Сейчас все ближе подходят к созданию интерпретаторов для таких языков, которые выглядят не так, как классические ЯП, ориентирован­ные на вычисления. В частности, в результате длительных исследований стала возможной интерпретация определенных языков, ориентированных скорее на спецификации, а не на вычисления (например, язык ПРОЛОГ, который служит для составления программ в машинно-интерпретируемой логике). Впрочем, для таких языков имеются определенные непре­одолимые преграды из-за границ вычислимости и сложности, которые для многих постановок задач делают практически невозможным исполь­зование этих языков.

Компилятор берет программу на исходномязыке в качестве своих входных данных и вырабатывает программу на объектном языке, понятном машине.

Если программу, написанную на ЯП высокого уровня, мы хотим выпол­нять многократно, со все новыми исходными данными, то часто бывает эффективнее программу не интерпретировать, а сначала перевести на уже реализованный язык, возможно более близкий к машинному языку, а затем уже выполнять порожденную таким образом программу. Такой способ позволяет лучше приспособить программу к структуре фактиче­ски используемой машины и тем самым добиться далеко идущей ее оп­тимизации. В принципе такой перевод можно осуществить вручную, од­нако это требует больших затрат времени и при этом могут быть допуще­ны ошибки. Поэтому для этой цели используются специальные переводящие программы, называемые переводчиками или компиляторами (англ. соmputer).



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

ЯП определяется его синтаксисом и семантикой. В процессе компи­ляции или интерпретации программа, понимаемая как синтаксический объект, берется в качестве входных данных и в соответствии с ее семан­тикой превращается в программу на другом языке или в последователь­ность действий (процесс выполнения).

Языки программирования бывают высокого и низкого уровней.

Языки, ориентированные на конкретный тип процессора и учитывающие его осо­бенности называются языками низкого уровня. Каждая команды языка низкого уровня не­посредственно реализует одну команду микропроцессора, и они всегда ориентированны на систему команд конкретного микропроцессора. Языком самого низкого уровня является язык ассемблера, который просто представляет каждую команду машинного кода, но не в виде чисел, а с помощью символьных условных обозначений, называемых мнемониками.

Языки высокого уровня позволяют задавать желаемые действия в программе с по­мощью определенного набора операторов. Они значительно ближе и понятнее человеку, чем компьютеру. Каждая команда такого языка может состоять из десятка и более команд микропроцессо­ра. Писать программы на ЯП ВУ легче.


1 – машинно-зависимые (Ассемблер). Языки низкого уровня.

2 – машинно-ориентированные (Си)

3 – универсальные (Фортран, Паскаль, Basic)

4 - проблемно-ориентированные (GPSS, Лого, объектно-ориентированные (форт, Смолток))

5,6,7 – (Пролог, Лисп, СНОБОЛ).

Си, Си++ - вся машинно-зависимая часть программы достаточно легко локализуется и модифицируется при переносе программы на другую архитектуру.

Фортран – первый язык высокого уровня (1958г., фирма IBM), используется и до сих пор, поддерживает модульное программирование, особенно предпочитается математиками.

Паскаль – один из наиболее популярных в учебных целях (Н.Вирт), реализует большинство идей структурного программирования.

Бейсик – для начинающих программистов, приближен к разговорному английскому языку, поддерживает модульное и структурное программирование.

Лого , среди проблемно-ориентированных языков – используется в основном для целей обучения. Это диалоговый процедурный язык (простой синтаксис).

GPSS – ориентирован на моделирование систем с помощью событий. Применяется там, где результаты исследований выражаются в терминах времени ожидания, длины очереди, использование ресурсов.

Смолток – один из ранних ОО ЯП, основная конструкция – это объект и действия с ним, предназначен для нечисловых задач (при построении систем искусственного интеллекта).

Форт – используется при решении задач имитационного моделирования в графических системах.

Языки функциональной группы используются в основном в системах искусственного интеллекта. У них мощная инструментальная поддержка, быстрый компилятор, встроенные средства организации многооконного режима, графика высокого разрешения, развитый набор математических функций.

Пролог – язык ИИ, даются термины и связи, а с его помощью создаются новые.

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

СНОБОЛ – язык ИИ.

Поколения языков программирования

Все языки программирования принято делить на 5 поколений.

1. Начало 50-х годов. Появились первые компьютеры и первые языки ассемблера, в которых программирование велось по принципу «Одна инструкция - одна строка».

2. Конец 50-х начало 60-х годов. Разработан символический Ассемблер, в котором появилось понятие переменной. Возросла скорость разработки и надежность программ.

3. 60-е года. Рождение языков высокого уровня. Простота программирования, не­зависимость от конкретного компьютера, новые мощные языковые конструк­ции.

4. Начало 70-х и по настоящее время. Проблемно-ориентированные языки, опери­рующие конкретными понятиями узкой предметной области. Мощные операто­ры, для которых на языках младшего поколения потребовались тысячи строк исходного кода.

5. Середина 90-х. Системы автоматического создания прикладных программ с помощью визуальных средств разработки, без знания программирования. Инст­рукции вводятся в компьютер в наглядном виде с помощью методов, наиболее удобных для человека незнакомого с программированием.

В нашем институте на различных курсах вы научитесь программировать на различных языках программирования.

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

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

Годом рождения теории компиляторов можно считать 1957, когда появился первый компилятор языка Фортран, созданный Бэкусом и дающий достаточно эффективный объектный код. Он работал на платформах IBM 7040, IBM 360 и DEC PDP-11. В 1980 г. была разработана новая версия для IBM 360 и IBM PC, которая поддерживала стандарт FORTRAN 77. Через год была образована фирма Watcom, которая в 1988 г. представила компилятор C. Он сразу получил широкую популярность среди программистов, так как генерировал самый быстрый код среди компиляторов того времени.

Основы
Большая часть компиляторов переводят программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен центральным процессором. Как правило, этот код также должен выполняться в среде конкретной операционной системы, поскольку использует предоставляемые ей возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой производится компиляция, называется целевой машиной.
Некоторые компиляторы (например, Java) переводят программу не в машинный код, а в программу на некотором специально созданном низкоуровневом языке. Такой язык - байт-код - также можно считать языком машинных команд, поскольку он подлежит интерпретации виртуальной машиной. Например, для языка Java это JVM (язык виртуальной машины Java), или так называемый байт-код Java (вслед за ним все промежуточные низкоуровневые языки стали называть байт-кодами). Для языков программирования на платформе.NET Framework (C#, Managed C++, Visual Basic .NET и другие) это MSIL (Microsoft Intermediate Language, "Промежуточный язык фирмы Майкрософт").

Программа на байт-коде подлежит интерпретации виртуальной машиной, либо ещё одной компиляции уже в машинный код непосредственно перед исполнением. Последнее называеется "Just-In-Time компиляция" (JIT), по названию подобного компилятора для Java. MSIL-код компилируется в код целевой машины также JIT-компилятором, а библиотеки.NET Framework компилируются заранее).
Для каждой целевой машины (IBM, Apple и т.д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые кросс-компиляторы, позволяющие на одной машине и в среде одной ОС получать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС. Кроме того, компиляторы могут быть оптимизированы под разные типы процессоров из одного семейства (путём использования специфичных для этих процессоров инструкций). Например, код, скомпилированный под процессоры семейства i686, может использовать специфичные для этих процессоров наборы инструкций - MMX, SSE, SSE2.
Существуют программы, которые решают обратную задачу - перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а программы - декомпиляторами. Но, поскольку компиляция - это процесс с потерями, точно восстановить исходный код, скажем, на C++ в общем случае невозможно. Более эффективно декомпилируются программы в байт-кодах - например, существует довольно надёжный декомпилятор для Flash.

Логическая структура компилятора

  1. Лексический анализ. Лексический анализатор выполняет распознавание лексем языка и замену их соответствующими кодами. Под лексемами понимаются элементарные единицы, входящие в структуру предложения языка, такие как ключевые слова, константы, имена и т.п. Правильность задания структуры предложения языка на фазе лексического анализа не выполняется. Результатом является поток лексем (кодов - ссылок на таблицы), эквивалентный исходному тексту.
  2. Синтаксический анализатор необходим для того, чтобы выяснить, удовлетворяют ли предложения, из которых состоит исходная программа, правилам грамматики этого языка. Процесс синтаксического анализа может рассматриваться как построение дерева грамматического разбора для транслируемых предложений. Грамматики могут использоваться как для порождения так и для распознавания предложений языка. Порождение начинается с начального понятия (или аксиомы грамматики). При распознавании с помощью грамматических правил порождается предложение, которое затем сравнивается с входной строкой. При этом применение правил подстановки для порождения очередного символа предложения зависит от результатов сравнения предыдущих символов с соответствующими символами входной строки. Результат анализа исходного предложения в терминах грамматических конструкций удобно представлять в виде дерева. Такие деревья обычно называются деревьями грамматического разбора или синтаксическими деревьями. READ (VALUE).
  3. Семантический анализ. На этом этапе осуществляется контроль типа и вида всех идентификаторов и других операндов.
  4. Оптимизация. Происходит преобразование исходной программы в промежуточную (например, польскую) форму записи. Оптимизация промежуточного кода - выделение общих подвыражений и вычисление константных подвыражений. Фаза оптимизации предназначена для уменьшения избыточности программы по затратам времени и памяти. В зависимости от критериев проектирования транслятора данная фаза обработки программы может исключаться из цикла обработки программы.
  5. Распределение памяти. На этом этапе выделяются конкретные адреса пользователя под переменные, которые генерируются компилятором.
  6. Генератор объектного (ассемблерного) кода - выполняет подстановку кодовых образцов на выходном языке, соответствующих промежуточным кодам программы. Генератору кода могут не требоваться шаблоны, он весь может быть реализован в процедурном виде.
  7. Машинно-зависимая компиляция. Зависит от того, какие используются регистры. Работа этой процедуры зависит от соглашений, принятых для исполняемой части программы. Например, выделяется базовый регистр для текущей активной записи в стеке. В конкретных реализациях компиляторов, эти этапы могут быть разделены или совмещены в том или ином виде.
Транслятор
Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Если объектный язык представляет собой автокод или некоторый машинный язык, то транслятор называется компилятором.

Автокод очень близок к машинному языку; большинство команд автокода - точное символическое представление команд машины.

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

Примеры компиляторов
GCC
Free Pascal Compiler
Компиляторы C, C++ и Fortran от Sun Microsystems Inc.
Watcom Fortran/C++ Compiler
Intel C++/Fortran compiler
ICC AVR.

Литература:
1. Альфред Ахо, Рави Сети, Джеффри Ульман, "Компиляторы. Принципы, технологии, инструменты", "Вильямс", М.-С-Пб.-К. 2003 г.
2. Карпов В.Э. "Классическая теория компиляторов", Учебное пособие - Московский государственный институт электроники и математики, М., 2003 г.
3. Робин Хантер "Основные концепции компиляторов" М.: "Вильямс", 2002 г.
4. Хантер Р. Проектирование и конструирование компиляторов: Пер. с англ. С. М. Круговой - М. Финансы и статистика, 1984 г.

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

Таким образом, компиляция - это когда входная информация (исходный код), представляющая описание алгоритма или написанная на проблемно-ориентированном языке программа, переписывается в эквивалентный перечень команд, представленных в объектном коде (машинно-ориентированном языке).

Если еще упростить определение, то компилировать - это транслировать машинную программу с проблемно-ориентированного в машинно-ориентированный язык.

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

Меняя значение определенной константы, можно регулировать включение или выключение трансляции части текста программы.

Для удобства программистов при решении различных задач применяются наиболее удобные и приспособленные компиляторы. Если произвести их классификацию, то можно выделить несколько видов подобных утилит.

Компилятор векторизующий производит трансляцию исходного кода в машинный компьютерный код, подстраиваясь под векторные процессоры.

Гибкий компилятор был разработан на основе модульного принципа. Его управление осуществляется таблицами. Запрограммирован он на высокоуровневом языке. Также возможна его реализация при помощи компилятора компиляторов.

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

Интерпретирующий или пошаговый компилятор использует принцип последовательного выполнения независимой компиляции для каждого отдельного оператора или команды из исходной программы.

Который воспринимает формальное описание для языка программирования. Он способен самостоятельно генерировать компилятор для конкретного языка.

Отладочный компилятор может самостоятельно устранять некоторые виды ошибок синтаксиса.

Резидентному компилятору отведено постоянное место в оперативной памяти, и он доступен при повторном использовании широким спектром задач.

Существуют самокомпилируемые компиляторы. Они пишутся тем же языком, с которого происходит трансляция.

Универсальный компилятор имеет в основании формальное описание семантики и синтаксиса входного языка. Он состоит из ядра, синтаксического и семантического загрузчиков.

Наиболее часто встречающиеся задачи, где компиляторы находят себе применение, − это компиляция ядра для платформы Linux. Операция эта позволяет решить широкий спектр проблем, связанных с согласованием оборудования и настройки наиболее приемлемой версии платформы.

Компиляция Java реализовывается при использовании компиляторов, работающих на самых различных платформах. Это позволяет исходные коды перекомпилировать под потребности операционных систем от разных производителей.