Формальные языки и грамматики. Формальное определение языков программирования Формальный язык программирования

ФОРМАЛИЗОВАННЫЙ ЯЗЫК – искусственная знаковая система, предназначенная для представления некоторой теории. Формализованный язык отличается от естественных (национальных) языков человеческого общения и мышления, от искусственных языков типа Эсперанто, от «технических» языков науки, сочетающих средства определенной части естественного языка с соответствующей научной символикой (язык химии, язык обычной математики и др.), от алгоритмического языка типа обобщенного программирования и т.п. прежде всего тем, что его задача – служить средством фиксации (формализации) определенного логического содержания, позволяющего вводить отношение логического следования и понятие доказуемости (либо их аналоги). Исторически первым формализованным языком была силлогистика Аристотеля, реализованная с помощью стандартизованного фрагмента естественного (греческого) языка. Общую идею формализованного языка сформулировал Лейбниц (characteristica universalis), предусматривавший его расширение до «исчисления умозаключений» – calculus ratiocinator. В Новое время различные варианты формализованных языков разрабатывались на основе аналогии между логикой и алгеброй. Вехой здесь явились труды Моргана , Буля и их последователей, в особенности Шрёдера и Порецкого . Современные формализованные языки – в их наиболее распространенных формах – восходят к труду Фреге «Begriffsschrift» – «Запись в понятиях» (1879), от которого идет главная линия развития языка логики высказываний и (объемлющей ее) логики (многоместных) предикатов, а также применение этих логических языковых средств к задачам обоснования математики.

Характерная структура таких формализованных языков: задание алфавита исходных знаков, индуктивное определение (правильно построенной) формулы языка, т.н. задание правил образования, задание правил вывода, т.н. правил преобразования, которые сохраняют выделенную логическую характеристику формул (истинность, доказуемость и др.). Добавление правил преобразования превращает формализованный язык в логическое исчисление. Существует много видов формализованных языков: это прежде всего языки дедуктивно-аксиоматических построений, систем натурального («естественного») вывода и секвенциальных построений, аналитических таблиц, систем «логики спора» и многих других.

Формализованные языки различаются по своей логической силе, начиная с «классических» языков (в которых в полной мере действуют аристотелевские законы тождества, противоречия и исключенного третьего, а также принцип логической двузначности) и кончая многочисленными языками неклассических логик, позволяющих ослаблять те или иные принципы, вводить многозначность оценок формул либо их модальности. Разработаны языки, в которых логические средства в том или ином смысле минимизируются. Таковы языки минимальной и положительной логик или язык логики высказываний, использующий единственную логическую операцию, напр. штрих Шеффера (см. Логические связки ).

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

Формализованный язык может быть «чистой формой», т.е. не нести никакой внелогической информации; если же он ее несет, то становится прикладным формализованным языком, специфика которого – наличие постоянных предикатов и термов (дескрипций) – напр. арифметических, – отражающих свойства прикладной области. Для формализации теорий высокого уровня абстракции формализованный язык может по-разному видоизменяться, расширяться либо «надстраиваться»; пример: формализация классического математического анализа как арифметики второго порядка (т.е. с кванторами по предикатным переменным). В ряде случаев формализованный язык содержит логические структуры многих – даже бесконечно многих – порядков (такова, напр., «башня языков» А.А.Маркова, служащая формализации конструктивной математики, или интерпретация модальностей в виде иерархии «возможных миров»). Семантическая база формализованного языка логики может быть теоретико-множественной, алгебраической, вероятностной, теоретико-игровой и др. Возможны и такие ее «ослабления», которые лишь родственны вероятностной семантике – так возникает, напр., формализованный язык «расплывчатой логики» (в смысле Заде). Тогда язык приобретает специфическую прагматику, принимающую во внимание фактор носителя языка (дающего оценку «функции принадлежности» предмета объему данного понятия). Здесь проявляется крепнущая ныне тенденция учета в формализованных языках «человеческого фактора» – в том или ином его виде, что явно проявляется в некоторых формализованных языках логики квантовой механики. В другом направлении идет разработка формализованных языков, семантика которых предполагает отказ от экзистенциальных допущений либо те или иные онтологические предпосылки – о допустимости правил с бесконечным числом посылок, «многосортности» предметных областей, даже противоречивых, и т.д.

Непременной чертой формализованного языка является «возможностное» истолкование правил вывода; напр., на определенном шаге мы вольны использовать либо не использовать, скажем, правило modus ponens. Этой черты лишены алгоритмические языки, носящие «предписывающий» характер. Но по мере развития компьютерной логики и разработки программ «описывающего» типа это различие начинает сглаживаться. В этом же направлении действует и разработка формализованных языков, ориентированных на решения задач эвристики.

Литература:

1. Черч А. Введение в математическую логику, т. 1. М., 1960;

2. Клини С.К. Введение в метаматематику. М., 1957;

3. Карри Х. Основания математической логики. М., 1969;

4. Фрейденталь Х. Язык логики. М., 1969;

5. Смирнова Е.Д. Формализованные языки и проблемы логической семантики. М., 1982.

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

Современные языки программирования высокого уровня, такие как Паскаль, Си, Ада, Java, C++, C# и другие, до настоящего времени остаются наиболее распространенным и мощным инструментом у программистов, занимающихся разработкой как системного, так и прикладного программного обеспечения. С появлением новых задач и потребностей функциональные возможности этих языков постоянно расширяются путем создания все более совершенных версий.

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

Как универсальные, так и проблемно-ориентированные языки программирования обладают одной общей чертой - они являются

формальными языками. Что же такое формальный язык? В самом общем виде на этот вопрос можно ответить так: язык - это множество предложений, а формальный язык - это язык, предложения которого построены по определенным правилам.

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

И естественные языки, и языки программирования - бесконечные множества. На языке программирования можно написать неограниченное число программ.

Как же задать правила построения предложений формального языка? При ответе на этот вопрос мы будем отталкиваться от двух важных понятий: синтаксис и семантика языка.

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

Существуют различные способы описания синтаксиса формальных языков (способам описания посвящена вторая глава учебного пособия). Наиболее используемыми в языках программирования являются форма Бэкуса - Наура (БНФ) и синтаксические диаграммы.

БНФ была разработана Бэкусом и впервые применена для строгого описания языка АЛГОЛ-60 в 1963 г. Эта форма используется как для описания структуры языка в целом, так и для описания отдельных языковых конструкций (подмножеств языка) и его элементов - операторов, идентификаторов, выражений, чисел и др.

