В чем различие между компиляцией и интерпретацией
Перейти к содержимому

В чем различие между компиляцией и интерпретацией

  • автор:

Какая разница между Интерпретацией и Компиляцией в обработке?

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

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

По логике что выходит, на каком языке у нас получится продуктивнее сервер, Java или php?

  • Вопрос задан более трёх лет назад
  • 3524 просмотра

Комментировать
Решения вопроса 2

gobananas

finishhim.ru

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

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

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Rou1997

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

var str = "5+3"; if (str.Contains('+')) < var result = Int(str.Split('+')[0]) + Int(str.Split('+')[1]); >else if (str.Contains('-'))

Это ведь уже простейший интерпретатор, хоть в нем и нет нормальной реализации ни лексического, ни синтаксического анализатора, но даже такого г..нокода достаточно, чтобы понимать, как работает интерпретатор, и как так получается, что если во входной строке знак «+» то в итоге процессор складывает значения, а если «-» то вычитает.
А вы, видимо, даже до такого г..нокода не можете додуматься, а хотите делать какие-то глобальные выводы про продуктивность Java и PHP.
Не нужно вам лезть в такие дебри, теория без практики — мертва, она превращается в лженауку.
Лучше попробуйте написать сайт на PHP, а затем на Java, пользы будет в десятки раз больше, чем от пространных рассуждений «хелловорлдщика».

Ответ написан более трёх лет назад
Нравится 1 8 комментариев

Ingernirated

Ingernirated @Ingernirated Автор вопроса

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

Rou1997

Ingernirated: Ошибаетесь. Могу. А вот вы не можете понять ответ, и вообще в голове каша, поскольку нет практического опыта, а лишь обрывки теории.

Я прокомментировал вот этот абзац:

Про интерпретацию читал, что это мгновенное выполнение, без превращения её в машинный код, но она же должна обработаться процесером, который понимает только машинный код?

Я объяснил, как работает интерпретация, привел исходный код простейшего интерпретатора.
Было еще два абзаца — «какая разница между интерпретацией и компиляцией», и про продуктивность Java vs PHP.
Но понимание разницы автоматически вытекает из понимания интерпретации, а насчет продуктивности, я и ответил, что это бред, связывать ее с тем, интерпретируемый ли ЯП или JIT-компилируемый. С таким же успехом можно по форме черепа создателя ЯП определять его продуктивность, и задавать вопросы, основанные на этом ложном тезисе.

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

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

Разница между компилятором и интерпретатором

Какая разница между компилятором и интерпретатором? Может ли язык программирования иметь и компилятор и интерпретатор?

Отслеживать
11.5k 8 8 золотых знаков 42 42 серебряных знака 69 69 бронзовых знаков
задан 23 дек 2016 в 8:09
Salut Amigo Salut Amigo
540 1 1 золотой знак 3 3 серебряных знака 18 18 бронзовых знаков
23 дек 2016 в 8:14
Бейсик имел традиционно много разных компиляторов и интерпретаторов.
23 дек 2016 в 8:24
– user181100
23 дек 2016 в 8:40

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Чтобы опеределить разницу, давайте узнаем, что это такое:

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

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

Интерпрета́тор — программа (разновидность транслятора), выполняющая интерпретацию.

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

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

Если взять язык java , то он имеет, как компилятор, так и интерпретатор. Компилятор преобразует исходный код в байткод. А байткод в начальной стадии выполнения программы обрабатывается интерпретатором.

Компилятор, это отдельная программа javac , интерпретатор же встроен в jvm . Помимо обычного компилятора, в jvm присутствует just-in-time компиляция. т.к. интерпретация довольно медленна, то горячие места в программе компилируются в машинный код jit компилятором, тем самым ускоряя выполнение.

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

Компиляция и интерпретация кода: что это такое и в чем разница главное изображение

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

Это адаптированный перевод статьи A Deeper Inspection Into Compilation And Interpretation от разработчика Vaidehi Joshi из компании Vimeo. Повествование ведется от имени автора.

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

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

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

Чтобы понять упрямство людей того времени, пройдем вместе с ними этот тернистый путь, выстланный перфокартами.

Все объединяет идея языков

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

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

  • Проверить текст на ошибки
  • Сделать лексический и синтаксический анализ
  • Сохранить результат перевода.

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

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

От цифр к словам

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

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

В том числе и Грейс Хоппер.

Однажды Хоппер предложила коллегам не мучиться с машинным кодом, а говорить с компьютером на английском языке. Например, сказать ему: «Вычти подоходный налог из зарплаты». Как отреагировали ее коллеги и начальство, вы уже знаете: «Они мягко объяснили мне, что компьютеры могут решать лишь арифметические задачи и что они никогда не смогут выполнять программы», — рассказывала Хоппер в своей биографии «Grace Hopper: Navy Admiral and Computer Pioneer».

Но Грейс Хоппер не так легко сбить с толку. Эта женщина пошла на фронт добровольцем, причем исключительно благодаря напористости — ее не хотели брать из-за дефицита веса. Она закончила обучение с лучшими оценками и стала лучшим инженером штаба.

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

Первым переводчиком был компилятор

Хоппер показала коллегам свой переводчик в 1952 году, и ее проигнорировали. Три года технологией никто не пользовался, пока, наконец, проект не заметили в Министерстве обороны США.

Зачем военным понадобился компьютер, который заказали в Бюро переписи населения? Зачем им нужна была технология Хоппер, на которую махнули рукой ее более авторитетные коллеги?

