Содержание

Компиляция — что это такое? Определение, значение, перевод

Компиляция в русском языке может означать как минимум две вещи:

В компьютерных науках компиляцией называют «перевод» программы с языка высокого уровня на понятный компьютеру язык нулей и единиц. Для этой нелёгкой задачи существуют специальные программы, называемые «компиляторами». Если вы написали программу на вашем С++, и она успешно откомпилировалась, это ещё совсем не значит, что она будет так же безупречно работать. Тут следует отметить, что не все современные программы проходят компиляцию в её традиционном смысле. Некоторые языки программирования, такие, например, как PHP, «интерпретируются» компьютером прямо таки «налету», выплёвывая ошибки криворуких программистов на веб-странички.

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

дворцах.



Вы узнали, откуда произошло слово Компиляция, его объяснение простыми словами, перевод, происхождение и смысл.
Пожалуйста, поделитесь ссылкой «Что такое Компиляция?» с друзьями:

И не забудьте подписаться на самый интересный паблик ВКонтакте!

 



Компиляция в русском языке может означать как минимум две вещи:

В компьютерных науках компиляцией называют «перевод» программы с языка высокого уровня на понятный компьютеру язык нулей и единиц. Для этой нелёгкой задачи существуют специальные программы, называемые «компиляторами». Если вы написали программу на вашем С++, и она успешно откомпилировалась, это ещё совсем не значит, что она будет так же безупречно работать. Тут следует отметить, что не все современные программы проходят компиляцию в её традиционном смысле. Некоторые языки программирования, такие, например, как PHP, «интерпретируются» компьютером прямо таки «налету», выплёвывая ошибки криворуких программистов на веб-странички.

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

дворцах.

Есть ли польза от компиляции кода по ходу дела?

Недавно у меня было собеседование, на котором мне дали час, чтобы написать настоящий код. Это не было огромное количество, вероятно, менее 100 строк. Примерно через 45 минут я скомпилировал, запустил его и заставил работать. Возможно, я потратил 5-10 минут на разработку ошибок компиляции и пару незначительных ошибок, но в целом все было очень гладко. (Кстати, я получил предложение от них.)

Однако, то, что озадачило меня, было то, что после того, как я передал законченный код, интервьюер сказал мне, что единственное, что я сделал неправильно, это «не компилирую, как я иду». Я спросил его, в чем разница, и он сказал: «Что бы вы сделали, если бы вы закончили код, а он не скомпилировался вовремя».

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

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

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

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

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

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

Что делает компилятор angular «compile»?

Typescript переходит в JS. Затем идет встряхивание дерева, «less» (необязательно) и что еще в процессе изготовления deployment. Но ничего подобного (afaik) не имеет никакого отношения к «compiling». Все упаковывается и сильно оптимизируется, но на самом деле это не компилируется, верно?

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

Компиляция просто означает перевод программы с языка а на язык Б . Вот и все, что это значит. (Также обратите внимание, что вполне возможно, что A и B -это один и тот же язык.)

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

A и B и что делает компилятор:

  • если A воспринимается как assembly язык, А B воспринимается как машинный язык, то мы называем его ассемблером ,
  • если считается машинным языком и B считается язык assembly, тогда мы называем это дизассемблер ,
  • если воспринимается более низкого уровня, чем B , то мы называем это декомпилятор ,
  • если A и B имеют один и тот же язык, и в результате программа является в некотором роде быстрее или легче, тогда мы называем это оптимизатор
    ,
  • если A и B являются те же языки, и в результате программа будет меньше, то мы называем это английское сокращение Cups ,
  • если A и B являются одними и теми же языками, а полученная программа менее читабельна, то мы называем ее обфускатором ,
  • если A и B воспринимаются примерно на одном уровне абстракции, то мы называем ее транспилятором , и
  • если A и B воспринимаются примерно на одном уровне абстракции, а результирующая программа сохраняет форматирование, комментарии и намерения программиста таким образом, что можно поддерживать результирующую программу таким же образом, как и исходную программу, то мы называем ее
    инструментом реинжиниринга
    .

Кроме того, обратите внимание, что более старые источники могут использовать термины «translation» и «translator» вместо «compilation» и «compiler». Например, C говорит о «translation units».

Вы также можете наткнуться на термин «language processor». Это может означать либо компилятор, интерпретатор, либо оба компилятора и интерпретатора в зависимости от определения.

Javascript сам по себе все еще интерпретируется, верно?

JavaScript — это язык. Языки — это набор логических правил и ограничений. Языки не интерпретируются и не компилируются. Языки просто есть .

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

Эти два термина принадлежат к разным слоям абстракции. Если бы английский был типизированным языком, «interpreted-language» было бы ошибкой типа.

Заметим также, что некоторые языки не имеют ни интерпретатора, ни компилятора. Есть языки, которые вообще не имеют реализации. Тем не менее, это языки, и вы можете писать на них программы. Ты просто не можешь ими управлять.

