— Лексический анализатор выполняет распознавание лексем языка и замену их соответствующими кодами. Под лексемами понимаются элементарные единицы, входящие в структуру предложения языка, такие как ключевые слова, константы, имена и т.п. Правильность задания структуры предложения языка на фазе лексического анализа не выполняется.
— Синтаксический анализатор выполняет проверку правильности задания предложений языка в соответствии с грамматикой языка. Только при отсутствии ошибок возможна работа последующих модулей компилятора.
— На фазе трансляции в промежуточную форму выполняется преобразование программы в матрицу промежуточного кода, где каждая строка матрицы содержит в общем случае тройку — код операции и два операнда. Промежуточные коды не имеют прямых аналогов в системе машинных команд, поэтому данную форму представления программы называют машинно-независимой.
— Фаза оптимизации предназначена для уменьшения избыточности программы по затратам времени и памяти. В зависимости от критериев проектирования транслятора данная фаза обработки программы может исключаться из цикла обработки программы.
Предварительная обработка текста | Обработка естественного языка
— На фазе распределения памяти определяются объемы каждого из видов памяти, используемых в данной программе, и вносятся коды резервирования памяти в матрицу промежуточного кода. Каждая программа использует по крайней мере два вида памяти: статическую — для разщения данных и кодов программы, и стековую — для обращения к подпрограммам.
— На фазе генерации кода выполняется подстановка кодовых образцов на выходном языке, соответствующих промежуточным кодам программы. Кроме того, на этой фазе обработки программы выполняется также машинно-зависимая оптимизация программы, которая заключается в учете особенностей архитектуры данного компьютера. Например, использование общих регистров процессора для хранения результатов промежуточных вычислений позволяет почти в два раза уменьшить время выполнения программы.
Как правило, выходным языком транслятора является машинный язык целевой вычислительной системы. (Целевая ВС — та ВС, на которой программа будет выполняться.)
Язык Ассемблера — система записи программы с детализацией до отдельной машинной команды, позволяющая использовать мнемоническое обозначение команд и символическое задание адресов.
Он позволяет программисту пользоваться текстовыми мнемоническими (то есть легко запоминаемыми человеком) кодами, по своему усмотрению присваивать символические имена регистрам компьютера и памяти, а также задавать удобные для себя способы адресации. Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант, использовать в программе комментарии и др.
Язык ассемблера, обеспечивая возможность символических имен в программе и избавляя программиста от утомительной работы по распределению памяти ЭВМ для переменных и констант, существенно облегчает труд программиста и повышает его производительность по сравнению с программированием на машинном языке. Язык ассемблера позволяет также гибко и полно реализовать технические возможности ЭВМ, как и машинный язык. Транслятор программ с этого языка, т. е. ассемблер, гораздо проще и компактней транслятора программ, требующегося для алгоритмического языка высокого уровня, а результирующая машинная программа на выходе ассемблера может быть столь же эффективной, как и программа, которую сразу написали на машинном языке. Поэтому неудивительно, что первым транслятором, который создается для новой ЭВМ, является обычно ассемблер. Это особенно справедливо для микро-ЭВМ, в которых ограниченный объем основной памяти может значительно усложнить задачу создания транслятора с языка высокого уровня и заставить разработчиков программного обеспечения в течение долгого времени довольствоваться языком ассемблера.
NLP обработка текста, решение задачи классификации твитов — «Школа Больших Данных» Москва
Таким образом, язык ассемблера и сам ассемблер обычно составляют основу для создания программного обеспечения микро-ЭВМ и, в частности, операционных систем и систем реального времени, к которым предъявляются высокие требования с точек зрения объема занимаемой машинной памяти и скорости выполнения программ.
Язык Ассемблера «в чистом виде» применяется только для написания отдельных небольших частей системного ПО: микроядра ОС, самых нижних уровней драйверов — тех частей, которые непосредственно взаимодействуют с реальными аппаратными компонентами.
Языки высокого уровня были разработаны для того, чтобы избежать специальной технической особенности конкретных компьютеров. Язык ассемблера, в свою очередь, разработан для конкретной специфики компьютера или точнее для специфики процессора.
Программа, написанная на языке ассемблера, состоит из последовательности предложений, или операторов, и называется исходной программой или исходным модулем.
Вопрос №14. Прерывания. Классификация. Виды прерывания, обработка программных прерываний.
Современные ЭВМ невозможно представить без прерываний. Без механизма прерываний невозможно представить многопользовательский, многозадачный режим работы вычислительной машины. Прерывания представляют собой механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы, реагировать на особые состояния, которые могут возникнуть при её работе.
Прерывание – это принудительная передача управления от выполняемой программы к операционной системе, которая происходит при возникновении определенного события.
Типы (классы) прерываний
Прерывания можно разделить на два основных класса: внешние (называют асинхронными) и внутренние (синхронные).
Внешние (асинхронные) могут поступить:
- от таймера;
- от внешних устройств (прерывания ввода/вывода);
- от блока контроля питания;
- с пульта оператора вычислительной системы;
- от другого процессора или другой вычислительной машины.
Синхронные (внутренние) прерывания можно разделить на две части – программные и остальные:
· при нарушении адресации (выход за пределы программы за пределы массива);
· при возникновении в поле кода операции, которого нет на данной вычислительной системе;
· при делении на нуль;
· при переполнении, исчезновении порядка;
· при обнаружении ошибок четности;
· другие … (например, прерывания супервизора);
· масса программных прерываний.
Механизм прерывания реализуется аппаратно-программными средствами и, в зависимости от аппаратной архитектуры, может быть различным, но все они имеют одну особенность – происходит изменение порядка выполнения команд процессором. Сигналы, вызывающие прерывания, формируются вне процессора или в самом процессоре. Они могут возникнуть одновременно.
В этом случае их обработка может происходить только последовательно в каком-то установленном порядке. Чтобы установить разумный порядок прерываниям присваиваются приоритеты. Сигнал с более высоким приоритетом обрабатывается в первую очередь, обработка остальных сигналов прерывания откладывается.
Например, если аппаратура работает неправильно, то есть ли смысл обрабатывать программные прерывания. Наверное, в этом случае лучше всего закончить обработку на компьютере и исправить его. Если пришел сигнал на некритичное прерывание, то его обработка начнется только после выполнения команды, которая обрабатывается процессором (т.к. некоторые команды выполняются несколько машинных тактов).
Наличие сигнала прерывания не всегда прерывает выполнение программы, так как процессор может обладать механизмом защиты от прерываний (происходит маскирование, или запрет, отдельных сигналов прерывания).
Для управления системой прерываний существуют специальные команды, которые позволяют управлять работой системы прерываний. Маскирование некоторых прерываний может осуществить пользователь, но в этом случае за верную работу процессора он и несет ответственность. Маскирование сигналов прерываний осуществляется при помощи регистров маски, а программное управление позволяет реализовать различные дисциплины обслуживания:
- с относительными приоритетами. При этой дисциплине обслуживания, если обрабатывается прерывание, то его обработка продолжится до окончания и только после этого произойдет переход на обработку прерывания (конечно, если оно есть) с наивысшим приоритетом;
- с абсолютным приоритетом. В этом случае, если во время обработки прерывания поступает прерывание с более высоким приоритетом, то происходит прерывание самой программы обработки прерывания с меньшим приоритетом;
- по принципу стека (дисциплина LCFS – last come first served) – последним пришел – первым обслужен). При этой дисциплине обслуживания запросы на прерывания с более низким приоритетом могут прерывать обработку прерывания с более высоким приоритетом.
Уровень приоритета прерываний
Источник: studopedia.su
Этапы обработки программы на компьютере
Исходные модули (ИМ) – тексты программы на алгоритмическом языке.
Объектные модули (ОМ) – оттранслированные тексты программы на машинном языке в относительных адресах.
Загрузочный модуль (ЗМ) – единая готовая к выполнению программа, по-прежнему, в относительных адресах.
Рассмотрим более подробно каждый этап.
Трансляция
В целях снижения уровня сложности разработки большинство программ разбивается на отдельные части, выполняющие одну или более функций. Эти части называют модулями. Каждый модуль может транслироваться отдельно, независимо от других модулей программы. Это позволяет выполнять процесс разработки поэтапно.
Модуль до трансляции называют исходным, после трансляции – объектным. Каждый модуль может состоять из одной или более процедур. В любой программе существует процедура, в которой начинается выполнение и в которой в большинстве случаев работа программы заканчивается. Такую процедуру называют главной ( main ).
Замечание. В современных визуальных средах разработки в качестве главной может применяться специальный объект – форма.
Каждая процедура может передавать данные в другую процедуру и получать обратно результаты ее работы. Совокупность процедур и связей между ними составляют структуру программы. Вариант возможной структуры программы показан на рисунке.
На этапе трансляции выполняется синтаксический анализ текстов исходных модулей, т.е. проверка их соответствия правилам языка. Обычно перехода к следующему этапу обработки программы не происходит, пока не будут исправлены все синтаксические ошибки. Следует заметить, что при этом анализе редко выявляются все нарушения правил языка.
Для обозначения объектов программы на алгоритмическом языке используется понятие имя.
Пример. Возможные имена.
x matrix Height Copy1 Sum
Во время трансляции происходит распределение памяти, т.е. процесс выделения каждому именованному объекту программы области памяти необходимого размера. Выделенная область памяти характеризуется начальным адресом расположения объекта. Поэтому распределение памяти – это процесс установления взаимно однозначного соответствия между именем в исходном модуле и адресом в объектном модуле. Схематически это можно изобразить так.
Поскольку после трансляции программа представляет собой совокупность нескольких объектных модулей, то в качестве адреса объекта выступает смещение относительно начала модуля, в котором встречается его имя. Такие адреса называют относительными.
Наиболее распространенными языками программирования являются: FORTRAN ( Formula Translator – переводчик формул), PL/1 ( Programming Language/1 – язык программирования 1), C и C++, Pascal, BASIC ( Beginner’s All-purpose Symbolic Instruction Code – универсальный язык символического кодирования для начинающих).
Редактирование связей (компоновка)
На этом этапе основным является установление связей между всеми объектными модулями оттранслированной программы и объединение их в единый загрузочный модуль. Каждая среда разработки IDE включает несколько библиотек, содержащих процедуры для выполнения типовых операций, хранящихся в виде объектных модулей. Примерами таких процедур являются различные математические функции, функции работы с датами и т.п. Необходимые библиотечные процедуры также подключаются к загрузочному модулю на этапе компоновки.
После завершения этапа адреса объектов представляют собой смещения относительно начала единого загрузочного модуля, т.е. являются, по-прежнему, относительными.
Загрузка
Процесс загрузки программы был описан выше, поэтому отметим лишь основные функции данного этапа:
— определение и выделение необходимой памяти под программу и данные;
— загрузка программы в выделенную область с формированием абсолютных адресов; абсолютные адреса получаются суммированием относительных адресов загрузочного модуля с начальным адресом выделенной области;
— передача управления первой инструкции главной процедуры.
Выполнение
Источник: infopedia.su
1.9. Этапы обработки программы.
Язык Си относится к языкам высокого уровня, т.е. предназначенным для записи программы в форме, удобной для человека и не «привязанной» к конкретному типу машин. Исходный текст программы на Си, введенный с помощью клавиатуры в память компьютера — исходный код (source code, обычно хранится в файлах с расширением *.cpp). Он может быть разбит на смысловые части (функции и т.д.). Если эти части хранятся в разных файлах, то каждый такой файл называется исходным модулем.
Компилятор — программа, осуществляющая перевод программ с языка высокого уровня (приближенного к человеку) на язык более низкого уровня (близкий к ЭВМ), или язык машинных команд. Компиляция программы на языке Си состоит из двух этапов: начальной обработки, выполняемой т.н. препроцессором, и собственно компиляции. Результат обработки исходного модуля компилятором — объектный код (object code, обычно хранится в файлах с расширением *.obj). В большинстве случаев компилятор переводит на машинный язык каждую функцию по отдельности, не связывая их друг с другом и с библиотечными функциями; поэтому объектный код не может еще быть выполнен.
Лишь вторая специальная программа — редактор связей (Linker) — создает исполняемый (абсолютный, загрузочный) код, «связывая» между собой функции и места их использования (вызова), подключая при этом и библиотечные функции. Linker еще называют компоновщиком, т.к. он объединяет программные модули в новый модуль, пригодный для выполнения — загрузочный модуль (Load module, расширение *.exe).
Большинство сред программирования по команде «Запуск программы» («Run») автоматически выполняют все указанные этапы. Однако знать их различие все же стоит, чтобы при возникновении ошибок лучше понимать их причины. По тексту сообщения об ошибке обычно четко видно, на каком этапе она произошла.
1.10. Роль препроцессора.
Перед компиляцией программа на языке Си обрабатывается специальной программой – препроцессором, который работает под управлением директив.
Препроцессорные директивы начинаются с символа #, за которым следует наименование директивы, указывающее текущую операцию препроцессора.
Препроцессор решает ряд задач по предварительной обработке программы, основной из которых является «подключение» к программе так называемых заголовочных файлов (обычных текстов) с декларацией стандартных библиотечных функций, которые используются в программе. Наименование такой директивы: include (подключить), а общий формат ее использования:
где «h» – расширение заголовочных файлов.
Если имя файла заключено в угловые скобки (< >), то поиск данного файла производится в стандартной директории (папке) с этими файлами, если же имя файла заключено в двойные кавычки (” ”), то поиск данного файла производится в текущей директории.
К наиболее часто используемым библиотекам относятся:
stdio.h — содержит стандартные функции файлового ввода-вывода;
conio.h — функции для работы с консолью (клавиатура, экран монитора);
iostream.h — функции потокового ввода-вывода (см. ниже);
math.h — математические функции.
Второе основное назначение препроцессора – это обработка макроопределений. Макроподстановка define (определить) имеет общий вид:
Например: #define PI 3.1415927
В ходе препроцессорной обработки программы появление в тексте идентификатора PI везде заменяется значением 3.1415927.
Другие возможности препроцессора будут рассмотрены позже.
Источник: studfile.net