Назовите тип транслятора, который сразу переводит всю программу в машинный код и создает исполняемый файл

Обновлено: 06.07.2024

Переводчики, компиляторы, интерпретаторы и ассемблеры — все это инструменты программирования, которые преобразуют код в другой тип кода, но каждый термин имеет особое значение. Все вышеперечисленное каким-то образом работает над переводом языка программирования высокого уровня в машинный код, понятный центральному процессору (ЦП). Примеры процессоров включают процессоры Intel (например, x86), AMD (например, APU Athlon), NXP (например, PowerPC) и многие другие. Важно отметить, что все трансляторы, компиляторы, интерпретаторы и ассемблеры сами по себе являются программами.


Переводчики
Наиболее общим термином для программного средства преобразования кода является «переводчик». Транслятор в терминах программирования — это общий термин, который может относиться к компилятору, ассемблеру или интерпретатору; все, что преобразует код более высокого уровня в другой код высокого уровня (например, Basic, C++, Fortran, Java) или код более низкого уровня (т. е. язык, понятный процессору), такой как язык ассемблера или машинный код. Если вы не знаете, что на самом деле делает этот инструмент, кроме того, что он выполняет некоторый уровень преобразования кода для определенного целевого языка, то вы можете смело называть его переводчиком.

Компиляторы
Компиляторы преобразуют код языка высокого уровня в машинный (объектный) код за один сеанс. Компиляторам может потребоваться некоторое время, потому что они должны одновременно транслировать высокоуровневый код на машинный язык более низкого уровня, а затем сохранять исполняемый объектный код в памяти. Компилятор создает машинный код, который работает на процессоре с определенной архитектурой набора инструкций (ISA), которая зависит от процессора. Например, вы не можете скомпилировать код для x86 и запустить его на архитектуре MIPS без специального компилятора. Компиляторы также зависят от платформы. То есть компилятор может преобразовать C++, например, в машинный код, предназначенный для платформы, на которой работает ОС Linux. Однако кросс-компилятор может генерировать код для платформы, отличной от той, на которой он работает сам.

Кросс-компилятор, работающий на компьютере с Windows, например, может генерировать код, который работает в определенной операционной системе Windows или на платформе Linux (операционная система). Компиляторы исходного кода переводят одну программу или код в другую на другом языке (например, с Java на C). Таким образом, выбор компилятора означает, что сначала вам нужно знать ISA, операционную систему и язык программирования, которые вы планируете использовать. Компиляторы часто поставляются в комплекте с другими инструментами, и у каждого производителя процессоров есть по крайней мере один компилятор или пакет инструментов разработки программного обеспечения (включая компилятор). Часто программные инструменты (включая компилятор) бесплатны; в конце концов, ЦП совершенно бесполезен без программного обеспечения, которое на нем работает. Компиляторы сообщат об ошибках после завершения компиляции.

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

Интерпретаторы, однако, полезны в тех областях, где скорость не имеет значения (например, отладка и обучение), и можно взять весь интерпретатор и использовать его на другом ISA, что делает его более переносимым, чем компилятор при работе. между аппаратными архитектурами. Существует несколько типов интерпретаторов: интерпретатор, управляемый синтаксисом (т. е. интерпретатор абстрактного синтаксического дерева (AST)), интерпретатор байт-кода и многопоточный интерпретатор (не путать с потоками параллельной обработки), интерпретатор точно в срок (разновидность гибридного интерпретатора/компилятора) и некоторые другие. Инструкции по созданию интерпретатора можно найти в Интернете.[i] Примерами языков программирования, использующих интерпретаторы, являются Python, Ruby, Perl и PHP.

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

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

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

Переводчик преобразует исходный код в машинный код (объектный код).

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

Компилятор

Ширина схемы компилятора

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

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

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

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

Переводчик

Ширина диаграммы интерпретатора

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

Интерпретатор останавливается, когда достигается строка кода, содержащая ошибку.

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

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

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

Ассемблер

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