Кроме того, обратите внимание, что все интерпретируется в какой-то момент : если вы хотите выполнить что-то, вы должны интерпретировать это. Компиляция просто переводит код с одного языка на другой. Она им не управляет. Интерпретация управляет им. (Иногда, когда интерпретатор реализован в аппаратном обеспечении, мы называем его «CPU», но это все равно интерпретатор.)

Показательный пример: каждая существующая в настоящее время основная реализация JavaScript имеет компилятор.

V8 начинался как чистый компилятор: он компилировал JavaScript прямо в умеренно оптимизированный машинный код. Позже был добавлен второй компилятор. Теперь есть два компилятора: легкий компилятор, который производит умеренно оптимизированный код, но сам компилятор очень быстр и использует мало RAM. Этот компилятор также вводит код профилирования в скомпилированный код. Второй компилятор-более тяжелый, медленный, более дорогой компилятор, который, однако, производит гораздо более жесткий, гораздо более быстрый код. Он также использует результаты кода профилирования, введенного первым компилятором, для принятия решений по динамической оптимизации. Кроме того, решение о том, какой код следует повторно скомпилировать с помощью второго компилятора, принимается на основе этой информации профилирования. Обратите внимание, что ни в коем случае не задействован переводчик. V8 никогда не интерпретирует, он всегда компилирует. В нем даже нет переводчика. (На самом деле, я считаю, что в настоящее время это так, я описываю первые две итерации.)

SpiderMonkey SpiderMonkey JavaScript компилирует в байт-код, который затем интерпретируется. Интерпретатор также профилирует код, а затем код, который выполняется чаще всего, компилируется компилятором в собственный машинный код. Итак, SpiderMonkey содержит два компилятора: один от JavaScript до SpiderMonkey байт-кода, а другой от SpiderMonkey байт-кода до собственного машинного кода.

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

Вы написали в комментарии:

Я действительно думал, что машинный код где-то замешан.

Что вообще означает «machine code»?

Что такое машинный язык одного человека, является промежуточным языком другого человека и наоборот? Например, есть CPUs, которые могут изначально выполнять байт-код JVM, на таком CPU, JVM байт-код является собственным машинным кодом. И есть интерпретаторы для x86 машинного кода, когда вы запускаете из этих x86 машинного кода интерпретируемый байт-код.

Существует интерпретатор x86 под названием JPC, написанный в Java. Если я запускаю машинный код x86 на JPC, работающем на собственном JVM CPU … какой байт-код и какой машинный код? Если я скомпилирую машинный код x86 в JavaScript (да, есть инструменты, которые могут это сделать) и запущу его в браузере на моем телефоне (который имеет ARM CPU), то какой байт-код и какой собственный машинный код? Что делать, если программа, которую я компилирую, является эмулятором SPARC, и я использую ее для запуска кода SPARC?

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

Компиляция вашей первой программы в C++ | Уроки С++

  Обновл. 17 Сен 2020  | 

Перед написанием нашей первой программы мы еще должны кое-что узнать.

Теория

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

Во-вторых, есть разные типы проектов. При создании нового проекта, вам нужно будет выбрать его тип. Все проекты, которые мы будем создавать на данных уроках, будут консольного типа. Это означает, что они запускаются в консоли (аналог командной строки). По умолчанию, консольные приложения не имеют графического интерфейса пользователя — GUI (сокр. от «Graphical User Interface») и компилируются в автономные исполняемые файлы. Это идеальный вариант для изучения языка C++, так как он сводит всю сложность к минимуму.

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

Традиционно, первой программой на новом языке программирования является всеми известная программа «Hello, world!». Мы не будем нарушать традиции 🙂

Пользователям Visual Studio

Для создания нового проекта в Visual Studio 2019, вам нужно сначала запустить эту IDE, затем выбрать "Файл" > "Создать" > "Проект":

Дальше появится диалоговое окно, где вам нужно будет выбрать "Консольное приложение Windows" из вкладки "Visual C++" и нажать "ОК":

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

В текстовом редакторе вы увидите, что уже есть некоторый текст и код — удалите его, а затем напечатайте или скопируйте следующий код:

#include <iostream> int main() { std::cout << «Hello, world!» << std::endl; return 0; }

#include <iostream>

int main()

{

std::cout << «Hello, world!» << std::endl;

return 0;

}

Вот, что у вас должно получиться:

ВАЖНОЕ ПРИМЕЧАНИЕ: Строка #include "pch.h" требуется только для пользователей Visual Studio 2017. Если вы используете Visual Studio 2019 (или более новую версию), то не нужно писать эту строку вообще.

Чтобы запустить программу в Visual Studio, нажмите комбинацию Ctrl+F5. Если всё хорошо, то вы увидите следующее:

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

Hello, world!

