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

06.07.2019

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

Компиляция!

Компиляция относится к обработке файлов исходного кода (.c, .cc, или.cpp) и создании объектных файлов проекта. На этом этапе не создается исполняемый файл. Вместо этого компилятор просто транслирует высокоуровневый код в машинный язык. Например, если вы создали (но не скомпоновали) три отдельных файла, у вас будет три объектных файла, созданные в качестве выходных данных на этапе компиляции. Расширение таких файлов будет зависеть от вашего компилятора, например *.obj или *.o. Каждый из этих файлов содержит машинные инструкции, которые эквивалентны исходному коду. Но вы не можете запустить эти файлы! Вы должны превратить их в исполняемые файлы операционной системы, только после этого их можно использовать. Вот тут за дело берётся компоновщик.

Компоновка!

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

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

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

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

Эти два этапа берёт на себя и вам не стоит беспокоиться о том, какие из файлов были изменены. IDE сама решает,когда создавать объекты файлов, а когда нет.

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

Компьютеры сами по себе способны выполнять только очень ограниченный набор операций, называемых машинными кодами. В старые времена, когда появились первые компьютеры, программы писались в машинных кодах, представляющих собой последовательности двоичных чисел, однозначно воспринимаемых компьютером. В конце 50-х кодов прошлого века появились первые языки программирования, такие как язык ассемблера и Фортран. Для того, чтобы компьютер мог понять программу, написанную на каком-то языке программирования, необходим переводчик ( транслятор ) такой программы в машинные коды. Отметим, что, если оператор языка ассемблера отображается при трансляции чаще всего 1Некоторые операторы языка ассемблера, например, такие, как операторы ввода/вывода, отображаются в несколько машинных команд. в одну машинную инструкцию, предложения языков более высокого уровня отображаются, вообще говоря, в несколько машинных инструкций.

Трансляторы бывают двух типов: компиляторы ( compiler ) и интерпретаторы ( interpreter ). Процесс компиляции состоит из двух частей: анализа ( analysis ) и синтеза ( synthesis ). Анализирующая часть компилятора разбивает исходную программу на составляющие ее элементы (конструкции языка) и создает промежуточное представление исходной программы. Синтезирующая часть из промежуточного представления создает новую программу, которую компьютер в состоянии понять. Такая программа называется объектной программой. Объектная программа может в дальнейшем выполняться без перетрансляции. В качестве промежуточного представления обычно используются деревья, в частности, так называемые деревья разбора. Под деревом разбора понимается дерево , каждый узел которого соответствует некоторой операции , а сыновья этого узла - операндам.

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

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

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

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


Компилятор


Компилятор переводит программы с одного языка на другой. Входом компилятора служит цепочка символов , составляющая исходную программу на языке программирования . Выход компилятора (объектная программа ) также представляет собой цепочку символов, но принадлежащую другому языку , например, языку некоторого компьютера. При этом сам компилятор написан на языке , возможно, отличающемся от первых двух. Будем называть язык исходным языком, язык - целевым языком, а язык - языком реализации. Таким образом, можно говорить о компиляторе как об Pascal и кончая современными объектно-ориентированными языками такими, как C# и Java . Практически каждый язык программирования имеет какие-то особенности с точки зрения создателя транслятора. Однако мы начнем с рассмотрения разнообразных целевых языков компиляторов.

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

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

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

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

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

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

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

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

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

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

Генерация кода [ | ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Компилятор: определение и история возникновения

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

Компилятор: принцип работы

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

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

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

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

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

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

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

Компьютеров, оснащённых векторным процессором .

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

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

    Основы

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

    Некоторые компиляторы (например, низкоуровневом языке. Такой язык - байт-код - также можно считать языком машинных команд, поскольку он подлежит интерпретации виртуальной машиной . Например, для языка Java это JVM (язык виртуальной машины Java), или так называемый байт-код Java (вслед за ним все промежуточные низкоуровневые языки стали называть байт-кодами). Для языков программирования на платформе .NET Framework ( , Managed C++, Visual Basic .NET и другие) - это MSIL (Microsoft Intermediate Language).

    Программа на байт-коде подлежит интерпретации виртуальной машиной , либо ещё одной компиляции уже в машинный код непосредственно перед исполнением. Последнее называется «Just-In-Time компиляция» (MSIL-код компилируется в код целевой машины также JIT-компилятором, а библиотеки .NET Framework компилируются заранее).

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

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

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

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

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

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

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

    Трансляция и компоновка

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

    Примечания

    См. также

    Реализации компиляторов
    • Sun Studio - компиляторы C, C++ и Fortran от Sun Microsystems Inc.
    • Open Watcom - свободное продолжение компиляторов Watcom C/C++/Fortran.
    • ICC AVR

    Литература

    • Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. - 2-е изд. - М.: Вильямс , 2008. - ISBN 978-5-8459-1349-4
    • Робин Хантер. Основные концепции компиляторов = The Essence of Compilers. - М.: Вильямс , 2002. - С. 256. - ISBN 0-13-727835-7
    • Хантер Р. Проектирование и конструирование компиляторов / Пер. с англ. С. М. Круговой. - М.: Финансы и статистика, 1984. - 232 с.
    • Д. Креншоу. Давайте создадим компилятор! .

    Wikimedia Foundation . 2010 .

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

      Компиляция: В Викисловаре есть статья «компиляция» Компиляция (литература) (лат. … Википедия

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

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

      Just in time compilation (JIT, компиляция «на лету»), dynamic translation (динамическая компиляция) технология увеличения производительности программных систем, использующих байт код, путём компиляции байт кода в машинный код… … Википедия

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

      Python Класс языка: функциональный, объектно ориентированный, императивный, аспектно ориентированный Тип исполнения: интерпретация байт кода, компиляция в MSIL, компиляция в байт код Java Появился в: 1990 г … Википедия

      ГОСТ 19781-90: Обеспечение систем обработки информации программное. Термины и определения - Терминология ГОСТ 19781 90: Обеспечение систем обработки информации программное. Термины и определения оригинал документа: 9. Абсолютная программа Non relocatable program Программа на машинном языке, выполнение которой зависит от ее… … Словарь-справочник терминов нормативно-технической документации

    Похожие статьи