Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Н.Е.Сапожников_Информационные системы в экономике_УЧЕБНОЕ ПОСОБИЕ.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Глава 5 Языки программирования для решения экономических задач

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

Революционный скачок в развитии и популяризации ИТ за последние 20—25 лет напрямую связан с прорывом в аппаратном обеспечении — в переходе от ЭВМ группового пользования, до­ступных узкому кругу специалистов, к персональным ком­пьютерам (ПК). Сегодня ПК по возможнос­тям значительно превосходят практически все ЭВМ 70—80-х годов, имеют выход во внешний мир и вмес­те с тем обладают интеллигентным и дружественным сис­темным и прикладным программным обеспечением. Имен­но существенное развитие программного обеспечения, став­шее доступным на уровне интерфейса любому пользовате­лю, является второй основной причиной массового вне­дрения ИТ. Например, сегодня задача копирования файла решается настолько просто, что ее решит любой начинаю­щий пользователь компьютера. Но еще в середине восьми­десятых годов прошлого века для выполнения подобной операции требовалось привлечь специалиста, который со­ставил бы специальный пакет-задание для вызова одной из системных утилит (например, IEFUJV, IEBCOPY или IEBGENER), состоящий из 10—15 системных управляю­щих команд.

Массовая разработка и внедрение современных инфор­мационных технологий была бы невозможна без карди­нального изменения инструмента разработки ИТ — про­граммирования.

Программирование в машинных кодах и ассемблере

Любая программа для ЭВМ - системная или приклад­ная — воспринимается (распознается) процессором толь­ко в том случае, если она состоит из специальных ко­манд, коды которых известны процессору определенного типа. Команды записаны в памяти компьютера в специ­альном формате. Каждая команда состоит из операционной и адресной частей. В первой из них находится позиционный двоичный код, определяющий требуемое от процессора действие (сложение, вычитание и т.д.). Во второй – адресной части команды, также в виде двоичного позиционного кода, находятся адреса данных (операндов), над которыми это действие необходи­мо выполнить, либо сами операнды. В вольном переводе на русский язык не­которую команду можно, например, интерпретировать так: сложить два числа, находящиеся в памяти по ад­ресам 100 и 120.

Разные типы ЭВМ имеют отличные друг от друга спосо­бы кодировки команд. Так, на персональных IВМ-совместимых компьютерах некоторая команда сложения в двоичном коде может иметь вид: 0000001111000011D или в шестнадцатиричном коде 03С3H . А на «древних» компью­терах типа М-220 команда сложения двух чисел могла выглядеть так:

001 00000001100100 00000001111000 00000001111011.

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

Вторым недостатком программирования в кодах явля­ется сильное дробление программы. Дело в том, что логи­чески команды процессора достаточно примитивны и обу­славливают выполнение простейших операций. Так, про­граммирование несложной формулы x=(a+b)(c+d) требо­вало задания серии команд типа:

- сложить а и b, промежуточный результат записать в ,

- сложить c и d, промежуточный результат записать в ,

- умножить на , результат записать в х.

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

Однако программированию в кодах присущи и значи­тельные плюсы. Программист управляет всеми ресурсами компьютера, полностью контролирует текущее состояние ЭВМ, выбирает наиболее оптимальный код команды. Са­мые короткие по объему и наиболее быстрые по выполнению программы или их фрагменты разрабатываются и се­годня в кодах. Для облегчения наглядности программы в кодах разработаны специальные символические языки — ассемблеры. В них каждой команде компьютера сопостав­ляется определенный символьный код, являющийся со­кращением «родных» для человека слов. Специальная программа (она также называется ассемблером) переводит (транслирует) «непонятную» для компьютера (но более понятную для человека) символьную строку в коды ком­пьютера. Так, приведенные выше коды команд сложения на ассемблере могли выглядеть так: ADD АХ, BX (сло­жить числа из регистров АХ и ВХ и результат запомнить в АХ). При программировании на ассемблере программист мо­жет оперировать не с адресами памяти, в которых хра­нятся данные, а с их символическим представлением. На­пример, вначале ассемблеру специальной инструкцией со­общается, что по такому-то адресу хранится число, на­званное для программиста как . Далее программист не заду­мывается над тем, по какому адресу находится соответ­ствующее число, но просто использует его имя .

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

Языки программирования высокого уровня для больших ЭВМ

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

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

Первые алгоритмические языки назывались Algol (со­кращение от Algorithmic Language - язык алгоритмов) и Fortran (сокращение от Formula Translation — трансля­тор формул). Эти языки обладали рядом сходных воз­можностей. К ним относятся:

- простота записи математических выражений;

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

- использование массивов, позволяющие программировать операции над матрицами и векторами;