Чтобы убрать строку «…завершает работу с кодом 0…», вам нужно перейти в "Отладка" > "Параметры":

Затем "Отладка" > "Общие" и поставить галочку возле "Автоматически закрыть консоль при остановке отладки" и нажать "ОК":

Тогда ваше консольное окно будет выглядеть следующим образом:


Готово! Мы научились компилировать программу в Visual Studio.

Пользователям Code::Blocks

Чтобы создать новый проект, запустите Code::Blocks, выберите "File" > "New" > "Project":

Затем появится диалоговое окно, где вам нужно будет выбрать "Console application" и нажать "Go":

Затем выберите язык "C++" и нажмите "Next":

Затем нужно указать имя проекта и его расположение (можете создать отдельную папку Projects) и нажать "Next":

В следующем диалоговом окне нужно будет нажать "Finish".

После всех этих манипуляций, вы увидите пустое рабочее пространство. Вам нужно будет открыть папку Sources в левой части экрана и дважды кликнуть по main.cpp:

Вы увидите, что программа «Hello, world!» уже написана!

Для того, чтобы скомпилировать ваш проект в Code::Blocks, нажмите Ctrl+F9, либо перейдите в меню "Build" и выберите "Build". Если всё пройдет хорошо, то вы увидете следующее во вкладке "Build log":

Это означает, что компиляция прошла успешно!

Чтобы запустить скомпилированную программу, нажмите Ctrl+F10, либо перейдите в меню "Build" и выберите "Run". Вы увидите следующее окно:

Это результат выполнения вашей программы.

Пользователям командной строки

Вставьте следующий код в текстовый файл с именем HelloWorld.cpp:

#include <iostream> int main() { std::cout << «Hello, world!» << std::endl; return 0; }

#include <iostream>

int main()

{

std::cout << «Hello, world!» << std::endl;

return 0;

}

В командной строке напишите:

g++ -o HelloWorld HelloWorld. cpp

Эта команда выполнит компиляцию и линкинг файла HelloWorld.cpp. Для запуска программы напишите:

HelloWorld

Или:

./HelloWorld

И вы увидите результат выполнения вашей программы.

Пользователям веб-компиляторов

Вставьте следующий код в рабочее пространство:

#include <iostream> int main() { std::cout << «Hello, world!» << std::endl; return 0; }

#include <iostream>

int main()

{

std::cout << «Hello, world!» << std::endl;

return 0;

}

Затем нажмите "Run". Вы должны увидеть результат в окне выполнения.

Пользователям других IDE

Вам нужно:

Шаг №1: Создать консольный проект.

Шаг №2: Добавить файл . cpp в проект (если нужно).

Шаг №3: Вставить следующий код в файл .cpp:

#include <iostream> int main() { std::cout << «Hello, world!» << std::endl; return 0; }

#include <iostream>

int main()

{

std::cout << «Hello, world!» << std::endl;

return 0;

}

Шаг №4: Скомпилировать проект.

Шаг №5: Запустить проект.

Если компиляция прошла неудачно (a.k.a. «О Боже, что-то пошло не так!»)

Всё нормально, без паники. Скорее всего, это какой-то пустяк.

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

   Во-вторых, просмотрите Урок №7 — там есть решения наиболее распространенных проблем.

   Если всё вышесказанное не помогло — «загуглите» проблему. С вероятностью 90% кто-то уже сталкивался с этим раньше и нашел решение.

Заключение

Поздравляем, вы написали, скомпилировали и запустили свою первую программу на языке C++! Не беспокойтесь, если вы не понимаете, что означает весь этот код, приведенный выше. Мы детально всё это рассмотрим на следующих уроках.

Оценить статью:

Загрузка…

Поделиться в социальных сетях:

Скомпилированные и интерпретируемые языки Ru Python

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

Большинство моих опытов программирования были с CPython (динамический, интерпретируемый) и Java (статический, скомпилированный). Однако я понимаю, что существуют и другие типы интерпретируемых и скомпилированных языков. Помимо того, что исполняемые файлы могут быть распространены из программ, написанных на скомпилированных языках, существуют ли какие-либо преимущества / недостатки для каждого типа? Зачастую я слышу, как люди утверждают, что интерпретируемые языки могут использоваться в интерактивном режиме, но я считаю, что скомпилированные языки могут также иметь интерактивные реализации, правильно?

Скомпилированный язык – это тот, где программа, однажды скомпилированная, выражается в инструкциях целевой машины. Например, операция добавления «+» в исходном коде может быть переведена непосредственно в инструкцию «ADD» в машинный код.

Интерпретируемый язык – это тот, где инструкции не выполняются непосредственно на целевой машине, а вместо этого считываются и выполняются какой-либо другой программой (которая обычно записывается на языке родной машины). Например, одна и та же операция «+» была бы распознана интерпретатором во время выполнения, которая затем вызывала бы свою собственную функцию «добавить (a, b)» с соответствующими аргументами, которая затем выполняла бы инструкцию «ADD» машинного кода ,

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

Я собираюсь полностью обобщить (пуристы прощают меня!), Но, грубо говоря, вот преимущества скомпилированных языков:

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

И вот преимущества интерпретируемых языков:

  • Легче реализовать (писать хорошие компиляторы очень сложно !!)
  • Нет необходимости запускать этап компиляции: можно выполнить код непосредственно «на лету»,
  • Может быть более удобным для динамических языков

Обратите внимание, что современные методы, такие как компиляция байт-кода, добавляют некоторую дополнительную сложность – здесь происходит то, что компилятор нацелен на «виртуальную машину», которая не совпадает с базовым оборудованием. Эти инструкции виртуальной машины могут быть затем скомпилированы на более позднем этапе, чтобы получить собственный код (например, как это сделано JVM JIT-компилятором Java JVM).

Сам язык не компилируется и не интерпретируется, а только конкретная реализация языка. Java – прекрасный пример. Существует байт-кодовая платформа (JVM), собственный компилятор (gcj) и интерпретатор для надмножества Java (bsh). Итак, что такое Java сейчас? Компилируется байткод, скомпилирован или интерпретируется?

Другие языки, которые скомпилированы, а также интерпретируются, – Scala, Haskell или Ocaml. Каждый из этих языков имеет интерактивный интерпретатор, а также компилятор для байтового кода или собственный машинный код.

Так что вообще категоризация языков по «скомпилированным» и «интерпретированным» не имеет большого смысла.

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

Давным-давно давно уже жил в стране вычислительных интерпретаторов и компиляторов. Всевозможные суеты сопровождались достоинствами одного над другим. Общее мнение в то время было чем-то вроде:

  • Переводчик: быстро развивается (редактируется и запускается). Медленное выполнение, потому что каждый оператор должен был интерпретироваться в машинный код каждый раз, когда он был выполнен (подумайте, что это означало для цикла, выполняемого тысячи раз).
  • Компилятор: медленно развиваться (редактировать, компилировать, связывать и запускать. Шаги компиляции / ссылки могут занять значительное время). Быстро выполнять. Вся программа была уже в собственном машинного кода.

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

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

Классическое различие заключается в том, что компиляторы генерируют собственный машинный код, интерпретаторы читают исходный код и генерируют машинный код «на лету» с использованием какой-то системы времени выполнения. Сегодня осталось очень мало классических интерпретаторов – почти все они компилируются в байтовый код (или какое-то другое полукомпилированное состояние), которое затем запускается на виртуальной «машине».

Крайние и простые случаи:

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

  • Интерпретатор представит пользователю запрос в цикле, в котором он может вводить операторы или код, а при достижении RUN или эквивалента интерпретатор будет проверять, анализировать, анализировать и интерпретировать каждую строку до тех пор, пока программа не запустится до точки остановки или ошибка. Поскольку каждая строка обрабатывается сама по себе, и интерпретатор не «учит» что-либо из того, что видел линию раньше, усилия по преобразованию удобочитаемого языка в машинные инструкции выполняются каждый раз для каждой строки, так что это собака медленная. С яркой стороны пользователь может проверять и иным образом взаимодействовать со своей программой различными способами: изменять переменные, изменять код, работать в режимах трассировки или отладки … что угодно.

С учетом этого, позвольте мне объяснить, что жизнь не так проста. Например,

  • Многие интерпретаторы будут предварительно компилировать код, который им задан, поэтому шаг перевода не нужно повторять снова и снова.
  • Некоторые компиляторы компилируются не для машинных инструкций, специфичных для процессора, а для байт-кода, своего рода искусственный машинный код для фиктивной машины. Это делает скомпилированную программу более переносимой, но для каждой целевой системы требуется интерпретатор байт-кода.
  • В настоящее время интерпретаторы байт-кода (я смотрю на Java здесь) имеют тенденцию перекомпилировать байт-код, который они получают для центрального процессора целевого раздела непосредственно перед выполнением (называемый JIT). Чтобы сэкономить время, это часто делается только для кода, который работает часто (горячие точки).
  • Некоторые системы, которые выглядят и действуют как интерпретаторы (например, Clojure), компилируют любой код, который они получают, немедленно, но разрешают интерактивный доступ к среде программы. Это в основном удобство переводчиков со скоростью бинарной компиляции.
  • Некоторые компиляторы действительно не компилируются, они просто предварительно переваривают и сжимают код. Я немного слышал об этом, как работает Perl. Поэтому иногда компилятор просто выполняет немного работы, и большинство из них все еще интерпретируется.

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

С http://www.quora.com/What-is-the-difference-between-compiled-and-interpreted-programming-languages

