Транслятор — обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.
Приведенное определение относится ко всем разновидностям транслирующих программ. Однако у каждой из таких программ могут иметься свои особенности по организации процесса трансляции. В настоящее время трансляторы разделяются на три основные группы: ассемблеры, компиляторы и интерпретаторы.
Ассемблер — системная обслуживающая программа, которая преобразует символические конструкции в команды машинного языка. Специфической чертой ассемблеров является то, что они осуществляют дословную трансляцию одной символической команды в одну машинную. Таким образом, язык ассемблера (еще называется автокодом) предназначен для облегчения восприятия системы команд компьютера и ускорения программирования в этой системе команд. Программисту гораздо легче запомнить мнемоническое обозначение машинных команд, чем их двоичный код. Поэтому, основной выигрыш достигается не за счет увеличения мощности отдельных команд, а за счет повышения эффективности их восприятия.
ЯЗЫК АССЕМБЛЕРА С НУЛЯ | #1 НАЧАЛО
Вместе с тем, язык ассемблера, кроме аналогов машинных команд, содержит множество дополнительных директив, облегчающих, в частности, управление ресурсами компьютера, написание повторяющихся фрагментов, построение многомодульных программ. Поэтому выразительность языка намного богаче, чем просто языка символического кодирования, что значительно повышает эффективность программирования.
Компилятор — это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера).
Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд (например, Пролог).
Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам). Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие.
Интерпретатор — программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее.
ЯЗЫК АССЕМБЛЕРА за 3 МИНУТЫ
Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким.
Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.
Эмулятор — программа или программно-техническое средство, обеспечивающее возможность без перепрограммирования выполнять на данной ЭВМ программу, использующую коды или способы выполнения операция, отличные от данной ЭВМ. Эмулятор похож на интерпретатор тем, что непосредственно исполняет программу, написанную на некотором языке. Однако, чаще всего это машинный язык или промежуточный код. И тот и другой представляют команды в двоичном коде, которые могут сразу исполняться после распознавания кода операций. В отличие от текстовых программ, не требуется распознавать структуру программы, выделять операнды.
Эмуляторы используются достаточно часто в самых различных целях. Например, при разработке новых вычислительных систем, сначала создается эмулятор, выполняющий программы, разрабатываемые для еще несуществующих компьютеров. Это позволяет оценить систему команд и наработать базовое программное обеспечение еще до того, как будет создано соответствующее оборудование.
Очень часто эмулятор используется для выполнения старых программ на новых вычислительных машинах. Обычно новые компьютеры обладают более высоким быстродействием и имеют более качественное периферийное оборудование. Это позволяет эмулировать старые программы более эффективно по сравнению с их выполнением на старых компьютерах.
Примером такого подхода является разработка эмуляторов домашнего компьютера ZX Spectrum с микропроцессором Z80. До сих пор находятся любители поиграть на эмуляторе в устаревшие, но все еще не утратившие былой привлекательности, игровые программы. Эмулятор может также использоваться как более дешевый аналог современных компьютерных систем, обеспечивая при этом приемлемую производительность, эквивалентную младшим моделям некоторого семейства архитектур. В качестве примера можно привести эмуляторы IBM PC совместимых компьютеров, реализованные на более мощных компьютерах фирмы Apple. Ряд эмуляторов, написанных для IBM PC, с успехом заменяют различные игровые приставки.
Эмулятор промежуточного представления, как и интерпретатор, могут легко переноситься с одной компьютерной архитектуры на другую, что позволяет создавать мобильное программное обеспечение. Именно это свойство предопределило успех языка программирования Java, с которого программа транслируется в промежуточный код. Исполняющая этот код виртуальная Java машина, является ни чем иным как эмулятором, работающим под управлением любой современной операционной системы.
Перекодировщик — программа или программное устройство, переводящие программы, написанные на машинном языке одной ЭВМ в программы на машинном языке другой ЭВМ. Если эмулятор является менее интеллектуальным аналогом интерпретатора, то перекодировщик выступает в том же качестве по отношению к компилятору. Точно также исходный (и обычно двоичный) машинный код или промежуточное представление преобразуются в другой аналогичный код по одной команде и без какого-либо общего анализа структуры исходной программы. Перекодировщики бывают полезны при переносе программ с одних компьютерных архитектур на другие. Они могут также использоваться для восстановления текста программы на языке высокого уровня по имеющемуся двоичному коду.
Макропроцессор — программа, обеспечивающая замену одной последовательности символов другой [Браун]. Это разновидность компилятора. Он осуществляет генерацию выходного текста путем обработки специальных вставок, располагаемых в исходном тексте. Эти вставки оформляются специальным образом и принадлежат конструкциям языка, называемого макроязыком.
Макропроцессоры часто используются как надстройки над языками программирования, увеличивая функциональные возможности систем программирования. Практически любой ассемблер содержит макропроцессор, что повышает эффективность разработки машинных программ. Такие системы программирования обычно называются макроассемблерами.
Макропроцессоры используются и с языками высокого уровня. Они увеличивают функциональные возможности таких языков как PL/1, C, C++. Особенно широко макропроцессоры применяются в C и C++, позволяя упростить написание программ. Примером широкого использования макропроцессоров является библиотека классов Microsoft Foundation Classes (MFC).
Через макровставки в ней реализованы карты сообщений и другие программные объекты. При этом, макропроцессоры повышают эффективность программирования без изменения синтаксиса и семантики языка.
Синтаксис — совокупность правил некоторого языка, определяющих формирование его элементов. Иначе говоря, это совокупность правил образования семантически значимых последовательностей символов в данном языке. Синтаксис задается с помощью правил, которые описывают понятия некоторого языка. Примерами понятий являются: переменная, выражение, оператор, процедура.
Последовательность понятий и их допустимое использование в правилах определяет синтаксически правильные структуры, образующие программы. Именно иерархия объектов, а не то, как они взаимодействуют между собой, определяются через синтаксис. Например, оператор может встречаться только в процедуре, а выражение в операторе, переменная может состоять из имени и необязательных индексов и т.д. Синтаксис не связан с такими явлениями в программе как «переход на несуществующую метку» или «переменная с данным именем не определена». Этим занимается семантика.
Семантика — правила и условия, определяющие соотношения между элементами языка и их смысловыми значениями, а также интерпретацию содержательного значения синтаксических конструкций языка. Объекты языка программирования не только размещаются в тексте в соответствии с некоторой иерархией, но и дополнительно связаны между собой посредством других понятий, образующих разнообразные ассоциации. Например, переменная, для которой синтаксис определяет допустимое местоположение только в описаниях и некоторых операторах, обладает определенным типом, может использоваться с ограниченным множеством операций, имеет адрес, размер и должна быть описана до того, как будет использоваться в программе.
Синтаксический анализатор — компонента компилятора, осуществляющая проверку исходных операторов на соответствие синтаксическим правилам и семантике данного языка программирования. Несмотря на название, анализатор занимается проверкой и синтаксиса, и семантики. Он состоит из нескольких блоков, каждый из которых решает свои задачи. Более подробно будет рассмотрен при описании структуры транслятора.
Источник: studfile.net
Ассемблер
Ассе́мблер (от assembler — рабочий-сборщик) — компьютерная программа, компилятор исходного текста программы написанной на языке ассемблера, в программу на машинном коде.
Как и сам язык (ассемблера), ассемблеры, как правило, специфичны конкретной архитектуре, операционной системе и варианту синтаксиса языка. Вместе с тем существуют, мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.
Ассемблирование может быть не первым и не последним этапом на пути получения исполняемого модуля программы. Так многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальшейшем обрабатывает ассемблер. Так же, результатом ассемблирования может быть не исполняемый, а объектный модуль, содержащий разрозненные и непривязанные друг к другу кусочки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем может быть скомпонован исполняемый модуль, с помощью программы-компоновщика (или «линкера»).
Архитектура x86
Ассемблеры для DOS
Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM), и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.
Microsoft Windows
При появлении операционной системы Microsoft Windows появилось расширение TASM, именуемое TASM32, позволившее создавать программы для выполнения в среде Windows. Последняя известная версия Tasm — 5.3, поддерживающая инструкциии MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено.
Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».
GNU и GNU/Linux
В состав операционной системы GNU входит компилятор gcc, включающий в себя ассемблер gas (GNU Assembler), использующий AThttps://www.tadviser.ru/index.php/%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F:%D0%90%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80″ target=»_blank»]www.tadviser.ru[/mask_link]
Что такое Ассемблер и для чего нужен
Изучаете как программировать на удобных высокоуровневых языках, но ничего не слышали об Assembler? Вашему вниманию занимательная статья о том, как всё начиналось.
Ассемблер — общее название части языков программирования низкого уровня. Это наиболее близкий для машины язык, который может написать человек. Кому может сегодня быть нужен язык, созданный в середине 20го века, и почему в вакансиях до сих пор упоминают знание Ассемблера?
Даниил Фам
Исполнительный директор
7 октября 2022
Что такое Ассемблер
Давайте для начала разберемся с уровнями языка. В программировании их всего два: низкоуровневые и высокоуровневые.
Высокоуровневые языки просты для человеческого понимания: такие же простые, как английский, русский или разговорный язык любой страны. На таких языках легко писать программы и приложения. Они созданы для решения конкретных проблем и задач. Среди языков программирования к таковым относятся С, С++, Pascal, Python, Basic.
Говоря о низкоуровневых языках, их можно поделить на две основные категории:
К сожалению, компьютер воспринимает только такой язык. Максимально неудобный для нас, так как состоит только из 0 и 1. Условно говоря, «есть ток» и «нет тока». Последовательность цифр становится сигналом для запуска процессов в машине.
Они имеют следующий вид:
Программы, написанные подобным языком, машина выполняет очень быстро. Примерно так, как вы легко понимаете родную речь (значительно легче, чем любой иностранный язык, пусть и хорошо выученный).
В случае машины все инструкции направляются напрямую в центральный процессор, не нуждаясь в предварительной обработке и переводе.
Казалось бы, почему не писать на машинном коде все программы?
На это есть четыре серьезных причины:
- Отсутствие универсальности. Программа подойдет не для всех машин – устройство у всех разное, программа может работать на определенной машине и не подойти для другой
- Сложность. Программист обязан знать аппаратную часть машины, для которой пишет программу
- Риск ошибки. Учитывая однообразность языка, включающего всего два символа, вероятность ошибиться огромна
- По этой же причине практически невозможно редактировать готовый код
Как видите, работать с машинным языком в его исходном виде не представляется возможным. Поэтому программисты придумали более комфортный язык Ассемблера.
- Языки Ассемблера
Фактически это примитивный переводчик с высокоуровневого языка, понятного человеку, на простой двоичный машинный код.
Код на ассемблере пишет все еще человек, но тот максимально близок к принципу работы машины. В целом ассемблер – это не один язык, а группа языков с общим синтаксисом и принципами, но ввиду схожести их решили назвать общим понятием «Ассемблер».
- Легко найти ошибку и исправить ее
- Легко редактировать код
- В целом язык легче понимать и использовать, ведь коды и числа тут заменены специальными короткими словами — мнемониками. Например, перемещение информации обозначается мнемоником MOV, добавление Add
Впрочем, есть и недостатки, в основном пришедшие из машинного кода:
- Сохраняется зависимость от машины. Программы все еще работают только для конкретной марки и модели ПК
- Программист должен знать аппаратное обеспечение машины, для которой пишет код
Ассемблер — это промежуточный язык-переводчик между высокоуровневыми языками программирования, удобными для людей, и двоичным кодом, удобным для машин. Это все еще сложный для понимания и работы язык, лишь на одну ступень проще машинного кода — но благодаря мнемоникам он уже доступен для редактирования. Позволяет без серьезных усилий переносить программу с машины с одной системой команд на другую.
Есть также дизассемблер — программа, переводящая с машинного языка на понятный человеку ассемблер.
О процессорах и языке
Сейчас попробуем объяснить принципы работы ассемблера. Для этого нужно понимать, как именно работает ЦП, и как воспринимает поступающие команды.
Процессор это в первую очередь электронное устройство, воспринимающее только уровень напряжения: высокий либо низкий. Уровни напряжения кодируются условно как 0 и 1, поэтому команды для ЦП выглядят как непрерывная последовательность нулей и единиц.
Это единственный язык, который может понять ЦП, слова и цифры ему недоступны. Всю поступающую информацию нужно переводить в формат 0-1.
На основе двоичного языка создается машинный код. Это перечень инструкций, каждая из которых содержит одно простое действие: числовую арифметику, логическую операцию, ввод-вывод данных и другие.
Например, так выглядит команда сложения двух чисел для ЦП Intel 8088:
Практически невозможно программировать на голом машинном языке: вам придется иметь дело с множеством нулей и единиц. Вы легко можете совершить ошибку.
Поэтому от идеи писать в двоичном коде отказались еще в 50х годах, а в 70х начали активно использовать возможности Ассемблера.
В нем коды операции обозначались сокращениями от английских слов (обычно 2-3 буквы в сокращении).
Пример: чтобы переместить число 7 в ячейку AV, использовалась команда MOV AV, 7.
История создания
Еще в 50х годах 20го века Кэтлин Бут придумала язык Ассемблер. Будучи инженером и ученым, она стала новатором с области информатики, прославив Канаду и Британию, откуда была родом.
Ассемблер применялся тогда на огромных ЭВМ, работавших на электронных лампах. Память у таких компьютеров была ограничена, потому чтобы ввести команду, приходилось переключать рубильники и кнопки. Даже простые вычисления на таких аппаратах занимали много времени и сил.
Ситуация упростилась, когда память компьютеров выросла достаточно, чтобы хранить в ней программы. Тогда и потребовался Ассемблер для перевода написанных человеком программ в машинный код. От этого пошло название программы – Assemble (англ. «собирать»), программа-сборщик.
Изобретение не сразу оценили по достоинству, и Ассемблер начали активно использовать только через 20 лет в появившихся тогда калькуляторах с памятью. И только потом язык стали применять для программирования ПК. Тогда оказалось, что программы, написанные на ассемблере весят существенно меньше их вариантов в машинном коде – что для ограниченных резервов ЭВМ было критически важно.
Как устроен
Чтобы понять, как именно функционирует Ассемблер, давайте разберемся в устройстве компьютерного процессора и том, как он обрабатывает данные.