- использование процедур (в Fortran'e—подпрограмм) и функций, позволяющих выделить в отдельный блок некоторый логически законченный алгоритм над абстрактными данными (формальные параметры) и многократно обращаться к ним с указанием конк­ретных данных (фактические параметры). Так, на­пример, для многократного использования тригоно­метрических функций следует запрограммировать алгоритм их вычисления от абстрактного аргумента (например, X), а затем многократно их использо­вать, указывая, что на место абстрактного X под­ставляются конкретные данные - Y, Z, Fi, 30 и т.д. Или запрограммировать процедуру обращения квад­ратной матрицы. Алгоритм записывается для неко­торой абстрактной матрицы (скажем, А), а затем при их вызове указывается конкретная матрица. Кроме общих моментов, эти языки имели отличия. Мало существенным является отличие в синтаксисе, т.е. в раз­ной форме записи аналогичных инструкций — циклов, ус­ловных операторов и т.д. Существенным оказалось нали­чие двух принципиальных отличий:

- способа управления объемом резервируемой под данные программы памяти;

- особой структурой организа­ции программы на Фортране.

Модульное программирование

Увеличение роста специализированных библиотек оп­ределило дальнейшее развитие концепции и языков про­граммирования. Этот стиль получил название модульного программирования. Лучшие аспекты Алгола и Фортрана (динамическое распределение памяти и модульная струк­тура программ), а также множество других положитель­ных особенностей были заложены в языке PL/1 (сокраще­ние от Programming Language — язык программирова­ния). Его стандарт был разработан в конце 60-х годов, а массовое использование на «больших» ЭВМ IBM-360/370 (аналог в СССР — ЕС ЭВМ) началось со второй половины 70-х и продолжалось минимум 10—15 лет. ПЛ/l в то вре­мя был наиболее развитым языком программирования [14]. Наряду с модульной структурой, динамическим распреде­лением памяти, укрупненными операциями над массива­ми, работой с текстовыми данными, в него были включе­ны новые возможности: переменные файлового типа, ра­бота с адресами памяти (тип pointer - указатель), объеди­нение в одно целое данных разных типов — структуриза­ция данных. Развитие концепции модульного программи­рования обусловило возможность объединения в одну про­грамму модулей, написанных на разных языках програм­мирования. Одни модули могли быть написаны на ПЛ/l, другие - на Фортране, третьи — на ассемблере. При сты­ковке модулей важно было лишь корректно передать па­раметры, учитывая специфику реализации механизма их передачи в разных языках.

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

В свою очередь, развитие аппаратных средств обусло­вили изменение отношения к компьютерной технике в об­ществе. ЭВМ и программное обеспечение из инструмента научных исследований превращались в удобные инстру­ментальные средства управления, проектирования, про­гнозирования. Наблюдается стремительное увеличение спроса на ЭВМ и на новые прикладные программные про­дукты. Так, на рубеже 70-х - 80-х годов фирма IBM не могла удовлетворить все заказы на поставку больших ЭВМ. Объем заказов превышал возможности производства на десять лет вперед. Также и спрос на программистов суще­ственно превышал объем их подготовки.

Структурное программирование

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

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

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

Если исправлены все синтаксические ошибки и ошибки компоновки, то программа начинает выполняться (стадия Run). Однако эта стадия может быть прервана недопусти­мой операцией (например, делением на ноль), и в этом случае говорят об ошибках времени выполнения {RunTime Errors). Либо программа досчитала до конца, но получен­ные результаты оказываются неверными. Вызвать это мо­гут ошибки алгоритма, либо ошибки организации межмо­дульных связей, ошибки преобразования типов данных, либо простые описки (например, пропущен ноль при за­писи числа 100 и программа использовала в вычислениях 10). Ошибки времени выполнения обнаруживаются реше­нием серии тестовых примеров {прогонка программы), ре­зультат для которых известен заранее. Как правило, вре­мя, затраченное на поиск подобных ошибок, существенно превышает время написания самой программы и исправ­ления синтаксических ошибок. Развитие концепции про­граммирования тесно связано с проблемой снижения бра­ка при написании программы.

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

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

Язык структурного программирования должен предо­ставлять возможность конструирования собственных ти­пов данных. На низшем уровне стоят предопределенные в языке фундаментальные структуры (например: скаляр­ные типы, запись, массив и множество). Из фундамен­тальных структур, как из молекул, строят усложненные структуры. Переменные фундаментальной структуры мо­гут менять только значение, сохраняя тип или множество допустимых значений и занимаемый ими размер. Услож­ненные структуры характеризуются изменением не только значения, но и самой формы представления, составом вхо­дящих в них фундаментальных структур. Динамическое управление памятью реализуется на уровне указателей, и динамические данные объединяются в древовидную струк­туру (деревья).

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

Концепция структурного программирования предпола­гает не только использование специальных языков и при­менения определенного стиля программирования. В пер­вую очередь это — философия программирования, которая затрагивает и такой аспект, как методика обучения про­граммистов. Отмечается, что программирование представ­ляет собой обширную и разнообразную деятельность, час­то требующей сложной умственной работы. Неверно счи­тать, что программирование можно свести к использова­нию готовых рецептов, основанных на систематическом описании простейших блоков. У учеников необходимо развивать способность творчески мыслить, и здесь чрезвы­чайно важна роль учителя, показывающего, как он дела­ет то-то и то-то. Творчество не подвластно канонам, мето­дикам и технологиям. В качестве метода обучения прини­мается тщательный выбор и рассмотрение характерных примеров. Необходимо рассматривать сложные и длинные программы, какие часто и встречаются на практике и лучше всего подходят для выявления того неуловимого, но важ­ного свойства, которое называется стилем программиро­вания. Разбор длинных программ служит упражнением в искусстве их чтения, которое не менее важно, чем умение писать программы.

Контрольные вопросы и задачи

5.1. Назовите и кратко охарактеризуйте части команды программы.

5.2. Основой для программы функционирования УОДИ является ____ ; дайте его определение.

5.3. Что понимается под программированием в кодах?

5.4. Что Вы знаете о языке ассемблер?

5.5. Какие языки программирования называют машинно-независи-мыми?

5.6. Каким образом осуществляется «перевод» программы, написанной на алгоритмическом языке в объектный код, понятный компьютеру?

5.7. Что понимается под модульным программированием и отдельным модулем?

5.8. Что Вы знаете о структурном программировании?