Нет никакой разницы, потому что «скомпилированный язык программирования» и «интерпретируемый язык программирования» не являются значимыми понятиями. Любой язык программирования, и я действительно имею в виду любой, может быть интерпретирован или скомпилирован. Таким образом, интерпретация и компиляция – это методы внедрения, а не атрибуты языков.

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

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

На основании вышеприведенных определений вы, возможно, предположили, что эти два метода реализации не являются взаимоисключающими и могут даже быть взаимодополняющими. Традиционно языком объектов компилятора был машинный код или что-то подобное, что относится к любому числу языков программирования, понимаемых конкретными компьютерными ЦП. Затем машинный код запускается «на металле» (хотя можно было бы увидеть, если посмотреть достаточно внимательно, что «металл» очень похож на интерпретатора). Однако сегодня очень часто используется компилятор для генерации объектного кода, который должен интерпретироваться, например, так работает Java (а иногда и все еще работает). Существуют компиляторы, которые переводят другие языки на JavaScript, который затем часто запускается в веб-браузере, который может интерпретировать JavaScript или компилировать его как виртуальную машину, так и собственный код. У нас также есть переводчики для машинного кода, которые могут использоваться для эмуляции одного вида оборудования на другом. Или можно использовать компилятор для генерации объектного кода, который затем является исходным кодом для другого компилятора, который может даже скомпилировать код в памяти как раз вовремя для его запуска, что в свою очередь. , , вы получаете идею. Существует много способов сочетания этих понятий.

Самое большое преимущество интерпретируемого исходного кода в отношении скомпилированного исходного кода – ПОРТАТИВНОСТЬ .

Если ваш исходный код скомпилирован, вам нужно скомпилировать другой исполняемый файл для каждого типа процессора и / или платформы, для которых вы хотите запустить свою программу (например, один для Windows x86, один для Windows x64, один для Linux x64 и т. Д. на). Кроме того, если ваш код не полностью совместим со стандартами и не использует какие-либо функции / библиотеки для конкретной платформы, вам действительно нужно будет писать и поддерживать несколько баз кода!

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

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

Во-первых, разъяснение, Java не полностью статично скомпилировано и связано с тем, как C ++. Он скомпилирован в байт-код, который затем интерпретируется JVM. JVM может идти и делать компиляцию точно в срок на родной машинный язык, но это не нужно делать.

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

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

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

Что касается генерации исполняемых команд, это мало связано с ним, IMHO. Вы часто можете создавать исполняемый файл с компилируемого языка. Но вы также можете создать исполняемый файл из интерпретируемого языка, за исключением того, что интерпретатор и среда выполнения уже упакованы в exectuable и скрыты от вас. Это означает, что вы, как правило, по-прежнему оплачиваете затраты времени исполнения (хотя я уверен, что для некоторых языков есть способы перевести все на исполняемый файл дерева).

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

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

Традиционно «скомпилированный» означает, что этот перевод происходит всего за один раз, выполняется разработчиком, и полученный исполняемый файл распространяется среди пользователей. Чистый пример: C ++. Компиляция обычно занимает довольно много времени и пытается сделать много дорогостоящей optmization, так что полученный исполняемый файл работает быстрее. У конечных пользователей нет инструментов и знаний для компиляции самого материала, и исполняемый файл часто должен запускаться на различных аппаратных средствах, поэтому вы не можете выполнять множество оптимизаций для конкретных аппаратных средств. Во время разработки отдельный этап компиляции означает более длительный цикл обратной связи.

Традиционно «интерпретируемый» означает, что перевод происходит «на лету», когда пользователь хочет запустить программу. Чистый пример: ванильный PHP. Наивный интерпретатор должен анализировать и переводить каждый кусок кода каждый раз, когда он работает, что делает его очень медленным. Он не может выполнять сложные, дорогостоящие оптимизации, поскольку они занимают больше времени, чем время, затраченное на выполнение. Но он может полностью использовать возможности аппаратного обеспечения, на котором он работает. Отсутствие этапа компиляции разделения снижает время обратной связи во время разработки.

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

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

Книга Python © 2015 Imagine Publishing Ltd просто расстраивает разницу следующим намеком, упомянутым на странице 10, как:

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

Компиляция – это процесс создания исполняемой программы из кода, написанного на скомпилированном языке программирования. Компиляция позволяет компьютеру запускать и понимать программу без необходимости использования программного обеспечения для ее создания. Когда программа компилируется, она часто компилируется для определенной платформы (например, платформы IBM), которая работает с совместимыми с IBM компьютерами, но не с другими платформами (например, с платформой Apple). Первый компилятор был разработан Грейс Хоппер во время работы на компьютере Гарварда Марка I. Сегодня большинство языков высокого уровня будут включать в себя собственный компилятор или имеющиеся инструменты, которые могут быть использованы для компиляции программы. Хорошим примером компилятора, используемого с Java, является Eclipse, а примером компилятора, используемого с C и C ++, является команда gcc. В зависимости от того, насколько велика программа, для ее компиляции требуется несколько секунд или минут, и если при компиляции не возникают ошибки, создается исполняемый файл. Проверьте эту информацию

Компиляция

Программу на Паскале надо предварительно скомпилировать. Компиляция означает перевод исходной программы с языка Pascal в объектную программу – на язык компьютера. При запуске программы, вычисления производятся по программе в объектном коде, а не по исходной программе.

После компиляции имеются две версии программы: одна на Паскале, другая на языке компьютера (или близком к нему). Если посмотреть на объектную программу, то на экране будут непонятные «слова» и закорючки.

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

Сначала исходная программа записывается программистом (редактируется), после чего сохраняется на диске под произвольным именем.

На следующем шаге в память загружаются компилятор и исходный текст программы. Компилятор «читает» ее, превращая в объектный код, который затем также сохраняется на диске.

Последний шаг – выполнение программы. В компьютерную память загружается именно объектный (исполняемый) код. Выполняющаяся программа может предполагать ввод данных (input) с клавиатуры и вывод результатов (output) на экран. Это довольно распространенная схема ввода-вывода данных, стандартная в Паскале, но, разумеется, не единственная. Язык был разработан еще тогда, когда файлы хранились на магнитной ленте, ввод осуществлялся с перфокарт, а вывод – на печатающее устройство.

Компилируем код Python в файл exe

{«id»:122327,»url»:»https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe»,»title»:»\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 Python \u0432 \u0444\u0430\u0439\u043b exe»,»services»:{«facebook»:{«url»:»https:\/\/www.facebook.com\/sharer\/sharer.php?u=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe»,»short_name»:»FB»,»title»:»Facebook»,»width»:600,»height»:450},»vkontakte»:{«url»:»https:\/\/vk. com\/share.php?url=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe&title=\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 Python \u0432 \u0444\u0430\u0439\u043b exe»,»short_name»:»VK»,»title»:»\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435″,»width»:600,»height»:450},»twitter»:{«url»:»https:\/\/twitter.com\/intent\/tweet?url=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe&text=\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 Python \u0432 \u0444\u0430\u0439\u043b exe»,»short_name»:»TW»,»title»:»Twitter»,»width»:600,»height»:450},»telegram»:{«url»:»tg:\/\/msg_url?url=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe&text=\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 Python \u0432 \u0444\u0430\u0439\u043b exe»,»short_name»:»TG»,»title»:»Telegram»,»width»:600,»height»:450},»odnoklassniki»:{«url»:»http:\/\/connect. ok.ru\/dk?st.cmd=WidgetSharePreview&service=odnoklassniki&st.shareUrl=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe»,»short_name»:»OK»,»title»:»\u041e\u0434\u043d\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u0438\u043a\u0438″,»width»:600,»height»:450},»email»:{«url»:»mailto:?subject=\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 Python \u0432 \u0444\u0430\u0439\u043b exe&body=https:\/\/vc.ru\/newtechaudit\/122327-kompiliruem-kod-python-v-fayl-exe»,»short_name»:»Email»,»title»:»\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0447\u0442\u0443″,»width»:600,»height»:450}},»isFavorited»:false}

29 332 просмотров

Определение компиляции Merriam-Webster

com · pile | \ kəm-ˈpī (-ə) l \

переходный глагол

1 : для составления из материалов других документов составить статистическую диаграмму

2 : для сбора и редактирования в том составить сборник стихов

3 : постепенно наращивать составил рекорд из четырех побед и двух поражений

4 : для запуска (чего-то, например программы) через компилятор

Определение и значение компиляции | Словарь английского языка Коллинза

Примеры «составить» в предложении

компиляция

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

Times, Sunday Times (2016)

Невозможно составить список.

Times, Sunday Times (2017)

Да, действительно — он составил список покупательских тенденций по национальностям.

The Sun (2016)

Кто-то может спросить, почему на составление отчета ушло десятилетие.

Times, Sunday Times (2007)

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

Times, Sunday Times (2012)

Его книга — яркое празднование усилий по сбору информации на протяжении веков.

Times, Sunday Times (2016)

Теперь он хотел собрать информацию о домохозяйствах и посещаемых ими веб-сайтах.

Times, Sunday Times (2012)

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

Times, Sunday Times (2012)

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

Times, Sunday Times (2013)

Подразделение собирает разведывательные данные для создания первой в столице базы данных членов банды.

Times, Sunday Times (2011)

Подробнее …

Местные СМИ недавно процитировали тревожное исследование китайской компании, которая собирает данные в социальных сетях.

Times, Sunday Times (2011)

Скоро вы сможете составить список своих личных виновников.

Уэсткотт, Пэтси, Альтернативное здравоохранение для женщин (1991)

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

Times, Sunday Times (2016)

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

Times, Sunday Times (2014)

Имея это в виду, мы составили список тех, кто, по нашему мнению, одет лучше всего.

Times, Sunday Times (2013)

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

