Транслятор(англ. translator — переводчик) — это программа-переводчик. Она преобразует программу, написанную на одном из языков высокого уровня, в программу, состоящую из машинных команд. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д. Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом. В общем случае понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным компьютерным (вроде языков разметки типа HTML), так и естественным (русскому, английскому и т. п.).
Виды трансляторов
- Диалоговый. Обеспечивает использование языка программирования в режиме разделения времени (англ.).
- Синтаксически-ориентированный (синтаксически-управляемый). Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.
- Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.
- Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.
- Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.
- Тестовый. Набор макрокоманд языка ассемблера, позволяющих задавать различные отладочные процедуры в программах, составленных на языке ассемблера.
- Обратный. Для программы в машинном коде выдаёт эквивалентную программу на каком-либо языке программирования (см.: дизассемблер, декомпилятор).
Виды компиляторов
- Векторизующий. Транслирует исходный код в машинный код компьютеров, оснащённых векторным процессором.
- Гибкий. Сконструирован по модульному принципу, управляется таблицами и запрограммирован на языке высокого уровня или реализован с помощью компилятора компиляторов.
- Диалоговый. См.: диалоговый транслятор.
- Инкрементальный. Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.
- Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора (команды) исходной программы.
- Компилятор компиляторов. Транслятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.
- Отладочный. Устраняет отдельные виды синтаксических ошибок.
- Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.
- Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.
- Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.
Источник: studfile.net
Трансляторы и интерпретаторы языков программирования
Конкретными исполнителями языков программирования являются трансляторы и интерпретаторы.
Транслятор представляет собой программу, на основе которой компьютер преобразует вводимые в него программы на машинный язык, поскольку он может выполнять программы, записанные только на языке его процессора, и алгоритмы, заданные на другом языке, должны быть перед их выполнением переведены на машинный язык.
Транслятор — программа или техническое средство, выполняющее трансляцию программы.
Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке, эквивалентную по результатам выполнения первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т.д.
Язык, на котором представлена входная программа, называется исходнымязыком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом. Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста. В случае программ-трансляторов, адресатом является техническое устройство (процессор) или программа-интерпретатор.
Трансляторы реализуются в виде компиляторов или интерпретаторов. С точки зрения выполнения работы компилятор и интерпретатор существенно различаются.
Язык процессоров (машинный код) является низкоуровневым. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется компилятором.
Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется. Результат работы компилятора — бинарный исполняемый файл.
Достоинство компилятора: программа компилируется один раз и при каждом выполнении не требуется дополнительных преобразований. Соответственно, не требуется наличие компилятора на целевой машине, для которой компилируется программа. Недостаток: отдельный этап компиляции замедляет написание и отладку и затрудняет исполнение небольших, несложных или разовых программ.
В случае, если исходный язык является языком ассемблера (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется ассемблером.
Другой метод реализации — когда программа исполняется с помощью интерпретатора вообще без трансляции.
Интерпретатор (англ. interpreter — истолкователь, устный переводчик) переводит и выполняет программу строка за строкой.
Интерпретатор программно моделирует машину, цикл выборки-исполнения которой работает с командами на языках высокого уровня, а не с машинными командами. Такое программное моделирование создаёт виртуальную машину, реализующую язык. Этот подход называется чистой интерпретацией. Чистая интерпретация применяется как правило для языков с простой структурой (например, АПЛ или Лисп). Интерпретаторы командной строки обрабатывают команды в скриптах в UNIX или в пакетных файлах (.bat) в MS-DOS также как правило в режиме чистой интерпретации.
Достоинство чистого интерпретатора: отсутствие промежуточных действий для трансляции упрощает реализацию интерпретатора и делает его удобнее в использовании, в том числе в диалоговом режиме. Недостаток — интерпретатор должен быть в наличии на целевой машине, где должна исполняться программа. Также, как правило, имеется более или менее значительный проигрыш в скорости. А свойство чистого интерпретатора, что ошибки в интерпретируемой программе обнаруживаются только при попытке выполнения команды (или строки) с ошибкой, можно признать как недостатком, так и достоинством.
Существуют компромиссные между компиляцией и чистой интерпретацией варианты реализации языков программирования, когда интерпретатор перед исполнением программы транслирует её на промежуточный язык (например, в байт-код или p-код), более удобный для интерпретации (то есть речь идёт об интерпретаторе со встроенным транслятором). Такой метод называется смешанной реализацией. Примером смешанной реализации языка может служить Perl. Этот подход сочетает как достоинства компилятора и интерпретатора (бо?льшая скорость исполнения и удобство использования), так и недостатки (для трансляции и хранения программы на промежуточном языке требуются дополнительные ресурсы; для исполнения программы на целевой машине должен быть представлен интерпретатор). Также, как и в случае компилятора, смешанная реализация требует, чтобы перед исполнением исходный код не содержал ошибок (лексических, синтаксических и семантических).
По мере увеличения ресурсов компьютеров и расширения гетерогенных сетей (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения, на лету. Уже скомпилированные участки кода кэшируются, чтобы при повторном обращении к ним они сразу получали управление, без перекомпиляции. Этот подход получил название динамической компиляции.
Достоинством динамической компиляции является то, что скорость интерпретации программ становится сравнимой со скоростью исполнения программ в обычных компилируемых языках, при этом сама программа хранится и распространяется в единственном виде, независимом от целевых платформ. Недостатком является бо?льшая сложность реализации и бо?льшие требования к ресурсам, чем в случае простых компиляторов или чистых интерпретаторов.
Этот метод хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java, .NET Framework, Perl, Python.
После того, как программа откомпилирована, ни исходный текст программы, ни компилятор более не нужны для исполнения программы. В то же время программа, обрабатываемая интерпретатором, должна заново переводиться на машинный язык при каждом очередном запуске программы. То есть исходный файл является непосредственно исполняемым.
Откомпилированные программы работают быстрее, но интерпретируемые проще исправлять и изменять.
Каждый конкретный язык ориентирован либо на компиляцию, либо на интерпретацию — в зависимости от того, для каких целей он создавался. Например, С++ обычно используется для решения довольно сложных задач, в которых важна скорость работы программ, поэтому данный язык реализуется с помощью компилятора.
Для достижения большей скорости работы программ на интерпретируемых языках программирования может использоваться трансляция в промежуточный байт-код. Языками, позволяющую данную хитрость являются Java, Python и некоторые другие языки программирования.
Алгоритм работы простого интерпретатора:
1. прочитать инструкцию;
2. проанализировать инструкцию и определить соответствующие действия;
3. выполнить соответствующие действия;
4. если не достигнуто условие завершения программы, прочитать следующую инструкцию и перейти к пункту 2
Статьи к прочтению:
- Требования к документированию. можно выделить три группы требований к документированию системы защиты информации: протоколирование
- Требования к форматированию текста при написании реферата
Основы программирования #2 Компилятор и интерпретатор
Похожие статьи:
- Использование трансляторов и интерпретаторов на разных уровнях Исходный код программы – код, написанный на языке программирования. Объектный модуль – код программы после трансляции, преобразованный в машинные коды….
- История и классификация языков программирования ГЛАВА 2. ВВЕДЕНИЕ В ЯЗЫКИ ПРОГРАММИРОВАНИЯ История и классификация языков программирования Язык программирования — это способ записи программ решения…
Источник: csaa.ru
Транслятор – это. Виды трансляторов. Преобразование и трансляция программы
Программам, как и людям, для перевода с одного языка на другой требуется переводчик, или транслятор.
Основные понятия
Программа представляет собой лингвистическое представление вычислений: i → P → P(i). Интерпретатор представляет собой программу, на вход которой подается программа Р и некоторые входные данные x. Он выполняет P на х: I(P, x) = P(x). Тот факт, что существует единственный транслятор, способный выполнять все возможные программы (которые можно представить в формальной системе), является очень глубоким и значительным открытием Тьюринга.
Процессор является интерпретатором программ на машинном языке. Как правило, слишком дорого писать интерпретаторы для языков высокого уровня, поэтому их транслируют в форму, которую интерпретировать легче.
Очень часто в Интернете можно столкнуться с таким понятием, как «парсинг». Что это такое и для чего.
Некоторые виды трансляторов имеют очень странные имена:
- Ассемблер транслирует программы на ассемблере в машинный язык.
- Компилятор транслирует с языка высокого уровня на язык более низкого.
Транслятор – это программа, которая принимает в качестве входных данных программу на некотором языке S и выдает программу на языке T таким образом, что обе они имеют ту же семантику: P → X → Q. То есть, ∀x. P(х) = Q(х).
Если транслировать всю программу в нечто интерпретируемое, то это называется компиляцией перед исполнением, или АОТ-компиляцией. АОТ-компиляторы могут использоваться последовательно, последний из которых часто является ассемблером, например:
Исходный код → Компилятор (транслятор) → Ассемблерный код → Ассемблер (транслятор) → Машинный код → ЦПУ (интерпретатор).
Оперативная или динамическая компиляция происходит, если часть программы транслируется, когда исполняются другие ранее скомпилированные части. JIT-трансляторы запоминают то, что они уже выполнили, чтобы не повторять исходный код снова и снова. Они способны даже производить адаптивную компиляцию и перекомпиляцию, основанную на поведении среды выполнения программы.
Удовольствие от путешествий в новые места не имеет себе равных. Единственная проблема связана с.
Многие языки позволяют выполнять код во время трансляции и компилировать новый код во время выполнения программы.
Этапы трансляции
Трансляция состоит из этапов анализа и синтеза:
Исходный код → Анализатор → Концептуальное представление → Генератор (синтезатор) → Целевой код.
Это обусловлено такими причинами:
- Любой другой способ не подходит. Пословный перевод просто не работает.
- Хорошее инженерное решение: если нужно написать трансляторы для M исходных языков и N целевых, потребуется написать только M + N простых программ (полукомпиляторов), а не M × N комплексных (полных трансляторов).
Тем не менее на практике концептуальное представление очень редко бывает достаточно выразительным и мощным, чтобы охватить все мыслимые исходные и целевые языки. Хотя некоторые и смогли к этому приблизиться.
Реальные компиляторы проходят через множество этапов. При создании собственного компилятора не нужно повторять всю тяжелую работу, которую люди уже проделали при создании представлений и генераторов. Можно транслировать свой язык прямо в JavaScript или C и воспользоваться существующими JavaScript-движками и компиляторами языка C, чтобы сделать все остальное. Также можно использовать существующие промежуточные представления и виртуальные машины.
Сегодня, когда сфера высоких технологий развивается большими темпами, можно часто услышать о.
Запись транслятора
Транслятор – это программа или техническое средство, в котором задействованы три языка: исходный, целевой и базисный. Их можно записать в Т-форме, расположив исходный слева, целевой справа и базисный ниже.
Существует три вида компиляторов:
- Транслятор – это самокомпилятор, если у него исходный язык соответствует базисному.
- Компилятор, у которого целевой язык равен базисному, называется саморезидентным.
- Транслятор – это кросс-компилятор, если у него целевой и базисный языки различные.
Почему это важно?
Даже если вы никогда не сделаете настоящий компилятор, хорошо знать о технологии его создания, потому что используемые для этого концепции применяются повсеместно, например в:
- форматировании текстов;
- языках запросов к базам данных;
- расширенных компьютерных архитектурах;
- обобщенных задачах оптимизации;
- графических интерфейсах;
- языках сценариев;
- контроллерах;
- виртуальных машинах;
- машинных переводах.
Кроме того, если нужно написать препроцессоры, сборщики, загрузчики, отладчики или профилировщики, необходимо пройти через те же этапы, что и при написании компилятора.
Также можно узнать, как лучше писать программы, так как создание транслятора для языка означает лучшее понимание его тонкостей и неясностей. Изучение общих принципов трансляции также позволяет стать хорошим дизайнером языка. Так ли это важно, насколько крут язык, если он не может быть реализован эффективно?
Всеобъемлющая технология
Технология компилятора охватывает множество различных областей информатики:
- формальную теорию языка: грамматику, парсинг, вычислимость;
- компьютерную архитектуру: наборы инструкций, RISC или CISC, конвейерную обработку, ядра, тактовые циклы и т.д.;
- концепции языков программирования: например, управление последовательностью выполнения, условное выполнение, итерации, рекурсии, функциональное разложение, модульность, синхронизацию, метапрограммирование, область видимости, константы, подтипы, шаблоны, тип вывода, прототипы, аннотации, потоки, монады, почтовые ящики, продолжения, групповые символы, регулярные выражения, транзакционную память, наследование, полиморфизм, режимы параметров и т. д.;
- абстрактные языки и виртуальные машины;
- алгоритмы и структуры данных: регулярные выражения, алгоритмы парсинга, графические алгоритмы, динамическое программирование, обучение;
- языки программирования: синтаксис, семантику (статическую и динамическую), поддержку парадигм (структурной, ООП, функциональной, логической, стековой, параллелизма, метапрограммирования);
- создание ПО (компиляторы, как правило, крупные и сложные): локализацию, кэширование, компонентизацию, API-интерфейсы, повторное использование, синхронизацию.
Проектирование компилятора
Некоторые проблемы, возникающие при разработке реального транслятора:
- Проблемы с исходным языком. Легко ли его скомпилировать? Есть ли препроцессор? Как обрабатываются типы? Имеются ли библиотеки?
- Группировка проходов компилятора: одно- или многоходовая?
- Степень желательной оптимизации. Быстрая и нечистая трансляция программы практически без оптимизации может быть нормальной. Чрезмерная оптимизация будет тормозить компилятор, но лучший код во время выполнения может того стоить.
- Требуемая степень обнаружения ошибок. Может ли транслятор просто остановиться на первой ошибке? Когда он должен остановиться? Доверить ли компилятору исправление ошибок?
- Наличие инструментов. Если исходный язык не является очень маленьким, сканер и генератор анализаторов являются обязательными. Также существуют генераторы генераторов кода, но они не так распространены.
- Вид целевого кода для генерации. Следует выбирать из чистого, дополненного или виртуального машинного кода. Или просто написать входную часть, создающую популярные промежуточные представления, такие как LLVM, RTL или JVM. Или сделать трансляцию от исходного в исходный код на C или JavaScript.
- Формат целевого кода. Можно выбрать язык ассемблера, переносимый машинный код, машинный код образа памяти.
- Перенацеливание. При множестве генераторов хорошо иметь общую входную часть. По этой же причине лучше иметь один генератор для многих входных частей.
Архитектура компилятора: компоненты
Это главные функциональные компоненты транслятора, генерирующего машинный код (если выходной программой является программа на С или виртуальная машина, то потребуется не так много этапов):
- Входная программа (поток знаков) поступает в сканер (лексический анализатор), который преобразует ее в поток токенов.
- Парсер (синтаксический анализатор) строит из них абстрактное синтаксическое дерево.
- Семантический анализатор раскладывает семантическую информацию и проверяет узлы дерева на ошибки. В результате строится семантический граф – абстрактное синтаксическое дерево с дополнительными свойствами и установленными ссылками.
- Генератор промежуточного кода строит граф потока (кортежи группируются в основные блоки).
- Машинонезависимый оптимизатор кода проводит как локальную (внутри базового блока), так и глобальную (по всем блокам) оптимизацию, в основном оставаясь в рамках подпрограмм. Сокращает избыточный код и упрощает вычисления. В результате получается модифицированный граф потока.
- Генератор целевого кода связывает базовые блоки в прямолинейный код с передачей управления, создавая объектный файл на ассемблере с виртуальными регистрами (возможно, неэффективными).
- Машинозависимый оптимизатор-компоновщик распределяет память между регистрами и производит планирование команд. Осуществляет преобразование программы на ассемблере в настоящий ассемблер с хорошим использованием конвейерной обработки.
Кроме того, используются подсистемы обнаружения ошибок и менеджер таблиц символов.
Лексический анализ (сканирование)
Сканер конвертирует поток знаков исходного кода в поток токенов, убирая пробелы, комментарии и расширяя макросы.
Сканеры часто встречаются с такими проблемами, как принимать или не принимать во внимание регистр, отступы, перевод строки и вложенные комментарии.
Ошибки, которые могут встретиться при сканировании, называются лексическими и включают:
- символы, отсутствующие в алфавите;
- превышение числа знаков в слове или строке;
- не закрытый знак или строковый литерал;
- конец файла в комментарии.
Синтаксический анализ (парсинг)
Парсер преобразует последовательность токенов в абстрактное синтаксическое дерево. Каждый узел дерева сохраняется как объект с именованными полями, многие из которых сами являются узлами дерева. На этом этапе циклы отсутствуют. При создании парсера необходимо обратить внимание на уровень сложности грамматики (LL или LR) и выяснить, есть ли какие-либо правила снятия неоднозначности. Некоторые языки действительно требуют проведения семантического анализа.
Ошибки, встречающиеся на этом этапе, называются синтаксическими. Например:
- k = 5 * (7 – y;
- j = /5;
- 56 = x * 4.
Семантический анализ
Во время проведения семантического анализа необходимо проверить правила допустимости и связать части синтаксического дерева (разрешая ссылки имен, вставляя операции для неявного приведения типов и т. д.) для формирования семантического графа.
Очевидно, что набор правил допустимости у разных языков различный. Если компилируются Java-подобные языки, трансляторы могут найти:
- множественные объявления переменной в пределах области ее действия;
- ссылки на переменную до ее объявления;
- ссылки на необъявленное имя;
- нарушение правил доступности;
- слишком большое или недостаточное количество аргументов при вызове метода;
- несоответствие типов.
Генерация
Генерация промежуточного кода производит граф потока, составленный из кортежей, сгруппированных в базовые блоки.
Генерация кода производит реальный машинный код. В традиционных компиляторах для RISC-машин на первом этапе создается ассемблер с бесконечным числом виртуальных регистров. Для CISC-машин, вероятно, этого не произойдет.
Современная сеть Интернет – это мировое средство коммуникации, в котором содержится необъятное количество информации из разных стран. Тяжело представить, сколько терабайтов займут эти данные. У многих людей возникает необходимость добывать .
Что же такое компилятор? Чем компилятор отличается от интерпретатора? Что эффективнее — компилятор или интерпретатор? Ответы на эти вопросы вы найдете в статье ниже.
Информационные источники (как называется сторона, предающая информацию) — это, по сути, все объекты окружающего мира. Биологические информационные каналы — это зрение, слух, обоняние, осязание, вкус.
Уметь находить в потоке информации что-то нужное или возможно полезное, уметь отсекать лишнее — идея, рожденная с первым языком программирования во имя распознавания программы для ее исполнения. Развитие интернет-технологий расширило границы этой .
В данной статье мы поговорим о том, как в «Опере» перевести страницу на русский язык. Дело в том, что порою в поисках какой-то информации приходится столкнуться с тем, что на русскоязычном пространстве интернета ее найти не удается, а вот .
Принятие правильных решений возможно на основании актуальной информации. Когда появилась идея парсинга, на динамику информации было сразу обращено внимание. Но на самом деле важна не столько динамика информационных потоков, сколько точки актуальности в них. Ключевые слова, семантическое ядро, основы продвижения и другие объективные стороны веб-ресурсов, по-прежнему представляют интерес, но интуиция в парсинге стала набирать обороты
Очень часто в Интернете можно столкнуться с таким понятием, как «парсинг». Что это такое и для чего нужно? Бывает так, что программистам дают задание спарсить какой-либо сайт. Или обычный пользователь сталкивается с таким термином и не знает его значения.
Удовольствие от путешествий в новые места не имеет себе равных. Единственная проблема связана с языковым барьером. Для тех, у кого нет времени изучать язык посещаемой страны, есть хорошая новость: они могут использовать свой смартфон. В данном обзоре представлен список лучших приложений-переводчиков для «Андроида».
Сегодня, когда сфера высоких технологий развивается большими темпами, можно часто услышать о компилировании. Но что это такое?
В статье рассказывается об истории возникновения языков программирования, их классификации. Приведена информация о применении языков программирования высокого уровня.
Источник: autogear.ru