Каждая вычислительная машина имеет свой собственный язык программирования – язык команд или машинный язык – и может исполнять программы, записанные только на этом языке. С помощью машинного языка, в принципе, можно описать любой алгоритм, но затраты на программирование будут чрезвычайно велики. Это обусловлено тем, что машинный язык позволяет описывать и обрабатывать лишь примитивные структуры данных – бит, байт, слово. Программирование в машинных кодах требует чрезмерной детализации программы и доступно лишь программистам, хорошо знающим устройство и функционирование ЭВМ. Преодолеть эту трудность и позволили языки высокого уровня (Фортран, ПЛ/1, Паскаль, Си, Ада и др.) с развитыми структурами данных и средствами их обработки, не зависящими от языка конкретной ЭВМ.
Алгоритмические языки высокого уровня дают возможность программисту достаточно просто и удобно описывать алгоритмы решения многих прикладных задач. Такое описание называют исходной программой, а язык высокого уровня — входным языком.
Как сделать программу переводчик с нуля.
Языковым процессором называют программу на машинном языке, позволяющую вычислительной машине понимать и выполнять программы на входном языке. Различают два основных типа языковых процессоров: интерпретаторы и трансляторы.
Интерпретатор – это программа, которая в качестве входа допускает программу на входном языке и по мере распознавания конструкций входного языка реализует их, выдавая на выходе результаты вычислений, предписанные исходной программой.
Транслятор – это программа, которая допускает на входе исходную программу и порождает на своем выходе программу, функционально-эквивалентную исходной, называемую объектной. Объектная программа записывается на объектном языке.
В частном случае, объектным языком может служить машинный язык, и в этом случае, полученную на выходе транслятора программу можно сразу же выполнить на ЭВМ (проинтерпретировать). При этом ЭВМ является интерпретатором объектной программы в машинных кодах. В общем случае объектный язык не обязательно должен быть машинным или близким к нему (автокодом). В качестве объектного языка может служить некоторый промежуточный язык – язык, лежащий между входным и машинным языками.
Если в качестве объектного языка используется промежуточный язык, то возможны два варианта построения транслятора.
• Первый вариант – для промежуточного языка имеется (или разрабатывается) другой транслятор с промежуточного языка на машинный, и он используется в качестве последнего блока проектируемого транслятора.
• Второй вариант построения транслятора с использованием промежуточного языка – построить интерпретатор команд промежуточного языка и использовать его в качестве последнего блока транслятора. Преимущество интерпретаторов проявляется в отладочных и диалоговых трансляторах, обеспечивающих работу пользователя в диалоговом режиме, вплоть до внесений изменений в программу без ее повторной полной перетрансляции.
Интерпретаторы используются также и при эмуляции программ – исполнении на технологической машине программ, составленных для другой (объектной) машины. Данный вариант, в частности, используется при отладке на универсальной ЭВМ программ, которые будут выполняться на специализированной ЭВМ.
Надо ли знать программисту: историю ЭВМ, машинный код, уметь работать с низкоуровневыми языками?
Транслятор, использующий в качестве входного языка язык, близкий к машинному (автокод или ассемблер), традиционно называют ассемблером. Транслятор для языка высокого уровня называют компилятором.
В построении компилятора за последние годы достигнуты значительные успехи. Первые компиляторы использовали так называемые прямые методы трансляции – это преимущественно эвристические методы, в которых на основе общей идеи для каждой конструкции языка разрабатывался свой алгоритм перевода в машинный эквивалент. Эти методы были медленные и не носили структурного характера.
В основе методики проектирования современных компиляторов лежит композиционный синтаксически-управляемый метод обработки языков. Композиционный в том смысле, что процесс перевода исходной программы в объектную реализуется композицией функционально независимых отображений с явно выделенными входными и выходными структурами данных. Отображения эти строятся из рассмотрения исходной программы, как композиции основных аспектов (уровней) описания входного языка: лексики, синтаксиса, семантики и прагматики, и выявления этих аспектов из исходной программы в ходе ее компиляции. Рассмотрим эти аспекты с целью получения упрощенной модели компилятора.
Основой любого естественного или искусственного языка является алфавит – набор допустимых в языке элементарных знаков (букв, цифр и служебных знаков). Знаки могут объединяться в слова – элементарные конструкции языка, рассматриваемые в тексте (программе) как неделимые символы, имеющие определенный смысл.
Словом может быть и одиночный символ. Например, в языке Паскаль словами являются идентификаторы, ключевые слова, константы, и разделители, в частности знаки арифметических и логических операций, скобки, запятые и другие символы. Словарный состав языка вместе с описанием способов их представления составляют лексику языка.
Слова в языке объединяются в более сложные конструкции – предложения. В языках программирования простейшим предложением является оператор. Предложения строятся из слов и более простых предложений по правилам синтаксиса. Синтаксис языка представляет собой описание правильных предложений.
Описание смысла предложений, т.е. значений слов и их внутренних связей, составляет семантику языка. В дополнение отметим, что конкретная программа несет в себе некоторое воздействие на транслятор – прагматизм. В совокупности синтаксис, семантика и прагматизм языка образуют семиотику языка.
Перевод программы с одного языка на другой, в общем случае состоит в изменении алфавита, лексики и синтаксиса языка программы с сохранением ее семантики. Процесс трансляции исходной программы в объектную обычно разбивается на несколько независимых подпроцессов (фаз трансляции), которые реализуются соответствующими блоками транслятора. Удобно считать основными фазами трансляции лексический анализ, синтаксический анализ, семантический анализ и
синтез объектной программы. Тем не менее, во многих реальных компиляторах эти фазы разбиваются на несколько подфаз, могут также быть и другие фазы (например, оптимизация объектного кода). На рис. 1.1 показана упрощенная функциональная модель транслятора.
В соответствии с этой моделью входная программа, прежде всего, подвергается лексической обработке. Цель лексического анализа – перевод исходной программы на внутренний язык компилятора, в котором ключевые слова, идентификаторы, метки и константы приведены к одному формату и заменены условными кодами: числовыми или символьными, которые называются дескрипторами. Каждый дескриптор состоит из двух частей: класса (типа) лексемы и указателя на адрес в памяти, где хранится информация о конкретной лексеме. Обычно эта информация организуется в виде таблиц. Одновременно с переводом исходной программы на внутренний язык на этапе лексического анализа проводится лексический контроль — выявление в программе недопустимых слов.
Синтаксический анализатор воспринимает выход лексического анализатора и переводит последовательность образов лексем в форму промежуточной программы. Промежуточная программа является, по существу, представлением синтаксического дерева программы. Последнее отражает структуру исходной программы, т.е. порядок и связи между ее операторами. В ходе построения синтаксического дерева выполняется синтаксический контроль – выявление синтаксических ошибок в программе.
Фактическим выходом синтаксического анализа может быть последовательность команд, необходимых для того, чтобы строить промежуточную программу, обращаться к таблицам справочника, выдавать, когда это требуется, диагностическое сообщение.
Рис. 1.1. Упрощенная функциональная модель транслятора
Синтез объектной программы начинается, как правило, с распределения и выделения памяти для основных программных объектов. Затем производится исследование каждого предложения исходной программы и генерируется семантически эквивалентные предложения объектного языка. В качестве входной информации здесь используется синтаксическое дерево программы и выходные таблицы лексического анализатора – таблица идентификаторов, таблица констант и другие. Анализ дерева позволяет выявить последовательность генерируемых команд объектной программы, а по таблице идентификаторов определяются типы команд, которые допустимы для значений операндов в генерируемых командах (например, какие требуется породить команды: с фиксированной или плавающей точкой и т.д.).
Непосредственно генерации объектной программы часто предшествует семантический анализ, который включает различные виды семантической обработки. Один из видов – проверка семантических соглашений в программе. Примеры таких соглашений: единственность описания каждого идентификатора в программе, определение переменной производится до ее использования и т.д. Семантический анализ может выполняться на более поздних фазах трансляции, например, на фазе оптимизации программы, которая тоже может включаться в транслятор. Цель оптимизации – сокращение временных ресурсов или ресурсов оперативной памяти, требуемых для выполнения объектной программы.
Таковы основные аспекты процесса трансляции с языков высокого уровня. Подробнее организация различных фаз трансляции и связанные с ними практические способы их математического описания рассматриваются ниже.
Источник: libraryno.ru
Языки и средства программирования различных уровней (язык машинных кодов, ассемблер, интерпретатор, компилятор, оптимизирующий компилятор), их особенности, примеры использования.
Любую программу, которая переводит произвольный текст на некотором входном языке в текст на другом языке, называют транслятором. В частности, исходным текстом может быть входная программа. Транслятор переводит её в выходную или объектную программу. По уровню входного языка трансляторы принято делить на ассемблеры, макроассемблеры, компиляторы, генераторы.
Входным языком ассемблера является мнемокод, макроассемблера — макроязык, компилятора — процедурно-ориентированный язык, а генератора — проблемно – ориентированный язык. В связи с этим входной язык называют по типу транслятора: язык ассемблера, язык макроассемблера и т.д.
Программа, полученная после обработки транслятором, либо непосредственно исполняется на ЭВМ, либо подвергается обработке другим транслятором. Компиляторы и интерпретаторы Языки программирования высокого уровня отличаются от ассемблеров и используют более строгий контроль типов.
Термин “высокоуровневый” означает следующее: многие детали обрабатываются автоматически, а программисту для создания своего приложения приходится писать меньшее количество строк. В частности: Распределением регистров занимается компилятор, так что программисту не надо писать код, обеспечивающий перемещение данных между регистрами и памятью; Последовательности вызова процедур генерируются автоматически; программисту нет необходимости описывать помещение аргументов функции в стек и их извлечение оттуда; Для описания структур управления программист может использовать также ключевые слова, как if, while, for; последовательности машинных команд, соответствующие этим описаниям компилятор генерирует динамически.
Типизация. Современные компьютеры устроены таким образом, что им не известно понятие типа. Каждое слово памяти может содержать значение любого типа; целое число, число с плавающей запятой, указатель или машинную команду. Интерпретация значения определяется способом его использования.
Если указатель следующей машинной команды указывает в процессе исполнения команды на некоторое слово в памяти, то оно и рассматривается как команда; если адрес слова задан в параметрах команды целочисленного сложения, то его значение и обрабатывается как целое число; и т. д. Одно и то же слово памяти может использоваться в различных случаях разными способами. В противоположность этому для современных языков программирования характерна строгая типизация.
Для языков описания сценариев (интерпретаторы) характерно отсутствие типизации, которая только усложнила бы задачу соединения компонентов. Все элементы в них выглядят и функционируют одинаково и являются полностью взаимозаменяемыми. Например, в Tcl или Visual Basic переменная может содержать в одной точке программы строку, а в другой – целое число.
Код и данные также часто бывают взаимозаменяемы. Например, Tcl, Visual Basic переменная может содержать в одной точке программы строку, а в другой — целое число. Обычно процессы трансляции и исполнения программы разделены во времени. Сначала вся программа транслируется, а потом исполняется. Трансляторы, работающие в таком режиме, называют трансляторами компилирующего типа.
Если входным языком такого транслятора является процедурно-ориентированный язык высокого уровня, то транслятор называют компилятором. Компилятор – транслятор с языков высокого уровня на машинный язык (объектный код). Увеличивается скорость программирования, переносимость и совместимость программ, удобство отладки.
Существуют трансляторы, в которых трансляция и исполнение совмещены во времени, их называют интерпретаторами. В состав интерпретатора входит блок анализа, распознающий операторы входного языка, набор подпрограмм, соответствующих различным операторам, и блок, управляющий всей работой интерпретатора.
Интерпретаторы часто применяются в качестве отладочных и диалоговых трансляторов, обеспечивающих работу пользователя с машиной в диалоговом режиме с дистанционного терминала. Недостаток интерпретатора заключается в неэффективном использовании машинного времени. Например, при выполнении циклических программ, один и тот же оператор приходится интерпретировать многократно.
Преимущество интерпретаторной реализации состоит в том, что она допускает «непосредственный режим» (перевод непосредственно во время исполнения программы (BASIC, FOXPRO)). Непосредственный режим позволяет задавать компьютеру задачу вроде PRINT 3.14159*3/2.1 и возвращает быстрый ответ. Но неэффективен при использовании циклов.
Интерпретаторы широко используются для автоматизации решения типовых задач, например, при администрировании ЭВМ. Пример – интерпретатор команд shell в ОС UNIX. Программу, написанную на языке интерпретатора, часто называют сценарием или скриптом. Командами в таком языке являются запускаемые друг за другом и взаимодействующие между собой программы.
Программа command.com в MS-DOS также является интерпретатором, который исполняет пакетные файлы *.bat. Оптимизирующий компилятор Оптимизирующий компилятор почти всю работу по адаптации кода к архитектуре сделает за вас. Достаточно указать ключ командной строки и проанализировать листинг оптимизации.
Степень использования аппаратных возможностей машины без дополнительных усилий велика, но сильно зависит от характера задачи и стиля программирования. Например, при параллельной архитектуре VLIW (ОДКС) процессора, оптимизирующий компилятор создает программу «очень длинных командных слов» из последовательного алгоритма: параллельное выполнение команд, повышение производительности. Правила оптимизации формализованы.
- Финансовая энциклопедия
- Как обрести веру в себя и свои силы?
- Как успешно выступить на защите диплома?
Источник: novostynauki.com
О языках программирования и трансляторах
Для программирования на современных ЭВМ применяются системы программирования (СП). Они предназначены для создания программ управления компьютером.
«Родным» языком ЭВМ является язык машинных команд. В программах на таких языках данные обозначаются их адресами в памяти машины, а выполняемые операции — числовыми кодами.
Системы программирования позволяют исполнять на ЭВМ программы, написанные на языках более высокого уровня, чем язык машинных команд. Что понимается под уровнем языка? Уровень связан со степенью его удаленности от языка процессора ЭВМ и приближенности к естественному человеческому языку. Чем выше уровень, тем дальше от ЭВМ и ближе к человеку.
Язык машинных команд — это язык самого низкого уровня. Первые языки программирования, отличные от ЯМК, появились на машинах первого поколения и назывались они Автокодами. Автокоды стали называть Ассемблерами. В наше время на Ассемблере программируют довольно редко. Это, как правило, делают системные программисты.
Сегодня большинство программистов работают на языках программирования высокого уровня Паскаль, Бейсик, СИ, Фортран.
Вот пример записи одной и той же команды сложения двух чисел на трех языках разного уровня: ЯМК, Автокоде и Паскаль:
С:=А+В Паскаль
ADD A, B, c Автокод
01 24 28 2C ЯМК
Видно, как с повышением уровня языка повышается «понятность» команды (по-английски слово ADD означает «сложить»).
Как сделать так, чтобы человек мог писать программы на Автокоде или Паскале, а компьютер мог исполнить эти программы? Ответ на поставленный вопрос такой же, как ответ на вопрос: «Как мне общаться с японцем, если я не знаю японского языка?. Нужен переводчик! По-английски переводчик — translator.
Таким образом, компьютер сам производит перевод под управлением программы — транслятора. Процесс перевода программы на язык машинных команд называется трансляцией.
Транслятор является обязательным элементом любой системы программирования. Первые СП включали в себя только транслятор. Затем к транслятору стали добавляться различные сервисные средства: текстовые редакторы, отладчики, системы обслуживания программных библиотек, средства организации дружественного интерфейса с пользователем.
Наиболее удобными для пользователя стали системы программирования, созданные на персональных компьютерах.
Язык программирования, с которым работает СП, называется ее входным языком. Системы программирования именуются по названию своего входного языка. Например: «Система Бейсик», «Система Паскаль», «Система Фортран». Иногда в название систем включаются префиксы, обозначающие, например, ее фирменное происхождение.
Очень популярны системы с приставкой «Турбо»: Турбо-Паскаль, Турбо-Си, и др. Это системы программирования, разработанные фирмой Borland.
О двух способах трансляции.
Существует два принципиально различных метода трансляции. Они называются «компиляция» и «интерпретация».
полный предварительный перевод: лектор заранее передает текст выступления переводчику, тот записывает перевод, размножает его и раздает слушателям (после этого лектор может уже и не выступать).
Компиляция является аналогом полного предварительного перевода; интерпретация — аналог синхронного перевода. Транслятор, работающий по принципу компиляции, называется компилятором. Транслятор, работающий методом интерпретации, называется интерпретатором
Компилятор производит синтаксический контроль программы и при обнаружении ошибок выводит диагностические сообщения. Если ошибок нет, то результатом компиляции является программа на языке машинных команд — ехе.файл.
Интерпретатор «читает» ее первый оператор, переводит его в машинные коды и тут же организует выполнение этих команд. Затем переходит к переводу и выполнению следующего оператора и так до конца программы. При этом результаты предыдущих переводов в памяти не сохраняются.
Один раз откомпилированная программа может быть сохранена в памяти, и затем многократно выполняться.
Программа на интерпретируемом языке при каждом выполнении подвергается повторной трансляции.
Источник: for-teacher.ru