Сайт о телевидении

Сайт о телевидении

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

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

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

Определение и история появления

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

Появились такие программы вместе с зарождением первых языков программирования. Произошло это в конце 50-х годов. Получается, что история, которая связана с компиляторами и языками программирования насчитывает уже более шести десятков лет. Несмотря на такой серьезный срок, данное направление компьютерной науки ни в коем случае нельзя назвать устаревшим или устоявшимся. Наоборот, с ходом времени, с появлением новых отраслей и задач, для решения которых применяются компьютеры, возникает потребность в разработке новых, более удобных языков программирования. Соответственно, для этих языков нужны компиляторы. Windows, Linux, MacOS - для каждой платформы существуют свои разработки.

Принцип работы

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

Просто, но сложно

По традиции, компиляторы в информатике являются одной из базовых вещей вместе с операционными системами, а также базами данных. Что такое в каком-то смысле базис компьютерной науки.

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

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

Трудности в создании

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

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

Класс и компилятор

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

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

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

Разработка компиляторов как работа

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

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

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

Компиля́тор - программа или техническое средство, выполняющее компиляцию .

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

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

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

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

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

    Диалоговый . См.: диалоговый транслятор.

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

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

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

    Отладочный . Устраняет отдельные виды синтаксических ошибок.

    Резидентный . Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.

    Самокомпилируемый . Написан на том же языке, с которого осуществляется трансляция.

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

Виды компиляции

    Пакетная . Компиляция нескольких исходных модулей в одном пункте задания.

    Построчная . То же, что и интерпретация.

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

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

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

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

    Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.

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

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

    Генерация кода. Из промежуточного представления порождается код на целевом языке.

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

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

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

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

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

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

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

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

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

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

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

Основная статья: JIT-компиляция

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

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

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

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

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

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

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

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

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

Язык для операционной системы

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

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

В языке ассемблер все осуществляется благодаря регистрам процессора: деление, умножение, перемещение значения из точки А в точку Б и т. д. Основная его проблема, что он все еще является полумашинным, но все равно поддается прочтению человеку, в отличии от хаотично раскиданных битов. Еще одним минусом было ограниченное количество этих самых регистров.

В 80-х годах решили придумать язык программирования, благодаря которому можно будет легко и просто написать операционную систему. Так появился С и компилятор С GCC от компании GNU. Если вы пользуетесь Linux, то обязательно должны были видеть продукты данной компании. Кстати, ассемблер используется и поныне, ведь некоторые компиляторы создают объектные файлы с двоичным кодом, а другие исполнительные – с кодом на ассемблере. Все зависит от платформы разработчика.

Современный компилятор имеет следующие программы в себе:

    Дебагер – программа, которая отправляет сообщения об ошибке от линковщика, препроцессора, интерпретатора. Препроцессор – это программа, главной задачей которой является поиск специальных меток, начинающихся со знака #, и выполнение определенного рода команд. Например, добавления сторонней библиотеки для компиляции проекта. Интерпретатор – программа, которая переводит наш более-менее понятный язык программирования в двоичный код или ассемблер. Линковщик – программа, благодаря которой недостающие файлы автоматически подключаются.

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

Первые простейшие компиляторы

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


Возможна ли сборка без нового языка?

Если вы достаточно толковый программист, то вполне сможете выполнить эту задачу. Правда, для этого понадобится немало времени и сил. Кстати, раньше даже была профессия такая – программист-линковщик. Это только в новых языках программирования все автоматизировано, а раньше людям приходилось связывать куски кода Make файлами. Между прочим, некоторые проекты на Linux и сейчас можно собрать с помощью этих самых Make-файлов, нужно лишь указать их зависимости вручную.


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

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

Лучший компилятор Windows

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

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


    Во-первых, он взял солидную долю стандартных библиотек от С, и новые компиляторы G++ способны компилировать код С, что уже само по себе указывает на их схожесть. Во-вторых, С++ был создан, чтоб заместить С, и итоги этого мы видим сейчас. К слову, программа компилятор G++ не "ругается" до тех пор, пока не будет использован хотя бы один класс – в этом и есть основное отличие двух языков. Можно назвать G++ лучшим компилятором, не зря ведь благодаря ему пишут мобильные приложения, операционную систему Windows и т. д.

Ваш путь будет тернист – это стоит знать прежде всего. Для начала работы с языком, например, если это С, вы обязательно должны будете ознакомиться с компилятором C. А если с ним не подружиться и не понять его логику, то ваши проекты один за одним будут лагать и вылетать.


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

В заключение

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

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

  • Векторизующий . Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором .
  • Гибкий . Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
  • Диалоговый . См.: диалоговый транслятор.
  • Инкрементальный . Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.
  • Интерпретирующий (пошаговый) . Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
  • Компилятор компиляторов . Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
  • Отладочный . Устраняет отдельные виды синтаксических ошибок.
  • Резидентный . Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
  • Самокомпилируемый . Написан на том же языке, с которого осуществляется трансляция.
  • Универсальный . Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Виды компиляции

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

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

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

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

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

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

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

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

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

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

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

Результатом работы компилятора может быть программа на специально созданном низкоуровневом языке , подлежащем интерпретации виртуальной машиной . Такой язык называется псевдокодом или байт-кодом . Как правило, он не является машинным кодом какого-либо компьютера и программы на нём могут исполняться на различных архитектурах, где имеется соответствующая виртуальная машина, но в некоторых случаях создаются аппаратные платформы, напрямую поддерживающие псевдокод какого-либо языка. Например, псевдокод языка 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 ) - трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль.

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

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

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

См. также

Примечания

Литература

  • Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = 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 с.
  • Д. Креншоу. Давайте создадим компилятор!
  • Серебряков В. А., Галочкин М. П. Основы конструирования компиляторов .

Wikimedia Foundation . 2010 .

Синонимы :

Смотреть что такое "Компилятор" в других словарях:

    - (ново лат., от лат. compilare грабить, обирать, выбирать). Составитель статей или книг путем заимствования отрывков из сочинений разных авторов. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910. КОМПИЛЯТОР… … Словарь иностранных слов русского языка

    См. писатель... Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. компилятор автор, писатель; транслятор, халтурщик, программа Словарь русских синонимов … Словарь синонимов

    Программа, преобразующая текст, написанный на алгоритмическом языке, в программу, состоящую из машинных команд. Компилятор создает законченный вариант программы на машинном языке. См. также: Трансляторы Финансовый словарь Финам … Финансовый словарь

    КОМПИЛЯТОР, КОМПЬЮТЕРНАЯ ПРОГРАММА, которая переводит символы ЯЗЫКА ПРОГРАММИРОВАНИЯ в команды, которые может непосредственно воспринимать компьютер. Программы по большей части пишутся на ЯЗЫКАХ ВЫСОКОГО УРОВНЯ, таких как «Си», Паскаль или Бейсик … Научно-технический энциклопедический словарь

    КОМПИЛЯТОР, компилятора, муж. (книжн.). Автор компиляции. || Литератор, способный писать только компиляции (пренебр.). Жалкий компилятор. Толковый словарь Ушакова. Д.Н. Ушаков. 1935 1940 … Толковый словарь Ушакова

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

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

Компиляция

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

Исполняемая

Программа

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

Компилятор

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

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

кода

сообщения об

ошибках

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

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

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

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

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

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


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

42971. Принципиальная схема высокоэффективного импульсного регулятора напряжения постоянного тока 1.34 MB
Регуляторыстабилизаторы напряжения или других параметров электроэнергии в цепях постоянного тока выполняются преимущественно на основе полупроводниковых приборов. На выходное напряжение преобразователя электроэнергии влияют различные факторы: изменение входного напряжения и тока нагрузки температура окружающей среды и др. Поскольку они вызывают изменения выходного напряжения их в этом смысле называют возмущающими. Точность поддержания напряжения при воздействии различных возмущающих факторов характеризуется соответствующими параметрами...
42972. Разработка ремонтной мастерской с ремонтно-технологической документацией на ремонт узлов металлоконструкции автомобильного крана 1.23 MB
Определение годового объема работ по ТО и Р ремонтной мастерской и распределение трудоемкости по видам работ 15 1. Определение суммарного объема работ по ТО и Р 15 1. Годовой объем работ по отдельным зонам ремонтной мастерской 16 1. Распределение трудоемкости ТО по видам работ 17 1.
42973. Проектирование консольно-фрезерного станка 155.12 KB
Серийным называется такое производство, при котором изготовление изделий производится партиями или сериями, состоящими из одноименных, однотипных по конструкции и одинаковых по размерам изделий.
42974. Разработка самозагружающегося скипового подъемника, предназначенного для загрузки составляющих в растворосмеситель 363.31 KB
Дипломный проект состоит из расчетно-пояснительной записки содержащий 5 основных разделов и состоящий из 72 страниц машинописного текста и графической части состоящей из 9 листов чертежей. В расчётно-пояснительной записке дан обзор существующей российской техники для получения бетонной и растворной смесей и способов загрузки составляющих в смесители произведен расчёт на прочность скипового подъёмника а также расчет экономической эффективности рассмотрен вопрос безопасности жизнедеятельности приводится список используемой для выполнения...
42975. Цех ремонта сельхозтехники 103.5 KB
площадь застройки промышленного здания в пределах внешнего периметра наружных стен. полезная площадь промышленного здания. Лёгкий бетон=1000 кг м3 Расчёт вспомогательных помещений Показатели для расчёта: Количество работающих во всех сменах: А=А1А2=8436=120 А1 мужчины А2 женщины Количество работающих в наиболее многочисленной смене: В=В1В2=4921=70 В1 мужчины В2 женщины Количество служащих: С=15 Вид помещений Показатель Значение Примечание Все вспомогательные помещения Площадь м2 504...
42976. Двухэтажный 4-квартирный жилой дом со стенами из керамических камней 87.5 KB
Объемнопланировочное решение здания. Конструктивные решения здания. Характеристика района строительства Место расположения будущего здания в городе Рязань. Климатические условия района строительства: среднегодовая температура 38 0С минимальная зафиксированная температура 410С максимальная зафиксированная температура 380С продолжительность периода со среднесуточной температурой  0С составляет 145 суток количество осадков за год 644мм средняя месячная относительная влажность воздуха: наиболее холодного месяца...
42977. Цех по ремонту автотранспорта 61.5 KB
Введение Исходные данные Характеристики климатического района Характеристика рельефа Характеристики огнестойкости и взрыво-пожаробезопасности Технологическая часть Направленность технологического процесса Технологические зоны Грузоподъемное оборудование Технологические зоны с агрессивными средами Объемно-планировочные решения Параметры проектируемого здания Помещения и перегородки Ворота Окна Полы Кровля Расчет количества водоприемных воронок Фасад...
42978. Газоснабжение жилого микрорайона в Советском районе г. Астрахань с газификацией жилого много квартирного дома 86 KB
При определении сметной стоимости строительства внутренних инженерных систем использованы Территориальные единичные расценки на строительные работы ТЕР. ТЕР2001 предназначены для определения прямых затрат в сметной стоимости строительства а также для расчётов за выполненные строительные работы. Сборники ТЕР2001 разработаны в базисном уровне цен Госстроя по состоянию на 1 января 2001 года. При расчёте сметной стоимости базовоиндексным методом приняты: а Объёмы работ для подсчета сметной стоимости работ определяются в разделе...
42979. Двухэтажный 6-квартирный жилой дом со стенами из силикатного кирпича 88.5 KB
Объемнопланировочное решение здания. Конструктивные решения здания. Характеристика района строительства Место расположения будущего здания в городе Орел. Климатические условия района строительства: среднегодовая температура 49 0С минимальная зафиксированная температура 350С максимальная зафиксированная температура 380С продолжительность периода со среднесуточной температурой  0 0С составляет 138 суток количество осадков за год 571мм средняя месячная относительная влажность воздуха: наиболее холодного месяца...