- •Н.Е. Сапожников
- •Севастополь
- •Оглавление
- •Список сокращений
- •Предисловие
- •Введение
- •Глава 1 Информация: ресурс, продукт, услуга
- •Глава 2 Информация как экономическая категория
- •Глава 3 Информационный рынок
- •Глава 4 Материальные носители информации
- •Глава 5 Языки программирования для решения экономических задач
- •Глава 6 Современное программное обеспечение информационных систем
- •Глава 7 Кодирование и классификация экономической информации
- •Раздел 2. «Национальные единицы измерения, включенные в ескк» содержит дополнительные национальные единицы измерения, отсутствующие в международных классификациях.
- •Глава 8 Проектирование информационных систем
- •Глава 9 Стандартизация информационных экономических систем
- •Глава 10 Новые направления развития экономических информационных систем
- •Глава 11 Сбор и анализ данных и прогнозирование тенденций
- •Глава 12 Выработка стратегии управления
- •Глава 13 Обзор возможностей пакета Marketing Expert
- •Глава 14 Построение и анализ имитационных моделей
- •Глава 15
- •Глава 16 Оптимальное планирование модельных экспериментов
- •Глава 17 Обработка и анализ результатов моделирования
- •Глава 18 Обзор программных пакетов matlab и jpssw
- •Глава 19 Сетевые информационные технологи
- •Глава 20 Защита информации в ивс
- •Глава 21
- •Решение задач анализа экономических
- •Зависимостей и линейной оптимизации
- •С применением пакета ms Excel
- •Глава 22 Анализ рынка экономических информационных управляющих систем
- •Глава 23 Принципы построения икис «галактика»
- •Решения и ответы на контрольные вопросы
- •Литература
- •Глоссарий
- •Николай Евгеньевич Сапожников
Глава 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. Что Вы знаете о структурном программировании?
