Общие сведения | Энциклопедия | Научные публикации | Публицистика | Новости | Каталоги | Авторы |
| На главную | О проекте | Контакты | | |
![]() |
Статья в Энциклопедическом Фонде
Компилятор
Компилято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. Логическая структура компилятора
Транслятор - это программа, которая переводит исходную программу в эквивалентную ей объектную программу. Если объектный язык представляет собой автокод или некоторый машинный язык, то транслятор называется компилятором. Автокод очень близок к машинному языку; большинство команд автокода - точное символическое представление команд машины. Важной исторической особенностью компилятора являлось то, что он мог производить и компоновку (то есть содержал две части - транслятор и компоновщик). Это связано с тем, что раздельная компиляция и компоновка как отдельная стадия сборки выделились значительно позже появления компиляторов, и многие популярные компиляторы (например, 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 г. |
|
|