Назначение и состав инструментальных средств программирования и проектирования программного обеспечения
В основе решения любой задачи на компьютере используется соответствующая программа, представляющая, в общем случае, формализованное описание взаимосвязанной последовательности операций, выполняемых различными устройствами компьютера. В последние годы широкое распространение получил термин “программное средство” (программное приложение или просто приложение). В целом под программным средствомпринято понимать программу или другое формализованное описание, обеспечивающее автоматизацию решения на компьютере задачи пользователя, как автономно, так и с помощью каких-либо программно-инструментальных средств. Множество видов программно-инструментальных средств может быть представлено различными языками программирования с соответствующими трансляторами, языковыми средствами для формирования запросов и выполнения других операций с базами данных, средствами настройки электронных таблиц и др.
Программапредставляет собой упорядоченную последовательность команд (инструкций), необходимых для управления компьютером при решении определенной задачи. В последние годы, как среди пользователей, так и программистов более широко используется термин приложение, означающий программную реализацию решения задачи на компьютере.
Развитие вычислительной техники сопровождалось разработкой системного и прикладного программного обеспечения. Существенную роль при этом выполняют инструментальные средства программирования, представляющие собой программные продукты для реализации (поддержки) технологии программирования и в целом ориентированные на автоматизацию процессов разработки и реализации информационных систем.
Инструментарий технологии программирования включает в себя:
· средства разработки приложений (программ), состоящие из систем программирования и языков программирования;
· CASE-системы (Computer–Aided System Engineering).
С учетом ориентации языков на конкретные классы (клоны, семейства) компьютеров они подразделяются на машинно-зависимые и машинно-независимые языки программирования.
Использование машинно-зависимых языков предполагает знание особенностей реализации технических решений, реализованных в конкретных компьютерах. К этой группе языков в первую очередь относятся машинные языки, являющиеся внутренними языками конкретных процессоров, не требующими каких-либо преобразований перед их исполнением. Команды машинных языков представляют собой многоразрядные кодовые комбинации в двоичной системе счисления (определенной машинной команде соответствует конкретный код из 0 и 1), непосредственно подаваемые на шину процессора при их выполнении. Программирование на машинных языках отличается высокой трудоемкостью, поэтому оно применялось на ЭВМ первого поколения ввиду отсутствия других языков программирования. К машинно-зависимым языкам относятся также языки программирования семейства ассемблеров. Каждая команда языка ассемблера фактически представляет машинную команду в виде условных, символьных обозначений, называемых мнемониками. В основном, название команды ассемблера представляет собой сокращенное обозначение на английском языке операции, реализуемой этой команды. До непосредственного выполнения на компьютере написанная на языке ассемблер программа с помощью специальной программы-транслятора должна быть преобразована в программу в машинных кодах. Поскольку процессоры различных моделей имеют отличающие наборы команд, то, соответственно, отличаются и их языки ассемблеры. Следовательно, написанная на языке ассемблер программа будет работоспособна только на процессорах определенных моделей.
Языки семейства ассемблеров относятся к языкам низкого уровня, для которых характерны возможности создания эффективных и компактных программ, поскольку программист имеет непосредственный доступ к аппаратным ресурсам компьютера (процессору, основной и внешней памяти, контроллерам и др.). В настоящее время ассемблер, как правило, используют при написании небольших системных приложений, драйверов (программ, управляющих взаимодействием внешних устройств с процессором и с ОЗУ), отдельных процедур обработки данных и др. Как и для других языков программирования, для ассемблеров написан ряд библиотек, в которых реализованы процедуры различных видов обработки данных, что способствует ускорению процесса разработки программ. Многие языки программирования высокого уровня позволяют вставлять в разрабатываемые на их основе программы отдельные модули, написанные на языке ассемблер.
Машинно-независимые языки программирования или, по-другому, - языки высокого уровня не требуют от программистов при написании программ знания особенностей организации конкретных компьютеров, на которых эти программы будут выполняться. Основной целью создания языков высокого уровня явилась необходимость обеспечения программистов производительным инструментарием технологии программирования, допускающим выполнение подготовленных программ на компьютерах с различными наборами машинных команд. Языки высоко уровня позволяют описывать решение задачи в достаточно легко воспринимаемом (программистами) виде с использованием мощных команд, большинство из которых впоследствии реализуется десятками или сотнями машинных команд. При этом преобразование команд языка высокого уровня в соответствующие последовательности машинных команд осуществляется транслятором в автоматическом режиме без непосредственного участия программиста.
Однако следует отметить, что по мере развития процессоров в их наборах машинных команд появляются новые команды, которые в более ранних моделях процессоров выполнялись длинными последовательностями машинных команд. Таким образом, потенциальную основу повышения производительности технологий программирования обеспечивают как языки программирования высокого уровня, так и мощные машинные команды современных моделей процессоров.
В целом языки программирования позволяют кардинальным образом повысить производительность программиста по сравнению с написанием программ на языке ассемблер. Однако оттранслированные с языка высокого уровня на уровень машинных команд программы имеют, как правило, в несколько раз больший объем, чем аналогичные программы, изначально написанные на языке ассемблер. Кроме того, в силу избыточности сгенерированного машинного кода оттранслированные программы работают в несколько раз медленнее.
Системы программирования (например, Delphi) включают в себя: конкретный язык программирования, транслятор, библиотеки стандартных программ, редактор связей, отладчик, средства оптимизации сгенерированного кода программ, средства управления создаваемым проектом, различного рода техническую документацию. Основное назначение систем программирования – повышение эффективности разработки и отладки программ.
Общая схема получения исполняемого кода программы из исходной программы, написанной на языке высокого уровня, приведена на рисунке 5.1.
Рис. 5.1. Обобщенная схема обработки исходной программы
Подготовка исходного текста программы может осуществляться как с использованием встроенных в системы программирования редакторов, так и на основе автономных распространенных редакторов.
Язык программирования служит основой для написания текста программы, реализующей определенный алгоритм обработки данных. Для получения искомого результата текст исходной программы должен быть преобразован (оттранслирован) в исполняемую программу (загрузочный модуль), представленную непосредственно в машинных кодах.
В основе работы программ трансляторов используются два подхода: интерпретация команд (операторов) и компиляция программ в целом.
Интерпретатор осуществляет трансляцию очередного оператора из текста выполняемой программы в последовательность машинных команд и сразу же выполняет их. Переход к выполнению (трансляции) следующего оператора исходной программы реализуется только при успешном выполнении предыдущего оператора. В целом для интерпретаторов характерны следующие особенности:
§ при многократном включении конкретного оператора в программу каждое его выполнение требует заново реализации операции трансляции в машинные команды, что приводит к значительному замедлению выполнения программы;
§ программа интерпретатор в течение всего времени выполнения исходной программы должна находиться в ОЗУ и, следовательно, она уменьшает доступный системе объем оперативной памяти;
§ интерпретаторы поддерживают диалоговый режим работы, что способствует разработке и отладке программ, благодаря возможности оперативного внесения изменений в конкретный выполняемый оператор.
Примером реализации интерпретатора является инструментарий языка Basic (однако есть версии, например Quick Basic, позволяющие создавать исполняемые модули).
Компилятор обрабатывает текст исходной программы полностью. При этом, как правило, обработка выполняется за несколько проходов. При первом проходе компилятор проверяет корректность синтаксиса языковых конструкций отдельных операторов независимо друг от друга, при втором подходе проверяется корректность синтаксических взаимосвязей между операторами, и только затем осуществляется преобразование в машинные команды.
В ряде случаев дополнительно используют средства оптимизации кода программ – оптимизирующие трансляторы, которые после завершения компиляции осуществляют оптимизацию полученного объектного модуля. В частности, при оптимизации кода выполняется поиск команд, которые не выполняются ни при каких условиях, и их удаление. Оптимизация, как правило, позволяет повысить производительность исполняемого программного кода на 10 - 15%, однако сам процесс оптимизации требует значительных временных затрат.
В результате компиляции создается объектный модуль, представляющий собой программу в машинных кодах. Однако выполнить полученную программу еще невозможно, так как в ней не указаны конкретные адреса используемых ячеек оперативной памяти (при запуске программы на выполнение она предварительно переписывается в ОЗУ). Поэтому объектный модуль должен быть обработан специальной программой – редактором связей, в результате чего создается загрузочный модуль с относительными адресами памяти. При размещении загрузочного модуля в оперативной памяти, начиная с определенной ячейки памяти, все необходимые для работы адреса могут быть определены на основе имеющихся относительных адресов. При необходимости редактор связей дополнительно подключает в загрузочный модуль готовые последовательности машинных команд, реализующие конкретные операции. Время компиляции программ значительно увеличивается при обработке данных со сложной структурой, особенно со структурой, изменяющейся во время выполнения программы. При этом непосредственно в процессе выполнения программы в машинный код приходится вставлять множество дополнительных проверок, анализировать наличие ресурсов операционной системы, динамически (т. е. в процессе выполнения программы) их захватывать и освобождать и др. В результате эффективность полученного в результате компиляции машинного кода значительно снижается.
В целом для компиляторов характерны следующие особенности:
· откомпилированная программа работает на несколько порядков быстрее, чем эта же исходная программа выполняется с использованием интерпретатора;
· в отличие от интерпретатора, компилятор при выполнении программы не занимает место в ОЗУ (выгружается оттуда после завершения компиляции);
· программа в виде загрузочного модуля может быть перенесена на другие компьютеры (со схожими наборами машинных команд).
На практике находят применение трансляторы, реализованные в виде интерпретатора-компилятора, позволяющего на этапе разработки и отладки программ преобразовывать отдельные операторы в режиме интерпретатора, а по завершении отладки исходная программа транслируется полностью в объектный модуль в режиме компиляции. Подобный подход позволяет сократить время отладки и обеспечить эффективное исполнение программы.
Дата добавления: 2015-03-07; просмотров: 4093;