Дело в устройстве первого переводчика (как говорят в программировании, транслятора). Вот как работал этот транслятор:

  1. Хоппер писала инструкцию на английском языке — «Вычти подоходный налог»
  2. Компилятор переводил инструкцию в машинный код — тогда это были цифры и буквы
  3. Компьютер выполнял машинный код, не зная ничего про инструкцию на английском.

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

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

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

Люди в американском правительстве считали компилятор временным решением. Однако концепция трансляторов, как и принципы языка COBOL, прочно вошли в инженерные практики на многие годы.

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

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

Как интерпретатор делает построчную трансляцию

На дворе идет 1958 год, компиляторы давно и успешно используются — в том числе в Массачусетском технологическом университете, где стоит IBM 704. Эта гигантская дорогая штуковина занимает всю комнату. И на ней куется Lisp — язык, на котором 30 лет после этого писался весь код для разработок в области искусственного интеллекта.

Но сейчас, в октябре 58-го, один из местных разработчиков прохлаждается вместо того, чтобы кормить адскую машину перфокартами. Он углубился в чтение статьи своего профессора и по совместительству босса, Джона Маккарти. Бездельника звали Стив Рассел.

«Потом Стив подошел ко мне и сказал: «Слушай, а почему у нас нет функции eval?». Я посмеялся конечно, и отвечаю: «Слушай, не путай теорию и практику, хорошо? Eval — это теоретическое понятие»», — Джон Маккарти для симпозиума ACM 1984 года.

Маккарти хотел как лучше, отказывая Расселу в проекте. Подумайте сами: eval — это команда, которая превращает любую строку в функцию и потом еще выполняет ее. Это два действия за один перевод! Невыполнимый трюк для транслятора, который умеет отдавать процессору только одну инструкцию за раз.

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

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

Но если вы просто будете отправлять инструкции процессору построчно, то у вас не будет интерпретатора. Он отправляет результат перевода не в процессор, а обратно в программу — это позволяет создавать интересные многоступенчатые команды вроде eval .

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

Транслятор влияет на опыт пользователя

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

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

Еще нам неважно, что у другого студента MacOS, а у вас — Windows: интерпретатор берет всю работу по совместимости на себя, для работы кода важно, чтобы у всех стоял интерпретатор.

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

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

Компилятор и интерпретатор делают одну и ту же работу, так почему компилятор быстрее?

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

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

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

�� Компилятор и интерпретатор: понимание основ

Что такое компиляция, линковка, run time?

Что такое язык программирования, и какие они бывают?

Что такое синтаксис в программировании

Что такое митапы и зачем они айтишнику

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

Если вы когда-нибудь задавались вопросом, как компьютер может понимать и выполнять программы на языке, понятном только человеку, значит пора узнать, что такое компилятор и интерпретатор. Добро пожаловать в увлекательный мир программирования! В этой статье мы рассмотрим один из ключевых инструментов программиста — что такое компилятор, как он работает, какие виды бывают и где применяются. А самое главное, какая разница между компилятором и интерпретатором. Готовы окунуться в мир компьютерных языков вместе с нами? Тогда начнем!

Определение

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

Кроме того, всех их можно условно разделить на две группы:

  1. те, которые работают с конкретными языками программирования;
  2. те, которые служат системами сборки программ. Примерами таких компиляторов являются GCC, gnat, clang, xcode, gfortran, Makefile и CMake.

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

Существуют два типа:

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

Некоторые такие трансляторы могут работать в режиме диалога или цикла чтения-вычисления-печати (REPL). В таком режиме интерпретатор считывает законченную конструкцию языка, выполняет её и выводит результаты.

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

  • Преимущества:
  • Значительно облегчает работу с исходным кодом программы.
  • Использует минимальный объем памяти компьютера при переводе по одной инструкции.
  • Может связать сообщения об ошибках с выполнением инструкций.
  • Недостатки:
  • Затрачивается время на интерпретацию программы в каждый раз, когда она выполняется.
  • Возможность выполнения только на компьютерах, где установлен соответствующий транслятор.

Сравнение компилятора и интерпретатора

Компилятор Интерпретатор
Что это Программа, которая преобразует исходный код на языке высокого уровня в машинный язык Программа, которая выполняет исходный код на языке высокого уровня
Работа Читает весь код программы и создает исполняемый файл Читает и выполняет каждую строку кода по очереди
Ошибка Сообщения об ошибках выводятся после прохождения компиляции Сообщения об ошибках выводятся по мере выполнения кода
Исполнение Исполняемые файлы работают быстрее Интерпретируемый код работает медленнее, чем скомпилированный
Использование Рекомендуется для крупных проектов и для языков, где требуется высокая производительность Рекомендуется для быстрой разработки и отладки, а также для языков, которые используются в интерактивной среде
Примеры языков C++, Java, Swift, Rust, Go Python, Ruby, JavaScript, PHP, Perl

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

Похожие материалы
Что такое компиляция, линковка, run time?
Что такое язык программирования, и какие они бывают?
Что такое синтаксис в программировании
Что такое митапы и зачем они айтишнику
Что такое сигнатура в программировании: терминология и примеры
Что такое компилятор и интерпретатор?

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

Какие преимущества и недостатки компилятора?

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

Какие преимущества и недостатки интерпретатора?

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

В каких ситуациях лучше использовать компилятор?

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

В каких ситуациях лучше использовать интерпретатор?

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

Можно ли использовать и компилятор, и интерпретатор в одном проекте?

Да, некоторые языки программирования, такие как Python и JavaScript, используют так называемые «JIT» (Just-In-Time) компиляторы, которые сочетают преимущества обеих подходов.

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

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