После сборки программный файл можно использовать снова и снова без повторной сборки.

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

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

Компилируемые языки (например, C, C++)

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


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

Исходная сборка Запустить исполняемый файл Rebuild

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

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

Интерпретируемые языки программирования (например, Python, Perl)

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


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

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

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

А теперь кое-что другое. Java

Язык программирования Java не вписывается ни в модели компилируемого языка, ни в модели интерпретируемого языка. Это показано на рисунке ниже.


Компилятор Java (javac) преобразует исходный код в байт-код. Байт-код — это своего рода средний машинный язык. Этот файл байт-кода (файл .class) можно запустить в любой операционной системе с помощью интерпретатора Java (java) для этой платформы. Интерпретатор называется виртуальной машиной. Таким образом, Java является примером языка программирования для виртуальных машин.

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

Способ, которым языки программирования виртуальных машин получают часть скорости компилируемых языков, заключается в том, что исходный код пропускается через компилятор для создания байт-кода. Это преобразование происходит до запуска программы. Способ, которым языки виртуальных машин достигают своей переносимости (независимости от платформы), заключается в наличии разных интерпретаторов для каждой поддерживаемой операционной системы. Этот интерпретатор связывает правильные библиотеки времени выполнения для каждой операционной системы. Скомпилированный байт-код представляет собой средний машинный язык, который будет работать без изменений с любым интерпретатором виртуальной машины для этого языка. Этот процесс проиллюстрирован далее. У нас есть компилятор, который преобразует исходный код в байт-код. Это можно смоделировать, нажав кнопку Compile. После создания байт-кода этот же байт-код можно использовать без каких-либо изменений в любой операционной системе, имеющей интерпретатор виртуальной машины для языка программирования. Обратите внимание, что каждый интерпретатор виртуальной машины имеет разный код библиотеки времени выполнения, потому что каждая операционная система имеет разные библиотеки времени выполнения. Вот как язык виртуальной машины решает проблемы зависимости от платформы. Нажмите «Запустить Windows», «Запустить Mac OSX» или «Запустить Linux», чтобы имитировать запуск программы в любой из этих операционных систем.

Интерпретируемые и компилируемые языки программирования: что такое

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

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

Хорошо… но что это на самом деле означает?

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

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

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

Компилированные языки

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

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

Примерами чисто компилируемых языков являются C, C++, Erlang, Haskell, Rust и Go.

Интерпретируемые языки

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

Когда-то интерпретируемые языки работали значительно медленнее, чем компилируемые. Но с развитием компиляции «точно в срок» этот разрыв сокращается.

Примерами распространенных интерпретируемых языков являются PHP, Ruby, Python и JavaScript.

Небольшое предостережение

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

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

Преимущества и недостатки

Преимущества компилируемых языков

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

Недостатки компилируемых языков

  • Дополнительное время, необходимое для завершения всего шага компиляции перед тестированием.
  • Зависимость сгенерированного двоичного кода от платформы

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

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

Недостатки интерпретируемых языков

Наиболее заметным недостатком является типичная скорость выполнения по сравнению с скомпилированными языками.

Если эта статья была вам полезна, отправьте твит .

Научитесь программировать бесплатно. Учебная программа freeCodeCamp с открытым исходным кодом помогла более чем 40 000 человек получить работу в качестве разработчиков. Начать

freeCodeCamp – это поддерживаемая донорами некоммерческая организация, освобожденная от налогов в соответствии со статьей 501(c)(3) (идентификационный номер федерального налогоплательщика США: 82-0779546)

Наша миссия: помочь людям научиться программировать бесплатно. Мы достигаем этого, создавая тысячи видеороликов, статей и интерактивных уроков по кодированию — все они находятся в свободном доступе. У нас также есть тысячи учебных групп freeCodeCamp по всему миру.

Пожертвования в пользу freeCodeCamp идут на наши образовательные инициативы и помогают оплачивать серверы, услуги и персонал.

Читайте также: