Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Вопрос 43. Трансляция программ и сопутствующие процессы. Компиляторы и интерпретаторы




Ответ; С появления первых компьютеров программисты серьезно задумывались над проблемой кодирования компьютерных программ. Уже с конца 40-х годов стали появляться первые примитивные языки программирования высокого уровня. В них программист записывал решаемую задачу в виде математических формул, а затем, используя специальную таблицу, переводил символ за символом, преобразовывал эти формулы в двухлитерные коды. В дальнейшем специальная программа (впоследствии названная интерпретатором) превращала эти коды в двоичный машинный код. Первый компилятор был разработан Г. Хоппер в начале 50-х годов; он осуществлял функцию объединения команд и в ходе трансляции производил организацию подпрограмм, выделение памяти компьютера.

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

 

Важнейшим элементом в развитии систем программирования выступили подпрограммы. Появление аппарата подпрограмм существенно облегчило процесс разработки системных и прикладных программ. Подпрограммы позволили формировать библиотеки из наиболее часто употребляемых в программах алгоритмов -процедур и функций. В системах программирования обязательно присутствуют стандартные (встроенные в систему) библиотеки подпрограмм. Например, в их число входят подпрограммы вычисления математических функций sin(x), cos(x), abs(x) и др.

 

В настоящее время распространены пользовательские и прикладные библиотеки подпрограмм. Их число увеличивается. Меняется структура библиотечных подпрограмм. В современных языках получили распространение модули (Unit), представляющие специализированные пакеты взаимосвязанных подпрограмм определенного предназначения, например по работе с клавиатурой, с графикой и пр. Развитие объектно-ориентированного программирования позволило создавать библиотеки объектов и подпрограмм с объектными типами данных (Object). Примером могут служить оболочки типа TurboVision.

 

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

 

Рассмотрим один из вариантов трансляции программы с языка программирования Паскаль. Исходный текст программы решения квадратного уравнения представлен ниже:

program KvadUravn;

var А, В, С, D, XI, Х2: REAL;

begin

writeln;

writeln('введи A,B,C); read(A,B,C);

D:=B*B-4*A*C;

if D<0 then write('KopHeu нет')

else begin

Xl:=(-B+sqrt(D))/(2*A); X2:=(-B-sqrt(D))/(2*A); write('Xl=', XI,' X2=', X2); end

end.

Предположив, что этот текст (по отношению к процессу трансляции выступающий как исходный модуль) сформирован одним из текстовых редакторов, попытаемся отправить его на выполнение. Прежде всего его необходимо перевести в машинный двоичный код (называемый абсолютным или загрузочным модулем). Для этого на первых этапах осуществляется трансляция (в данном случае, как это реализовано в системах программирования Паскаля, компиляция) исходного текста в машинный код (объектный модуль). Однако, объектный модуль не может быть использован для выполнения программы, поскольку в нем нет программ по выполнению процедур ввода (read) и вывода (write, writeln), а также вычисления функции извлечения квадратного корня (sqrt). В исходном тексте программы ссылки на указанные библиотечные подпрограммы отмечены знаком {*}.

 

Следующий шаг трансляции - компоновка - заключается в подключении к исходному объектному модулю объектных модулей соответствующих подпрограмм в места ссылок на них (исходные тексты этих подпрограмм в системе вовсе отсутствуют). Другими словами, на место процедуры Write помещается подпрограмма, осуществляющая процедуру вывода данных на экран дисплея. Таким образом после компоновки (или, иначе, редактирования связей link editor) возникает абсолютный модуль, намного превышающий по объему размер исходного текста программы, Он и является исполняемым компьютером после его запуска. Расширениями его файлового имени, как правило, являются, com или. ехе.

 

В силу того, что объектные модули не предназначены для непосредственного исполнения, в них обычно нет привязки составляющих их машинных команд к конкретному месту в ОЗУ. Адреса машинных слов бывают условными, что помогает компоновщику размещать объектные модули в свободных местах ОЗУ (заменяя условные адреса команд на конкретные).

 

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

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

 

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

 

Заметим, что описанный процесс трансляции характерен для компиляции. Последовательно реализованный интерпретатор объектного модуля фактически не создает. В этом его и недостаток, и достоинство (экономия машинной памяти). Впрочем, у современных ЭВМ, в том числе и персональных, проблема малого ОЗУ отходит на второй план, и интерпретация встречается все реже, так как эффективность этого процесса в целом значительно ниже.

 

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

 

На первом этапе транслятор производит синтаксический анализ исходной программы - проверяет, не нарушены ли формальные правила, содержащиеся в данном языке программирования. Например, в Паскале текст может встретиться либо внутри текстовой константы (т.е. в апострофах), либо внутри Комментария. Если такой текст встретился в другом месте, то это явная ошибка. В системе программирования встроены описания всех синтаксически разрешенных конструкций, и транслятор их применяет к исходной программе. Для задания синтаксиса применяются формы Бэкуса-Наура и синтаксические диаграммы, о которых будет рассказано в следующей главе.

 

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

 

Даже если в синтаксическом смысле исходная программа верна, это не означает, что она имеет смысл в рамках данного языка программирования. На следующем этапе семантического анализа транслятор ищет ошибки такого рода: числа употребления слов BEGIN и END не совпадают; переменные не описаны (в языке, требующем обязательного явного описания переменных), т.е. текст программы непонятен (семантика - смысловая сторона языка).

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

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

 

Компиляторы и интерпретаторы:

 

Компилятор —

* Программа или техническое средство, выполняющее компиляцию^IJ[2l

* Машинная программа, используемая для компиляции(2'^1

* Программа, переводящая текст программы на языке высокого уровня в эквивалентную программу на машинном языке'4'.

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

на машинно-ориентированном языке(объектный код).

* Программа выполняющая (после трансляции) компоновку программы. Виды:

* Векторизующий. Компилирует исходный код в машинный код для компьютеров, оснащённых векторным процессором.

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

* Диалоговый. См.: диалоговым транслятор.

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

перекомпиляции всей программы.

* Интерпретирующий (пошаговый). Последовательно выполняет независимую компиляцию каждого отдельного оператора(команды) исходной программы.

* Компилятор компиляторов. Компилятор, воспринимающий формальное описание языка программирования и генерирующий компилятор для этого языка.

* Отладочный. Устраняет отдельные виды синтаксических ошибок.

* Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.

* Самокомпилируемый. Написан на том же языке, с которого осуществляется компиляция.

* Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Важными составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Интерпретатор (языка программирования) —

* Программа или техническое средство, выполняющее интерпретацию.

* Вид транслятора, осуществляющего пооператорную (покомандную) обработку и выполнение исходной программы или запроса (в отличие от компилятора, транслирующего всю программу без её выполнения).

* Программа (иногда аппаратное средство), анализирующая команды или операторы программы и тут же выполняющая их.

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

 

Виды:

 

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

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

минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как Java. Tel, РегКиспользуется байт-код), REXX (сохраняется результат парсинга исходного кода), а также в различных СУБД

ВОПРОС 44. Средства создания программ. Основные этапы компьютерною решения задач. Ответы: Программирование — в обычном понимании, это процесс создания компьютерных программ

 

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

 

текстовый редактор — для набора исходного текста программы;

компилятор — для перевода текста программы в машинный код;

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

 

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

 

Исходный текст программы можно получить без записи его вручную в текстовом редакторе. Существуют системы визуального программирования — RAD-среды (Rapid Application Development), которые, не исключая возможности записи программы вручную, позволяют создавать текст программы автоматически, путем манипуляций со стандартными элементами управления, включенными в RAD-среду. Поэтому для RAD-среды понятие «программирование» часто заменяют понятием «проектирование».

 

По способу разработки программ можно выделить два подхода:

 

• процедурное программирование— это программирование, при котором выполнение команд программы определяется их последовательностью, командами перехода, цикла или обращениями к процедурам;

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

 

Объектно-ориентированное программирование (ООП) не исключает, а охватывает технологию процедурного программирования.

 

Основные этапы решения задач на компьютере

 

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

Рассмотрим эти этапы на таком простейшем примере: пусть требуется вычислить сумму двух целых чисел и вывести на экран видеомонитора результат.

Первый этап - постановка задачи. На этом этапе требуется хорошо изучить предметную область задачи. Нужно четко определить цель задачи, дать словесное описание содержания задачи и продумать общий подход к её решению. Для нашей задачи можно предложить такое описание: ввести два целых числа, сложить их и вывести сумму в качестве результата решения задачи.

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

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

лучший из них. Для нашей задачи данный этап будет выглядеть так: введённые в компьютер числа запомним в памяти под именами А и В, затем вычислим сумму этих чисел по формуле А+В, и результат запомним в памяти под именем Summa.

 

Третий этап - алгоритмизация задачи. На основе математического описания необходимо разработать алгоритм решения.

 

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

 

Алгоритм должен обладать рядом свойств.

 

Свойства алгоритма:

* Однозначность алгоритма, под которой понимается единственность толкования исполнителем правил и порядка выполнения действий. Для этого алгоритм должен быть записан командами из системы команд исполнителя. Для нашего примера исполнитель должен понимать такую запись действий, как А + В.

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

* Результативность алгоритма, предполагающая, что его выполнение завершится получением определённых результатов. В нашем примере всегда для целых чисел А и В может быть вычислена сумма.

* Массовость, т.е. возможность применения алгоритма к целому классу задач, отвечающих общей постановке задачи. Для того, чтобы алгоритм обладал свойством массовости, следует составлять его с использованием обозначения величин и избегая конкретных значений. Наш алгоритм позволяет правильно посчитать сумму не только для чисел 2 и 3, но и для любой пары целых чисел.

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

 

Существует несколько типов алгоритмов:

 

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

 

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

 

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

 

Четвёртый этап - программирование. Программой называют план действий, подлежащих выполнению исполнителем, в качестве которого может выступать компьютер. От алгоритма программа отличается тем, что записывается на языке понятном для исполнителя. Если исполнителем является компьютер, то программа записывается на одном из языков программирования. В компьютере данные и команды представляются в виде последовательности нулей и единиц. Поэтому, когда говорят о "понятности" языка программирования для компьютера подразумевают наличие специальной программы, способной перевести инструкции языка программирования в последовательность двоичных компьютерных команд. Язык программирования выполняет функции посредника между человеком и ЭВМ и поэтому с одной стороны должен быть удобен для записи алгоритмов в понятной для человека форме, а с другой стороны легко преобразовываться в машинные коды.

 

Программа и исходные данные вводятся в ЭВМ с клавиатуры с помощью редактора текстов или загружаются в редактор с внешнего носителя, результаты работы программы выводятся на экран дисплея или записываются на носитель информации.

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

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

 

Шестой этап - тестирование и отладка программы. На этом этапе происходит исполнение программы на ЭВМ, поиск и исправление логических ошибок, то есть ошибок приводящих к неправильной работе программы. При этом программисту приходится выполнять анализ работы программы. Для сложных программ этот этап, как правило, требует гораздо больше времени и сил, чем написание первоначального текста программы.

 

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

 

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

 

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

 




Поделиться с друзьями:


Дата добавления: 2015-04-24; Просмотров: 1546; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.08 сек.