Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


СРЕДЫ И РЕАЛИЗАЦИИ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ



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

Старейшей средой программирования считается UNIX - ма­шинно-независимая операционная система с разделением времени. Она предоставляет многочисленные мощные инструментальные средства для производства ПО и эксплуатации разнообразных язы­ков. Работа с этой средой осуществляется с помощью графического интерфейса, устанавливаемого поверх нее. Во многих случаях этим интерфейсом является Common Desktop Environment (CDE).

Последнюю стадию развития сред разработки ПО представляют Microsoft Visual C++, Visual BASIC, Delphi и Java Development Kit, которые предлагают легкий способ создания графических интер­фейсов для программ пользователя.

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

Компилируемые языки. Компилируемыми принято счи­тать такие языки как С, C++, FORTRAN, Pascal и Ada. Это означает, что программы, написанные на этих языках, транслируются в ма­шинный код данного компьютера перед началом выполнения. Про­граммная интерпретация при этом ограничивается только интер­претацией набора программ поддержки выполнения, которые мо­делируют элементарные операции исходного языка, не имеющие близкого аналога в машинном языке.

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

Интерпретируемые языки. Реализуются с использова­нием программного интерпретатора. К таковым относятся языки LISP, ML, Perl, Postscript, Prolog и Smalltalk. При такой реализации транслятор выдает не машинный код используемого компьютера, а некую промежуточную форму программы. Эта форма легче для выполнения, чем исходная программа, но все же она отличается от машинного кода.

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

Развитие Всемирной паутины WWW и появление языка Java внесли изменения в описанную схему. Язык Java похож скорее на Pascal и C++, чем на LISP, но в большинстве случаев реализуется как интерпретируемый язык. Компилятор Java вырабатывает про­межуточный набор байт-кодов для виртуальной машины Java. Пе­редача байт-кодов на локальный компьютер (даже если он медлен­нее, чем web-сервер) выгоднее в отношении временных затрат, чем передача результатов выполнения программы на web-сервере. Од­нако web-сервер не в состоянии предугадать машинную архитекту­ру хост-компьютера. Поэтому браузер создает виртуальную маши­ну Java, которая и выполняет стандартный набор байт-кодов Java.


 

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

Например, задача работы с базой данных может быть разделена на две подзадачи: задачу добавления информации в базу данных и задачу обработки информации базы данных. Задача добавления информации может быть также разделена, например на три подзадачи: получение информации, проверка непротиворечивости, непосредственное добавление информации в базу.

Типичными методами структурного программирования являются:

  • нисходящее проектирование (проектирование сверху вниз);
  • модульное (процедурное) программирование;
  • структурное кодирование.

 

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

В языке Delphi структурный стиль программирования реализуется как модульное программирование или программирование с помощью компонентов. Например, обычная стереосистема содержит приемник, магнитофон, проигрыватель CD, усилитель и динамики. Производители выпускают эти компоненты отдельно, а потребители могут объединять их в разных сочетаниях. Для потребителей компонентные стереосистемы привлекательны тем, что их легко модернизировать: для этого достаточно купить и установить новый компонент. Поскольку технические характеристики непрерывно совершенствуются, заменять компоненты можно один за другим по мере необходимости, что значительно дешевле, чем замена всей стереосистемы.

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

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

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

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


 

ТЕОРИЯ ПЕРВИЧНЫХ ПРОГРАММ

 

Теория первичных программ была предложена Маддуксом в качестве обобщения методологии структурного программи­рования для определения однозначной иерархической декомпози­ции блок-схем. В этой теории предполагается, что графы программ могут содержать три класса узлов (рис. 2):

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

узлы принятия решения - изображаются в виде ромбов с одной входящей дутой и двумя выходящими (истина и ложь). Эти узлы представляют предикаты, и управление из узла принятия решения передается дальше либо по ветви истина, либо по ветви ложь;

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

 

Любая блок-схема состоит только из этих трех компонентов.

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

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

 

 

На рис. 3 изображены все первичные программы, которые включают в себя не более четырех узлов. Первичные программы а, б, д, и представляют собой последовательности функциональных узлов. Первичная программа е — конструкция if-then, .ж — do-while, з - repeat-until, к - if-then-else, л - do-while-do.

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

Многие из описанных выше наборов управляющих структур были включены в существующие языки программирования. Эти структуры представляют собой первичные программы с неболь­шим количеством узлов и просты для понимания.

10. ПОНЯТИЕ АЛГОРИТМА И ЕГО СВОЙСТВА

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

Алгоритм - это точное, сформулированное на определенном языке, конечное описание того или иного способа действия, осно­ванного на применении исполнимых элементарных однозначно трактуемых шагов.

Любой алгоритм имеет пять особенностей.

1) Конечность алгоритма (финитность). Означает, что алго­ритм всегда должен заканчиваться после конечного числа шагов.

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

Однако существуют примеры, использующие бесконечные процессы, например контроль показателей жизнедеятельности па­циента в больнице или поддержание установленной высоты полета авиалайнера.

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

2) Определенность алгоритма. Каждый шаг алгоритма должен быть точно определен, то есть действия, которые необходимо про­извести должны быть недвусмысленно определены в каждом воз­можном случае.

Чтобы исключить неоднозначность, разработаны определенные подходы для записи алгоритмов. Один из них - запись алгоритма в виде блок схемы, представляющей собой последовательность специальных пиктограмм, каждая из которых однозначно указыва­ет на выполняемое действие.

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

3) Наличие входных данных. Алгоритм имеет некоторое число
входных величин, заданных ему до начала работы.

Иногда это число может равняться нулю, однако это означает, что входные величины должны быть описаны как часть алгоритма. Например, алгоритм сложения числа 777 с числом 333. В этом слу­чае шаги 1 и 2 должны быть записаны так:

Шаг 1. Записать число 777.

Шаг 2. Под ним записать число 333

………

То есть, если даже входные величины отсутствуют, то какие-то величины будут описаны в самом алгоритме. В противном случае алгоритм не может быть выполнен.

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

5) Эффективность алгоритма. Алгоритм, который выполняет действие за меньшее число шагов признается более эффективным.

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


 


Поделиться:



Последнее изменение этой страницы: 2017-03-14; Просмотров: 542; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.027 с.)
Главная | Случайная страница | Обратная связь