Ниже приведены примеры БНФ, определяющие синтаксис десятичных целых чисел и синтаксис арифметических выражений, содержащих операции «+» и «*».

БНФ десятичных целых чисел:

= 0|1|...|9

БНФ арифметических выражений:

:= () а

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

В левой части БНФ в угловых скобках записываются названия определяемых синтаксических категорий (понятий, единиц), символ «:= » означает «есть», «это», «определяется как», символ «|» означает «или».

Правая часть БНФ определяет возможные варианты конструирования конкретных значений этих категорий, в данном случае - значений десятичных чисел и конкретных арифметических выражений. БНФ содержит также и алфавит символов, из которых составляются эти значения. Для десятичных целых чисел алфавит - это множество {+,-, 0, 1,..., 9}, а для выражений - это множество {а, *, +, (,)}.

Процесс конструирования значений синтаксической категории состоит в выводе этих значений путем последовательных подстановок правых частей правил БНФ в левые. Ниже приведены выводы числа « - 320» и выражения «а+а*а» с использованием соответствующих БНФ:

БНФ имеют большое сходство с формальными грамматиками , используемыми в теории формальных языков (некоторые авторы их отождествляют).

Именно появление БНФ стимулировало быстрое развитие теории формальных языков и ее применение к прикладным задачам разработки языков программирования и проектирования трансляторов.

Если в рассмотренных БНФ каждую синтаксическую категорию из левой части правил обозначить через А, В и С соответственно, а вместо символа:= использовать -то будут получены следующие формы:

Для десятичных целых чисел:

А->В+В-В В^>СВС С-> 0 | 11... | 9

Для арифметических выражений:

А^А+ВВ

В->В*СС

С^>(А)а

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

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

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

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

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

то можно построить множество предложений с различными смыслами. Например, предложения «автомобиль едет» и «автомобиль думает» правильны с точки зрения синтаксиса. Однако первое предложение имеет корректный смысл, о втором можно сказать, что оно бессмысленно. Таким образом, семантика определяет множество смыслов и допустимых соответствий между предложениями (текстами) и смыслами.

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

Точно так же в языках программирования синтаксически правильно построенный оператор присваивания

будет семантически некорректным, если а имеет значение 10,5 (а = 10.5), а b - значение ложь (b = false).

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

Многие аспекты семантики языка программирования можно описать в виде перечня семантических соглашений, которые носят общий, неформальный характер. Например, программистам известны такие соглашения, как «каждый идентификатор в блоке описывается один раз», «переменная должна быть определена до ее использования» и т.д.

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

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

Другая часть авторов считает, что со времени опубликования стандартов первых языков программирования - Фортран, Алгол и др. - в 60-х гг. XX в., произошла «стабилизация» языков в том смысле, что сходные по назначению языковые конструкции в разных языках имеют практически одну и ту же семантическую основу, несмотря на различия в лексике и синтаксисе. Поэтому, как только удастся формально определить эту общую семантическую базу, можно будет приступить к созданию универсального языка, который уже будет не языком программирования в традиционном понимании, а заготовками семантических конструкций. Программа будет представляться набором этих конструкций, а текстовый редактор уступит место структурному редактору. В качестве примера частичной реализации этого подхода приводятся визуальные среды программирования, подобные Delphi, C++ Builder и др.

Конец

Начало

Повторять

Начало

Псевдокоды

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

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

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

алгоритм алгоритм Евклида;

пока первое число не равно второму

если числа равны

то стоп все;

иначе определить большее из двух чисел;

з аменить большее число на разность большего и меньшего чисел

конец;

взять первое число в качестве ответа

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

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

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


Язык программирования - это формализованный язык, который представляет собой совокупность алфавита, правил написания конструкций (синтаксис) и правил толкования конструкций (семантика).

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

Основные понятия

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

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

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

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

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

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

Системой операций называется совокупность всех машинных операций, предусмотренных в ЭВМ.

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

Основными операциями ЭВМ являются арифметические, логические, переносы, переходы, когда машина осуществляет переход от выполнения одной команды к выполнению другой, выборка команд из оперативной памяти и останов машины («стоп»). Основными операциями над буквенной информацией являются: определение длины слова; перенос слова с одного места оперативной памяти в другое; выделение определенной части заданного слова; включение между словами пробелов; деление строки слов на более мелкие строки; сравнение двух слов. Обычно перечисленные операции называют редактированием.

Программирование

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

При решении на ЭВМ некоторой задачи (класса задач) работа распадается на следующие этапы:

    математическую формулировку задачи;

    разработку методики ее решения;

    разработку алгоритма ее решения и запись ее на некотором языке программирования;

    программирование;

    отладку программы на машине;

    подготовку исходных данных, решение задачи на ЭВМ.

Описанный комплекс работ называют проблемным программированием.

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

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

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

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

Применяя ЭВМ для решения задачи, необходимо учитывать следующие ее особенности:

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

Программирование. Программирование заключается в записи разработанного алгоритма на языке программирования (например, на так называемом языке АССЕМБЛЕРА или на АЛГОЛе, ФОРТРАНе, КОБОЛе, ПЛ/I), выполняемой вручную, и последующей трансляции на машинный алгоритмический язык.

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

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

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

Как правило, для ввода информации в вычислительную машину используются либо 80-колонные ПК, либо бумажная ПЛ. На больших машинах имеется и то и другое. Перфокарта содержит 12 строк, и, следовательно, в каждой колонке возможно 12 пробивок; в поперечном направлении перфоленты допускаются 5, 6, 7 и 8 позиции пробивки. Таким образом, теоретически возможно использование алфавита от 2 5 =32 до 2 12 =4096 символов, но на практике в колонке перфокарты редко встречается более 3 пробивок, так что, как правило, используемый алфавит содержит от 40 до 80 символов. Среди оборудования вычислительной машины имеется самостоятельное устройство воспроизведения на бумаге информации, содержащейся на перфокартах и перфоленте в виде, удобном для чтения ее человеком. В результате мы получаем то, что обычно называется листингом, или распечаткой.

После ввода в ЭВМ программ и исходных данных решение задачи производится автоматически.

Математическое обеспечение ЭВМ

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

В систему МО вычислительных машин могут входить следующие группы программ:

    операционная система программ;

    система средств программирования;

    приложения к программам;

    система программ поддержания математического обеспечения;

    система испытательных программ, предназначенных для контроля исправности ЭВМ.

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

диспетчер - программа, обеспечивающая определенный режим работы ЭВМ;

супервизор, или монитор,- программа, обеспечивающая работу, задаваемую машине человеком-оператором в рамках установленного для нее режима;

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

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

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

Супервизор планирует по требованию человека-оператора порядок выполнения программ и распределяет между ними наличное оборудование ЭВМ, организует их очередь и поддерживает в этой очереди порядок. Основные задачи, стоящие перед супервизором,- это: управление ходом работы ЭВМ; поддерживание связи с человеком-оператором.

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

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

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

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

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

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

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

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

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

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

Системы средств программирования новейших ЭВМ часто основываются на так называемом принципе модульности. Модулями называют «куски» алгоритмов, заданных на языке исполнительной системы или на входном языке программирования, для которых выполнены следующие условия:

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

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

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

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

В библиотеку собирают обычно специально составленные и специально оформленные программы.

Перечисленные средства программирования целесообразно применять для решения различных задач (проблем). При этом считается, что программы отдельных задач (проблем) могут быть и не очень «хорошие», зато суммарным расход средств на программирование и решение задачи на ЭВМ бывает обычно меньше, чем при составлении более «хороших» программ.

Математическое обеспечение АСУ

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

Основными положениями, которыми необходимо руководствоваться при создании МО АСУ, являются следующие:

  • совместимость и базирование разрабатываемого МО АСУ на имеющемся МО ЭВМ;
  • ориентированность выбираемых средств МО на задачи АСУ;
  • достаточное разнообразие средств автоматизации программирования;
  • возможность эффективного внесения изменений в рабочие программы;
  • возможность однозначного и исчерпывающего описания алгоритмов;
  • возможность оптимизации работы программ частного применения;
  • модульность построения программ.

МО АСУ служит для представления пользователю широкого спектра услуг по технологии программирования. Его можно разделить на две части: составление управляющих программ и составление обрабатывающих программ.

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

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

Функции системы автоматизации программирования следующие: запись программ на входных языках программирования; трансляции программ на внутренний язык ЭВМ; объединение (сборка) нужных конфигураций (сегментов) из стандартных подпрограмм; отладка программ на уровне входных языков; корректировка программ на уровне входных языков.

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

Основными компонентами МО АСУ являются системная диспетчерская программа и библиотека стандартных подпрограмм и типовых программ, предназначенных для обработки производственно-экономической информации.

Системная диспетчерская программа обеспечивает функционирование АСУП в режиме, определенном производственно-хозяйственной или административной деятельностью.

Библиотека стандартных подпрограмм, имеющаяся в МО ЭВМ, является переходной ступенью к разработке системной библиотеки, ориентированной на процессы обработки информации в АСУ. Системная библиотека должна содержать:

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

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

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

Языки программирования

Языком программирования называются знаковые системы, применяемые для описания процессов решения задач на ЭВМ. По своему характеру языки программирования делятся на три группы:

  1. формальные алгоритмические языки;
  2. формальные неалгоритмические языки программирования;
  3. не вполне формализованные знаковые системы, применяемые при программировании.

Формальные языки программирования. К этой группе языков относятся: алгоритмические языки машин и операционных систем; машинно-ориентированные алгоритмические языки; проблемно-ориентированные алгоритмические языки; универсальные машинно-независимые алгоритмические языки.

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

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

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

Проблемно-ориентированные алгоритмические языки это такие языки, которые специально разработаны для описания процессов решения задач некоторого узкого класса, например задач линейной алгебры, статистики, задач обработки данных и т. п. В частности, к проблемно-ориентированным языкам относится КОБОЛ.

Универсальные машинно-независимые алгоритмические языки пригодны для создания алгоритмов решения задач весьма широких классов. К числу этих языков относятся уже упомянутые АЛГОЛ, ФОРТРАН, ПЛ/1.

Из числа универсальных машинно-независимых алгоритмических языков исключение составляет ЯЛС. Назначение этого языка не сводится к тому, чтобы быть языком программирования. ЯЛС используется как первый этап описания алгоритмов при программировании на машинном языке или на языке АССЕМБЛЕРА (операторный метод программирования; записанный на ЯЛС алгоритм вручную переводится на язык машины или язык АССЕМБЛЕРА).

В таблице ниже приводятся сравнительные данные формальных языков программирования.

Не вполне формализованные знаковые системы. Эти языки обычно используются при программировании вручную или на предварительном, выполняемом вручную этапе автоматизированного программирования. Их примером является блок-схема программы. Блок-схема программы представляет собой укрупненное описание программы, при котором отдельные ее части изображаются в виде «блоков» (прямоугольников, ромбов, кружков и т. п.), внутри которых на естественном языке (например, на русском) излагается содержание этих частей. Связь между блоками (частями программы) изображается с помощью линий, обозначающих передачу управления. Линии могут быть снабжены надписями, указывающими условия, при которых происходит передача управления. Блок-схемы аналогичны алгоритмам, записанным на ЯЛС с помощью обобщенных операторов, но отличаются от них тем, что значение блоков изложено на естественном, неформальном языке, тогда как в ЯЛС обобщенные операторы снабжены расшифровкой на точном формальном языке.

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

Различают языки программирования следующих уровней:

    язык нулевого или низшего уровня - машинный код;

    язык первого уровня - мнемокод, или язык символического кодирования;

    язык второго уровня - автокод (макрокод);

    языки третьего уровня (высшего)-проблемно-ориентированные языки.

В качестве входных языков в зависимости от вида задач АСУП целесообразно применять проблемно-ориентированные языки различного типа

Сравнительные данные формальных алгоритмических языков программирования

Класс алгоритмических языков программирования

Учет особенностей ЭВМ

Характеристика класса задач

Способ программирования

Условная оценка качества программ

Машинные языки

Машинно-ориентированные языки

Частичный

Определяется особенностями ЭВМ

Автоматизированный

Удовлетворительная

Проблемно-ориентированные языки

Незначительный

Автоматизированный

Удовлетворительная

Универсальные машиннонезависимые языки

Отсутствует или весьма незначительный

Весьма обширный

Автоматизированный

Невысокая

(например, для анализа - АЛГОЛ, ФОРТРАН и др., для экономических задач- АЛГЭК и др., для информационных задач -КОБОЛ, СИНТОЛ и др.).

Рассмотрим некоторые из алгоритмических языков программирования.

АЛГОЛ-60. Название языка происходит от английских слов Algorithmic Language. Он был разработан группой ученых различных стран в 1960 г. и получил повсеместное распространение. Причины успеха заключаются в его близости к обычному математическому языку, в удобстве описания широкого класса задач, универсальности и полной независимости от конкретной ЭВМ, строгой формализации языка от алфавита до самых сложных конструкций.

АЛГОЛ-60 не только универсальный язык программирования, но и международный язык описания алгоритмов.

Основой записи алгоритмов на языке АЛГОЛ-60 является последовательность операторов, разделенных символом «;». К этой последовательности операторов, являющихся единичными действиями в языке, присоединяется последовательность описаний, дающих транслятору информацию о необходимых свойствах, используемых в операторах. Описания, например, дают информацию о классах чисел, используемых в качестве значений переменных, о размерности массивов чисел и т. д. Такое объединение описаний и операторов в этом языке называется блоком.

Программой в языке АЛГОЛ-60 называется блок, или составной оператор, который не содержит внутри другого оператора и не использует другой оператор, не содержащийся в нем.

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

В СССР АЛГОЛ-60 получил распространение в виде некоторых его вариантов.

ФОРТРАН. Слово ФОРТРАН образовано из двух английских слов (Formula Translator). Одной из важнейших особенностей языка ФОРТРАН является то, что он относительно свободен от специфики конкретной вычислительной машины. ФОРТРАН является машиннонезависимым языком программирования.

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

Повсеместное внедрение ФОРТРАНа в практику программирования происходит благодаря его качествам, из которых следует отметить, во-первых, его простоту по сравнению с другими алгоритмическими языками (например, АЛГОЛом); во-вторых, благодаря отсутствию слишком сложных конструкций оттранслированные программы получаются более эффективными по сравнению с программами, составленными на других языках; в то же время ФОРТРАН пригоден для программирования большинства вычислительных алгоритмов;

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

Алгоритм решения задачи, записанный с помощью ФОРТРАНа, состоит из последовательности операторов. Эти операторы могут принадлежать к нескольким различным типам. Вместе взятые операторы, определяющие алгоритм решения задачи, составляют исходную программу. После того как исходная программа написана и отперфорирована на перфокартах, она преобразуется с помощью транслятора ФОРТРАНа в рабочую программу.

Первый оператор - оператор-заголовок, имеющий вид || PROGRAMa ||, где а -имя программы, а последний - оператор конца (оператор || END ||) и совокупность подпрограмм. Основная программа и каждая подпрограмма локализуют в себе метки операторов, а также имена переменных, массивов и других величин, позволяя тем самым использовать в разных подпрограммах и в основной программе одни и те же метки и идентификаторы. Связь между основной программой и подпрограммами осуществляется с помощью соответствующих операторов обращения.

При составлении программ на ФОРТРАНе рекомендуется придерживаться следующего порядка следования операторов: 1) оператор-заголовок основной программы (подпрограммы); 2) оператор описания файлов; 3) неявный оператор задания типа; 4) явный оператор задания типа, оператор задания размеров, оператор задания общих областей; 5) оператор задания эквивалентности; 6) оператор-функция, оператор-процедура; 7) оператор задания формата, выполняемые операторы (безусловные, условные, ввода, вывода); 8) оператор конца.

КОБОЛ. Название языка происходит от английских слов Common Business Orientated Language. КОБОЛ - проблемно-ориентированный алгоритмический язык, предназначенный для описания процессов решения задач и обработки данных. В настоящее время КОБОЛ является единственным широко распространенным языком высокого уровня для программирования экономических задач. Его широкая популярность объясняется тем, что КОБОЛ достаточно близок к естественному языку, на котором обычно формулируются и решаются экономические задачи.

Отличительные особенности языка КОБОЛ состоят в следующем:

язык в известном смысле является подмножеством английского языка; написанный на КОБОЛе текст можно понимать без предварительной подготовки;

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

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

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

В КОБОЛе значительно облегчено внесение в программу мелких изменений, необходимых при обработке коммерческой информации.

В КОБОЛе основной единицей ввода-вывода является файл данных. Каждый файл состоит из записей. Один и тот же файл часто используется в различных программах в зависимости от характера решаемых задач. Описание файлов является очень строгим и не допускает изменений.

Разработчики учли возможность использования для трансляции программ одной машины, а для решения задачи по составленной программе - другой машины. Кроме того, одна и та же КОБОЛ-программа допускает трансляцию на языки различных ЭВМ, имеющих различные комплекты оборудования.

СОЛ. Цифровое моделирование как эффективный метод исследования завоевывает все большую популярность среди специалистов, занимающихся анализом и проектированием сложных систем.

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

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

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

Рассмотрим некоторые специализированные алгоритмические языки моделирования.

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

Алгоритмический язык SIMSCRIPT принято считать наиболее мощным моделирующим языком в настоящее время. Благодаря ряду своих уникальных черт он применим для самого широкого класса задач. Однако этот язык сравнительно сложен, диагностические средства для отладки программ ограничены. Кроме того, потенциальный потребитель этого языка должен знать ФОРТРАН, иметь опыт программирования.

Внимание специалистов, связанных с решением проблем моделирования, привлекают специализированные языки, разработанные для этих целей на базе АЛГОЛа. Среди таких языков автоматического программирования наиболее совершенными являютсяSIMULA и SOL (СОЛ).

Примером одного из наиболее удачных специализированных алгоритмических языков, предназначенных для моделирования дискретно изменяющихся систем, является язык СОЛ - Simulation Orientated Language.

Язык СОЛ построен на базе универсального языка программирования АЛГОЛ, имеет такую же структуру и использует основные его элементы. Для описания широкого класса процессов с дискретными событиями СОЛ представляет универсальную систему понятий, и потому он во многих отношениях очень похож на проблемно-ориентированные языки автоматического программирования, такие, как АЛГОЛ или ФОРТРАН. Однако языку СОЛ присущи основные черты, отличающие его от этих языков: СОЛ обеспечивает механизм моделирования асинхронных параллельных процессов, удобные обозначения для случайных элементов внутри арифметических выражении, автоматические средства сбора статистических данных о компонентах моделируемой системы. С другой стороны, многие черты проблемно-ориентированных универсальных языков не используются в СОЛе не потому, что они несовместимы с ним, а скорее потому, что они вносят большие усложнения в его схему, не расширяя его возможности. Принципы, положенные в основу построения языка и написания моделирующих программ на нем, позволяют строить модели сложных систем в удобной для чтения форме.

ПЛ/ I . Название языка происходит от английских слов Programming Language/One.

Язык ПЛ/I появился после создания целого ряда весьма совершенных языков, и, конечно, эти языки-предшественники оказали существенное влияние на его структуру. Так, в нем сохранены от АЛГОЛа блочная структура программы, возможность динамического распределения памяти, имеется аппарат вызова процедур, способ задания форматов, используемый в ФОРТРАНе, и т. д. Но много и новых черт. Язык удобен для моделирования, решения логических задач, исследования логических схем, решения задач в реальном масштабе времени, разработки систем математического обеспечения. Возможно использование разного типа данных (двоичных, десятичных, символьных, комплексных чисел, матриц и т. д.), однако весьма сложно организовывать эти данные в массивы, таблицы, тексты, анкеты, картотеки и т. и. Имеется большой набор стандартных функций и процедур. В языке ПЛ/I разработана удачная система операции, управляющих всеми процессами ввода, вывода и обмена информацией между основными и запоминающими устройствами. Все эти особенности производят впечатление сильной перегруженности языка. Следует иметь в виду и недостатки: описание языка неудовлетворительно, оно не формализовано.

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

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

В языке ПЛ/I каждому описателю переменной, каждой уточняющей конструкции-дополнению и каждой спецификации придана «интерпретация (принцип) умолчания». Это означает, что всюду, где язык предоставляет несколько возможностей, а программист не указал никакой, компилятор применяет «интерпретацию умолчания», т. е. подразумевается некоторая из возможностей, предусмотренная в языке на этот случай. В качестве таких подразумеваемых для каждой конструкции возможностей в языке выбраны те, которые, вероятнее всего, потребуются программисту.

Программы на языке ПЛ/I пишутся в свободной форме; программист может сам разработать нужные ему формы записи программ. При этом обеспечен доступ ко всем средствам системы ЭВМ.

Операторы программы, записанной на языке ПЛ/I, объединяются в «блоки». Блоки выполняют важные функции: они определяют область действия переменных и других имен, так что одно и то же имя в разных блоках может использоваться для различных целей; они позволяют отводить ячейки памяти под переменные только на время выполнения данного блока и освобождать их для использования в других целях по прекращении работы блока.

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

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

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

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

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

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

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

После написания программы на соответствующих бланках текст программы перфорируется на картах.

Для получения рабочей программы сначала нужно выполнить трансляцию исходной программы. Для этого к картам исходной программы добавляются некоторые управляющие карты, такие, как управляющая карта транслятора РГ1Г и карты управляющих операторов - УПРАВЛЕНИЯ ЗАДАНИЯМИ, необходимые для работы транслятора РПГ. После трансляции полученный модуль может быть отредактирован с помощью РЕДАКТОРА. В результате редактирования получается готовая для выполнения программа (загрузочный модуль), которая называется рабочей программой. Компиляция и редактирование необходимы для получения желаемого отчета.

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

АЛГАМС. Алгоритмический язык АЛГАМС ориентирован на машины средней мощности; основой его стало подмножество языка АЛГОЛ-60.

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

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

При вводе текста последовательным элементам массива начиная с указанного объекта ввода присваиваются целые значения, соответствующие последовательным символам вводимой строки в смысле процедуры=ТЕХТ. Процедура = ТЕХТ определяется следующим образом: <оператор текст> ::=ТЕХТ (<строка>, <переменная с индексами>).

Идентификатором процедуры ввода является слово OUTPUT. Оператор имеет четыре вида: оператор вывода чисел, оператор логических значений, оператор вывода текста и оператор размещения. Оператор вывода состоит из идентификатора OUTPUT и следующего за ним списка фактических параметров, заключенного в круглые скобки. Первый фактический параметр процедуры определяет номер канала вывода, второй параметр определяет формат выводимых данных, а все остальные - объекты вывода. Имеются средства редактирования при выводе информации на печать.

БЭЙСИ К. Название языка происходит от английских слов Beginners all Purpose Symbolic Instructioncode. Он получил широкую популярность благодаря своей простоте, легкости в изучении и большим возможностям для решения самых различных задач. Во многих мини-ЭВМ этот язык принят в качестве основного разговорного языка. Язык БЭЙСИК представляет собой язык программирования. Он удобен для решения научно-технических задач небольшого объема как по количеству выполняемых операций, так и по количеству исходных и результирующих данных. Важнейшей особенностью языка является то, что он приспособлен для шаговой реализации. Это означает, что после каждого изменения исходного текста программы на языке БЭЙСИК можно перетранслировать не всю-программу, а только те ее операторы, которые были изменены. Возможность шаговой реализации языка БЭЙСИК позволяет сократить затраты машинного времени на перетрансляцию. Это в свою очередь позволяет ускорить цикл отладки настолько, что становится целесообразной отладка БЭЙСИК-программ в режиме диалога.

Помимо возможности накапливать большие программы, состоящие из перенумерованных операторов языка БЭЙСИК, предусмотрены так называемые прямые команды, т. е. такие, которые исполняются тотчас же после ввода их с пульта программиста (с телетайпа). В режиме прямых команд могут использоваться не только административные директивы типа RUN-запуск исполнения, LIST - распечатка текста, SAVE - сохранить текст программы в библиотеке, BYE - конец сеанса работы; любой оператор языка БЭЙСИК, введенный без порядкового номера, исполняется в режиме прямой команды. Это позволяет, в частности, распечатывать и изменять значения переменных в любой момент выполнения программы.

Служебное слово Выполняемое действие

PRINT Отпечатать текст сообщения, заключенный в кавычки, или значение арифметического выражения (предварительно вычислив его), или значения переменных

INPUT Ввести числа с пульта программиста и заслать их в указанные переменные

LET Присвоить переменной значение выражения

GO ТО Перейти к выполнению оператора с заданным номером

IF Если заданное условие выполнено, то необходимо выполнить действие, указанное в данном операторе, иначе - перейти к выполнению следующего оператора

DATA Данные; этот оператор не выполняется. Он описывает блок отладочных данных (чисел). Совокупность блоков отладочных данных образует массив отладочных данных

END Конец программы

Таким образом, шаговая схема компиляции в сочетании с режимом прямых команд позволяет эффективно отлаживать БЭЙСИК-программы в режиме диалога.

Программа на языке БЭЙСИК состоит из операторов, каждый из которых начинается со служебного слова. Служебное слово определяет тип оператора и характер действий, осуществляемых при его выполнении.

При решении многих задач необходимо представление данных в виде таблиц. Используя возможности некоторых операторов языка БЭЙСИК, можно формировать таблицы различных форматов.

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

Алфавит - фиксированный для данного языка набор основных сим-волов, допустимых для составления текста программы на этом языке. Синтаксис - система правил, определяющих допустимые конструк-ции языка программирования из букв алфавита. Семантика - система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных. При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и оп-ределяемые ею свойства программных объектов или процесса обработ-ки данных. Взаимодействие синтаксических и семантических правил определяют те или иные понятия языка, например, операторы, идентификаторы, переменные, функции «процедуры, модули и т.д. В отличие от естественных языков правила грамматики и семантики для языков программиро-вания, как и для всех формальных языков, должны быть явно, одно-значно и четко сформулированы. Языки программирования, имитирующие естественные языки, обла-дающие укрупненными командами, ориентированными на решение прикладных содержательных задач, называют языками «высокого уров-ня». В настоящее время насчитывается несколько сотен таких языков, а если считать и их диалекты, то это число возросло до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, ма-шинная программа, в конечном счете, записывается с помощью лишь двух символов О и I. Во-вторых, каждая ЭВМ имеет ограниченный на-бор машинных операций, ориентированных на структуру процессора. Как правило, этот набор состоит из уравнительно небольшого числа простейших операций, типа: переслать число в ячейку; считать число из ячейки; увеличить содержимое ячейки на +1 и т.п. Команда на машин-ном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содер-жит код и адреса ячеек, с содержимым которой выполняется закодиро-ванное действие.

Языки программирования высокого уровня имеют следующие дос-тоинства:

Алфавит языка значительно шире машинного, что делает его гораздо боли выразительным и существенно повышает наглядность и понят-ность текста;

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



Конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;

Используется аппарат переменных и действия с ними;

Поддерживается широкий набор типов данных. Таким образом, языки программирования высокого уровня являются машинно-независимыми и требуют использования соответствующих программ-переводчиков (трансляторов) для представления программы на языке машины, на которой она будет исполняться. Алгоритмическое программирование. На заре вычислительной техники компьютеры имели весьма небольшой по современным меркам объем оперативной памяти, который достигал десятков ки-лобайт. Обычный размер программ тех лет составлял несколько де-сятков строк кода. Такие программы разрабатывали методом алго-ритмического программирования: сначала готовили алгоритм в ви-де наглядной блок-схемы, а потом записывали его операторами того или иного языка программирования. Программа, составленная методом алгоритмического програм-мирования, начинается в одной точке, затем последовательно ис-полняет все инструкции и завершается в другой точке. Конечно, та-кие программы могут иметь и циклы, и ветвления, но общая логика работы программы все-таки последовательная: от начала к концу. Языки программирования 50-70 гг. XX в. были рассчитаны на алгоритмическое программирование. Основными языками тех лет были ФОРТРАН и АЛ ГОЛ-60. Язык ФОРТРАН имел упрощенный синтаксис, и его предпочитали инженеры, а язык АЛГОЛ-60 отли-чался строгими требованиями, и его предпочитали ученые, в основ-ном математики и физики. Несколько позже, в середине 60-х гг. был разработан язык алгоритмического программирования Бейсик, который и сегодня используют для начального знакомства с алгорит-мами и алгоритмическим программированием. Если цель обучения программированию состоит только в освоении приемов создания простейших алгоритмов, то язык Бейсик для этого вполне достато-чен. Процедурное программирование. Понятие подпрограммы было введено еще в ранних языках программирования. В алгоритмиче-ском программировании их использовали для того, чтобы выделить в отдельные блоки некоторые часто повторяющиеся операции. Обычно программа, записанная на алгоритмическом языке, содер-жит до десятка подпрограмм, которые делают ее более понятной. При желании без них можно обойтись, просто текст программы становится несколько более запутанным. В 70-х гг. XX в. размеры оперативной памяти компьютеров дос-тигли сотен килобайт. Появились дисковые накопители, с которыми программы могли обмениваться данными без участия человека. Это позволило увеличить размеры программ до тысяч операторов, и то-гда недостатки языков алгоритмического программирования стали сдерживать работу программистов. Если написать на алгоритмическом языке очень длинную про-грамму, то с ней трудно разобраться. Переходы из одних мест в другие кажутся запутанными, а большое количество переменных не укладывается в голове. Легко забыть, что хранится в той или иной переменной, и перепутать их имена. Выход из тупика был найден в более широком использовании подпрограмм. Программа, записанная на языке процедурного про-граммирования, выглядит как множество циклов, вложенных друг в друга. Она непрерывно «крутится» в этих циклах и время от време-ни вызывает исполнение функций и процедур. Даже если в про-грамме тысячи строк, разобраться с ней становится гораздо проще. Программист всегда может легко определить, внутри какого цикла в данный момент работает программа, и если там происходит какой-то сбой, то быстро выясняются имена подпрограмм, которые могут его вызвать. Алгоритмы для процедурного программирования тоже можно изображать графически, только называются они не блок-схемами, а структурными диаграммами. Вход в программу обычно один, но выходов из нее (в отличие от алгоритмического программирования) может быть много, и они не всегда размещаются в конце листинга. Для выхода из программы достаточно просто из любого места вы-звать завершающую процедуру. Первым языком процедурного программирования стал язык Пас-каль (Pascal). Это не значит, что на нем нельзя писать программы методом алгоритмического программирования, просто для проце-дурного программирования он подходил лучше, чем любой другой язык своего времени. Вскоре появился другой популярный язык процедурного программирования - СИ (С). Все первые языки, предназначенные для создания баз данных (Clipper, dBASE II, Fox-Pro, Paradox и мн. др.), тоже были рассчитаны на процедурное про-граммирование. Средствами процедурного программирования была создана ос-новная масса программ 70-80 гг. XX в. Большинство программ для MS-DOS (текстовых редакторов, бухгалтерских систем, баз данных и т. п.), используемых и по сей день, тоже были созданы этим прие-мом. Так же создавалось и большинство компьютерных игр для MS-DOS вплоть до начала 90-х гг. Усложнение подпрограмм. С развитием процедурного програм-мирования программисты поняли, какую огромную роль имеют подпрограммы. Неожиданно выяснилось, что программы самых разных классов - от служебных до игровых, могут быть очень по-хожи по структуре, а различаются лишь содержанием подпрограмм. Тогда программисты стали пытаться сделать подпрограммы такими, чтобы их можно было использовать многократно в разных проек-тах. Отдельные процедуры и функции стали приобретать такую мощь, что одним вызовом процедуры можно было выполнить сложнейшие действия, для которых раньше требовались недели программирования. Типизация подпрограмм. Чем мощнее становились процедуры и функции, тем выше был соблазн стандартизовать их так, чтобы без изменений использовать в разных программах. И тогда выяснилось, что одни подпрограммы подходят для этого хорошо, а другие - не очень. Нетрудно присоединить к любой программе процедуру или функцию, которая не обменивается с программой параметрами (ти-па RND), а просто выполняет какое-то действие, но чем больше па-раметров участвует в работе процедуры, тем труднее ее встроить в другую программу без специальной настройки. В итоге к середине 80-х гг. XX в. большинство компаний, вы-пускающих программы, занялись стандартизацией используемых процедур. Объектный подход. Чтобы подпрограммы стали стандартными и могли использоваться без переделок (но с поднастройками) повсе-местно, потребовалось изобрести для них классификацию и разра-ботать принципы их создания, документирования и применения. Эти принципы назвали объектно-ориентированным подходом. Достаточно сложные и мощные подпрограммы, поставлявшиеся вместе с языками программирования, стали считаться стандарт-ными объектами. Их можно было использовать в своих программах после несложной настройки параметров. Возьмем, к примеру, под-программу, выполняющую поиск слов в тексте. Ее можно исполь-зовать в разных программах, причем по-разному. При вызове с од-ними параметрами она способна искать заданные слова по содер-жащимся в них символам, при вызове с другими параметрами - по использованному шрифту, а при вызове с третьим набором пара-метров она не только найдет слова с ошибками, но и исправит их. Объекты стали считаться новыми, особыми типами данных, в которых сочетаются программный код и сами данные. Свойства объектов. С понятием объекта неразрывно связано по-нятие его свойств. Все объекты имеют свойства и различимы по своим свойствам. В итоге использование в программах готовых объектов стало очень простым: вызвали объект, настроили его свойства - получили готовый программный код. Использование готовых объектов с настраиваемыми свойствами позволило созда-вать программы без программирования. Если раньше для рисования правильного треугольника на экране программист должен был писать одну процедуру, а для рисования квадрата - другую, то при объектно-ориентированном подходе он может вызвать стандартный объект Shape (Фигура) и настроить его свойство, отвечающее за количество вершин. Более того, он может еще настроить такие свойства, как толщина, цвет и вид линии (сплошная, пунктирная и т. п.). Настройка свойств объектов выпол-няется простой операцией присвоения значений. То есть для про-граммиста свойства объектов - это обычные, хорошо знакомые пе-ременные, которым можно присваивать значения. Итак, объекты в программировании - это аналог подпрограмм. Свойства объектов - это аналог переменных, используемых в подпрограммах, а аналогом рабочего кода стали методы объектов. Методы объектов - это стандартные процедуры, которые свя-заны со своими объектами. Разным типам объектов соответствуют разные свойства и разные методы. Например, объекты, относящиеся к типу «окно», можно открывать и закрывать - это два типичных метода для окон. Объекты, относящиеся к типу «фигура», можно закрашивать разными цветами -за это отвечает метод, называе-мый заливкой. А с объектом «целое число» связаны знакомые нам методы сложения, умножения, деления и вычитания. Классификация объектов. Если бы объект был просто совокупно-стью методов и свойств, то ничего нового он программистам бы не дал - это была бы самая обычная стандартная подпрограмма с па-раметрами. Раньше каждая компания накапливала библиотеки про-цедур для себя, теперь появилась возможность всемирной стандар-тизации. Теперь, когда компания Borland или Microsoft включает в свою систему программирования класс объектов Frame, то любой программист в мире знает, что при его вызове на экране получится окно. Он также знает, как вызвать метод его закрытия или откры-тия, и каким свойствам надо присвоить значения, чтобы окно полу-чилось нужного размера. То же относится к другим объектам: Shape (Фигура), Table (Таблица) и др. Если сравнить программирование со строительством дома, то во времена процедурного программирования каждая фирма сама лепи-ла и обжигала для себя кирпичи (подпрограммы) и сохраняла в тай-не приемы работы с ними. С введением объектно-ориентированного подхода все программисты получили одинаковые заготовки (объек-ты) для кирпичей, труб, плит и панелей. Для их использования надо знать методы и свойства, связанные с каждым типом.

Наследование свойств и методов. Возможность классификации и стандартизации - не единственное достоинство объектно-ориентированного программирования. Важную роль сыграла также возможность наследования свойств и методов. Если бы все про-граммисты составляли свои программы только из заранее заготов-ленных объектов (стандартных классов), то все программы были бы удивительно похожи. С одной стороны, это хорошо, а с другой - плохо. Для служебных программ, например приложений Windows, это хорошо, потому что упрощается их изучение и освоение. Но для развлекательных программ это плохо: им требуется разнообразие. Но программист не обязан пользоваться только готовыми клас-сами объектов. Он может создавать свои объекты - для этого ему достаточно запрограммировать связанные с ними методы и подго-товить свойства. Более того, программист не должен делать это «с нуля». Он может взять какой-то готовый класс объектов и на его основе создать свой. Большинство методов и свойств ему не при-дется создавать - они наследуются автоматически. Конструирование вместо программирования. Создать программу, рисующую на экране красивое окно, весьма непросто, а использо-вать готовый объект Frame и настроить его свойства, чтобы окно было таким, каким надо, может каждый начинающий программист. После настройки свойств объекта он получает готовый программ-ный код длиной в десятки килобайт, хотя на самом деле присвоил всего лишь несколько значений переменным, выражающим свойст-ва объекта. Так благодаря объектно-ориентированному подходу программи-рование стало превращаться в конструирование программ из гото-вых блоков. Единственное, что остается для ручного программиро-вания, - запись строк, в которых свойства объектов получают нужные значения. Иногда программисты сталкиваются с тем, что для своих задач не находят готовых объектов. В этом случае им приходится дейст-вительно серьезно заниматься программированием, чтобы создать методы и описать свойства нестандартных объектов. Впрочем, и эта задача значительно упрощается, если программист не изобретает новый объект «с нуля», а использует для его создания другой, ранее созданный объект. Таким образом, объектно-ориентированный подход позволил создавать новые программы путем перенастройки старых. Это позволило значительно поднять производительность труда про-граммистов и перейти во второй половине 90-х гг. к созданию про-грамм размером в миллионы строк кода. Наглядный пример - опе-рационная система Windows. Над первой версией (Windows 95) компания Microsoft работала много лет. Сегодня новые версии Win-dows выходят каждый год: 1998 Windows 98 1999 Windows 98 SE 2000 Windows 2000, Windows Me 2001 Windows XP (версии Ноте и Professional) 2002 Windows XP (Server и Advanced Server). Объектно-ориентированные языки программирования. Переход к объектно-ориентированному программированию в середине 80-х годов XX в. состоялся не сразу, а только после создания языков программирования нового поколения. Вместе с новой концепцией программирования были разработаны и новые компиляторы, и биб-лиотеки объектов. Одним из первых объектно-ориентированных языков стал язык СИ++ (C++). Язык Паскаль (Pascal) развился в язык Object Pascal. Появились и другие объектно-ориентированные языки программирования, например язык Java, разработанный кор-порацией Sun Microsystems, - ныне он широко используется при создании приложений, работающих в Интернете. Визуальное программирование В операционной системе Win-dows немало стандартных элементов управления, таких как окна, меню, списки, переключатели, флажки и пр. Стандартны приемы работы с мышью: наведение, щелчок, двойной щелчок и прочие. Эти элементы и приемы управления стали настолько стандартными, что их унаследовало и большинство программ, написанных для ра-боты с Windows. Стандартизация графических элементов управле-ния и приемов работы с ними с помощью мыши позволила вновь изменить стиль программирования и перейти к так называемому визуальному программированию.

Системы визуального программирования. Переход к визуальному программированию наметился еще во времена операционной среды Windows 3.1 (1992-1994), но подлинное развитие новый метод по-лучил только после 1995 г., когда стали появляться специальные программные комплексы, получившие название систем визуального программирования. По-английски они также называются RAD-системами (RAD - Rapid Application Development - среда быст-рой разработки приложений). Языку Object Pascal соответствует система Delphi, языку Бейсик (Basic) - система Visual Basic, языку СИ ++ (C++) - система C++ Builder, языку Java - система Java Builder. Принципы визуального программирования. До визуального про-граммирования программист использовал в работе печатные спра-вочники или программные справочные системы, в которых были описаны правила создания объектов из стандартных классов, при-ведены основные методы и свойства объектов и правила их исполь-зования и настройки. Визуальное программирование позволило во многих случаях отказаться от справочников и создавать объекты с помощью мыши, что и удобно, и наглядно. Общий принцип визу-ального программирования такой. 1. Стандартные классы объектов, например такие, как окна, кнопки, списки, поля, переключатели, флажки и мн. др., представлены в системе визуального программирования в ви-де значков на инструментальной панели. Эти значки называ-ются компонентами. То есть компоненты - это инструменты для создания объектов. 2. Для вставки объекта в свою программу программист выбира-ет нужный компонент, после чего с помощью мыши помеща-ет в заготовку окна (она называется формой) заготовку буду-щего элемента управления. 3. Поместив объект на форму, программист щелчком мыши вы-зывает окно свойств этого объекта и настраивает их. После настройки объект приобретает размеры, местоположение, имя, надпись и т. п. Свойства могут иметь внутренние свой-ства, например, надпись на кнопке может иметь заданный цвет, шрифт, размер и т. п.

4. Точно так же с помощью мыши программист может вызвать окно кода, связанного с объектом, и выполнить настройку ме-тодов объекта. Например, он может сделать так, чтобы при открытии окна раздавался звук, а перед его закрытием возникало предупреждающее сообщение. 5. После размещения всех необходимых элементов управления на форме, настройки их свойств и подключения необходимых методов программа готова. С помощью мыши выдается команда на ее трансляцию. Системы Delphi и C++ Builder выполняют компи-ляцию, а система Visual Basic - интерпретацию. Событийное программирование Существует три стиля управле-ния: командный, диалоговый и пакетный. Это относится не только к программированию, а вообще к любому управлению. Подобие диалоговой работы впервые возникло во второй половине 60-х гг., ко-гда в больших ЭВМ появились многозадачные операционные сис-темы, работавшие в режиме разделения времени. Компьютер одно-временно работал с десятками пользователей, мгновенно пере-ключаясь между ними и их задачами. Каждый пользователь пола-гал, что компьютер работает только с ним. Тогда впервые программисты стали общаться с ЭВМ напрямую. Их рабочие места осна-стили терминалами (монитор + клавиатура). Но диалог происходил не внутри программы, а на уровне операционной системы, то есть либо перед исполнением программы, либо после него. Получив ре-зультат расчета, программист мог повторить расчет с другими дан-ными или внести изменения в программу и вновь запустить ее ис-полнение. До середины 70-х гг. в языках программирования не бы-ло средств для организации диалога. Такие языки появились только после создания персональных компьютеров. Все диалоговые возможности компьютера основаны на том, что программа работает в некоем бесконечном цикле, в ходе которого бесконечно опрашивает внешние устройства управления (клавиату-ру, мышь, модем и др.), а после получения отклика входит в другой цикл и опять что-то опрашивает. Вплоть до конца 80-х гг. програм-мисты отводили сотни строк своих программ реализации этих цик-лов. В итоге прием стал настолько стандартным, что его передали операционной системе, и начиная с Windows 3.0 программист мог не опрашивать устройства управления, а ждать сигнала от Windows. Для операционной системы Windows нажатие клавиш на клавиату-ре, перемещение мыши и нажатие ее кнопок, открытие и закрытие окон, поступление сигналов от внутренних часов, модема, принтера и прочих периферийных устройств, называются событиями. С раз-ными объектами Windows связаны разные события. Например, для окна событиями являются его открытие и закрытие; для текстового поля - его изменение, а для командной кнопки - щелчок мышью, совершенный над ней. При получении от операционной системы сигнала о том, что произошло некое событие, связанное с объектом, автоматически запускается подпрограмма-метод, являющаяся обработчиком данного события. В ней программист может записать ал-горитм действий, которые он хочет выполнить при наступлении со-бытия. Выше мы говорили о том, что с объектами связаны две характеристики: свойства и методы. Теперь мы можем добавить третью - события, связанные с объектами. В качестве реакции на событие объект автоматически запускает подпрограмму-метод, пред-варительно подготовленную программистом, а она, в свою очередь, может вызвать изменение свойств данного объекта или иных объек-тов, а также вызвать другие события, связанные с другими объектами и т. д. Последовательность исполнения программы при ис-пользовании событийного механизма зависит от порядка, в котором наступают те или иные события, и от реакции программных объектов на эти события. Практически все прикладные программы Win-dows основаны на событийном механизме. Действие инструментов рисования в программе Paint зависит от того, на каком из них произошел щелчок (какой инструмент избрал пользователь) и как он управляет мышью в ходе рисования. Действие процедур формати-рования в программе WordPad также зависит от того, какие экран-ные элементы управления зафиксировали событие. Событийный механизм не является свойством тех или иных языков программи-рования - это свойство (и особенность) операционной системы компьютера. При объединении событийного механизма, предостав-ляемого операционной системой, и объектно-ориентированного подхода, предоставляемого языком программирования, образуется отличная возможность для простой реализации диалога с компьютером. Это сочетание и называют событийным программировани-ем.