Times, Sunday Times (2006)

Затем она составила свой отчет.

Times, Sunday Times (2008)

Я думаю, что пора нам приступить к составлению книги рекордов, которая лучше отражает эти странные и тревожные времена.

Times, Sunday Times (2012)

Это один из способов составить список самых злых людей страны.

The Sun (2012)

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

Солнце (2011)

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

Times, Sunday Times (2007)

определение компиляции The Free Dictionary

Для любого, кроме меня, который очень любил море, часы показались бы долгими и однообразными; но ежедневные прогулки по платформе, когда я погрузился в бодрящий воздух океана, вид богатых вод через окна салона, книги в библиотеке, составление моих мемуаров занимали все мое время. , и не оставил мне ни минуты тоски или усталости. И его полезность стала настолько очевидной, что люди, которые при составлении Конституции были яростными противниками ее, на собственном опыте стали ее признанными поклонниками. [1] Ночь была холодной и тихой; вся семья удалилась отдыхать, кроме Вильфора, который один остался спать, и работал до пяти часов утра, просматривая последние допросы, проведенные накануне ведущими следователями, составляя показания свидетелей и завершая допросы. Удар по делу об обвинении, который был одним из самых энергичных и наиболее продуманных из всех, что он когда-либо предъявил.Вы слышите, как безжалостно многие дамы кажущегося положения и богатства исключены из этого «общества». Неистовые усилия, которые они прилагают, чтобы войти в этот круг, подлости, которым они подчиняются, оскорбления, которым они подвергаются, вызывают удивление у тех, кто берет человечество или женщину для изучения; и погоня за модой в трудных условиях была бы прекрасной темой для любого очень выдающегося человека, у которого хватило бы ума, досуга и знания английского языка, необходимых для составления такой истории. В преддверии субботнего Конгресса Всепрогрессивного Конгресса (APC) в штате Дельта лидеры партии опровергли обвинения в том, что вождь О’тега Эмерхор составлял список имен в приходах и местных органах власти. Помимо составления глоссариев и словарей, некоторые из них наших ученых провели исследования диалектов урду, региональных разновидностей и неформального употребления, характерного для некоторых других областей, таких как Раджастхан, Пуна, Лахор, Мумбаи (известный как Бамбайя урду) и Калькутта (называемый Калкатья урду).Практика составления имен подозреваемых в употреблении наркотиков при администрации Дютера «очень похожа» на то, что нацисты сделали с евреями в Германии, произвольно арестовывая их и помещая в концентрационные лагеря. статистика крикета, собирается поделиться своим богатым опытом составления цифр с избранной группой статистиков на первом в своем роде семинаре, который состоится в четверг и пятницу в Нагпуре. Хасан Пойпуй, секретарь Комитета по стандартизации нанотехнологий, указал на деятельность Комитета на национальном и международном уровнях и заявил: «К настоящему времени Комитет составил 10 национальных стандартов в области нанотехнологий, и в настоящее время он составляет семь других национальных стандартов. Он сказал, что FBR собирает такие данные, чтобы знать, кто действительно заслуживает, и сколько возможностей и льгот они воспользовались с учетом освобождения по закону, а также заслуживают ли они отказа или нуждаются ли они в нем. Когда ученики в школе в Сандерленде хотели показать Благодаря своей признательности дилеру Ford в Саут-Шилдс они пришли к идее составить персональный буклет с благодарностью.

определение составлено The Free Dictionary

В то время я посвятил три дня усердному перевариванию всего этого пива, говядины и хлеба, во время которых мне случайно было предложено много глубоких мыслей, способных к трансцендентному и платоническому применению; и, кроме того, я составил собственные дополнительные таблицы, касаясь вероятного количества рыбы и т. д.Мой дневник, из которого я составил эти страницы, идет немного дальше: Хейворд порекомендовал ему руководство, составленное на основе работ Раскина и с помощью В руке он усердно обходил комнату за комнатой: он внимательно читал, что критик сказал о картине, а затем решительно решил увидеть в ней то же самое. В этом суждении местный историк, из неопубликованной работы которого эти факты составлены, чтобы показать его согласие.Принято считать, что они общаются с помощью звуков и жестов щупальца; это утверждается, например, в умелой, но наскоро составленной брошюре (написанной, очевидно, кем-то, не являющимся очевидцем марсианских действий), на которую я уже ссылался и которая до сих пор была главным источником информации. «То, что вы не знаете о проказе и то, что остальные члены совета здравоохранения не знают о проказе, составило бы больше книг, чем было собрано людьми, которые профессионально изучили эту болезнь.из которого составлено это повествование, было отправлено из Чарльстона, группа все еще находилась в Форт-Молтри. Из того, что было написано об этом зверю, можно было составить библиотеку великого великолепия и величины, соперничающую с культом Шекспира и тем, что собиралось вокруг Он жил в V веке и составил греческий лексикон. По крайней мере, так считала компания, и так бы он считал, если бы он имел доступ к тщательно и подробно составленным записям о нем, хранящимся в архивах офиса. С энтузиазмом Потта уделять все свое время и внимание процессу, описанному в последней главе, взятому из его собственных меморандумов. В таких случаях он говорил, когда приходил домой: «Общественные дела задержали меня; когда человек принадлежит для правительства он больше не хозяин сам по себе ». Он составил сборники вопросов и ответов по различным исследованиям для юных девушек в школах-интернатах.

Что такое компилятор кода и для чего он нужен?

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

Что происходит при компиляции кода?

Сложность компилятора зависит от синтаксиса языка и степени абстракции, которую обеспечивает этот язык программирования. Компилятор C намного проще, чем компилятор для C ++ или C #.

Лексический анализ

При компиляции компилятор сначала считывает поток символов из файла исходного кода и генерирует поток лексических токенов. Например, код C ++:

 
 int C = (A * B) +10; 

могут быть проанализированы как эти токены:

  • тип «int»
  • переменная «C»
  • равно
  • левая скобка
  • переменная «A»
  • умноженная на
  • переменная «B»
  • правая скобка
  • плюс
  • буквальный «10»

Синтаксический анализ

Лексический вывод поступает в синтаксический анализатор компилятора, который использует правила грамматики, чтобы решить, является ли ввод действительным или нет.Если переменные A и B не были ранее объявлены и не попали в область видимости, компилятор может сказать:

  • «A»: необъявленный идентификатор.

Если они были объявлены, но не инициализированы. компилятор выдает предупреждение:

  • локальная переменная A используется без инициализации.

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

Один проход или два?

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

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

Код генерирующей машины

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

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

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

Создание кода

— вызов

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

  • Конвейерная обработка команд
  • Внутренние кэши.

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

Кеши и очереди

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

Многие процессоры имеют отдельные части для:

  • Целочисленная арифметика (целые числа)
  • Арифметика с плавающей запятой (дробные числа)

Эти операции часто могут выполняться параллельно для увеличения скорости.

Компиляторы обычно генерируют машинный код в объектные файлы, которые затем связываются вместе программой компоновщика.

Что такое компилятор? — Определение от WhatIs.com

К

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

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

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

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

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

Последнее обновление: сентябрь 2016 г.

Продолжить чтение о компиляторе Значение

слов — компилируется ли фрагмент кода? Или компилируется?

После комментариев к ответу JamesK:

«Согнутый железный пруток» — действительно отличная аналогия. И «изогнутый», и «скомпилированный» могут использоваться транзитивно или непереходно для описания фактического действия:

Гаечный ключ гнул железный стержень. — GCC скомпилировал код.

Пруток железный гнутый. — Код скомпилирован.


Как и почти любой английский глагол, «bend» и «compile» также могут использоваться для описания того, что какое-то физическое действие возможно , не обязательно подразумевая, что действие когда-либо было выполнено специально:

Гаечные ключи позволяют гнуть железные прутья.- GCC может компилировать код.

Гаечные ключи для гнутья прутков. — GCC компилирует код.

Этот железный пруток можно согнуть гаечным ключом. — Этот конкретный код может быть скомпилирован с помощью GCC.

Гаечный ключ легко гнет этот железный стержень. — GCC компилирует именно этот код.

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


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

Я согнул железный пруток [гаечным ключом].- Я скомпилировал код [используя GCC].

Гаечный ключ гнул железный стержень. — GCC скомпилировал код.

Я почти уверен, что это вопрос философии, а не грамматики. Сравнить

Джон убил старуху ножом. — Нож Джона * убил старуху.

Шальная пуля из пистолета Джона убила старуху. — Шальная пуля из пистолета Джона * убила старуху.

Мой гаечный ключ погнул железный стержень. — Моя рукавица * поймала бейсбольный мяч.

Некоторые действия интуитивно можно отнести к неодушевленным инструментам; некоторые действия интуитивно требуют свободы воли. Некоторые, такие как «убитые», кажутся в серой зоне, требующей некоторой силы , но не обязательно ценности человека. «Скомпилировано», кажется, далеко от того, что «не требуется никакого агентства».


Обратите внимание, что наша аналогия с «гаечным ключом» не совсем точна, по крайней мере, по двум причинам:

  • Когда вы сгибаете железный пруток гаечным ключом, результат зависит не только от гаечного ключа, но и от вашей собственной физической силы. «Гаечный ключ гнет этот железный стержень» часто зависит от наблюдателя : это может быть правдой для меня и ложью для вас (или наоборот). С другой стороны, «GCC компилирует этот код» редко зависит от наблюдателя. Это было бы больше похоже на высказывание «Nargesa MT500A гнет этот железный стержень» — утверждение, которое может проверить любой наблюдатель, имеющий доступ к инструменту.