Компилятор

Поделись знанием:
Перейти к: навигация, поиск

Компиля́тор — программа или техническое средство, выполняющее компиляцию[1][2][3].

Компиля́ция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду (абсолютный код, объектный модуль, иногда на язык ассемблера)[2][3][4]. Входной информацией для компилятора (исходный код) является описание алгоритма или программа на предметно-ориентированном языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код)[5].

Компили́ровать — проводить трансляцию машинной программы с предметно-ориентированного языка на машинно-ориентированный язык[3].





Виды компиляторов

Виды компиляции[2]

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

Структура компилятора

Процесс компиляции состоит из следующих этапов:

  1. Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
  2. Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
  4. Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
  5. Генерация кода. Из промежуточного представления порождается код на целевом языке.

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

Генерация кода

Генерация машинного кода

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

Результат компиляции — исполнимый модуль — обладает максимальной возможной производительностью, однако привязан к определённой операционной системе и процессору (и не будет работать на других).

Для каждой целевой машины (IBM, Apple, Sun и т. д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора. Существуют также так называемые кросс-компиляторы, позволяющие на одной машине и в среде одной ОС генерировать код, предназначенный для выполнения на другой целевой машине и/или в среде другой ОС. Кроме того, компиляторы могут оптимизировать код под разные модели из одного семейства процессоров (путём поддержки специфичных для этих моделей особенностей или расширений наборов инструкций). Например, код, скомпилированный под процессоры семейства Pentium, может учитывать особенности распараллеливания инструкций и использовать их специфичные расширения — MMX, SSE и т. п.

Некоторые компиляторы переводят программу с языка высокого уровня не прямо в машинный код, а на язык ассемблера (примером может служить PureBasic, транслирующий бейсик-код в ассемблер FASM). Это делается для упрощения части компилятора, отвечающей за кодогенерацию, и повышения его переносимости (задача окончательной генерации кода и привязки его к требуемой целевой платформе перекладывается на ассемблер), либо для возможности контроля и исправления результата компиляции программистом.

Генерация байт-кода

Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке, подлежащем интерпретации виртуальной машиной. Такой язык называется псевдокодом или байт-кодом. Как правило, он не является машинным кодом какого-либо компьютера и программы на нём могут исполняться на различных архитектурах, где имеется соответствующая виртуальная машина, но в некоторых случаях создаются аппаратные платформы, напрямую поддерживающие псевдокод какого-либо языка. Например, псевдокод языка Java называется байт-кодом Java и выполняется в Java Virtual Machine, для его прямого исполнения была создана спецификация процессора picoJava. Для платформы .NET Framework псевдокод называется Common Intermediate Language (CIL), а среда исполнения — Common Language Runtime (CLR).

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

Динамическая компиляция

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

CIL-код также компилируется в код целевой машины JIT-компилятором, а библиотеки .NET Framework компилируются заранее.

Декомпиляция

Существуют программы, которые решают обратную задачу — перевод программы с низкоуровневого языка на высокоуровневый. Этот процесс называют декомпиляцией, а такие программы — декомпиляторами. Но поскольку компиляция — это процесс с потерями, точно восстановить исходный код, скажем, на C++, в общем случае невозможно. Более эффективно декомпилируются программы в байт-кодах — например, существует довольно надёжный декомпилятор для Flash. Разновидностью декомпилирования является дизассемблирование машинного кода в код на языке ассемблера, который почти всегда выполняется успешно (при этом сложность может представлять самомодифицирующийся код или код, в котором собственно код и данные не разделены). Связано это с тем, что между кодами машинных команд и командами ассемблера имеется практически взаимно-однозначное соответствие.

Раздельная компиляция

Раздельная компиляция (англ. separate compilation) — трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль.[2]

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

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

Интересные факты

На заре развития компьютеров первые компиляторы (трансляторы) называли «программирующими программами»[6] (так как в тот момент программой считался только машинный код, а «программирующая программа» была способна из человеческого текста сделать машинный код, то есть запрограммировать ЭВМ).

См. также

Напишите отзыв о статье "Компилятор"

Примечания

  1. ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
  2. 1 2 3 4 Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  3. 1 2 3 СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
  4. Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3.
  5. Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  6. Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 1963.

Литература

  • Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2-е изд. — М.: Вильямс, 2010. — 1184 с. — ISBN 978-5-8459-1349-4.
  • Робин Хантер. Основные концепции компиляторов = The Essence of Compilers. — М.: Вильямс, 2002. — 256 с. — ISBN 0-13-727835-7.
  • Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. С. М. Круговой. — М.: Финансы и статистика, 1984. — 232 с.
  • Д. Креншоу. [www.kulichki.net/kit/crenshaw/crenshaw.html Давайте создадим компилятор!]
  • Серебряков В. А., Галочкин М. П. [www.citforum.ru/programming/theory/serebryakov/ Основы конструирования компиляторов].

Ссылки

  • [www.osp.ru/os/2013/01/13033990/ Новым процессорам — новые компиляторы]

Отрывок, характеризующий Компилятор

Пьер снял ноги со стола, встал и перелег на приготовленную для него кровать, изредка поглядывая на вошедшего, который с угрюмо усталым видом, не глядя на Пьера, тяжело раздевался с помощью слуги. Оставшись в заношенном крытом нанкой тулупчике и в валеных сапогах на худых костлявых ногах, проезжий сел на диван, прислонив к спинке свою очень большую и широкую в висках, коротко обстриженную голову и взглянул на Безухого. Строгое, умное и проницательное выражение этого взгляда поразило Пьера. Ему захотелось заговорить с проезжающим, но когда он собрался обратиться к нему с вопросом о дороге, проезжающий уже закрыл глаза и сложив сморщенные старые руки, на пальце одной из которых был большой чугунный перстень с изображением Адамовой головы, неподвижно сидел, или отдыхая, или о чем то глубокомысленно и спокойно размышляя, как показалось Пьеру. Слуга проезжающего был весь покрытый морщинами, тоже желтый старичек, без усов и бороды, которые видимо не были сбриты, а никогда и не росли у него. Поворотливый старичек слуга разбирал погребец, приготовлял чайный стол, и принес кипящий самовар. Когда всё было готово, проезжающий открыл глаза, придвинулся к столу и налив себе один стакан чаю, налил другой безбородому старичку и подал ему. Пьер начинал чувствовать беспокойство и необходимость, и даже неизбежность вступления в разговор с этим проезжающим.
Слуга принес назад свой пустой, перевернутый стакан с недокусанным кусочком сахара и спросил, не нужно ли чего.
– Ничего. Подай книгу, – сказал проезжающий. Слуга подал книгу, которая показалась Пьеру духовною, и проезжающий углубился в чтение. Пьер смотрел на него. Вдруг проезжающий отложил книгу, заложив закрыл ее и, опять закрыв глаза и облокотившись на спинку, сел в свое прежнее положение. Пьер смотрел на него и не успел отвернуться, как старик открыл глаза и уставил свой твердый и строгий взгляд прямо в лицо Пьеру.
Пьер чувствовал себя смущенным и хотел отклониться от этого взгляда, но блестящие, старческие глаза неотразимо притягивали его к себе.


– Имею удовольствие говорить с графом Безухим, ежели я не ошибаюсь, – сказал проезжающий неторопливо и громко. Пьер молча, вопросительно смотрел через очки на своего собеседника.
– Я слышал про вас, – продолжал проезжающий, – и про постигшее вас, государь мой, несчастье. – Он как бы подчеркнул последнее слово, как будто он сказал: «да, несчастье, как вы ни называйте, я знаю, что то, что случилось с вами в Москве, было несчастье». – Весьма сожалею о том, государь мой.
Пьер покраснел и, поспешно спустив ноги с постели, нагнулся к старику, неестественно и робко улыбаясь.
– Я не из любопытства упомянул вам об этом, государь мой, но по более важным причинам. – Он помолчал, не выпуская Пьера из своего взгляда, и подвинулся на диване, приглашая этим жестом Пьера сесть подле себя. Пьеру неприятно было вступать в разговор с этим стариком, но он, невольно покоряясь ему, подошел и сел подле него.
– Вы несчастливы, государь мой, – продолжал он. – Вы молоды, я стар. Я бы желал по мере моих сил помочь вам.
– Ах, да, – с неестественной улыбкой сказал Пьер. – Очень вам благодарен… Вы откуда изволите проезжать? – Лицо проезжающего было не ласково, даже холодно и строго, но несмотря на то, и речь и лицо нового знакомца неотразимо привлекательно действовали на Пьера.
– Но если по каким либо причинам вам неприятен разговор со мною, – сказал старик, – то вы так и скажите, государь мой. – И он вдруг улыбнулся неожиданно, отечески нежной улыбкой.
– Ах нет, совсем нет, напротив, я очень рад познакомиться с вами, – сказал Пьер, и, взглянув еще раз на руки нового знакомца, ближе рассмотрел перстень. Он увидал на нем Адамову голову, знак масонства.
– Позвольте мне спросить, – сказал он. – Вы масон?
– Да, я принадлежу к братству свободных каменьщиков, сказал проезжий, все глубже и глубже вглядываясь в глаза Пьеру. – И от себя и от их имени протягиваю вам братскую руку.
– Я боюсь, – сказал Пьер, улыбаясь и колеблясь между доверием, внушаемым ему личностью масона, и привычкой насмешки над верованиями масонов, – я боюсь, что я очень далек от пониманья, как это сказать, я боюсь, что мой образ мыслей насчет всего мироздания так противоположен вашему, что мы не поймем друг друга.
– Мне известен ваш образ мыслей, – сказал масон, – и тот ваш образ мыслей, о котором вы говорите, и который вам кажется произведением вашего мысленного труда, есть образ мыслей большинства людей, есть однообразный плод гордости, лени и невежества. Извините меня, государь мой, ежели бы я не знал его, я бы не заговорил с вами. Ваш образ мыслей есть печальное заблуждение.
– Точно так же, как я могу предполагать, что и вы находитесь в заблуждении, – сказал Пьер, слабо улыбаясь.
– Я никогда не посмею сказать, что я знаю истину, – сказал масон, всё более и более поражая Пьера своею определенностью и твердостью речи. – Никто один не может достигнуть до истины; только камень за камнем, с участием всех, миллионами поколений, от праотца Адама и до нашего времени, воздвигается тот храм, который должен быть достойным жилищем Великого Бога, – сказал масон и закрыл глаза.
– Я должен вам сказать, я не верю, не… верю в Бога, – с сожалением и усилием сказал Пьер, чувствуя необходимость высказать всю правду.
Масон внимательно посмотрел на Пьера и улыбнулся, как улыбнулся бы богач, державший в руках миллионы, бедняку, который бы сказал ему, что нет у него, у бедняка, пяти рублей, могущих сделать его счастие.
– Да, вы не знаете Его, государь мой, – сказал масон. – Вы не можете знать Его. Вы не знаете Его, оттого вы и несчастны.
– Да, да, я несчастен, подтвердил Пьер; – но что ж мне делать?
– Вы не знаете Его, государь мой, и оттого вы очень несчастны. Вы не знаете Его, а Он здесь, Он во мне. Он в моих словах, Он в тебе, и даже в тех кощунствующих речах, которые ты произнес сейчас! – строгим дрожащим голосом сказал масон.
Он помолчал и вздохнул, видимо стараясь успокоиться.
– Ежели бы Его не было, – сказал он тихо, – мы бы с вами не говорили о Нем, государь мой. О чем, о ком мы говорили? Кого ты отрицал? – вдруг сказал он с восторженной строгостью и властью в голосе. – Кто Его выдумал, ежели Его нет? Почему явилось в тебе предположение, что есть такое непонятное существо? Почему ты и весь мир предположили существование такого непостижимого существа, существа всемогущего, вечного и бесконечного во всех своих свойствах?… – Он остановился и долго молчал.
Пьер не мог и не хотел прерывать этого молчания.
– Он есть, но понять Его трудно, – заговорил опять масон, глядя не на лицо Пьера, а перед собою, своими старческими руками, которые от внутреннего волнения не могли оставаться спокойными, перебирая листы книги. – Ежели бы это был человек, в существовании которого ты бы сомневался, я бы привел к тебе этого человека, взял бы его за руку и показал тебе. Но как я, ничтожный смертный, покажу всё всемогущество, всю вечность, всю благость Его тому, кто слеп, или тому, кто закрывает глаза, чтобы не видать, не понимать Его, и не увидать, и не понять всю свою мерзость и порочность? – Он помолчал. – Кто ты? Что ты? Ты мечтаешь о себе, что ты мудрец, потому что ты мог произнести эти кощунственные слова, – сказал он с мрачной и презрительной усмешкой, – а ты глупее и безумнее малого ребенка, который бы, играя частями искусно сделанных часов, осмелился бы говорить, что, потому что он не понимает назначения этих часов, он и не верит в мастера, который их сделал. Познать Его трудно… Мы веками, от праотца Адама и до наших дней, работаем для этого познания и на бесконечность далеки от достижения нашей цели; но в непонимании Его мы видим только нашу слабость и Его величие… – Пьер, с замиранием сердца, блестящими глазами глядя в лицо масона, слушал его, не перебивал, не спрашивал его, а всей душой верил тому, что говорил ему этот чужой человек. Верил ли он тем разумным доводам, которые были в речи масона, или верил, как верят дети интонациям, убежденности и сердечности, которые были в речи масона, дрожанию голоса, которое иногда почти прерывало масона, или этим блестящим, старческим глазам, состарившимся на том же убеждении, или тому спокойствию, твердости и знанию своего назначения, которые светились из всего существа масона, и которые особенно сильно поражали его в сравнении с своей опущенностью и безнадежностью; – но он всей душой желал верить, и верил, и испытывал радостное чувство успокоения, обновления и возвращения к жизни.
– Он не постигается умом, а постигается жизнью, – сказал масон.
– Я не понимаю, – сказал Пьер, со страхом чувствуя поднимающееся в себе сомнение. Он боялся неясности и слабости доводов своего собеседника, он боялся не верить ему. – Я не понимаю, – сказал он, – каким образом ум человеческий не может постигнуть того знания, о котором вы говорите.
Масон улыбнулся своей кроткой, отеческой улыбкой.
– Высшая мудрость и истина есть как бы чистейшая влага, которую мы хотим воспринять в себя, – сказал он. – Могу ли я в нечистый сосуд воспринять эту чистую влагу и судить о чистоте ее? Только внутренним очищением самого себя я могу до известной чистоты довести воспринимаемую влагу.
– Да, да, это так! – радостно сказал Пьер.
– Высшая мудрость основана не на одном разуме, не на тех светских науках физики, истории, химии и т. д., на которые распадается знание умственное. Высшая мудрость одна. Высшая мудрость имеет одну науку – науку всего, науку объясняющую всё мироздание и занимаемое в нем место человека. Для того чтобы вместить в себя эту науку, необходимо очистить и обновить своего внутреннего человека, и потому прежде, чем знать, нужно верить и совершенствоваться. И для достижения этих целей в душе нашей вложен свет Божий, называемый совестью.
– Да, да, – подтверждал Пьер.
– Погляди духовными глазами на своего внутреннего человека и спроси у самого себя, доволен ли ты собой. Чего ты достиг, руководясь одним умом? Что ты такое? Вы молоды, вы богаты, вы умны, образованы, государь мой. Что вы сделали из всех этих благ, данных вам? Довольны ли вы собой и своей жизнью?
– Нет, я ненавижу свою жизнь, – сморщась проговорил Пьер.
– Ты ненавидишь, так измени ее, очисти себя, и по мере очищения ты будешь познавать мудрость. Посмотрите на свою жизнь, государь мой. Как вы проводили ее? В буйных оргиях и разврате, всё получая от общества и ничего не отдавая ему. Вы получили богатство. Как вы употребили его? Что вы сделали для ближнего своего? Подумали ли вы о десятках тысяч ваших рабов, помогли ли вы им физически и нравственно? Нет. Вы пользовались их трудами, чтоб вести распутную жизнь. Вот что вы сделали. Избрали ли вы место служения, где бы вы приносили пользу своему ближнему? Нет. Вы в праздности проводили свою жизнь. Потом вы женились, государь мой, взяли на себя ответственность в руководстве молодой женщины, и что же вы сделали? Вы не помогли ей, государь мой, найти путь истины, а ввергли ее в пучину лжи и несчастья. Человек оскорбил вас, и вы убили его, и вы говорите, что вы не знаете Бога, и что вы ненавидите свою жизнь. Тут нет ничего мудреного, государь мой! – После этих слов, масон, как бы устав от продолжительного разговора, опять облокотился на спинку дивана и закрыл глаза. Пьер смотрел на это строгое, неподвижное, старческое, почти мертвое лицо, и беззвучно шевелил губами. Он хотел сказать: да, мерзкая, праздная, развратная жизнь, – и не смел прерывать молчание.
Масон хрипло, старчески прокашлялся и кликнул слугу.
– Что лошади? – спросил он, не глядя на Пьера.
– Привели сдаточных, – отвечал слуга. – Отдыхать не будете?
– Нет, вели закладывать.
«Неужели же он уедет и оставит меня одного, не договорив всего и не обещав мне помощи?», думал Пьер, вставая и опустив голову, изредка взглядывая на масона, и начиная ходить по комнате. «Да, я не думал этого, но я вел презренную, развратную жизнь, но я не любил ее, и не хотел этого, думал Пьер, – а этот человек знает истину, и ежели бы он захотел, он мог бы открыть мне её». Пьер хотел и не смел сказать этого масону. Проезжающий, привычными, старческими руками уложив свои вещи, застегивал свой тулупчик. Окончив эти дела, он обратился к Безухому и равнодушно, учтивым тоном, сказал ему: