8-900-374-94-44
[email protected]
Slide Image
Меню

Раздельная компиляция c – Раздельная компиляция программ на C++

Содержание

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

Алгоритмизация и программирование

Алгоритмизация и программирование Программирование на С/С++ (ч.1 — основы) Беркунский Е.Ю., кафедра ИУСТ, НУК [email protected] http://www.berkut.mk.ua Компьютеры для чего? Компьютер это универсальный

Подробнее

Язык программирования Си

Язык программирования Си Бикулов Д.А., Иваницкая Н.В., Иванов А.П. Семинар 4. Функции, передача параметров по значению. Рекурсия. Глобальные и статические переменные, правила видимости переменных. Модульный

Подробнее

Объявление функций в С/С++

Объявление функций в С/С++ Описание функций в отдельных файлах В С++ существует возможность поместить объявления функций в отдельный файл, тогда необходимо будет подключать файл с функциями, как в случае

Подробнее

Лабораторная работа 4

Лабораторная работа 4 Цель: Лабораторная работа предназначена для приобретения практического опыта в создании приложения с использованием языка программирования С++ для математических расчѐтов. Призвана:

Подробнее

Лекция 2. Модульное программирование

Название Лекция 2. Модульное программирование Объектно-ориентированное программирование на C ++ 7 сентября 2009 г. Лекция 2 1 / 17 Проблемы при разработке ПО Проблемы Правила применения Проблемы, возникающие

Подробнее

Лабораторная работа 2

Лабораторная работа 2 Цель: Ознакомление со средой программирования, приобретение навыков создания и тестирования программ, изучение символьных типов данных. Приобретение навыков работы с условными и безусловными

Подробнее

Программы из нескольких файлов

102 В.Л. Тарасов Лекции по программированию на C++ Лекция 8 Программы из нескольких файлов Как правило, исходные тексты программ на C++ размещают в нескольких файлах. Это удобно, так как небольшой код

Подробнее

Алгоритмизация и программирование

Алгоритмизация и программирование Программирование на С/С++ (ч.11 файлы) Беркунский Е.Ю., кафедра ИУСТ, НУК [email protected] http://www.berkut.mk.ua Что такое файл? Файл именованный набор байтов,

Подробнее

Code::Blocks : CODE::BLOCKS 2.1

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Федеральное государственное образовательное учреждение высшего профессионального образования «ЮЖНЫЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ» ЧЕРДЫНЦЕВА М.И. РАЗРАБОТКА ПРОГРАММ НА

Подробнее

Структура программ, управление

46 В.Л. Тарасов Лекции по программированию на C++ Лекция 3 Структура программ, управление 3.1. Состав программы Программа на языке C++ состоит из функций и переменных. Среди функций любой программы должна

Подробнее

Краткая программа курса:

Информатика на Физико-Химическом Факультете МГУ имени М.В.Ломоносова В краткой программе курса обозначены основные положения, которые должны знать студенты, для сдачи зачёта. Студенты также должны уметь

Подробнее

Лекция 4. Динамическая память

http://compscicenter.ru 1/21 Александр Смаль CS центр 1 октября 2014 Санкт-Петербург http://compscicenter.ru 2/21 Зачем нужна динамическая память? Стек программы ограничен. Он не предназначен для хранения

Подробнее

Алгоритмизация и программирование

Алгоритмизация и программирование Программирование на С/С++ (ч.12 указатели) Беркунский Е.Ю., кафедра ИУСТ, НУК [email protected] http://www.berkut.mk.ua Указатели Указатель переменная, значением

Подробнее

Перегрузка операторов

192 В.Л. Тарасов Лекции по программированию на C++ Лекция 12. Перегрузка операторов 12.1. Функции-операторы В языке C++ можно определять функции, имена которых совпадают с именами встроенных операторов:

Подробнее

Компилятор и его друзья

11 июля 2016 г. Знакомые компиляторы Паскаль fpc hello.pas C gcc hello.c -o hello C++ g++ hello.cpp -o hello Тоже компиляторы Существенно отличаются от предыдущих! Java javac Hello.java Python python -m

Подробнее

Язык программирования Cи

Язык программирования Cи Бикулов Д.А., Иваницкая Н.В., Иванов А.П. Семинар 1. Средства программирования. Структура консольного приложения, этапы компиляции и сборки программы. Первая программа. 1 Введение

Подробнее

Операционная система Linux. Лекция 12

Операционная система Linux Лекция 12 1 Компиляция нескольких файлов Раздельная компиляция трансляция частей программы по отдельности с последующим объединением их компоновщиком в единый загрузочный модуль.

Подробнее

ОСНОВЫ ПРОГРАММИРОВАНИЯ

Университет «Дубна» Дмитровский институт непрерывного образования Специальность 09.0.03. «Программирование в компьютерных системах» ОСНОВЫ ПРОГРАММИРОВАНИЯ С++ ПРАКТИКУМ 1 часть Объявление и инициализация

Подробнее

Лабораторная работа 6. Функции в С++

Лабораторная работа 6 Функции в С++ 1. Цель работы: 1) Получить практические навыки работы с функциями; 2) получить практические навыки работы с шаблонами функций; 3) получить практические навыки работы

Подробнее

Тема 1.1 Функции в С. Понятие функции

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

Подробнее

Лабораторная работа 7

Лабораторная работа 7 Шаблоны классов 1. Цель задания: 1) Создание консольного приложения, состоящего из нескольких файлов в системе программирования Visual Studio. 2) Реализация шаблона класса-контейнера.

Подробнее

Операционная система Linux. Лекция 11

Операционная система Linux Лекция 11 GNU Compiler Collection (gcc) GNU Compiler Collection — набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC является свободным

Подробнее

1 ТЕХНОЛОГИЯ СДАЧИ ЭКЗАМЕНА

1 ТЕХНОЛОГИЯ СДАЧИ ЭКЗАМЕНА Экзамен проходит в форме тестирования по единому билету для экзаменующихся. В экзаменационный билет входят задачи двух типов: — Задача на программирование, решением которой

Подробнее

Массивы и их обработка

Массивы и их обработка Линейные массивы. Двумерные массивы. Сортировка Беркунский Е.Ю., кафедра ИУСТ, НУК [email protected] http://www.berkut.mk.ua Массивы — основы Массив это структура данных,

Подробнее

«Ликбез» по программированию

Бирюков Г.Ф. «Ликбез» по программированию Занятие 1 Программирование — это во многом умение решать задачи, используя компьютер, и определенное программное обеспечение в качестве инструмента. Как всякое

Подробнее

docplayer.ru

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

Питання до іспиту з Програмування (1 семетр).

  1. Структурний підхід до програмування.

  2. Алгоритми.

  3. Основні структурні блоки програми на С++.

  4. Лексичні поняття С++ (алфавіт, типи лексем)

  5. Типи даних (прості, похідні, складені).

  6. Область видимості та час життя змінної.

  7. Оголошення, визначення та ініціалізація змінних.

  8. Правило одного визначення.

  9. Вирази та операції (арифметичні, логічні, відношення).

  10. Посилання.

  11. Оголошення та визначення функції.

  12. Прототип.

  13. Передача параметрів в функції за замовчуванням.

  14. Передача аргументів в функцію за значенням та за посиланням.

  15. Перевантаження функцій.

  16. Вбудовані функції (inline).

  17. Керуючі конструкції (умовні оператори та цикли).

  18. Директиви препроцесора і вказівки компілятору.

  19. Структуровані типи даних: масиви.

  20. Доступ до елементів масиву через індексні вирази та через вказівники.

  21. Вказівники. Операції над вказівниками.

  22. Обробка символьної інформації. Рядки

  23. Структуровані типи даних: структури, об’єднання, засіб typedef, перелічення.

  24. Динамічне керування пам’яттю.

  25. Моделі пам’яті.

  26. Введення/виведення в стандартний потік.

  27. Доступ до файлів за допомогою потоку введення/виведення (функції високого рівня).

  28. Префіксний доступ до файлів. Функції вв/вив низького рівня.

  29. Функції вв/вив консольного термінала та порту.

  30. Роздільна компіляція.

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

1. Структурний підхід до програмування.

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

В соответствии с данной методологией

  1. Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

  • последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

  • ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

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

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

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

  2. Разработка программы ведётся пошагово, методом «сверху вниз».

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

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

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

  3. Сильно упрощается процесс тестированияиотладкиструктурированных программ.

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

  1. Всё является объектом.

  2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия.

  3. Каждый объект имеет независимую память, которая состоит из других объектов.

  4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

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

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

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

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

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

Частичная формализация понятия алгоритма началась с попыток решения проблемы разрешения (нем. Entscheidungsproblem), которую сформулировал Давид Гильберт в 1928 году. Следующие этапы формализации были необходимы для определения эффективных вычислений[1] или «эффективного метода»[2]; среди таких формализаций — рекурсивные функции Геделя — Эрбрана — Клини 1930, 1934 и 1935 гг., λ-исчисление Алонзо Чёрча 1936 г., «Формулировка 1» Эмиля Поста 1936 года и машина Тьюринга. В методологии алгоритм является базисным понятием и получает качественно новое понятие как оптимальности по мере приближения к прогнозируемому абсолюту. В современном мире алгоритм в формализованном выражении составляет основу образования на примерах, по подобию.

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

Для каждой задачи может существовать множество алгоритмов, приводящих к цели. Увеличение эффективности алгоритмов составляет одну из задач современной информатики. В 50-х гг. XX века появилась даже отдельная её область — быстрые алгоритмы. В частности, в известной всем с детства задаче об умножении десятичных чисел обнаружился ряд алгоритмов, позволяющих существенно (в асимптотическом смысле) ускорить нахождение произведения. См. быстрое умножение.

3. Основні структурні блоки програми на С++.

  1. Лексичні поняття С++ (алфавіт, типи лексем)

В C++

 слова = лексеми

 словосполучення = вирази

 пропозиції = оператори

Лексема

 мінімальна одиниця мови, що має самостійний зміст

 складається із символів алфавіту, що розпізнаються компілятором

Наприклад, оператор do — це лексема

 Зустрічаючи цю лексему, компілятор знає, який машинний

код потрібно підставляти замість неї

В C++ розрізняють п’ять типів лексем

 ідентифікатори

 ключові слова

 знаки операцій

 літерали (константи)

 роздільники

 \a — звуковий сигнал

 \n — розміщення курсору на початок наступного рядка

  1. Типи данних

До простих типів відносятьсяо простих типів відносяться

 bool

  intint

 char

 float

 double

До похідних типів відносяться

 масиви (int a[5])

 вказівники (int*a)

ККрім вбудованих типів у С++ існуютьрім вбудованих типів у С++ існують

користувацькі типи, які вимагають

попереднього оголошення.

ВВони зазвичай складеніони зазвичай складені

 структура (struct)

 об’єднання (union)

 п ерерахування (enum)перерахування (enum)

 класи (сlass)

8. Правило одного определения

[править]

Материал из Википедии — свободной энциклопедии

Правило одного определения (One Definition Rule) (ODR) один из основных принципов языка программированияC++.

Вкратце, положения ODR выглядят так:

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

  2. В пределах программы(совокупности всех единиц трансляции) объект или не-inlineфункцияне могут иметь больше одного определения; если объект или функция используются, у каждого из них должно быть строго по единственному определению. Можно объявить объект или функцию, которые не будут использованы в программе, в этом случае не потребуется и их определения. Ни в коем случае не должно быть более одного определения.

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

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

В своей знаменитой книге «Введение в язык C++» Бьёрн Страуструпприводит следующий пример:

// file1.c:

int a = 1;

int b = 1;

extern int c;

// file2.c:

int a;

extern double b;

extern int c;

В данном примере 3 ошибки: a определено дважды (int a; является определением, которое означает int a=0;), b описано дважды с разными типами, а c описано дважды, но не определено. Эти виды ошибок (ошибки компоновки) не могут быть обнаружены компилятором, который за один раз видит только один файл. Компоновщик, однако, их обнаруживает.

studfiles.net

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

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

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

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

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

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

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

  • Пакетная. Компиляция нескольких исходных модулей в одном задании.
  • Построчная. Машинный код порождается и затем исполняется для каждой завершённой грамматической конструкции языка. Внешне воспринимается как интерпретация, но устройство имеет иное.
  • Условная. Компиляция, при которой транслируемый текст зависит от условий, заданных в исходной программе директивами компилятора. (Яркий пример — работа препроцессора языка С и производных от него.) Так, в зависимости от значения некой константы некая заданная часть исходного текста программы транслируется или не транслируется.

Структура компилятора[ | код]

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

  1. Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
  2. компоновка машинно-ориентированной программы.

В первом случае компилятор представляет собой пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики. Такой компилятор может компилировать программу, разные части исходного текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.

Во втором случае компилятор де-факто выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Этот факт нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа поддерживают организацию импорта программой процедуры (функции) из уже оттранслированого программного модуля, написанного на другом языке программирования. Так в программу на С/С++ можно импортировать функцию написанную например Pascal или Fortran. Аналогично и напротив написанная на С/С++ функция может быть импортирована в Pascal- или Fortran-программу соответственно. Это как правило было бы невозможно без поддержки многими современными компиляторами организации обработки входных данных в процедуру (функций) в соответствии с соглашениями других языков программирования. Например современные компиляторы с языка Pascal помимо соглашения самого Pascal поддерживает организацию обработки процедурая/функцией входных в соответствии с соглашениями языка С/С++. (Чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка С/С++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.) Примерами таких компиляторов являются компиляторы со всех без исключения языков программирования, используемые непосредственно.

Трансляция программы как неотъемлемая составляющая компиляции включает в себя:

  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) используют байт-код для оптимизации исполнения: затратные этапы синтаксического анализа и преобразование текста программы в байт-код выполняются один раз при загрузке, затем соответствующий код может многократно использоваться без перекомляции.

Динамическая компиляция[ | код]

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

Наиболее популярной разновидностью динамической компиляции является JIT. Другой разновидностью является инкрементальная компиляция[en].

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

Трансляция байт-кода в машинный код[ | код]

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

Декомпиляция[ | код]

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

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

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

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

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

Собственно утилита make — яркий пример довольно удачной реализации раздельной компиляции. Работа утилиты make управляется сценарием на интерпретируемым утилитой входном языке, известном как makefile, содержащемся в задаваемом при запуске утилиты входном текстовом файле. Сама утилита не выполняет ни трансляцию, ни компоновку — де-факто утилита make функционирует как диспетчер процесса компиляции, организующий компиляцию программы в соответствии с заданным сценарием. В частности в ходе компиляции целевой программы утилита make вызывает трансляторы с языков программирования, транслирующие разные части исходной программы в объектный код, и уже после этого вызывается тот или иной компоновщик, компонующий конечный исполняемый программный или библиотечный программный модуль. При этом разные части программы, оформляемые в виде отдельных файлов исходного текста, могут быть написаны как на одном языке программирования, так и на разных языках программирования. В процессе перекомпиляции программы транслируются только измененные части-файлы исходного текста программы, вследствие чего длительность перекомпиляции программы значительно (порой на порядок) сокращается.

История[ | код]

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

См. также[ | код]

Примечания[ | код]

  1. ↑ ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
  2. 1 2 3 4 Першиков, 1991.
  3. 1 2 3 Вычислительная техника.
  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.

Литература[ | код]

  • СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
  • Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
  • Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = 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 с.
  • Д. Креншоу. Давайте создадим компилятор!
  • Серебряков В. А., Галочкин М. П. Основы конструирования компиляторов.
  • Textbook: Compiler Design: Theory, Tools, and Examples (неопр.).
  • В. Э. Карпов. КЛАССИЧЕСКАЯ ТЕОРИЯ КОМПИЛЯТОРОВ
  • Можно воспользоваться для поисков прочих источников запросом «Теория формальных языков».

Ссылки[ | код]

ru.wikibedia.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *