Компиляция программы что это

Процесс выполнения управляемого кода

Процесс управляемого исполнения включает следующие шаги, которые подробно разбираются позднее в этом разделе:

  1. Выбор компилятора. Чтобы воспользоваться преимуществами среды CLR, необходимо использовать один или несколько языковых компиляторов, обращающихся к среде выполнения.
  2. Компиляция кода в MSIL. При компиляции исходный код преобразуется в MSIL и создаются необходимые метаданные.
  3. Компиляция инструкций MSIL в машинный код. Во время выполнения JIT-компилятор преобразует инструкции MSIL в машинный код. Во время этой компиляции выполняется проверка кода и метаданных MSIL с целью установить, можно ли для них определить, является ли код типобезопасным.
  4. Выполнение кода. Среда CLR предоставляет инфраструктуру, обеспечивающую выполнение кода, и ряд служб, которые можно использовать при выполнении.

Выбор компилятора

Чтобы воспользоваться преимуществами, предоставляемыми средой CLR, необходимо применить один или несколько языковых компиляторов, ориентированных на среду выполнения, например компилятор Visual Basic, C#, Visual C++, F# или один из многочисленных компиляторов от независимых разработчиков, например компилятор Eiffel, Perl или COBOL.

C++ с нуля | 08 | Компиляция и линковка

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

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

Компиляция в MSIL

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

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

Компиляция и интерпретация за 10 минут

MSIL и метаданные содержатся в переносимом исполняемом (PE) файле, который основывается на форматах Microsoft PE и COFF, ранее использовавшихся для исполняемого контента, но при этом расширяет их возможности. Этот формат файлов, позволяющий размещать код MSIL или машинный код, а также метаданные, позволяет операционной системе распознавать образы среды CLR. Наличие в файле метаданных наряду с MSIL позволяет коду описывать себя. Это устраняет потребность в библиотеках типов и языке IDL. Среда выполнения находит и извлекает метаданные из файла по мере необходимости при выполнении.

Компиляция инструкций MSIL в машинный код

Перед запуском MSIL его необходимо скомпилировать в машинный код в среде CLR для архитектуры конечного компьютера. Платформа .NET предоставляет два способа такого преобразования:

  • JIT-компилятор платформы .NET.
  • Ngen.exe (генератор образов в машинном коде).

Компиляция с помощью JIT-компилятора

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

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

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

Создание кода во время установки с помощью NGen.exe

Тот факт, что JIT-компилятор преобразует MSIL-код сборки в машинный код при вызове отдельных методов, определенных в этой сборке, отрицательно сказывается на производительности во время выполнения. В большинстве случаев снижение производительности приемлемо. Что более важно, код, созданный JIT-компилятором, будет привязан к процессу, вызвавшему компиляцию.

Читайте также:
Что за программа рабство

Его нельзя сделать общим для нескольких процессов. Чтобы созданный код можно было использовать в нескольких вызовах приложения или в нескольких процессах, которые совместно используют набор сборок, среда CLR предоставляет режим предварительной компиляции. В таком режиме компиляции для преобразования сборок MSIL в машинный код в стиле JIT-компилятора используется генератор образов в машинном коде (Ngen.exe). Однако, работа Ngen.exe отличается от JIT-компилятора в трех аспектах.

  • Ngen.exe выполняет преобразование из MSIL-кода в машинный код перед выполнением приложения, а не во время его выполнения.
  • При этом сборка компилируется целиком, а не по одному методу за раз.
  • Она сохраняет созданный код в кэше образа машинного кода в виде файла на диске.

Проверка кода

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

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

  • ссылка на тип строго совместима с адресуемым типом;
  • для объекта вызываются только правильно определенные операции;
  • удостоверения являются подлинными.

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

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

Выполнение кода

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

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

В Microsoft Windows Vista загрузчик операционной системы выполняет поиск управляемых модулей, анализируя бит в заголовке COFF. Установленный бит обозначает управляемый модуль. При обнаружении управляемых модулей загружается библиотека Mscoree.dll, а подпрограммы _CorValidateImage и _CorImageUnloading уведомляют загрузчик о загрузке и выгрузке образов управляемых модулей. Подпрограмма _CorValidateImage выполняет следующие действия:

  1. Проверяет, является ли код допустимым управляемым кодом.
  2. Заменяет точку входа в образе на точку входа в среде выполнения.

В 64-разрядных системах Windows _CorValidateImage изменяет образ, находящийся в памяти, путем преобразования его из формата PE32 в формат PE32+.

См. также раздел

  • Обзор
  • Независимость от языка и независимые от языка компоненты
  • Метаданные и компоненты с самоописанием
  • Ilasm.exe (ассемблер IL)
  • Security
  • Взаимодействие с неуправляемым кодом
  • Развертывание
  • Сборки в .NET
  • Домены приложений

Источник: learn.microsoft.com

Компилятор

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

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

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

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

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

Источник: studfile.net

Урок 9. Про компиляцию, интерпретацию и .EXE файл

Drawing 20

Здравствуйте, дорогие читатели! Сегодня мы с вами немного окунемся в теорию. Наверняка, вы все когда-то хотели отправить свою супер-пупер программу другу. Но как это сделать? Не заставлять же его устанавливать PascalABC.NET!

О том, как это сделать, мы сегодня и поговорим.

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

Интерпретаторы

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

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

Protsess interpretatsii 510x141

При интерпретации выполнение кода происходит последовательно строка за строкой (от инструкции до инструкции). Операционная система взаимодействует с интерпретатором, а не исходным кодом.

Примеры интерпретируемых языков: PHP, JavaScript, C#, Python.

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

Программы же, рассчитанные на интерпретаторы, могут выполняться в любой системе, где таковой интерпретатор присутствует. Типичный пример — код JavaScript. Интерпретатором его выступает любой современный браузер. Вы можете однократно написать код на JavaScript, включив его в html-файл, и он будет одинаково выполняться в любой среде, где есть браузер. Не важно, будет ли это Safari в Mac OS, или же Internet Explorer в Windows.

Компиляторы

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

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

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

Примеры компилируемых языков: C, C++, Pascal, Delphi.

Ход работы компилятора.

Препроцессинг

Эту операцию осуществляет текстовый препроцессор.

Исходный текст частично обрабатывается — производятся:

  • Замена комментариев пустыми строками
  • Подключение модулей и т. д. и т. п.

Компиляция

Результатом компиляции является объектный код.

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

Компоновка

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

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

EXE файл.

После компоновки у вас образуется.EXE файл вашей программы. Вы можете кинуть ее другу, и она откроется у него прямо в командной строке, как в старом добром DOS. Давайте попробуем создать.EXE файл. Все действия будут приводится в PascalABC.NET.

Заходим в Сервис -> Настройки -> Опции компиляции. Поверяем, стоит ли галочка напротив 2 пункта. Если стоит, то убираем ее.

Теперь откройте свою программу и запустите ее.

Откройте директорию, в которой у вас лежит исходный код программы.

Кликаем по приложению. Как вы видите, после ввода данных, окошко сразу закрывается. Для того чтобы окно не закрывалось сразу, следует дописать две строчки кода, а именно: uses crt (перед разделом описания переменных) и readkey (в конце кода, перед оператором end).

Сохраненное изображение 2014 2 5 21 3 44.424 510x377

Теперь окно закроется по нажатию любой клавиши.

Сохраненное изображение 2014 2 5 21 2 32.800 510x256

На заметку:

— это интегрированная среда разработки.

Среда разработки включает в себя:

  • текстовый редактор;
  • компилятор;
  • средства автоматизации сборки;
  • отладчик.

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

Источник: learnpascal.ru

Компиляция программы что это

С появлением языков четвертого поколения, программирование стало тесно связанно с таким понятием как компилятор.

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

Компиляция программы — преобразования команд написанных на языке понятном разработчику в язык понятных ЭВМ или операционной системе работающей на данной ЭВМ.

Особенности компиляторов:

1) После окончательной компиляции программы она стает самостоятельным бинарным кодом. Который можно запускать как отдельное приложение на ОС для которой была проведена компиляция программы.

2) Откомпилированные компилятором программы работают заметно быстрее так как при запуске ОС сразу понимает команды записанные в программе.

Недостатки компиляторов:
1) Программа имеет зависимость от ОС, под которую была скомпилирована
2) Сложность отладки кода программы.
3) Собранную программу невозможно преобразовать в исходный код.
Сами программы компиляторы делятся на несколько видов.

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

Векторными процессорами — оснащены в основном видео карты, и системы графического отображения данных.

Читайте также:
Программа честный знак что это такое

2) Гибкий компилятор — данный вид компиляторов ориентирован на работу с базами данных и отдельными таблицами хранящими большие объемы информации.

3) Инкрементальный компилятор — дополняет к уже скомпилированному коду программы изменения вносимые разработчиками во время разработки.

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

5) Компилятор создания компиляторов — программа понимающая формальное описание языка программирования и создающая компилятор для данного языка.

6) Отладочный компилятор — данный вид компиляторов позволяет самостоятельно исправлять ошибки во время компиляции программы.

7) Само компилируемый компилятор — программа компилятор написана на том же языке, на котором нужно скомпилировать программу.

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

Источник: www.sites.google.com

Компилятор и интерпретатор в программировании: в чем разница

Lorem ipsum dolor

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

Компилятор использует всю программу сразу и преобразует ее в код, который сможет запуститься на устройстве. Самый простой пример — это файлы с расширением «.ехе» на Windows. То ест ь в ы пишите какую-то программу для работы под управлением Виндовс, допустим , на языке С++. Сразу запустить ее в системе не получится, потому что система ее не поймет.

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

Суть компилятора — это взять всю программу и перевести ее из высокоуровневого представления в низкоуровневое.

Интерпретация и интерпретатор — что это такое?

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

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

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

Компилятор и интерпретатор: особенности подходов

Напишем

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

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

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

Отметим ряд особенностей интерпретации и компиляции:

  1. После компиляции программный код готов к исполнению на устройстве, так как уже имеет машинное представление.
  2. Скомпилированный код выполняется быстрее, чем исходный код при интерпретировании.
  3. Скомпилированный код сложно откорректировать , п оэтому тут два эффекта : с одной стороны, компиляция защищает исходный код программы от постороннего вмешательства. С другой стороны, если разработчику программы нужно внести какие-то изменения, он это делает в исходном коде, а потом нужно перекомпилировать программу.
  4. Компилятор оптимизирует и определяет наличие ошибок в коде во время компиляции.
  5. Компилятор требует больше системных ресурсов, чем интерпретатор.
  6. Интерпретатор не «грузит» систему, потому что преобразует по одной инструкции за один раз.
  7. Интерпретируемые программы легко корректировать.
  8. При интерпретации путь программы от исходного кода и до ее исполнения короче, чем при компиляции.
  9. Компилятор сохраняет результат своей работы в виде отдельного файла, а интерпретатор выполняет работу «на лету».

Интерпретируется или компилируется программа — зависит от того, на каком языке программирования она написана.

Заключение

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

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

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

Мы будем очень благодарны

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

Источник: codernet.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru