Процесс компиляции программ на c++
Содержание:
- Обзор GCC
- пример
- Установка MinGW
- Генерация кода
- Какие бывают компиляторы?
- Как работает компилятор?
- Яндекс-карты в 1С (универсальная) (обычные и управляемые формы)
- Прочие
- Простой интерпретатор Lisp на Umka
- Структура компилятора
- Как убрать страницу с текстом?
- Виды компиляторов
- Компиляция и запуск программ C, C++
- Что такое LLVM и зачем он нужен?
- Примечания
- Структура компилятора
- Как управлять делегированными контактами
Обзор GCC
GCC — GNU Compiler Collection, первый С компилятор с открытым исходным кодом, он был выпущен в 1987 г. Возможность создавать С++ программы была добавлена в 1992 г.
Впоследствии функциональность компилятора была расширена и включена поддержка таких языков программирования как Objective-C, Java, Fortran, ADA и другие.
GCC — очень мощный инструмент, распространяемый под лицензией GNU GPL (GNU General Public License), написан на языке С и в данный момент является кроссплатформенным — может работать практически под любой современной операционной системой и компилировать программы под различные типы процессоров, в том числе для микроконтроллеров, портативных устройств и 64-разрядных процессоров.
пример
Различные веб-сайты предоставляют онлайн-доступ к компиляторам C ++. Набор функций онлайн-компилятора значительно варьируется от сайта к сайту, но обычно они позволяют сделать следующее:
- Вставьте свой код в веб-форму в браузере.
- Выберите некоторые параметры компилятора и скомпилируйте код.
- Собирать компилятор и / или выпуск программы.
Онлайн-поведение веб-компилятора обычно является довольно ограничительным, поскольку они позволяют кому-либо запускать компиляторы и выполнять произвольный код на своей стороне сервера, тогда как обычно удаленное выполнение произвольного кода считается уязвимостью.
Компиляторы онлайн могут быть полезны для следующих целей:
- Запустите небольшой фрагмент кода с компьютера, на котором отсутствует компилятор C ++ (смартфоны, планшеты и т. Д.).
- Убедитесь, что код успешно компилируется с разными компиляторами и работает одинаково, независимо от компилятора, с которым он был скомпилирован.
- Изучайте или преподавайте основы C ++.
- Изучите современные возможности C ++ (C ++ 14 и C ++ 17 в ближайшем будущем), когда современный компилятор C ++ недоступен на локальной машине.
- Найдите ошибку в своем компиляторе по сравнению с большим набором других компиляторов. Проверьте, исправлена ли ошибка компилятора в будущих версиях, которые недоступны на вашем компьютере.
- Решите проблемы онлайн-судьи.
Какие онлайн-компиляторы не должны использоваться для:
- Разработка полнофункциональных (даже небольших) приложений с использованием C ++. Обычно онлайн-компиляторы не позволяют связываться со сторонними библиотеками или загружать артефакты сборки.
- Выполнять интенсивные вычисления. Ресурсы на стороне Sever ограничены, поэтому любая пользовательская программа будет убита через несколько секунд после ее выполнения. Допустимое время выполнения обычно достаточно для тестирования и обучения.
- Сам сервер компилятора атаки или сторонние хосты в сети.
Примеры:
- http://codepad.org/ Онлайн-компилятор с совместным использованием кода. Редактирование кода после компиляции с предупреждением или ошибкой исходного кода работает не так хорошо.
- http://coliru.stacked-crooked.com/ Онлайн-компилятор, для которого вы указываете командную строку. Предоставляет компиляторы GCC и Clang для использования.
- http://cpp.sh/ — Онлайн-компилятор с поддержкой C ++ 14. Не позволяет редактировать командную строку компилятора, но некоторые параметры доступны через элементы управления графическим интерфейсом.
- https://gcc.godbolt.org/ — Предоставляет широкий список версий, архитектуры и разборки компилятора. Очень полезно, когда вам нужно проверить, что ваш код компилируется разными компиляторами. GCC, Clang, MSVC ( ), компилятор Intel ( ), ELLCC и Zapcc, причем один или несколько из этих компиляторов доступны для ARM, ARMv8 (как ARM64), Atmel AVR, MIPS, MIPS64, MSP430, PowerPC , x86 и x64 architecutres. Аргументы командной строки компилятора могут быть отредактированы.
- https://ideone.com/ — Широко используется в сети для иллюстрации поведения фрагмента кода. Предоставляет GCC и Clang для использования, но не позволяет редактировать командную строку компилятора.
- http://melpon.org/wandbox — Поддерживает многочисленные версии компилятора Clang и GNU / GCC.
- http://onlinegdb.com/ — крайне минималистичная среда разработки, включающая редактор, компилятор (gcc) и отладчик (gdb).
- http://rextester.com/ — Предоставляет компиляторы Clang, GCC и Visual Studio для C и C ++ (наряду с компиляторами для других языков), с доступной для использования библиотекой Boost.
- http://tutorialspoint.com/compile_cpp11_online.php — полнофункциональная оболочка UNIX с GCC и удобный для пользователя проект.
- http://webcompiler.cloudapp.net/ — Компилятор Online Visual Studio 2015, предоставленный Microsoft в составе RiSE4fun.
Previous
Next
Установка MinGW
Для установки требуется подключение к сети интернет.
Запустите установщик, он скачает и установит все необходимые файлы.
Жмите «Next».
Диалог сообщает нам, что программа запущена администратором компьютера и будет установлена для всех пользователей.
На этом этапе укажем загружать последнюю версию программного обеспечения.
Соглашаемся с условиями лицензионного соглашения и жмём «Next».
Укажем путь для установки. Не рекомендуется устанавливать в директорию или субдиректорию имеющюю в своём имени пробелы.
Рзмещайте все файлы по стандартному пути, например, «C:\MinGW».
Настройка ярлыков, можно оставить как есть и нажать «Next».
Выбор компонентов для установки.
В данном случае выбраны компилятор С и С++, инструменты для разработки и комплект утилит командной строки — MSYS.
Подтверждение настроек.
Если всё выбрано правильно, жмём «Install».
Начало установки — ожидаем начала загрузки компонентов.
Автоматически запускается консольное окно, в котором отражается весь ход процесса — в данный момент загружаются списки пакетов.
В следующем окне мы можем наблюдать за прогрессом загрузки.
Установка окончена, если вы не хотите читать подробный отчёт о процессе установки, снимите галочку.
Закройте окно установщика — нажмите «Finish».
Проверим, готова ли операционная система для полноценной работы с MinGW. В свойствах компьютера на вкладке «Дополнительно» кликните по кнопке «Переменные среды».
Нам потребуется значение переменной PATH, там должны быть прописаны пути к папкам с исполняемыми файлами MinGW и MSYS, в данном случае это директории «C:\MinGW\bin» и «C:\MinGW\msys\1.0\bin».
Если эти значения не были автоматически добавлены в переменную в процессе установки, допишите их вручную, добавте в начало строку «C:\MinGW\bin;C:\MinGW\msys\1.0\bin;», только без кавычек.
Если в вашей операционной системе отсутствует переменная PATH, то создайте её самостоятельно.
Теперь, когда все инструменты установлены, можно использовать GCC компиляторы в режиме командной строки или настроить их использование в своей IDE.
Генерация кода
Генерация машинного кода
Большинство компиляторов переводит программу с некоторого высокоуровневого языка программирования в машинный код, который может быть непосредственно выполнен физическим процессором. Как правило, этот код также ориентирован на исполнение в среде конкретной операционной системы, поскольку использует предоставляемые ею возможности (системные вызовы, библиотеки функций). Архитектура (набор программно-аппаратных средств), для которой компилируется (собирается) машинно-ориентированная программа, называется целевой машиной.
Результат компиляции — исполнимый программный модуль — обладает максимально возможной производительностью, однако привязан к конкретной операционной системе (семейству или подсемейству ОС) и процессору (семейству процессоров) и не будет работать на других.
Для каждой целевой машины (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. Другой разновидностью является инкрементальная компиляция.
CIL-код также компилируется в код целевой машины JIT-компилятором, а библиотеки .NET Framework компилируются заранее.
Какие бывают компиляторы?
Ни один компилируемый язык программирования не обходится без компилятора. Некоторые компиляторы работают с несколькими языками программирования. Но программист должен учитывать еще и параметры компьютера, на котором программа будет запускаться.
Дело в том, что современные процессоры отличаются друг от друга устройством, поэтому машинный код для одного процессора будет понятен, а для другого нет. Это касается и операционных систем: одна и та же программа будет работать на Windows, но не запустится на Linux или MacOS. Поэтому нужно пользоваться тем компилятором, который работает с нужным процессором и операционной системой.
Если программа будет работать на нескольких операционных системах, то нужен кросс-компилятор — компилятор, который преобразует универсальный машинный код. Например, GNU Compiler Collection(сокращенно GCC) поддерживает C++, Objective-C, Java, Фортран, Ada, Go и поддерживает разную архитектуру процессоров.
Начинающие программисты даже не знают о наличии компилятора на компьютере. Они пишут программы в интегрированной среде разработки, в которую встроен компилятор, а иногда и не один. В этом случае, выбор компилятора делает среда, а не программист. Например, MS Visual Studio поддерживает компиляторы для операционных систем Windows, Linux, Android. Выбирая тип проекта, Visual Studio определяет процессор и операционную систему компьютера, и после этого выбирает подходящий компилятор.
Как работает компилятор?
Преобразование программного кода в машинный называется компиляцией. Компиляция только преобразует код. Она не запускает его на исполнение. В этот момент он “статически” (то есть без запуска) транслируется в машинный код. Это сложный процесс, в котором сначала текст программы разбирается на части и анализируется, а затем генерируется код, понятный процессору.
Разберём этапы компиляции на примере вычисления периметра прямоугольника:
После запуска программы компилятору нужно определить, какие команды в ней записаны. Сначала компилятор разделяет программу на слова и знаки — токены, и записывает их в список. Такой процесс называется лексическим анализом. Его главная задача — получить токены.
Затем компилятор читает список и ищет токен-операторы. Это могут быть оператор присваивания(), арифметические операторы(,,,), оператор вывода() и другие операторы языка программирования. Такие операторы работают с числами, текстом и переменными.
Компилятор должен понять, какие токены в списке связаны с токен-оператором. Чтобы сделать это правильно, для каждого оператора строится специальная структура — логическое дерево или дерево разбора.
Так операция будет преобразована в логическое дерево:
Теперь каждое дерево нужно разобрать на команды, и каждую команду преобразовать в машинный код.
Компилятор начинает читать дерево снизу вверх и составляет список команд:
- Взять переменную , взять переменную , сложить их
- Взять результат сложения, взять число и найти их произведение
- Результат произведения присвоить (записать) в переменную
Компилятор еще раз проверяет команды, находит ошибки и старается улучшить код. При успешном завершении этого этапа, компилятор переводит каждую команду в набор 0 и 1. Наборы записываются в файл, который сможет прочитать и выполнить процессор.
Яндекс-карты в 1С (универсальная) (обычные и управляемые формы)
Прочие
Которыми раньше пользовался, но которые по каким-то причинам ушли из моих фаворитов.
-
http://cpp.sh/
- Плюсы:
- Короткое и лаконичное имя 🙂
- C++98, C++11, C++14 — по выбору (GCC 4.9.2)
- Различные уровни оптимизации: O0, O1, O2, O3
- Поддержка предупреждений: Wall, Wextra, Wpedantic
- Boost 1.55 (больше никто не предоставляет)
- Можно шарить код
- Ввод через стандартный ввод: интерактивный (этого нет ни у кого больше) и текст
- Сразу большое окно редактора
- Минусы
- Только C++
- Нет работы с файлами
- Не понимает завершения процесса по сигналу
- Плюсы:
-
http://ideone.com
- Плюсы:
- C++14 стандарт (компилятор gcc 8.2 и clang 8.0)
- Можно шарить код + оставить аннотацию к нему (нажать “More options”)
- Можно задать данные которые отошлются на STDIN программы
- Минусы:
- Нельзя задать параметры сборки
- Нельзя передать параметры командной строки
- Других стандартов C++ нет (С++98/03, C++11, C++17, C++20)
- Плюсы:
Простой интерпретатор Lisp на Umka
Разработка моего статически типизированного скриптового языка Umka вошла в ту стадию, когда потребовалась проверка языковых возможностей на более сложных примерах, чем скрипты в пару десятков строк. Для этого я решил реализовать на своём языке интерпретатор Lisp. На это меня вдохновил педагогический эксперимент Роба Пайка, одного из создателей языка Go. Недавно Пайк опубликовал маленький интерпретатор Lisp на Go. Особенно впечатлило замечание Пайка, что описание интерпретатора заключено на одной странице 13 древнего руководства по Lisp 1.5. Учитывая синтаксическое родство Umka и Go, было трудно не поддаться соблазну построить такой интерпретатор на Umka, но не буквальным переносом кода Пайка, а полностью заново, от основ. Надеюсь, знатоки Lisp и функциональных языков простят мне наивное изумление от соприкосновения с прекрасным.
Структура компилятора
Процесс компиляции состоит из следующих этапов:
- Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
- компоновка машинно-ориентированной программы.
В первом случае компилятор представляет собой пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики. Такой компилятор может компилировать программу, разные части исходно текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.
Во втором случае компилятор де-факто выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Этот факт нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа поддерживают организацию импорта программой процедуры (функции) из уже оттранслированого программного модуля, написанного на другом языке программирования. Так в программу на С/С++ можно импортировать функцию написанную например Pascal или Fortran. Аналогично и напротив написанная на С/С++ функция может быть импортирована в Pascal- или Fortran-программу соотвественно. Это как правило было бы невозможно без поддержки многими современными компиляторами организации обработки входных данных в процедуру (функций) в соответствии с соглашениями других языков программирования. Например современные компиляторы с языка Pascal помимо соглашения самого Pascal поддерживает организацию обработки процедурая/функцией входных в соответствии с соглашениями языка С/С++. (Чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка С/С++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.) Примерами таких компиляторов являются компиляторы со всех без исключения языков программирования, используемые непосредственно.
Трансляция программы как неотъемлемая составляющая компиляции включает в себя:
- Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
- Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в дерево разбора.
- Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
- Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
- Генерация кода. Из промежуточного представления порождается код на целевом машинно-ориентированном языке.
Как убрать страницу с текстом?
Способ №1
1. Установите курсор в любом месте текста на страничке, от которой нужно избавиться.
2. Кликните левой кнопкой мышки по опции «Найти» (крайний левый блок в верхней панели Word).
3. В ниспадающем меню выберите «Перейти… ».
4. В дополнительном окне «Найти и заменить», на вкладке «Перейти», выберите объект перехода «Страница».
5. В поле «Введите номер… » напечатайте директиву — page.
6. Нажмите по кнопке «Перейти». Текст на выбранной страничке выделится.
7. Кликните «Закрыть», а потом нажмите клавишу «DELETE».
Способ №2
1. Выделите весь текст на удаляемой странице: удерживая левую кнопку мышки, проведите курсор от начала до конца листа.
2. Нажмите «Delete».
Это интересно: Учетные записи windows – как удалить, или сменить запись: рассмотрим вместе
Виды компиляторов
- Векторизующий. Базируется на трансляторе, транслирующем исходный код в машинный код компьютеров, оснащённых векторным процессором.
- Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
- Диалоговый. См.: диалоговый транслятор.
- Инкрементальный. Пересобирает программу, заново транслируя только изменённые фрагменты программы без перетрансляции всей программы.
- Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
- Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
- Отладочный. Устраняет отдельные виды синтаксических ошибок.
- Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
- Самокомпилируемый. Написан на том же языке программирования, с которого осуществляется трансляция.
- Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.
Также все компиляторы условно можно разделить на две группы:
- Компиляторы с конкретных языков программирования. (Примеры: GCC, gnat, clang, xcode, gfortran.)
- Компиляторы как системы сборки программ. Таковы например довольно распространенная в UNIX- и Linux-системах система Makefile и распространенная в Windows-системах cmake. Работа последних (например в Makefile) очень часто управляется встроенным входным интерпретируемым языком, на котором и прописывается порядок самой компиляции программы.
Компиляция и запуск программ C, C++
Сначала посмотрим, как скомпилировать и запустить простую программу, написанную на языке Си.
Компиляция и запуск программ на C
Напишите свой код/программу в любимом редакторе CLI/GUI.
Я собираюсь написать свою программу на Си с помощью редактора nano.
Примечание. Вам необходимо использовать расширение .c для программ на Си или .cpp для программ на Си++.
Скопируйте/вставьте следующий код:
Нажмите Ctrl+O и Ctrl+X для сохранения и выхода из файла.
Чтобы скомпилировать программу, запустите:
Или:
Если в вашем коде/программе есть синтаксические или семантические ошибки, они будут отображены. Сначала необходимо их исправить, чтобы двигаться дальше. Если ошибки нет, то компилятор успешно сгенерирует исполняемый файл ostechnix в текущем рабочем каталоге.
Наконец, запустите программу с помощью команды:
Вы увидите вывод, как показано ниже:
Чтобы скомпилировать несколько исходных файлов (например, source1 и source2) в исполняемый файл, запустите:
Для разрешения предупреждений, необходима отладка символов на выходе:
Скомпилировать исходный код в инструкции ассемблера:
Скомпилировать исходный код без связывания:
Вышеприведенная команда создаст исполняемый файл под названием source.o.
Если ваша программа содержит математические функции:
За более подробной информацией обращайтесь к man-страницам (страницы руководства).
Компиляция и запуск программ на C++
Напишите вашу C++ программу в любом редакторе по вашему выбору и сохраните ее с расширением .cpp.
Пример простой C++ программы:
Программа:
Чтобы скомпилировать эту программу на C++ в Linux, просто запустите:
Если ошибок не было, то можно запустить эту Си++ программу под Linux с помощью команды:
Выведет:
В качестве альтернативы мы можем скомпилировать приведенную выше программу на C++, используя команду «make», как показано ниже.
Вы заметили? Я не использовал расширение .cpp в вышеприведенной команде для компиляции программы. Нет необходимости использовать расширение для компиляции Си++ программ с помощью команды make.
Запустите, используя команду:
За более подробной информацией обращайтесь к man-страницам.
Надеюсь, что статья помогла.
Что такое LLVM и зачем он нужен?
Всем привет! Думаю, у многих сразу возник другой вопрос — а зачем вообще нужна ещё одна статья про LLVM, ведь на хабре их и так больше сотни? Моей задачей было написать «введение в тему» for the rest of us — профессиональных разработчиков, не планирующих создавать компиляторы и совершенно не интересующихся особенностями устройства LLVM IR. Насколько я знаю, подобного ещё не было.
Главное, что интересует практически всех — и о чём я планирую рассказать — вынесено в заголовок статьи. Зачем нужен LLVM, когда есть GCC и Visual C++? А если вы не программируете на C++, вам стоит беспокоиться? И вообще, LLVM это Clang? Или нет? И что эти четыре буквы на самом деле означают?
Примечания
- ГОСТ 19781-83 // Вычислительная техника. Терминология: Справочное пособие. Выпуск 1 / Рецензент канд. техн. наук Ю. П. Селиванов. — М.: Издательство стандартов, 1989. — 168 с. — 55 000 экз. — ISBN 5-7050-0155-X.; см. также ГОСТ 19781-90
- ↑ Першиков В. И., Савинков В. М. Толковый словарь по информатике / Рецензенты: канд. физ.-мат. наук А. С. Марков и д-р физ.-мат. наук И. В. Поттосин. — М.: Финансы и статистика, 1991. — 543 с. — 50 000 экз. — ISBN 5-279-00367-0.
- ↑ СТ ИСО 2382/7-77 // Вычислительная техника. Терминология. Указ. соч.
- Борковский А. Б. Англо-русский словарь по программированию и информатике (с толкованиями). — М.: Русский язык, 1990. — 335 с. — 50 050 (доп,) экз. — ISBN 5-200-01169-3.
- Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
- Н. А. Криницкий, Г. А. Миронов, Г. Д. Фролов. Программирование / Под ред. М. Р. Шура-Бура. — М.: Государственное издательство физико-математической литературы, 1963.
Структура компилятора
Процесс компиляции состоит из следующих этапов:
- Трансляция программы — трансляция всех или только изменённых модулей исходной программы.
- компоновка машинно-ориентированной программы.
Структурные реализации компилятора могут быть следующими:
- И транслятор, и компоновщик могут целиком входит в состав компилятора как исполняемое программы.
- Компилятор сам выполняет лишь трансляцию компилируемой программы, компоновка же программы выполняется вызываемой компилятором отдельной программой-компоновщиком. Практически все современные компиляторы построены по такой схеме.
- Пакет программ, включающий в себя трансляторы с разных языков программирования и компоновщики.
По первой схеме строились самые первые компиляторы, — для современных компиляторов такая схема построения нехарактерна.
По второй схеме построены все без исключения компиляторы с языков высокого уровня. Любой такой компилятор сам выполняет только трансляцию и далее вызывает компоновщик как внешнюю подпрограмму, который и компонует машинно-ориентированную программу. Такая схема построения легко позволяет компилятору работать и в режиме транслятора с соответствующего языка программирования. Этот обстоятельство нередко служит поводом считать компилятор разновидностью транслятора, что естественно неверно, — все современные компиляторы такого типа все же выполняют компоновку, пусть и силами вызываемого компилятором внешнего компоновщика, тогда как транслятор сам никогда не выполняет вызов внешнего компоновщика. Но это же обстоятельство позволяет компилятору с одного языка программирования на фазе компоновки включать в программу написанную на одном языке программирования функции-подпрограммы из уже оттранслированных соответствующим транслятором/компилятором, написанные на ином языке программирования. Так в программу на С/С++ можно вставлять функции написанные например на Pascal или Fortran. Аналогично и напротив написанная на С/С++ функции могут быть вставлены в Pascal- или Fortran-программу соответственно. Это было бы невозможно без поддержки многими современными компиляторами генерации кода вызова процедур (функций) в соответствии с соглашениями иных языков программирования. Например современные компиляторы с языка Pascal помимо организации вызова процедур/функций в стандарте самого Pascal поддерживают организацию вызова процедурой/функцией в соответствии с соглашениями языка С/С++. (Например чтобы на уровне машинного кода написанная на Pascal процедура/функция работала с входными параметрами в соответствии с соглашениями языка С/С++, — оператор объявления такой Pascal-процедуры/Pascal-функции должен содержать ключевое слово cdecl.)
Наконец по третьей схеме построены компиляторы, представляющие собой целые системы, включающие в себя трансляторы с разных языков программирования и компоновщики. Также любой такой компилятор может использовать в качестве транслятора любой способный работать в режиме транслятора компилятор с конкретного языка высокого уровня. Естественно такой компилятор может компилировать программу, разные части исходного текста которой написаны на разных языках программирования. Нередко такие компиляторы управляются встроенным интерпретатором того или иного командного языка. Яркий пример таких компиляторов — имеющийся во всех UNIX-системах (в частности в Linux) компилятор make.
Трансляция программы как неотъемлемая составляющая компиляции включает в себя:
- Лексический анализ. На этом этапе последовательность символов исходного файла преобразуется в последовательность лексем.
- Синтаксический (грамматический) анализ. Последовательность лексем преобразуется в древо разбора.
- Семантический анализ. На этой фазе древо разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их объявлениям, типам данных, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным древом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.
- Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла. Оптимизация может быть на разных уровнях и этапах — например, над промежуточным кодом или над конечным машинным кодом.
- Генерация кода. Из промежуточного представления порождается код на целевом машинно-ориентированном языке.
Как управлять делегированными контактами
Если кто-то из пользователей в организации предоставит вам доступ к контактам, вы сможете управлять ими в своем аккаунте.
- Откройте Менеджер контактов.
- Убедитесь, что вы используете рабочий или учебный аккаунт.
- В левом верхнем углу нажмите на значок менюДелегированные контакты и выберите имя пользователя, который открыл доступ к ним.
Пока пользователь выбран:- Новые и измененные записи появляются в его списке контактов, а не в вашем.
- Вы можете редактировать и удалять контакты этого пользователя.
- В результатах поиска появляются контакты из его списка.
Если вы выберете другого пользователя, контакты текущего отображаться не будут.