Файл: Блок Основы систем программирования Тема Основы алгоритмизации и программирования. Системы программирования.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.04.2024
Просмотров: 49
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Название дисциплины
Тема 1. ………………….
Блок 1. Основы систем программирования
Тема 1. Основы алгоритмизации и программирования. Системы
программирования. Виды языков программирования
Технология программирования
Цели изучения темы:
ознакомить студентов с основными понятиями и механизмами процесса алгоритмизации;
сформировать базу знаний о языках программирования, их видах, особенностях и сферах применения.
Задачи изучения темы:
сформировать знания о принципах построения наиболее часто встречаемых алгоритмов.
В результате изучения данной темы Вы будете
знать:
основные типы алгоритмов и их использование для решения вычислительных, инженерных задач;
методы проектирования и производства программного продукта, и средства описания алгоритмов;
основные методологии программирования.
уметь:
использовать рабочую среду программирования для выбора эффективного и современного метода решения задач;
классифицировать языки программирования по видам и механизму работы.
владеть:
основами алгоритмизации и программирования.
Учебные вопросы темы:
1. Понятие алгоритма
2. Системы программирования
Основные термины и понятия, которые Вам предстоит изучить:
алгоритмизация, алгоритм, дискретность, детерминированность,
псевдокод, машинный язык, графический алгоритм
Вопрос 1. Понятие алгоритма
Практически все в нашем мире подчиняется каким-то законам и правилам. Современная наука не стоит на месте, благодаря чему человечеству известна масса формул и алгоритмов, следуя которым, можно рассчитать и воссоздать множество действий и строений, созданных природой, и воплотить в жизнь идеи, придуманные человеком
Большинство действий, которые мы выполняем в течение своей жизни, требуют соблюдений ряда правил. От того, насколько верное представление имеет человек о том что, как и в какой последовательности он должен сделать, зависит качество и результат выполнения поставленных перед ним задач
Алгоритмизация – это процесс создания алгоритма решения задачи.
Алгоритм – это точное и понятное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи. То бишь определяющее вычислительный процесс, ведущий от варьируемых исходных данных к искомому результату.
В алгоритме обязательно должны быть предусмотрены все ситуации, которые могут возникнуть в процессе решения комплекса задач. Само слово алгоритм происходит от имени арабского математика аль
Хорезми. Его полное имя было Абу Абдуллах (или Абу Джафар)
Мухаммад ибн Муса аль Хорезми. Он использовал индийскую позиционную систему счисления с нулем и в своих трудах сформулировал правила четырех арифметических действий над многозначными числами. Эти действия и стали впоследствии называть алгоритмами
Создание алгоритма требует творческого подхода, поэтому новый список последовательных действий может создать только живое существо. А вот для исполнения уже существующих инструкций фантазию иметь не обязательно, с этим справится даже бездушная техника.
Отличным примером точного исполнения заданной инструкции является пустая микроволновая печь, которая продолжает работать, несмотря на отсутствие пищи внутри нее.
Субъект или объект, которому не обязательно вникать в суть алгоритма, называется формальным исполнителем. Человек тоже может стать формальным исполнителем, однако в случае нерентабельности того или иного действия мыслящий исполнитель может все сделать по-своему. Поэтому основными исполнителями являются компьютеры, микроволновые печи, телефоны и другая техника. Понятие алгоритма в информатике имеет самое важное значение. Каждый алгоритм составляется с расчетом на конкретного
субъекта, с учетом допустимых действий. Те объекты, к которым субъект может применить инструкции, составляют среду исполнителя
Составляя алгоритм для какого-нибудь автоматического устройства, мы должны принимать во внимание следующее:
Первое – это кто исполнитель, тот, кто будет работать по нашему алгоритму. Какие действия он может выполнять, какие команды и в каком виде мы можем ему отдавать. Исполнителем, в принципе, может быть кто или что угодно: человек, компьютер, станок с ЧПУ, автоматический луноход и т. д.
Второе – это как скомбинировать команды, чтобы исполнитель сделал то, что от него требуется. Это самый трудный этап в составлении алгоритма, использовать набор команд, понятных исполнителю, какие действия и в каком порядке выполнять.
Третье – это форма записи алгоритма. Человек понимает смысл сказанной фразы по множеству неуловимых оттенков и интонаций.
Одну и ту же мысль мы можем выразить различными словами.
Компьютер же понимает алгоритм буквально («Хозяин, тебе дрова не нужны?»), для него каждая конкретная команда всегда имеет один и тот же смысл. Поэтому алгоритмы для компьютеров записываются по строгим, заранее определенным правилам, чтобы их нельзя было истолковать по-разному.
Исполнителем алгоритма предстает некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, которая способна выполнить действия, предписываемые алгоритмом.
Для характеристики исполнителя используют несколько понятий:
• среда;
• система команд;
• элементарные действия;
• отказы.
Среда (или обстановка) представляет собой «место обитания» исполнителя.
Любой из исполнителей может выполнять команды только из некоторого строго заданного списка, который является системой
команд исполнителя. Для каждой команды задаются условия применимости (в каких состояниях среды может быть выполнена команда) и приводятся результаты выполнения команды.
После вызова команды исполнитель производит соответствующее
элементарное действие.
Может возникнуть и отказ исполнителя в случае, если команда вызывается при недопустимом для нее состоянии среды. Чаще всего исполнитель ничего не знает о цели алгоритма. Он выполняет все предложенные ему действия, не задавая вопросов «почему» и «зачем».
В информатике универсальным исполнителем алгоритмов является компьютер.
К основным свойствам алгоритмов относятся:
1) понятность для исполнителя – исполнитель алгоритма должен знать, как его выполнять;
2) дискретность (прерывность, раздельность) – алгоритм должен представлять процесс решения задачи как последовательное исполнение простых (или ранее определенных) шагов (этапов); т.е. обязательна возможность разбиения алгоритма на отдельные элементарные действия, которые можно реализовать на ЭВМ и результат их выполнения определен и понятен
3) детерминированность (определенность) – каждое правило алгоритма должно быть четким, однозначным и не оставлять места для ее неоднозначного толкования и неопределенного исполнения.
Это свойство обеспечивает выполнение алгоритма механически, не требуя никаких дополнительных указаний или сведений о решаемой задаче;
4) результативность (или конечность) – алгоритм должен приводить к решению задачи за конечное число шагов; т.е. для любого допустимого набора исходных данных он должен через определенное число шагов завершить работу.
5) массовость – алгоритм решения задачи производится в общем виде, т. е. его можно будет применять для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из определенной области, которая называется областью применимости алгоритма. Хотя есть мнение, что последний пункт относится не к алгоритмам, а ко всем математическим методам в целом.
Часто в школах, чтобы дать детям более понятное описание алгоритмов, учителя приводят в пример приготовление пищи по кулинарной книге, изготовление лекарства по рецепту или процесс мыловарения на основе мастер-класса. Однако, учитывая второе свойство алгоритма, в котором говорится о том, что каждый пункт алгоритма должен быть настолько понятным, чтобы его мог выполнить абсолютно любой человек и даже машина, можно прийти к выводу что любой процесс, требующий проявления хоть какой-то фантазии, алгоритмом назвать нельзя. А готовка и рукоделие требуют определенных навыков и хорошо развитого воображения.
Алгоритм должен давать строгую и четкую последовательность действий, поэтому для него существенным является способ его задания. От исполнителя требуется лишь четкое выполнение каждого действия. Мы не должны объяснять ему, для каких целей предназначается алгоритм.
Возможности любого исполнителя всегда ограничены. Поэтому, прежде чем составлять алгоритм решения задачи, нужно узнать, какие действия исполнитель может выполнить. Эти действия называются допустимыми действиями исполнителя. Для решения одних и тех же задач исполнители с более «бедным» набором допустимых действий требуют более сложных подробных алгоритмов.
Алгоритм можно записывать разными способами.
Способы записи алгоритма:
1.
С помощью рисунка, (например, процесс подключения монитора),
2.
На естественном языке - построчно, каждая команда - с новой строки
(последовательность проявления фотопленки, последовательность склеивания поверхностей на тюбике с клеем и т. д.
3.
Использование псевдокода – полуформализованные описания алгоритмов на некотором условном алгоритмическом языке, которые включают в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и др.
Псевдокод занимает промежуточное место между естественным и формальным языками. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций (например, школьный АЯ).
4.
Графическое представление – блоксхема.
5.
Программное – тексты на языках программирования
Словесный способ
записи алгоритмов является описанием последовательных этапов обработки данных. Алгоритм может быть задан в произвольном изложении на естественном языке. Например, алгоритм нахождения наибольшего общего делителя двух натуральных чисел можно представить как следующую последовательность действий:
1. задание двух чисел;
2. если числа равны, то выбор любого из них в качестве ответа и остановка, в противном случае – продолжение выполнения алгоритма;
3. определение большего из чисел;
4. замена большего из чисел разностью большего и меньшего из чисел;
5. повтор алгоритма с шага 2.
Приведенный алгоритм используется для любых натуральных чисел и должен приводить к решению поставленной задачи.
Словесный способ не имеет широкого распространения, так как обладает некоторыми недостатками:
• данные описания строго не формализуемы;
• отличаются многословностью записей;
• допускают неоднозначность толкования отдельных предписаний.
Графический способ представления алгоритмов оказывается более компактным и наглядным по сравнению со словесным. При данном виде представления алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению некоторого числа действий.
Для графического представления алгоритм использует изображение в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Это графическое представление называется
схемой алгоритма, или блок-схемой.
В блок-схеме каждый из типов действий (ввод исходных данных, вычисление значений выражений, проверка условий, управление повторением действий, окончание обработки и т. п.) соответствует геометрической фигуре, представленной в виде блочного символа.
Блочные символы соединены линиями переходов, которые определяют очередность выполнения действий.
Псевдокод является системой обозначений и правил, которая предназначена для единообразной записи алгоритмов. Он занимает промежуточное место между естественным и формальным языками. С одной стороны, псевдокод похож на обычный естественный язык, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, благодаря чему запись алгоритма приближается к общепринятой математической записи.
В псевдокоде не применяются строгие синтаксические правила для записи команд, которые присущи формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде чаще всего имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном
языке. Например, в псевдокоде, также как и в формальных языках, существуют служебные слова, смысл которых определен раз и навсегда. Их выделяют в печатном тексте жирным шрифтом, а в рукописном тексте подчеркивают. Единый или формальный подход к определению псевдокода не существует, поэтому используются различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций.
Программная
форма
представления
алгоритмов
иногда характеризуется некоторыми структурами, состоящими из отдельных базовых (основных) элементов. При данном подходе к алгоритмам изучение основных принципов их конструирования следует начинать с этих базовых элементов. Их описание осуществляется с использованием языка схем алгоритмов и алгоритмического языка.
Графический алгоритм — понятие, подразумевающие под собой разложение действий, которые нужно выполнить для решения определенной задачи, по определенным геометрическим фигурам.
Графические схемы изображаются не как попало. Для того чтобы их мог понять любой человек применяются чаще всего блок-схемы.
Также блок-схемы изображаются в соответствии с ГОСТ-19701-90 и
ГОСТ-19.003-80. Графические фигуры, применяемые в алгоритме, делятся на:
Основные. Основные изображения применяются для обозначения операций, нужных для обработки данных при решении задачи.
Вспомогательные. Вспомогательные изображения нужны для обозначения отдельных, не самых важных, элементов решения задачи
В графическом алгоритме геометрические фигуры, используемые для обозначения данных, называются блоками. Все блоки идут в последовательности "сверху вниз" и "слева направо" — это правильное направление потока. При правильной последовательности линии, соединяющие между собой блоки, не показывают направление. В остальных случаях направление линий обозначается с помощью стрелок. У правильной схемы алгоритма не должно быть больше одного выхода из обрабатывающих блоков и менее двух выходов из блоков, отвечающих за логические операции и проверку выполнения условий
Название символа
Обозначение и пример заполнения
Пояснение
Процесс
Вычислительное действие или
последовательность действий
Решение
Проверка условий
Модификация
Начало цикла
Предопределенный процесс
Вычисление по подпрограмме, стандартной подпрограмме
Вывод-ввод
Вывод-ввод в общем виде
Пуск остановка
Начало, конец алгоритма, вход-выход в подпрограмму
Документ
Вывод результатов на печать
Вопрос 2. Системы программирования
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов –
языков программирования. Смысл появления такого языка – оснащенный набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм.
Языки программирования – это системы символов и правил их сочетания, предназначенные для взаимодействия человека со сложными машинами. Существуют сотни таких организованных систем, выполняющих различные функции. Чтобы сориентироваться в этом многообразии, специалисты создают общие классификации языков программирования, основанные на том или ином характерном признаке.
Языки программирования могут быть сгруппированы по десяткам различных признаков. Они являются принципиально важными или имеют прикладное значение. Наблюдается сильная зависимость классификации языков программирования от истории развития. С годами технологии усложнялись и кардинально изменялись, на первый план выходило удобство программиста, появлялись эффективные алгоритмы, сложные команды и новые уровни абстракции.
Основные классификации языков программирования по видам и механизму работы базируются на следующих параметрах:
Особенности лексики и грамматики в совокупности с уровнем абстракции и степенью удобства для человека.
Базовая концепция и методология составления алгоритмов.
Способ представления данных.
Организация процесса взаимодействия с машиной, механизм исполнения программ.
Область жизни, в которой применяется язык.
Историческая эпоха, в которую языковая система была сформирована.
Составить четкую классификацию языков и систем программирования нельзя, но возможно разделить и систематизировать их по принципиально важным признакам
Удобство для человека
Инструкции, написанные на машинном языке, понятны компьютеру, но крайне неудобны для человека. В них трудно разобраться, их практически невозможно быстро изменить или составить с их помощью сложный алгоритм. Для повышения эффективности программисты поднялись на новые уровни абстракции и научили машину принимать более человекопонятные инструкции и самостоятельно переводить их в машинный код. Рассмотрим классификацию и особенности языков программирования разного уровня:
Машинный код. Это тоже язык программирования, на котором при должной подготовке можно написать инструкцию.
Низкий уровень. По-настоящему низкоуровневыми являются языки ассемблера, которые используют нативные машинные команды, закодированные с помощью мнемонических кодов.
Средний уровень. Системы программирования этой группы могут считаться и низко- и высокоуровневыми, в зависимости от конкретных представлений о степень абстракции. Сюда можно отнести C и C++.
Высокий уровень. Эти языки позволяют создавать сложные алгоритмы, но требуют дополнительной обработки перед выполнением, поэтому сгенерированный ими код менее эффективен и выполняется медленнее.
Сверхвысокий уровень. Эта немногочисленная группа характеризуется появлением сверхмощных команд и операторов.
Сюда можно отнести Алгол-68
Особенностью языков низкого уровня является их машинозависимость. Они тесно привязаны к особенностям организации конкретного типа ЭВМ, но в целом похожи друг на друга.
Машинный язык — единственный язык, понятный ЭВМ. Он реализуется аппаратно: каждую команду выполняет некоторое электронное устройство. Программа на машинном языке представляет собой последовательность команд и данных, заданных в цифровом виде.
Данные на машинном языке представлены числами и символами.
Операции являются элементарными и из них строится вся программа.
Ввод программы в цифровом виде производился непосредственно в оперативную память.
Естественно, что процесс программирования был очень трудоемким, разобраться в программе даже автору было довольно сложно, а эффект от применения ЭВМ был довольно низким.
Этот этап в развитии языков программирования показал, что программирование является сложной проблемой, трудно поддающейся автоматизации, но именно программное обеспечение определяет в конечном счете эффективность применения ЭВМ. Поэтому на всех последующих этапах усилия направлялись на совершенствование интерфейса между программистом и ЭВМ языка программирования.
Стремление программистов оперировать не цифрами, а символами, привело к созданию мнемонического языка программирования, который называют ассемблером, мнемокодом, автокодом. Этот язык имеет определенный синтаксис записи программ, в котором, в частности, цифровой код операции заменен мнемоническим кодом.
Языки низкого уровня обеспечивают:
высокую скорость выполнения и максимальную компактность создаваемых программ;
прямое взаимодействие с аппаратными ресурсами;
полный контроль над памятью
Основные недостатки низкоуровневых языков:
для каждого типа ЭВМ необходимо использовать определенную систему команд, зависящую от особенностей функционирования машины;
сложность и низкая скорость процесса программирования;
высокая вероятность появления ошибок, которые сложно отследить;
отсутствие мобильности программ, невозможность запустить их на ЭВМ другого типа.
Высокоуровневые системы программирования не привязаны к определенной машинной системе команд и могут выполняться на любом компьютере. Благодаря высокому уровню абстракции они могут себе позволить использовать различные концепции и методологии в составлении инструкций.
Поэтому классификация языков программирования высокого уровня очень обширна и сложна.
Принципиальными отличиями языков высокого уровня от языков низкого уровня являются:
использование переменных;
возможность записи сложных выражений;
расширяемость типов данных за счет конструирования новых типов из базовых;
расширяемость набора операций за счет подключения библиотек подпрограмм;
слабая зависимость от типа ЭВМ.
Для машинно-независимых языков не требуется полного знания специфики компьютеров. С их помощью можно записывать программу в виде, допускающем ее реализацию на ЭВМ с различными типами машинных операций, привязка к которым возлагается на соответствующий транслятор.
Причина бурного развития и применения высокоуровневых языков программирования заключается в быстром росте производительности
ЭВМ и хронической нехватке программистских кадров.
Промежуточное место между машинно-независимыми и машинно- зависимыми языками отводится языку Си. Он создавался при попытке объединения достоинств, присущих языкам обоих классов. Данный язык обладает рядом особенностей:
максимально использует возможности конкретной вычислительной архитектуры; из-за этого программы на языке
Си компактны и работают эффективно;
позволяет налучшим образом использовать огромные выразительные средства современных языков высокого уровня.
Обработка программы машиной
Чтобы выполнить сложную инструкцию, компьютер прежде всего должен понизить ее абстрактность и перевести на понятный для себя язык. Способ, которым это делается, называется моделью исполнения.
Выделяют две основных модели и одну гибридную:
• Компиляция - единовременный перевод всей программы в машинный код.
• Интерпретация - последовательное выполнение каждого выражения.
• Транскомпиляция - перевод на язык более низкого уровня, например C или ассемблер, и его последующая компиляция.
Для перевода необходима специальная программа-транслятор - компилятор или интерпретатор, без которой работа с языком невозможна
Интерпретация представляет собой пооператорную трансляцию и последующее выполнение оттранслированного оператора исходной программы. Его присутствие необходимо от начала и до самого конца работы программы
Существует два основных недостатка метода интерпретации:
постоянное нахождение транслятора в памяти ЭВМ; интерпретирующая программа должна располагаться в памяти
ЭВМ на протяжении всего процесса выполнения исходной программы. Другими словами, она должна занимать некоторый установленный объем памяти
повторная обработка повторяющихся команд, процесс трансляции одного и того же оператора повторяется такое число раз, которое должна исполнять эта команда в программе. Это приводит к резкому снижению производительности работы программы.
Несмотря на это, интерпретируемые языки очень удобны для циклической разработки и отладки, так как позволяют быстро вносить изменения в программу. Трансляторы-интерпретаторы являются достаточно распространенными, так как они поддерживают диалоговый режим.
Компилятор же трудится только один раз, сразу преобразуя всю инструкцию в понятный для компьютера вид - машинный код или некий промежуточный байт-код, а затем покидает память ЭВМ.
Процессы трансляции и выполнения при компиляции разделяются во времени: сначала исходная программа в полном объеме переводится на машинный язык, после чего оттранслированная программа может многократно исполняться. Для трансляции методом компиляции необходим неоднократный «просмотр» транслируемой программы, т. е.
трансляторы-компиляторы
являются многопроходными.
Трансляция методом компиляции носит название объектного модуля,
который представляет собой эквивалентную программу в машинных кодах. Необходимо, чтобы перед исполнением объектный модуль обрабатывался специальной программой ОС и преобразовывался в
загрузочный модуль.
Здесь выполнение отделено от процесса трансляции, что является более эффективной.
Основные недостатки компиляционной модели: большая сложность.
Прежде чем перевести программу на понятный машине язык,
транслятор много раз проходит по исходной инструкции, анализируя и проверяя ее.
Применяют также трансляторы интерпретаторы-компиляторы,
объединяющие в себе достоинства обоих принципов трансляции.
Четкого разграничения систем не существует, так как традиционно интерпретируемые языки могут быть скомпилированы и наоборот.
Классификация языков программирования высокого уровня по модели исполнения:
Интерпретируемые - Python, Haskell, PHP, JavaScript.
Компилируемые сразу в машинный код: C, C++, Fortran, ASM.
Компилируемые в байт-код: Python, Java.
Транскомпилируемые: Haskell, Fortran, C, C++.
Принципиальный способ взаимодействия
Высокоуровневые языки используются в машинно-независимых системах программирования. Такие системы программирования в сравнении с машинно-ориентированными системами предстают более простыми в использовании. Высокоуровневые языки могут быть разделены по основной парадигме программирования. Существуют десятки методологий составления программ, некоторые из которых очень похожи друг на друга, поэтому создать четкую систему различий невозможно.
Языки программирования высокого уровня подразделяют на процедурно-ориентированные, проблемно-ориентированные и объектно-ориентированные.
Процедурно-ориентированные языки применяются для записи процедур или алгоритмов обработки информации на каждом определенном круге задач.. Требуют явного последовательного описания алгоритма решения задачи. Операторы при этом объединяются в процедурные группы, отделенные от самих данных. Примеры процедурных языков – Фортран, Pascal, Basic,
С;
Проблемно-ориентированные языки используются для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники.
Максимально формализовано описывают саму задачу и требуемый результат. Решение при этом должно логически следовать из этого описания;
Примеры проблемно ориентированных языков: Лисп, Пролог, VHDL.
объектно-ориентированные. Имеют в основе концепцию объекта, объединяющего в себе данные и методы их обработки.
Большинство из этих языков являются версиями процедурных и проблемных языков, но программирование с помощью языков
этой группы является более наглядным и простым. К наиболее часто употребляемым языкам относятся: а) Visual Basic ( Basic); б) Delphi ( Pascal); в) Visual Fortran ( Fortran); г) C++ ( C); д) Prolog++ ( Prolog).
Языки последней группы описывают все сущности в виде независимых объектов, скрывающих в себе сложные механики. Основными концепциями ООП (объектно-ориентированного программирования) являются:
инкапсуляция - скрытие функционала внутри объекта;
наследование одними объектами методов других;
полиморфизм - изменение сути с сохранением внешнего интерфейса.
Можно составить также классификацию языков объектно- ориентированного программирования по способу реализации основных концепций этого подхода - наследования, инкапсуляции и полиморфизма. Помимо классических механизмов существуют другие, например прототипный, используемый в JavaScript.
Методология ООП считается самой прогрессивной, эффективной и в некотором смысле модной. Однако в ряде случаев для решения конкретной задачи более эффективными могут быть другие подходы, например функциональный
Поколения языков программирования
Классификация языков программирования по истории их появления считается условной, так как не учитывает особенности конкретных систем. Однако она позволяет проследить, как менялись со временем концепции и усложнялись задачи, стоящие перед программистами.
В попытках связать классификацию и эволюцию языков программирования выделились несколько крупных групп, названных поколениями:
Первое поколение - машинные языки низкого уровня, привязанные к реализации конкретной ЭВМ. "Программы" на этих языках выглядели как ряды переключателей, приведенных в нужное положение, или перфокарты (перфоленты). Таким образом, все команды представляли собой последовательность нулей и единиц - бинарный код. Пример: язык ARM-процессора.
Во втором поколении языки стали немного понятнее для человека, но отвязать их от конкретного аппарата так и не удалось. Это время языков ассемблера с его мнемоническими
кодами и однозначной сборкой в машиночитаемую форму.
Пример: Макроассемблер.
Языки третьего поколения сняли с программиста заботу о непринципиальных деталях составления инструкций, таких как перевод программы в машинный код. Теперь компьютер научился делать это самостоятельно. Синтаксис и лексика приблизились к человеческим, стали понятнее. В этом поколении зародились практически все современные языки высокого уровня с широкой областью применения, независимо от их парадигмы:
PHP, Fortran.
В четвертом поколении уровень абстракции возрос еще больше, резко сужая область использования. К этой группе относятся такие специфичные языки, как FoxPro, Simulink, SQL. Появились языки визуального программирования: CAD-пакеты, системы
RAD.
Наконец, языки пятого поколения должны были сами писать программы, получая лишь описание от программиста. Эта задумка так и не была реализована полностью, так как для составления эффективного алгоритма иногда недостаточно прямой машинной логики, а требуется еще человеческая интуиция и смекалка. Примерами языков пятого поколения являются MathCAD, Prolog и Mercury.
По сути, поколения языков в точности соответствуют этапам программирования, рассмотренным в начале статьи, перечисленным в обратном порядке. Изначально программист все операции брал на себя, а машина лишь выполняла заданную последовательность действий.
Теперь же ЭВМ способна выдавать результат по формализованному описанию задачи.
Облегчение труда программиста сопровождается увеличением нагрузки на машину, программа выполняется медленнее и требует больших ресурсов.
Несмотря на то что технический прогресс движется семимильными шагами, языки первых поколений вовсе не исчезли. Они применяются в областях, требующих максимальной простоты и эффективности.
Область применения
Каждый язык программирования хорош в своей области, для которой он создавался. Так, для программирования микроконтроллеров используются ассемблеры, а с Java там делать нечего. Низкоуровневое программирование драйверов эффективно с C, который позволяет строго контролировать ресурсы памяти. Для веб-программирования стоит выбрать скриптовые языки PHP и JavaScript, интерпретатор которого встроен в каждый современный браузер. Важные банковские программы написаны на Java, обеспечивающем контроль ошибок.
Аэрокосмические - тоже на Java или на Паскале, который даже уборку мусора отдает на контроль программисту.
Все языки хороши, нужно лишь подобрать соответствующий задаче
Важность классификации
Сложно разделить сотни существующих систем взаимодействия человека и ЭВМ на несколько четких групп. И все же обзор классификаций языков программирования кратко прослеживает историю их эволюции и глубже раскрывает заложенные в них идеи.
Каждый язык одновременно относится к нескольким из перечисленных групп - он может быть строго типизированным, компилируемым и объектно-ориентированным одновременно.
Поэтому нельзя рассматривать многообразие систем программирования через призму какой-то одной классификации
Изобретение языка программирования высшего уровня позволило нам общаться с машиной, понимать её (если конечно Вам знаком используемый язык), как понимает американец немного знакомый с русским языком древнюю азбуку Кириллицы. Проще говоря, мы в нашем развитии науки программирования пока что с ЭВМ на ВЫ.
Поверьте мне, это не сарказм вы только посмотрите как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Но если мы обратим внимание на темпы роста и развития новейших технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут произвести на свет языки, умеющие принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста.
Вопросы для самопроверки:
1. Что такое алгоритм?
2. Какие условия нужно учитывать при создании алгоритма?
3. Что характеризует исполнителя алгоритма?
4. Перечислите основные свойства алгоритма
5. Перечислите способы записи алгоритма
6. Что такое язык программирования?
7. По каким основным признакам классифицируют языки программирования?
8. Какое принципиальное отличие языков низкого уровня от языков высокого уровня?
9. Какие есть модели обработки программы компьютером?
10. Какие существуют методологии программирования?
Название дисциплины
1 2 3 4 5 6 7
Название дисциплины
Тема 1. ………………….
Блок 1. Основы систем программирования
Тема 1. Основы алгоритмизации и программирования. Системы
программирования. Виды языков программирования
Технология программирования
Цели изучения темы:
ознакомить студентов с основными понятиями и механизмами процесса алгоритмизации;
сформировать базу знаний о языках программирования, их видах, особенностях и сферах применения.
Задачи изучения темы:
сформировать знания о принципах построения наиболее часто встречаемых алгоритмов.
В результате изучения данной темы Вы будете
знать:
основные типы алгоритмов и их использование для решения вычислительных, инженерных задач;
методы проектирования и производства программного продукта, и средства описания алгоритмов;
основные методологии программирования.
уметь:
использовать рабочую среду программирования для выбора эффективного и современного метода решения задач;
классифицировать языки программирования по видам и механизму работы.
владеть:
основами алгоритмизации и программирования.
Учебные вопросы темы:
1. Понятие алгоритма
2. Системы программирования
Основные термины и понятия, которые Вам предстоит изучить:
алгоритмизация, алгоритм, дискретность, детерминированность,
псевдокод, машинный язык, графический алгоритм
Вопрос 1. Понятие алгоритма
Практически все в нашем мире подчиняется каким-то законам и правилам. Современная наука не стоит на месте, благодаря чему человечеству известна масса формул и алгоритмов, следуя которым, можно рассчитать и воссоздать множество действий и строений, созданных природой, и воплотить в жизнь идеи, придуманные человеком
Большинство действий, которые мы выполняем в течение своей жизни, требуют соблюдений ряда правил. От того, насколько верное представление имеет человек о том что, как и в какой последовательности он должен сделать, зависит качество и результат выполнения поставленных перед ним задач
Алгоритмизация – это процесс создания алгоритма решения задачи.
Алгоритм – это точное и понятное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи. То бишь определяющее вычислительный процесс, ведущий от варьируемых исходных данных к искомому результату.
В алгоритме обязательно должны быть предусмотрены все ситуации, которые могут возникнуть в процессе решения комплекса задач. Само слово алгоритм происходит от имени арабского математика аль
Хорезми. Его полное имя было Абу Абдуллах (или Абу Джафар)
Мухаммад ибн Муса аль Хорезми. Он использовал индийскую позиционную систему счисления с нулем и в своих трудах сформулировал правила четырех арифметических действий над многозначными числами. Эти действия и стали впоследствии называть алгоритмами
Создание алгоритма требует творческого подхода, поэтому новый список последовательных действий может создать только живое существо. А вот для исполнения уже существующих инструкций фантазию иметь не обязательно, с этим справится даже бездушная техника.
Отличным примером точного исполнения заданной инструкции является пустая микроволновая печь, которая продолжает работать, несмотря на отсутствие пищи внутри нее.
Субъект или объект, которому не обязательно вникать в суть алгоритма, называется формальным исполнителем. Человек тоже может стать формальным исполнителем, однако в случае нерентабельности того или иного действия мыслящий исполнитель может все сделать по-своему. Поэтому основными исполнителями являются компьютеры, микроволновые печи, телефоны и другая техника. Понятие алгоритма в информатике имеет самое важное значение. Каждый алгоритм составляется с расчетом на конкретного
субъекта, с учетом допустимых действий. Те объекты, к которым субъект может применить инструкции, составляют среду исполнителя
Составляя алгоритм для какого-нибудь автоматического устройства, мы должны принимать во внимание следующее:
Первое – это кто исполнитель, тот, кто будет работать по нашему алгоритму. Какие действия он может выполнять, какие команды и в каком виде мы можем ему отдавать. Исполнителем, в принципе, может быть кто или что угодно: человек, компьютер, станок с ЧПУ, автоматический луноход и т. д.
Второе – это как скомбинировать команды, чтобы исполнитель сделал то, что от него требуется. Это самый трудный этап в составлении алгоритма, использовать набор команд, понятных исполнителю, какие действия и в каком порядке выполнять.
Третье – это форма записи алгоритма. Человек понимает смысл сказанной фразы по множеству неуловимых оттенков и интонаций.
Одну и ту же мысль мы можем выразить различными словами.
Компьютер же понимает алгоритм буквально («Хозяин, тебе дрова не нужны?»), для него каждая конкретная команда всегда имеет один и тот же смысл. Поэтому алгоритмы для компьютеров записываются по строгим, заранее определенным правилам, чтобы их нельзя было истолковать по-разному.
Исполнителем алгоритма предстает некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, которая способна выполнить действия, предписываемые алгоритмом.
Для характеристики исполнителя используют несколько понятий:
• среда;
• система команд;
• элементарные действия;
• отказы.
Среда (или обстановка) представляет собой «место обитания» исполнителя.
Любой из исполнителей может выполнять команды только из некоторого строго заданного списка, который является системой
команд исполнителя. Для каждой команды задаются условия применимости (в каких состояниях среды может быть выполнена команда) и приводятся результаты выполнения команды.
После вызова команды исполнитель производит соответствующее
элементарное действие.
Может возникнуть и отказ исполнителя в случае, если команда вызывается при недопустимом для нее состоянии среды. Чаще всего исполнитель ничего не знает о цели алгоритма. Он выполняет все предложенные ему действия, не задавая вопросов «почему» и «зачем».
В информатике универсальным исполнителем алгоритмов является компьютер.
К основным свойствам алгоритмов относятся:
1) понятность для исполнителя – исполнитель алгоритма должен знать, как его выполнять;
2) дискретность (прерывность, раздельность) – алгоритм должен представлять процесс решения задачи как последовательное исполнение простых (или ранее определенных) шагов (этапов); т.е. обязательна возможность разбиения алгоритма на отдельные элементарные действия, которые можно реализовать на ЭВМ и результат их выполнения определен и понятен
3) детерминированность (определенность) – каждое правило алгоритма должно быть четким, однозначным и не оставлять места для ее неоднозначного толкования и неопределенного исполнения.
Это свойство обеспечивает выполнение алгоритма механически, не требуя никаких дополнительных указаний или сведений о решаемой задаче;
4) результативность (или конечность) – алгоритм должен приводить к решению задачи за конечное число шагов; т.е. для любого допустимого набора исходных данных он должен через определенное число шагов завершить работу.
5) массовость – алгоритм решения задачи производится в общем виде, т. е. его можно будет применять для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из определенной области, которая называется областью применимости алгоритма. Хотя есть мнение, что последний пункт относится не к алгоритмам, а ко всем математическим методам в целом.
Часто в школах, чтобы дать детям более понятное описание алгоритмов, учителя приводят в пример приготовление пищи по кулинарной книге, изготовление лекарства по рецепту или процесс мыловарения на основе мастер-класса. Однако, учитывая второе свойство алгоритма, в котором говорится о том, что каждый пункт алгоритма должен быть настолько понятным, чтобы его мог выполнить абсолютно любой человек и даже машина, можно прийти к выводу что любой процесс, требующий проявления хоть какой-то фантазии, алгоритмом назвать нельзя. А готовка и рукоделие требуют определенных навыков и хорошо развитого воображения.
Алгоритм должен давать строгую и четкую последовательность действий, поэтому для него существенным является способ его задания. От исполнителя требуется лишь четкое выполнение каждого действия. Мы не должны объяснять ему, для каких целей предназначается алгоритм.
Возможности любого исполнителя всегда ограничены. Поэтому, прежде чем составлять алгоритм решения задачи, нужно узнать, какие действия исполнитель может выполнить. Эти действия называются допустимыми действиями исполнителя. Для решения одних и тех же задач исполнители с более «бедным» набором допустимых действий требуют более сложных подробных алгоритмов.
Алгоритм можно записывать разными способами.
Способы записи алгоритма:
1.
С помощью рисунка, (например, процесс подключения монитора),
2.
На естественном языке - построчно, каждая команда - с новой строки
(последовательность проявления фотопленки, последовательность склеивания поверхностей на тюбике с клеем и т. д.
3.
Использование псевдокода – полуформализованные описания алгоритмов на некотором условном алгоритмическом языке, которые включают в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и др.
Псевдокод занимает промежуточное место между естественным и формальным языками. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций (например, школьный АЯ).
4.
Графическое представление – блоксхема.
5.
Программное – тексты на языках программирования
Словесный способ
записи алгоритмов является описанием последовательных этапов обработки данных. Алгоритм может быть задан в произвольном изложении на естественном языке. Например, алгоритм нахождения наибольшего общего делителя двух натуральных чисел можно представить как следующую последовательность действий:
1. задание двух чисел;
2. если числа равны, то выбор любого из них в качестве ответа и остановка, в противном случае – продолжение выполнения алгоритма;
3. определение большего из чисел;
4. замена большего из чисел разностью большего и меньшего из чисел;
5. повтор алгоритма с шага 2.
Приведенный алгоритм используется для любых натуральных чисел и должен приводить к решению поставленной задачи.
Словесный способ не имеет широкого распространения, так как обладает некоторыми недостатками:
• данные описания строго не формализуемы;
• отличаются многословностью записей;
• допускают неоднозначность толкования отдельных предписаний.
Графический способ представления алгоритмов оказывается более компактным и наглядным по сравнению со словесным. При данном виде представления алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению некоторого числа действий.
Для графического представления алгоритм использует изображение в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Это графическое представление называется
схемой алгоритма, или блок-схемой.
В блок-схеме каждый из типов действий (ввод исходных данных, вычисление значений выражений, проверка условий, управление повторением действий, окончание обработки и т. п.) соответствует геометрической фигуре, представленной в виде блочного символа.
Блочные символы соединены линиями переходов, которые определяют очередность выполнения действий.
Псевдокод является системой обозначений и правил, которая предназначена для единообразной записи алгоритмов. Он занимает промежуточное место между естественным и формальным языками. С одной стороны, псевдокод похож на обычный естественный язык, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, благодаря чему запись алгоритма приближается к общепринятой математической записи.
В псевдокоде не применяются строгие синтаксические правила для записи команд, которые присущи формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде чаще всего имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном
языке. Например, в псевдокоде, также как и в формальных языках, существуют служебные слова, смысл которых определен раз и навсегда. Их выделяют в печатном тексте жирным шрифтом, а в рукописном тексте подчеркивают. Единый или формальный подход к определению псевдокода не существует, поэтому используются различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций.
Программная
форма
представления
алгоритмов
иногда характеризуется некоторыми структурами, состоящими из отдельных базовых (основных) элементов. При данном подходе к алгоритмам изучение основных принципов их конструирования следует начинать с этих базовых элементов. Их описание осуществляется с использованием языка схем алгоритмов и алгоритмического языка.
Графический алгоритм — понятие, подразумевающие под собой разложение действий, которые нужно выполнить для решения определенной задачи, по определенным геометрическим фигурам.
Графические схемы изображаются не как попало. Для того чтобы их мог понять любой человек применяются чаще всего блок-схемы.
Также блок-схемы изображаются в соответствии с ГОСТ-19701-90 и
ГОСТ-19.003-80. Графические фигуры, применяемые в алгоритме, делятся на:
Основные. Основные изображения применяются для обозначения операций, нужных для обработки данных при решении задачи.
Вспомогательные. Вспомогательные изображения нужны для обозначения отдельных, не самых важных, элементов решения задачи
В графическом алгоритме геометрические фигуры, используемые для обозначения данных, называются блоками. Все блоки идут в последовательности "сверху вниз" и "слева направо" — это правильное направление потока. При правильной последовательности линии, соединяющие между собой блоки, не показывают направление. В остальных случаях направление линий обозначается с помощью стрелок. У правильной схемы алгоритма не должно быть больше одного выхода из обрабатывающих блоков и менее двух выходов из блоков, отвечающих за логические операции и проверку выполнения условий
Название символа
Обозначение и пример заполнения
Пояснение
Процесс
Вычислительное действие или
последовательность действий
Решение
Проверка условий
Модификация
Начало цикла
Предопределенный процесс
Вычисление по подпрограмме, стандартной подпрограмме
Вывод-ввод
Вывод-ввод в общем виде
Пуск остановка
Начало, конец алгоритма, вход-выход в подпрограмму
Документ
Вывод результатов на печать
Вопрос 2. Системы программирования
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов –
языков программирования. Смысл появления такого языка – оснащенный набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм.
Языки программирования – это системы символов и правил их сочетания, предназначенные для взаимодействия человека со сложными машинами. Существуют сотни таких организованных систем, выполняющих различные функции. Чтобы сориентироваться в этом многообразии, специалисты создают общие классификации языков программирования, основанные на том или ином характерном признаке.
Языки программирования могут быть сгруппированы по десяткам различных признаков. Они являются принципиально важными или имеют прикладное значение. Наблюдается сильная зависимость классификации языков программирования от истории развития. С годами технологии усложнялись и кардинально изменялись, на первый план выходило удобство программиста, появлялись эффективные алгоритмы, сложные команды и новые уровни абстракции.
Основные классификации языков программирования по видам и механизму работы базируются на следующих параметрах:
Особенности лексики и грамматики в совокупности с уровнем абстракции и степенью удобства для человека.
Базовая концепция и методология составления алгоритмов.
Способ представления данных.
Организация процесса взаимодействия с машиной, механизм исполнения программ.
Область жизни, в которой применяется язык.
Историческая эпоха, в которую языковая система была сформирована.
Составить четкую классификацию языков и систем программирования нельзя, но возможно разделить и систематизировать их по принципиально важным признакам
Удобство для человека
Инструкции, написанные на машинном языке, понятны компьютеру, но крайне неудобны для человека. В них трудно разобраться, их практически невозможно быстро изменить или составить с их помощью сложный алгоритм. Для повышения эффективности программисты поднялись на новые уровни абстракции и научили машину принимать более человекопонятные инструкции и самостоятельно переводить их в машинный код. Рассмотрим классификацию и особенности языков программирования разного уровня:
Машинный код. Это тоже язык программирования, на котором при должной подготовке можно написать инструкцию.
Низкий уровень. По-настоящему низкоуровневыми являются языки ассемблера, которые используют нативные машинные команды, закодированные с помощью мнемонических кодов.
Средний уровень. Системы программирования этой группы могут считаться и низко- и высокоуровневыми, в зависимости от конкретных представлений о степень абстракции. Сюда можно отнести C и C++.
Высокий уровень. Эти языки позволяют создавать сложные алгоритмы, но требуют дополнительной обработки перед выполнением, поэтому сгенерированный ими код менее эффективен и выполняется медленнее.
Сверхвысокий уровень. Эта немногочисленная группа характеризуется появлением сверхмощных команд и операторов.
Сюда можно отнести Алгол-68
Особенностью языков низкого уровня является их машинозависимость. Они тесно привязаны к особенностям организации конкретного типа ЭВМ, но в целом похожи друг на друга.
Машинный язык — единственный язык, понятный ЭВМ. Он реализуется аппаратно: каждую команду выполняет некоторое электронное устройство. Программа на машинном языке представляет собой последовательность команд и данных, заданных в цифровом виде.
Данные на машинном языке представлены числами и символами.
Операции являются элементарными и из них строится вся программа.
Ввод программы в цифровом виде производился непосредственно в оперативную память.
Естественно, что процесс программирования был очень трудоемким, разобраться в программе даже автору было довольно сложно, а эффект от применения ЭВМ был довольно низким.
Этот этап в развитии языков программирования показал, что программирование является сложной проблемой, трудно поддающейся автоматизации, но именно программное обеспечение определяет в конечном счете эффективность применения ЭВМ. Поэтому на всех последующих этапах усилия направлялись на совершенствование интерфейса между программистом и ЭВМ языка программирования.
Стремление программистов оперировать не цифрами, а символами, привело к созданию мнемонического языка программирования, который называют ассемблером, мнемокодом, автокодом. Этот язык имеет определенный синтаксис записи программ, в котором, в частности, цифровой код операции заменен мнемоническим кодом.
Языки низкого уровня обеспечивают:
высокую скорость выполнения и максимальную компактность создаваемых программ;
прямое взаимодействие с аппаратными ресурсами;
полный контроль над памятью
Основные недостатки низкоуровневых языков:
для каждого типа ЭВМ необходимо использовать определенную систему команд, зависящую от особенностей функционирования машины;
сложность и низкая скорость процесса программирования;
высокая вероятность появления ошибок, которые сложно отследить;
отсутствие мобильности программ, невозможность запустить их на ЭВМ другого типа.
Высокоуровневые системы программирования не привязаны к определенной машинной системе команд и могут выполняться на любом компьютере. Благодаря высокому уровню абстракции они могут себе позволить использовать различные концепции и методологии в составлении инструкций.
Поэтому классификация языков программирования высокого уровня очень обширна и сложна.
Принципиальными отличиями языков высокого уровня от языков низкого уровня являются:
использование переменных;
возможность записи сложных выражений;
расширяемость типов данных за счет конструирования новых типов из базовых;
расширяемость набора операций за счет подключения библиотек подпрограмм;
слабая зависимость от типа ЭВМ.
Для машинно-независимых языков не требуется полного знания специфики компьютеров. С их помощью можно записывать программу в виде, допускающем ее реализацию на ЭВМ с различными типами машинных операций, привязка к которым возлагается на соответствующий транслятор.
Причина бурного развития и применения высокоуровневых языков программирования заключается в быстром росте производительности
ЭВМ и хронической нехватке программистских кадров.
Промежуточное место между машинно-независимыми и машинно- зависимыми языками отводится языку Си. Он создавался при попытке объединения достоинств, присущих языкам обоих классов. Данный язык обладает рядом особенностей:
максимально использует возможности конкретной вычислительной архитектуры; из-за этого программы на языке
Си компактны и работают эффективно;
позволяет налучшим образом использовать огромные выразительные средства современных языков высокого уровня.
Обработка программы машиной
Чтобы выполнить сложную инструкцию, компьютер прежде всего должен понизить ее абстрактность и перевести на понятный для себя язык. Способ, которым это делается, называется моделью исполнения.
Выделяют две основных модели и одну гибридную:
• Компиляция - единовременный перевод всей программы в машинный код.
• Интерпретация - последовательное выполнение каждого выражения.
• Транскомпиляция - перевод на язык более низкого уровня, например C или ассемблер, и его последующая компиляция.
Для перевода необходима специальная программа-транслятор - компилятор или интерпретатор, без которой работа с языком невозможна
Интерпретация представляет собой пооператорную трансляцию и последующее выполнение оттранслированного оператора исходной программы. Его присутствие необходимо от начала и до самого конца работы программы
Существует два основных недостатка метода интерпретации:
постоянное нахождение транслятора в памяти ЭВМ; интерпретирующая программа должна располагаться в памяти
ЭВМ на протяжении всего процесса выполнения исходной программы. Другими словами, она должна занимать некоторый установленный объем памяти
повторная обработка повторяющихся команд, процесс трансляции одного и того же оператора повторяется такое число раз, которое должна исполнять эта команда в программе. Это приводит к резкому снижению производительности работы программы.
Несмотря на это, интерпретируемые языки очень удобны для циклической разработки и отладки, так как позволяют быстро вносить изменения в программу. Трансляторы-интерпретаторы являются достаточно распространенными, так как они поддерживают диалоговый режим.
Компилятор же трудится только один раз, сразу преобразуя всю инструкцию в понятный для компьютера вид - машинный код или некий промежуточный байт-код, а затем покидает память ЭВМ.
Процессы трансляции и выполнения при компиляции разделяются во времени: сначала исходная программа в полном объеме переводится на машинный язык, после чего оттранслированная программа может многократно исполняться. Для трансляции методом компиляции необходим неоднократный «просмотр» транслируемой программы, т. е.
трансляторы-компиляторы
являются многопроходными.
Трансляция методом компиляции носит название объектного модуля,
который представляет собой эквивалентную программу в машинных кодах. Необходимо, чтобы перед исполнением объектный модуль обрабатывался специальной программой ОС и преобразовывался в
загрузочный модуль.
Здесь выполнение отделено от процесса трансляции, что является более эффективной.
Основные недостатки компиляционной модели: большая сложность.
Прежде чем перевести программу на понятный машине язык,
транслятор много раз проходит по исходной инструкции, анализируя и проверяя ее.
Применяют также трансляторы интерпретаторы-компиляторы,
объединяющие в себе достоинства обоих принципов трансляции.
Четкого разграничения систем не существует, так как традиционно интерпретируемые языки могут быть скомпилированы и наоборот.
Классификация языков программирования высокого уровня по модели исполнения:
Интерпретируемые - Python, Haskell, PHP, JavaScript.
Компилируемые сразу в машинный код: C, C++, Fortran, ASM.
Компилируемые в байт-код: Python, Java.
Транскомпилируемые: Haskell, Fortran, C, C++.
Принципиальный способ взаимодействия
Высокоуровневые языки используются в машинно-независимых системах программирования. Такие системы программирования в сравнении с машинно-ориентированными системами предстают более простыми в использовании. Высокоуровневые языки могут быть разделены по основной парадигме программирования. Существуют десятки методологий составления программ, некоторые из которых очень похожи друг на друга, поэтому создать четкую систему различий невозможно.
Языки программирования высокого уровня подразделяют на процедурно-ориентированные, проблемно-ориентированные и объектно-ориентированные.
Процедурно-ориентированные языки применяются для записи процедур или алгоритмов обработки информации на каждом определенном круге задач.. Требуют явного последовательного описания алгоритма решения задачи. Операторы при этом объединяются в процедурные группы, отделенные от самих данных. Примеры процедурных языков – Фортран, Pascal, Basic,
С;
Проблемно-ориентированные языки используются для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники.
Максимально формализовано описывают саму задачу и требуемый результат. Решение при этом должно логически следовать из этого описания;
Примеры проблемно ориентированных языков: Лисп, Пролог, VHDL.
объектно-ориентированные. Имеют в основе концепцию объекта, объединяющего в себе данные и методы их обработки.
Большинство из этих языков являются версиями процедурных и проблемных языков, но программирование с помощью языков
этой группы является более наглядным и простым. К наиболее часто употребляемым языкам относятся: а) Visual Basic ( Basic); б) Delphi ( Pascal); в) Visual Fortran ( Fortran); г) C++ ( C); д) Prolog++ ( Prolog).
Языки последней группы описывают все сущности в виде независимых объектов, скрывающих в себе сложные механики. Основными концепциями ООП (объектно-ориентированного программирования) являются:
инкапсуляция - скрытие функционала внутри объекта;
наследование одними объектами методов других;
полиморфизм - изменение сути с сохранением внешнего интерфейса.
Можно составить также классификацию языков объектно- ориентированного программирования по способу реализации основных концепций этого подхода - наследования, инкапсуляции и полиморфизма. Помимо классических механизмов существуют другие, например прототипный, используемый в JavaScript.
Методология ООП считается самой прогрессивной, эффективной и в некотором смысле модной. Однако в ряде случаев для решения конкретной задачи более эффективными могут быть другие подходы, например функциональный
Поколения языков программирования
Классификация языков программирования по истории их появления считается условной, так как не учитывает особенности конкретных систем. Однако она позволяет проследить, как менялись со временем концепции и усложнялись задачи, стоящие перед программистами.
В попытках связать классификацию и эволюцию языков программирования выделились несколько крупных групп, названных поколениями:
Первое поколение - машинные языки низкого уровня, привязанные к реализации конкретной ЭВМ. "Программы" на этих языках выглядели как ряды переключателей, приведенных в нужное положение, или перфокарты (перфоленты). Таким образом, все команды представляли собой последовательность нулей и единиц - бинарный код. Пример: язык ARM-процессора.
Во втором поколении языки стали немного понятнее для человека, но отвязать их от конкретного аппарата так и не удалось. Это время языков ассемблера с его мнемоническими
кодами и однозначной сборкой в машиночитаемую форму.
Пример: Макроассемблер.
Языки третьего поколения сняли с программиста заботу о непринципиальных деталях составления инструкций, таких как перевод программы в машинный код. Теперь компьютер научился делать это самостоятельно. Синтаксис и лексика приблизились к человеческим, стали понятнее. В этом поколении зародились практически все современные языки высокого уровня с широкой областью применения, независимо от их парадигмы:
PHP, Fortran.
В четвертом поколении уровень абстракции возрос еще больше, резко сужая область использования. К этой группе относятся такие специфичные языки, как FoxPro, Simulink, SQL. Появились языки визуального программирования: CAD-пакеты, системы
RAD.
Наконец, языки пятого поколения должны были сами писать программы, получая лишь описание от программиста. Эта задумка так и не была реализована полностью, так как для составления эффективного алгоритма иногда недостаточно прямой машинной логики, а требуется еще человеческая интуиция и смекалка. Примерами языков пятого поколения являются MathCAD, Prolog и Mercury.
По сути, поколения языков в точности соответствуют этапам программирования, рассмотренным в начале статьи, перечисленным в обратном порядке. Изначально программист все операции брал на себя, а машина лишь выполняла заданную последовательность действий.
Теперь же ЭВМ способна выдавать результат по формализованному описанию задачи.
Облегчение труда программиста сопровождается увеличением нагрузки на машину, программа выполняется медленнее и требует больших ресурсов.
Несмотря на то что технический прогресс движется семимильными шагами, языки первых поколений вовсе не исчезли. Они применяются в областях, требующих максимальной простоты и эффективности.
Область применения
Каждый язык программирования хорош в своей области, для которой он создавался. Так, для программирования микроконтроллеров используются ассемблеры, а с Java там делать нечего. Низкоуровневое программирование драйверов эффективно с C, который позволяет строго контролировать ресурсы памяти. Для веб-программирования стоит выбрать скриптовые языки PHP и JavaScript, интерпретатор которого встроен в каждый современный браузер. Важные банковские программы написаны на Java, обеспечивающем контроль ошибок.
Аэрокосмические - тоже на Java или на Паскале, который даже уборку мусора отдает на контроль программисту.
Все языки хороши, нужно лишь подобрать соответствующий задаче
Важность классификации
Сложно разделить сотни существующих систем взаимодействия человека и ЭВМ на несколько четких групп. И все же обзор классификаций языков программирования кратко прослеживает историю их эволюции и глубже раскрывает заложенные в них идеи.
Каждый язык одновременно относится к нескольким из перечисленных групп - он может быть строго типизированным, компилируемым и объектно-ориентированным одновременно.
Поэтому нельзя рассматривать многообразие систем программирования через призму какой-то одной классификации
Изобретение языка программирования высшего уровня позволило нам общаться с машиной, понимать её (если конечно Вам знаком используемый язык), как понимает американец немного знакомый с русским языком древнюю азбуку Кириллицы. Проще говоря, мы в нашем развитии науки программирования пока что с ЭВМ на ВЫ.
Поверьте мне, это не сарказм вы только посмотрите как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Но если мы обратим внимание на темпы роста и развития новейших технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут произвести на свет языки, умеющие принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста.
Вопросы для самопроверки:
1. Что такое алгоритм?
2. Какие условия нужно учитывать при создании алгоритма?
3. Что характеризует исполнителя алгоритма?
4. Перечислите основные свойства алгоритма
5. Перечислите способы записи алгоритма
6. Что такое язык программирования?
7. По каким основным признакам классифицируют языки программирования?
8. Какое принципиальное отличие языков низкого уровня от языков высокого уровня?
9. Какие есть модели обработки программы компьютером?
10. Какие существуют методологии программирования?
Название дисциплины
1 2 3 4 5 6 7
Название дисциплины
Тема 1. ………………….
Блок 1. Основы систем программирования
Тема 1. Основы алгоритмизации и программирования. Системы
программирования. Виды языков программирования
Технология программирования
Цели изучения темы:
ознакомить студентов с основными понятиями и механизмами процесса алгоритмизации;
сформировать базу знаний о языках программирования, их видах, особенностях и сферах применения.
Задачи изучения темы:
сформировать знания о принципах построения наиболее часто встречаемых алгоритмов.
В результате изучения данной темы Вы будете
знать:
основные типы алгоритмов и их использование для решения вычислительных, инженерных задач;
методы проектирования и производства программного продукта, и средства описания алгоритмов;
основные методологии программирования.
уметь:
использовать рабочую среду программирования для выбора эффективного и современного метода решения задач;
классифицировать языки программирования по видам и механизму работы.
владеть:
основами алгоритмизации и программирования.
Учебные вопросы темы:
1. Понятие алгоритма
2. Системы программирования
Основные термины и понятия, которые Вам предстоит изучить:
алгоритмизация, алгоритм, дискретность, детерминированность,
псевдокод, машинный язык, графический алгоритм
Вопрос 1. Понятие алгоритма
Практически все в нашем мире подчиняется каким-то законам и правилам. Современная наука не стоит на месте, благодаря чему человечеству известна масса формул и алгоритмов, следуя которым, можно рассчитать и воссоздать множество действий и строений, созданных природой, и воплотить в жизнь идеи, придуманные человеком
Большинство действий, которые мы выполняем в течение своей жизни, требуют соблюдений ряда правил. От того, насколько верное представление имеет человек о том что, как и в какой последовательности он должен сделать, зависит качество и результат выполнения поставленных перед ним задач
Алгоритмизация – это процесс создания алгоритма решения задачи.
Алгоритм – это точное и понятное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи. То бишь определяющее вычислительный процесс, ведущий от варьируемых исходных данных к искомому результату.
В алгоритме обязательно должны быть предусмотрены все ситуации, которые могут возникнуть в процессе решения комплекса задач. Само слово алгоритм происходит от имени арабского математика аль
Хорезми. Его полное имя было Абу Абдуллах (или Абу Джафар)
Мухаммад ибн Муса аль Хорезми. Он использовал индийскую позиционную систему счисления с нулем и в своих трудах сформулировал правила четырех арифметических действий над многозначными числами. Эти действия и стали впоследствии называть алгоритмами
Создание алгоритма требует творческого подхода, поэтому новый список последовательных действий может создать только живое существо. А вот для исполнения уже существующих инструкций фантазию иметь не обязательно, с этим справится даже бездушная техника.
Отличным примером точного исполнения заданной инструкции является пустая микроволновая печь, которая продолжает работать, несмотря на отсутствие пищи внутри нее.
Субъект или объект, которому не обязательно вникать в суть алгоритма, называется формальным исполнителем. Человек тоже может стать формальным исполнителем, однако в случае нерентабельности того или иного действия мыслящий исполнитель может все сделать по-своему. Поэтому основными исполнителями являются компьютеры, микроволновые печи, телефоны и другая техника. Понятие алгоритма в информатике имеет самое важное значение. Каждый алгоритм составляется с расчетом на конкретного
субъекта, с учетом допустимых действий. Те объекты, к которым субъект может применить инструкции, составляют среду исполнителя
Составляя алгоритм для какого-нибудь автоматического устройства, мы должны принимать во внимание следующее:
Первое – это кто исполнитель, тот, кто будет работать по нашему алгоритму. Какие действия он может выполнять, какие команды и в каком виде мы можем ему отдавать. Исполнителем, в принципе, может быть кто или что угодно: человек, компьютер, станок с ЧПУ, автоматический луноход и т. д.
Второе – это как скомбинировать команды, чтобы исполнитель сделал то, что от него требуется. Это самый трудный этап в составлении алгоритма, использовать набор команд, понятных исполнителю, какие действия и в каком порядке выполнять.
Третье – это форма записи алгоритма. Человек понимает смысл сказанной фразы по множеству неуловимых оттенков и интонаций.
Одну и ту же мысль мы можем выразить различными словами.
Компьютер же понимает алгоритм буквально («Хозяин, тебе дрова не нужны?»), для него каждая конкретная команда всегда имеет один и тот же смысл. Поэтому алгоритмы для компьютеров записываются по строгим, заранее определенным правилам, чтобы их нельзя было истолковать по-разному.
Исполнителем алгоритма предстает некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, которая способна выполнить действия, предписываемые алгоритмом.
Для характеристики исполнителя используют несколько понятий:
• среда;
• система команд;
• элементарные действия;
• отказы.
Среда (или обстановка) представляет собой «место обитания» исполнителя.
Любой из исполнителей может выполнять команды только из некоторого строго заданного списка, который является системой
команд исполнителя. Для каждой команды задаются условия применимости (в каких состояниях среды может быть выполнена команда) и приводятся результаты выполнения команды.
После вызова команды исполнитель производит соответствующее
элементарное действие.
Может возникнуть и отказ исполнителя в случае, если команда вызывается при недопустимом для нее состоянии среды. Чаще всего исполнитель ничего не знает о цели алгоритма. Он выполняет все предложенные ему действия, не задавая вопросов «почему» и «зачем».
В информатике универсальным исполнителем алгоритмов является компьютер.
К основным свойствам алгоритмов относятся:
1) понятность для исполнителя – исполнитель алгоритма должен знать, как его выполнять;
2) дискретность (прерывность, раздельность) – алгоритм должен представлять процесс решения задачи как последовательное исполнение простых (или ранее определенных) шагов (этапов); т.е. обязательна возможность разбиения алгоритма на отдельные элементарные действия, которые можно реализовать на ЭВМ и результат их выполнения определен и понятен
3) детерминированность (определенность) – каждое правило алгоритма должно быть четким, однозначным и не оставлять места для ее неоднозначного толкования и неопределенного исполнения.
Это свойство обеспечивает выполнение алгоритма механически, не требуя никаких дополнительных указаний или сведений о решаемой задаче;
4) результативность (или конечность) – алгоритм должен приводить к решению задачи за конечное число шагов; т.е. для любого допустимого набора исходных данных он должен через определенное число шагов завершить работу.
5) массовость – алгоритм решения задачи производится в общем виде, т. е. его можно будет применять для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из определенной области, которая называется областью применимости алгоритма. Хотя есть мнение, что последний пункт относится не к алгоритмам, а ко всем математическим методам в целом.
Часто в школах, чтобы дать детям более понятное описание алгоритмов, учителя приводят в пример приготовление пищи по кулинарной книге, изготовление лекарства по рецепту или процесс мыловарения на основе мастер-класса. Однако, учитывая второе свойство алгоритма, в котором говорится о том, что каждый пункт алгоритма должен быть настолько понятным, чтобы его мог выполнить абсолютно любой человек и даже машина, можно прийти к выводу что любой процесс, требующий проявления хоть какой-то фантазии, алгоритмом назвать нельзя. А готовка и рукоделие требуют определенных навыков и хорошо развитого воображения.
Алгоритм должен давать строгую и четкую последовательность действий, поэтому для него существенным является способ его задания. От исполнителя требуется лишь четкое выполнение каждого действия. Мы не должны объяснять ему, для каких целей предназначается алгоритм.
Возможности любого исполнителя всегда ограничены. Поэтому, прежде чем составлять алгоритм решения задачи, нужно узнать, какие действия исполнитель может выполнить. Эти действия называются допустимыми действиями исполнителя. Для решения одних и тех же задач исполнители с более «бедным» набором допустимых действий требуют более сложных подробных алгоритмов.
Алгоритм можно записывать разными способами.
Способы записи алгоритма:
1.
С помощью рисунка, (например, процесс подключения монитора),
2.
На естественном языке - построчно, каждая команда - с новой строки
(последовательность проявления фотопленки, последовательность склеивания поверхностей на тюбике с клеем и т. д.
3.
Использование псевдокода – полуформализованные описания алгоритмов на некотором условном алгоритмическом языке, которые включают в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и др.
Псевдокод занимает промежуточное место между естественным и формальным языками. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций (например, школьный АЯ).
4.
Графическое представление – блоксхема.
5.
Программное – тексты на языках программирования
Словесный способ
записи алгоритмов является описанием последовательных этапов обработки данных. Алгоритм может быть задан в произвольном изложении на естественном языке. Например, алгоритм нахождения наибольшего общего делителя двух натуральных чисел можно представить как следующую последовательность действий:
1. задание двух чисел;
2. если числа равны, то выбор любого из них в качестве ответа и остановка, в противном случае – продолжение выполнения алгоритма;
3. определение большего из чисел;
4. замена большего из чисел разностью большего и меньшего из чисел;
5. повтор алгоритма с шага 2.
Приведенный алгоритм используется для любых натуральных чисел и должен приводить к решению поставленной задачи.
Словесный способ не имеет широкого распространения, так как обладает некоторыми недостатками:
• данные описания строго не формализуемы;
• отличаются многословностью записей;
• допускают неоднозначность толкования отдельных предписаний.
Графический способ представления алгоритмов оказывается более компактным и наглядным по сравнению со словесным. При данном виде представления алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению некоторого числа действий.
Для графического представления алгоритм использует изображение в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Это графическое представление называется
схемой алгоритма, или блок-схемой.
В блок-схеме каждый из типов действий (ввод исходных данных, вычисление значений выражений, проверка условий, управление повторением действий, окончание обработки и т. п.) соответствует геометрической фигуре, представленной в виде блочного символа.
Блочные символы соединены линиями переходов, которые определяют очередность выполнения действий.
Псевдокод является системой обозначений и правил, которая предназначена для единообразной записи алгоритмов. Он занимает промежуточное место между естественным и формальным языками. С одной стороны, псевдокод похож на обычный естественный язык, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, благодаря чему запись алгоритма приближается к общепринятой математической записи.
В псевдокоде не применяются строгие синтаксические правила для записи команд, которые присущи формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде чаще всего имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном
языке. Например, в псевдокоде, также как и в формальных языках, существуют служебные слова, смысл которых определен раз и навсегда. Их выделяют в печатном тексте жирным шрифтом, а в рукописном тексте подчеркивают. Единый или формальный подход к определению псевдокода не существует, поэтому используются различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций.
Программная
форма
представления
алгоритмов
иногда характеризуется некоторыми структурами, состоящими из отдельных базовых (основных) элементов. При данном подходе к алгоритмам изучение основных принципов их конструирования следует начинать с этих базовых элементов. Их описание осуществляется с использованием языка схем алгоритмов и алгоритмического языка.
Графический алгоритм — понятие, подразумевающие под собой разложение действий, которые нужно выполнить для решения определенной задачи, по определенным геометрическим фигурам.
Графические схемы изображаются не как попало. Для того чтобы их мог понять любой человек применяются чаще всего блок-схемы.
Также блок-схемы изображаются в соответствии с ГОСТ-19701-90 и
ГОСТ-19.003-80. Графические фигуры, применяемые в алгоритме, делятся на:
Основные. Основные изображения применяются для обозначения операций, нужных для обработки данных при решении задачи.
Вспомогательные. Вспомогательные изображения нужны для обозначения отдельных, не самых важных, элементов решения задачи
В графическом алгоритме геометрические фигуры, используемые для обозначения данных, называются блоками. Все блоки идут в последовательности "сверху вниз" и "слева направо" — это правильное направление потока. При правильной последовательности линии, соединяющие между собой блоки, не показывают направление. В остальных случаях направление линий обозначается с помощью стрелок. У правильной схемы алгоритма не должно быть больше одного выхода из обрабатывающих блоков и менее двух выходов из блоков, отвечающих за логические операции и проверку выполнения условий
Название символа
Обозначение и пример заполнения
Пояснение
Процесс
Вычислительное действие или
последовательность действий
Решение
Проверка условий
Модификация
Начало цикла
Предопределенный процесс
Вычисление по подпрограмме, стандартной подпрограмме
Вывод-ввод
Вывод-ввод в общем виде
Пуск остановка
Начало, конец алгоритма, вход-выход в подпрограмму
Документ
Вывод результатов на печать
Вопрос 2. Системы программирования
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов –
языков программирования. Смысл появления такого языка – оснащенный набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм.
Языки программирования – это системы символов и правил их сочетания, предназначенные для взаимодействия человека со сложными машинами. Существуют сотни таких организованных систем, выполняющих различные функции. Чтобы сориентироваться в этом многообразии, специалисты создают общие классификации языков программирования, основанные на том или ином характерном признаке.
Языки программирования могут быть сгруппированы по десяткам различных признаков. Они являются принципиально важными или имеют прикладное значение. Наблюдается сильная зависимость классификации языков программирования от истории развития. С годами технологии усложнялись и кардинально изменялись, на первый план выходило удобство программиста, появлялись эффективные алгоритмы, сложные команды и новые уровни абстракции.
Основные классификации языков программирования по видам и механизму работы базируются на следующих параметрах:
Особенности лексики и грамматики в совокупности с уровнем абстракции и степенью удобства для человека.
Базовая концепция и методология составления алгоритмов.
Способ представления данных.
Организация процесса взаимодействия с машиной, механизм исполнения программ.
Область жизни, в которой применяется язык.
Историческая эпоха, в которую языковая система была сформирована.
Составить четкую классификацию языков и систем программирования нельзя, но возможно разделить и систематизировать их по принципиально важным признакам
Удобство для человека
Инструкции, написанные на машинном языке, понятны компьютеру, но крайне неудобны для человека. В них трудно разобраться, их практически невозможно быстро изменить или составить с их помощью сложный алгоритм. Для повышения эффективности программисты поднялись на новые уровни абстракции и научили машину принимать более человекопонятные инструкции и самостоятельно переводить их в машинный код. Рассмотрим классификацию и особенности языков программирования разного уровня:
Машинный код. Это тоже язык программирования, на котором при должной подготовке можно написать инструкцию.
Низкий уровень. По-настоящему низкоуровневыми являются языки ассемблера, которые используют нативные машинные команды, закодированные с помощью мнемонических кодов.
Средний уровень. Системы программирования этой группы могут считаться и низко- и высокоуровневыми, в зависимости от конкретных представлений о степень абстракции. Сюда можно отнести C и C++.
Высокий уровень. Эти языки позволяют создавать сложные алгоритмы, но требуют дополнительной обработки перед выполнением, поэтому сгенерированный ими код менее эффективен и выполняется медленнее.
Сверхвысокий уровень. Эта немногочисленная группа характеризуется появлением сверхмощных команд и операторов.
Сюда можно отнести Алгол-68
Особенностью языков низкого уровня является их машинозависимость. Они тесно привязаны к особенностям организации конкретного типа ЭВМ, но в целом похожи друг на друга.
Машинный язык — единственный язык, понятный ЭВМ. Он реализуется аппаратно: каждую команду выполняет некоторое электронное устройство. Программа на машинном языке представляет собой последовательность команд и данных, заданных в цифровом виде.
Данные на машинном языке представлены числами и символами.
Операции являются элементарными и из них строится вся программа.
Ввод программы в цифровом виде производился непосредственно в оперативную память.
Естественно, что процесс программирования был очень трудоемким, разобраться в программе даже автору было довольно сложно, а эффект от применения ЭВМ был довольно низким.
Этот этап в развитии языков программирования показал, что программирование является сложной проблемой, трудно поддающейся автоматизации, но именно программное обеспечение определяет в конечном счете эффективность применения ЭВМ. Поэтому на всех последующих этапах усилия направлялись на совершенствование интерфейса между программистом и ЭВМ языка программирования.
Стремление программистов оперировать не цифрами, а символами, привело к созданию мнемонического языка программирования, который называют ассемблером, мнемокодом, автокодом. Этот язык имеет определенный синтаксис записи программ, в котором, в частности, цифровой код операции заменен мнемоническим кодом.
Языки низкого уровня обеспечивают:
высокую скорость выполнения и максимальную компактность создаваемых программ;
прямое взаимодействие с аппаратными ресурсами;
полный контроль над памятью
Основные недостатки низкоуровневых языков:
для каждого типа ЭВМ необходимо использовать определенную систему команд, зависящую от особенностей функционирования машины;
сложность и низкая скорость процесса программирования;
высокая вероятность появления ошибок, которые сложно отследить;
отсутствие мобильности программ, невозможность запустить их на ЭВМ другого типа.
Высокоуровневые системы программирования не привязаны к определенной машинной системе команд и могут выполняться на любом компьютере. Благодаря высокому уровню абстракции они могут себе позволить использовать различные концепции и методологии в составлении инструкций.
Поэтому классификация языков программирования высокого уровня очень обширна и сложна.
Принципиальными отличиями языков высокого уровня от языков низкого уровня являются:
использование переменных;
возможность записи сложных выражений;
расширяемость типов данных за счет конструирования новых типов из базовых;
расширяемость набора операций за счет подключения библиотек подпрограмм;
слабая зависимость от типа ЭВМ.
Для машинно-независимых языков не требуется полного знания специфики компьютеров. С их помощью можно записывать программу в виде, допускающем ее реализацию на ЭВМ с различными типами машинных операций, привязка к которым возлагается на соответствующий транслятор.
Причина бурного развития и применения высокоуровневых языков программирования заключается в быстром росте производительности
ЭВМ и хронической нехватке программистских кадров.
Промежуточное место между машинно-независимыми и машинно- зависимыми языками отводится языку Си. Он создавался при попытке объединения достоинств, присущих языкам обоих классов. Данный язык обладает рядом особенностей:
максимально использует возможности конкретной вычислительной архитектуры; из-за этого программы на языке
Си компактны и работают эффективно;
позволяет налучшим образом использовать огромные выразительные средства современных языков высокого уровня.
Обработка программы машиной
Чтобы выполнить сложную инструкцию, компьютер прежде всего должен понизить ее абстрактность и перевести на понятный для себя язык. Способ, которым это делается, называется моделью исполнения.
Выделяют две основных модели и одну гибридную:
• Компиляция - единовременный перевод всей программы в машинный код.
• Интерпретация - последовательное выполнение каждого выражения.
• Транскомпиляция - перевод на язык более низкого уровня, например C или ассемблер, и его последующая компиляция.
Для перевода необходима специальная программа-транслятор - компилятор или интерпретатор, без которой работа с языком невозможна
Интерпретация представляет собой пооператорную трансляцию и последующее выполнение оттранслированного оператора исходной программы. Его присутствие необходимо от начала и до самого конца работы программы
Существует два основных недостатка метода интерпретации:
постоянное нахождение транслятора в памяти ЭВМ; интерпретирующая программа должна располагаться в памяти
ЭВМ на протяжении всего процесса выполнения исходной программы. Другими словами, она должна занимать некоторый установленный объем памяти
повторная обработка повторяющихся команд, процесс трансляции одного и того же оператора повторяется такое число раз, которое должна исполнять эта команда в программе. Это приводит к резкому снижению производительности работы программы.
Несмотря на это, интерпретируемые языки очень удобны для циклической разработки и отладки, так как позволяют быстро вносить изменения в программу. Трансляторы-интерпретаторы являются достаточно распространенными, так как они поддерживают диалоговый режим.
Компилятор же трудится только один раз, сразу преобразуя всю инструкцию в понятный для компьютера вид - машинный код или некий промежуточный байт-код, а затем покидает память ЭВМ.
Процессы трансляции и выполнения при компиляции разделяются во времени: сначала исходная программа в полном объеме переводится на машинный язык, после чего оттранслированная программа может многократно исполняться. Для трансляции методом компиляции необходим неоднократный «просмотр» транслируемой программы, т. е.
трансляторы-компиляторы
являются многопроходными.
Трансляция методом компиляции носит название объектного модуля,
который представляет собой эквивалентную программу в машинных кодах. Необходимо, чтобы перед исполнением объектный модуль обрабатывался специальной программой ОС и преобразовывался в
загрузочный модуль.
Здесь выполнение отделено от процесса трансляции, что является более эффективной.
Основные недостатки компиляционной модели: большая сложность.
Прежде чем перевести программу на понятный машине язык,
транслятор много раз проходит по исходной инструкции, анализируя и проверяя ее.
Применяют также трансляторы интерпретаторы-компиляторы,
объединяющие в себе достоинства обоих принципов трансляции.
Четкого разграничения систем не существует, так как традиционно интерпретируемые языки могут быть скомпилированы и наоборот.
Классификация языков программирования высокого уровня по модели исполнения:
Интерпретируемые - Python, Haskell, PHP, JavaScript.
Компилируемые сразу в машинный код: C, C++, Fortran, ASM.
Компилируемые в байт-код: Python, Java.
Транскомпилируемые: Haskell, Fortran, C, C++.
Принципиальный способ взаимодействия
Высокоуровневые языки используются в машинно-независимых системах программирования. Такие системы программирования в сравнении с машинно-ориентированными системами предстают более простыми в использовании. Высокоуровневые языки могут быть разделены по основной парадигме программирования. Существуют десятки методологий составления программ, некоторые из которых очень похожи друг на друга, поэтому создать четкую систему различий невозможно.
Языки программирования высокого уровня подразделяют на процедурно-ориентированные, проблемно-ориентированные и объектно-ориентированные.
Процедурно-ориентированные языки применяются для записи процедур или алгоритмов обработки информации на каждом определенном круге задач.. Требуют явного последовательного описания алгоритма решения задачи. Операторы при этом объединяются в процедурные группы, отделенные от самих данных. Примеры процедурных языков – Фортран, Pascal, Basic,
С;
Проблемно-ориентированные языки используются для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники.
Максимально формализовано описывают саму задачу и требуемый результат. Решение при этом должно логически следовать из этого описания;
Примеры проблемно ориентированных языков: Лисп, Пролог, VHDL.
объектно-ориентированные. Имеют в основе концепцию объекта, объединяющего в себе данные и методы их обработки.
Большинство из этих языков являются версиями процедурных и проблемных языков, но программирование с помощью языков
этой группы является более наглядным и простым. К наиболее часто употребляемым языкам относятся: а) Visual Basic ( Basic); б) Delphi ( Pascal); в) Visual Fortran ( Fortran); г) C++ ( C); д) Prolog++ ( Prolog).
Языки последней группы описывают все сущности в виде независимых объектов, скрывающих в себе сложные механики. Основными концепциями ООП (объектно-ориентированного программирования) являются:
инкапсуляция - скрытие функционала внутри объекта;
наследование одними объектами методов других;
полиморфизм - изменение сути с сохранением внешнего интерфейса.
Можно составить также классификацию языков объектно- ориентированного программирования по способу реализации основных концепций этого подхода - наследования, инкапсуляции и полиморфизма. Помимо классических механизмов существуют другие, например прототипный, используемый в JavaScript.
Методология ООП считается самой прогрессивной, эффективной и в некотором смысле модной. Однако в ряде случаев для решения конкретной задачи более эффективными могут быть другие подходы, например функциональный
Поколения языков программирования
Классификация языков программирования по истории их появления считается условной, так как не учитывает особенности конкретных систем. Однако она позволяет проследить, как менялись со временем концепции и усложнялись задачи, стоящие перед программистами.
В попытках связать классификацию и эволюцию языков программирования выделились несколько крупных групп, названных поколениями:
Первое поколение - машинные языки низкого уровня, привязанные к реализации конкретной ЭВМ. "Программы" на этих языках выглядели как ряды переключателей, приведенных в нужное положение, или перфокарты (перфоленты). Таким образом, все команды представляли собой последовательность нулей и единиц - бинарный код. Пример: язык ARM-процессора.
Во втором поколении языки стали немного понятнее для человека, но отвязать их от конкретного аппарата так и не удалось. Это время языков ассемблера с его мнемоническими
кодами и однозначной сборкой в машиночитаемую форму.
Пример: Макроассемблер.
Языки третьего поколения сняли с программиста заботу о непринципиальных деталях составления инструкций, таких как перевод программы в машинный код. Теперь компьютер научился делать это самостоятельно. Синтаксис и лексика приблизились к человеческим, стали понятнее. В этом поколении зародились практически все современные языки высокого уровня с широкой областью применения, независимо от их парадигмы:
PHP, Fortran.
В четвертом поколении уровень абстракции возрос еще больше, резко сужая область использования. К этой группе относятся такие специфичные языки, как FoxPro, Simulink, SQL. Появились языки визуального программирования: CAD-пакеты, системы
RAD.
Наконец, языки пятого поколения должны были сами писать программы, получая лишь описание от программиста. Эта задумка так и не была реализована полностью, так как для составления эффективного алгоритма иногда недостаточно прямой машинной логики, а требуется еще человеческая интуиция и смекалка. Примерами языков пятого поколения являются MathCAD, Prolog и Mercury.
По сути, поколения языков в точности соответствуют этапам программирования, рассмотренным в начале статьи, перечисленным в обратном порядке. Изначально программист все операции брал на себя, а машина лишь выполняла заданную последовательность действий.
Теперь же ЭВМ способна выдавать результат по формализованному описанию задачи.
Облегчение труда программиста сопровождается увеличением нагрузки на машину, программа выполняется медленнее и требует больших ресурсов.
Несмотря на то что технический прогресс движется семимильными шагами, языки первых поколений вовсе не исчезли. Они применяются в областях, требующих максимальной простоты и эффективности.
Область применения
Каждый язык программирования хорош в своей области, для которой он создавался. Так, для программирования микроконтроллеров используются ассемблеры, а с Java там делать нечего. Низкоуровневое программирование драйверов эффективно с C, который позволяет строго контролировать ресурсы памяти. Для веб-программирования стоит выбрать скриптовые языки PHP и JavaScript, интерпретатор которого встроен в каждый современный браузер. Важные банковские программы написаны на Java, обеспечивающем контроль ошибок.
Аэрокосмические - тоже на Java или на Паскале, который даже уборку мусора отдает на контроль программисту.
Все языки хороши, нужно лишь подобрать соответствующий задаче
Важность классификации
Сложно разделить сотни существующих систем взаимодействия человека и ЭВМ на несколько четких групп. И все же обзор классификаций языков программирования кратко прослеживает историю их эволюции и глубже раскрывает заложенные в них идеи.
Каждый язык одновременно относится к нескольким из перечисленных групп - он может быть строго типизированным, компилируемым и объектно-ориентированным одновременно.
Поэтому нельзя рассматривать многообразие систем программирования через призму какой-то одной классификации
Изобретение языка программирования высшего уровня позволило нам общаться с машиной, понимать её (если конечно Вам знаком используемый язык), как понимает американец немного знакомый с русским языком древнюю азбуку Кириллицы. Проще говоря, мы в нашем развитии науки программирования пока что с ЭВМ на ВЫ.
Поверьте мне, это не сарказм вы только посмотрите как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Но если мы обратим внимание на темпы роста и развития новейших технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут произвести на свет языки, умеющие принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста.
Вопросы для самопроверки:
1. Что такое алгоритм?
2. Какие условия нужно учитывать при создании алгоритма?
3. Что характеризует исполнителя алгоритма?
4. Перечислите основные свойства алгоритма
5. Перечислите способы записи алгоритма
6. Что такое язык программирования?
7. По каким основным признакам классифицируют языки программирования?
8. Какое принципиальное отличие языков низкого уровня от языков высокого уровня?
9. Какие есть модели обработки программы компьютером?
10. Какие существуют методологии программирования?
Название дисциплины
1 2 3 4 5 6 7
Название дисциплины
Тема 1. ………………….
Блок 1. Основы систем программирования
Тема 1. Основы алгоритмизации и программирования. Системы
программирования. Виды языков программирования
Технология программирования
Цели изучения темы:
ознакомить студентов с основными понятиями и механизмами процесса алгоритмизации;
сформировать базу знаний о языках программирования, их видах, особенностях и сферах применения.
Задачи изучения темы:
сформировать знания о принципах построения наиболее часто встречаемых алгоритмов.
В результате изучения данной темы Вы будете
знать:
основные типы алгоритмов и их использование для решения вычислительных, инженерных задач;
методы проектирования и производства программного продукта, и средства описания алгоритмов;
основные методологии программирования.
уметь:
использовать рабочую среду программирования для выбора эффективного и современного метода решения задач;
классифицировать языки программирования по видам и механизму работы.
владеть:
основами алгоритмизации и программирования.
Учебные вопросы темы:
1. Понятие алгоритма
2. Системы программирования
Основные термины и понятия, которые Вам предстоит изучить:
алгоритмизация, алгоритм, дискретность, детерминированность,
псевдокод, машинный язык, графический алгоритм
Вопрос 1. Понятие алгоритма
Практически все в нашем мире подчиняется каким-то законам и правилам. Современная наука не стоит на месте, благодаря чему человечеству известна масса формул и алгоритмов, следуя которым, можно рассчитать и воссоздать множество действий и строений, созданных природой, и воплотить в жизнь идеи, придуманные человеком
Большинство действий, которые мы выполняем в течение своей жизни, требуют соблюдений ряда правил. От того, насколько верное представление имеет человек о том что, как и в какой последовательности он должен сделать, зависит качество и результат выполнения поставленных перед ним задач
Алгоритмизация – это процесс создания алгоритма решения задачи.
Алгоритм – это точное и понятное предписание исполнителю совершить последовательность действий, направленных на решение поставленной задачи. То бишь определяющее вычислительный процесс, ведущий от варьируемых исходных данных к искомому результату.
В алгоритме обязательно должны быть предусмотрены все ситуации, которые могут возникнуть в процессе решения комплекса задач. Само слово алгоритм происходит от имени арабского математика аль
Хорезми. Его полное имя было Абу Абдуллах (или Абу Джафар)
Мухаммад ибн Муса аль Хорезми. Он использовал индийскую позиционную систему счисления с нулем и в своих трудах сформулировал правила четырех арифметических действий над многозначными числами. Эти действия и стали впоследствии называть алгоритмами
Создание алгоритма требует творческого подхода, поэтому новый список последовательных действий может создать только живое существо. А вот для исполнения уже существующих инструкций фантазию иметь не обязательно, с этим справится даже бездушная техника.
Отличным примером точного исполнения заданной инструкции является пустая микроволновая печь, которая продолжает работать, несмотря на отсутствие пищи внутри нее.
Субъект или объект, которому не обязательно вникать в суть алгоритма, называется формальным исполнителем. Человек тоже может стать формальным исполнителем, однако в случае нерентабельности того или иного действия мыслящий исполнитель может все сделать по-своему. Поэтому основными исполнителями являются компьютеры, микроволновые печи, телефоны и другая техника. Понятие алгоритма в информатике имеет самое важное значение. Каждый алгоритм составляется с расчетом на конкретного
Составляя алгоритм для какого-нибудь автоматического устройства, мы должны принимать во внимание следующее:
Первое – это кто исполнитель, тот, кто будет работать по нашему алгоритму. Какие действия он может выполнять, какие команды и в каком виде мы можем ему отдавать. Исполнителем, в принципе, может быть кто или что угодно: человек, компьютер, станок с ЧПУ, автоматический луноход и т. д.
Второе – это как скомбинировать команды, чтобы исполнитель сделал то, что от него требуется. Это самый трудный этап в составлении алгоритма, использовать набор команд, понятных исполнителю, какие действия и в каком порядке выполнять.
Третье – это форма записи алгоритма. Человек понимает смысл сказанной фразы по множеству неуловимых оттенков и интонаций.
Одну и ту же мысль мы можем выразить различными словами.
Компьютер же понимает алгоритм буквально («Хозяин, тебе дрова не нужны?»), для него каждая конкретная команда всегда имеет один и тот же смысл. Поэтому алгоритмы для компьютеров записываются по строгим, заранее определенным правилам, чтобы их нельзя было истолковать по-разному.
Исполнителем алгоритма предстает некоторая абстрактная или реальная (техническая, биологическая или биотехническая) система, которая способна выполнить действия, предписываемые алгоритмом.
Для характеристики исполнителя используют несколько понятий:
• среда;
• система команд;
• элементарные действия;
• отказы.
Среда (или обстановка) представляет собой «место обитания» исполнителя.
Любой из исполнителей может выполнять команды только из некоторого строго заданного списка, который является системой
команд исполнителя. Для каждой команды задаются условия применимости (в каких состояниях среды может быть выполнена команда) и приводятся результаты выполнения команды.
После вызова команды исполнитель производит соответствующее
элементарное действие.
Может возникнуть и отказ исполнителя в случае, если команда вызывается при недопустимом для нее состоянии среды. Чаще всего исполнитель ничего не знает о цели алгоритма. Он выполняет все предложенные ему действия, не задавая вопросов «почему» и «зачем».
В информатике универсальным исполнителем алгоритмов является компьютер.
К основным свойствам алгоритмов относятся:
1) понятность для исполнителя – исполнитель алгоритма должен знать, как его выполнять;
2) дискретность (прерывность, раздельность) – алгоритм должен представлять процесс решения задачи как последовательное исполнение простых (или ранее определенных) шагов (этапов); т.е. обязательна возможность разбиения алгоритма на отдельные элементарные действия, которые можно реализовать на ЭВМ и результат их выполнения определен и понятен
3) детерминированность (определенность) – каждое правило алгоритма должно быть четким, однозначным и не оставлять места для ее неоднозначного толкования и неопределенного исполнения.
Это свойство обеспечивает выполнение алгоритма механически, не требуя никаких дополнительных указаний или сведений о решаемой задаче;
4) результативность (или конечность) – алгоритм должен приводить к решению задачи за конечное число шагов; т.е. для любого допустимого набора исходных данных он должен через определенное число шагов завершить работу.
5) массовость – алгоритм решения задачи производится в общем виде, т. е. его можно будет применять для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из определенной области, которая называется областью применимости алгоритма. Хотя есть мнение, что последний пункт относится не к алгоритмам, а ко всем математическим методам в целом.
Часто в школах, чтобы дать детям более понятное описание алгоритмов, учителя приводят в пример приготовление пищи по кулинарной книге, изготовление лекарства по рецепту или процесс мыловарения на основе мастер-класса. Однако, учитывая второе свойство алгоритма, в котором говорится о том, что каждый пункт алгоритма должен быть настолько понятным, чтобы его мог выполнить абсолютно любой человек и даже машина, можно прийти к выводу что любой процесс, требующий проявления хоть какой-то фантазии, алгоритмом назвать нельзя. А готовка и рукоделие требуют определенных навыков и хорошо развитого воображения.
Алгоритм должен давать строгую и четкую последовательность действий, поэтому для него существенным является способ его задания. От исполнителя требуется лишь четкое выполнение каждого действия. Мы не должны объяснять ему, для каких целей предназначается алгоритм.
Возможности любого исполнителя всегда ограничены. Поэтому, прежде чем составлять алгоритм решения задачи, нужно узнать, какие действия исполнитель может выполнить. Эти действия называются допустимыми действиями исполнителя. Для решения одних и тех же задач исполнители с более «бедным» набором допустимых действий требуют более сложных подробных алгоритмов.
Алгоритм можно записывать разными способами.
Способы записи алгоритма:
1.
С помощью рисунка, (например, процесс подключения монитора),
2.
На естественном языке - построчно, каждая команда - с новой строки
(последовательность проявления фотопленки, последовательность склеивания поверхностей на тюбике с клеем и т. д.
3.
Использование псевдокода – полуформализованные описания алгоритмов на некотором условном алгоритмическом языке, которые включают в себя как элементы языка программирования, так и фразы естественного языка, общепринятые математические обозначения и др.
Псевдокод занимает промежуточное место между естественным и формальным языками. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором служебных слов и основных (базовых) конструкций (например, школьный АЯ).
4.
Графическое представление – блоксхема.
5.
Программное – тексты на языках программирования
Словесный способ
записи алгоритмов является описанием последовательных этапов обработки данных. Алгоритм может быть задан в произвольном изложении на естественном языке. Например, алгоритм нахождения наибольшего общего делителя двух натуральных чисел можно представить как следующую последовательность действий:
1. задание двух чисел;
2. если числа равны, то выбор любого из них в качестве ответа и остановка, в противном случае – продолжение выполнения алгоритма;
3. определение большего из чисел;
4. замена большего из чисел разностью большего и меньшего из чисел;
5. повтор алгоритма с шага 2.
Приведенный алгоритм используется для любых натуральных чисел и должен приводить к решению поставленной задачи.
Словесный способ не имеет широкого распространения, так как обладает некоторыми недостатками:
• данные описания строго не формализуемы;
• отличаются многословностью записей;
• допускают неоднозначность толкования отдельных предписаний.
Графический способ представления алгоритмов оказывается более компактным и наглядным по сравнению со словесным. При данном виде представления алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению некоторого числа действий.
Для графического представления алгоритм использует изображение в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Это графическое представление называется
схемой алгоритма, или блок-схемой.
В блок-схеме каждый из типов действий (ввод исходных данных, вычисление значений выражений, проверка условий, управление повторением действий, окончание обработки и т. п.) соответствует геометрической фигуре, представленной в виде блочного символа.
Блочные символы соединены линиями переходов, которые определяют очередность выполнения действий.
Псевдокод является системой обозначений и правил, которая предназначена для единообразной записи алгоритмов. Он занимает промежуточное место между естественным и формальным языками. С одной стороны, псевдокод похож на обычный естественный язык, поэтому алгоритмы могут на нем записываться и читаться как обычный текст. С другой стороны, в псевдокоде используются некоторые формальные конструкции и математическая символика, благодаря чему запись алгоритма приближается к общепринятой математической записи.
В псевдокоде не применяются строгие синтаксические правила для записи команд, которые присущи формальным языкам, что облегчает запись алгоритма на стадии его проектирования и дает возможность использовать более широкий набор команд, рассчитанный на абстрактного исполнителя. Однако в псевдокоде чаще всего имеются некоторые конструкции, присущие формальным языкам, что облегчает переход от записи на псевдокоде к записи алгоритма на формальном
Программная
форма
представления
алгоритмов
иногда характеризуется некоторыми структурами, состоящими из отдельных базовых (основных) элементов. При данном подходе к алгоритмам изучение основных принципов их конструирования следует начинать с этих базовых элементов. Их описание осуществляется с использованием языка схем алгоритмов и алгоритмического языка.
Графический алгоритм — понятие, подразумевающие под собой разложение действий, которые нужно выполнить для решения определенной задачи, по определенным геометрическим фигурам.
Графические схемы изображаются не как попало. Для того чтобы их мог понять любой человек применяются чаще всего блок-схемы.
Также блок-схемы изображаются в соответствии с ГОСТ-19701-90 и
ГОСТ-19.003-80. Графические фигуры, применяемые в алгоритме, делятся на:
Основные. Основные изображения применяются для обозначения операций, нужных для обработки данных при решении задачи.
Вспомогательные. Вспомогательные изображения нужны для обозначения отдельных, не самых важных, элементов решения задачи
В графическом алгоритме геометрические фигуры, используемые для обозначения данных, называются блоками. Все блоки идут в последовательности "сверху вниз" и "слева направо" — это правильное направление потока. При правильной последовательности линии, соединяющие между собой блоки, не показывают направление. В остальных случаях направление линий обозначается с помощью стрелок. У правильной схемы алгоритма не должно быть больше одного выхода из обрабатывающих блоков и менее двух выходов из блоков, отвечающих за логические операции и проверку выполнения условий
Название символа
Обозначение и пример заполнения
Пояснение
Процесс
Вычислительное действие или
Решение
Проверка условий
Модификация
Начало цикла
Предопределенный процесс
Вычисление по подпрограмме, стандартной подпрограмме
Вывод-ввод
Вывод-ввод в общем виде
Пуск остановка
Начало, конец алгоритма, вход-выход в подпрограмму
Документ
Вывод результатов на печать
Вопрос 2. Системы программирования
Прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов –
языков программирования. Смысл появления такого языка – оснащенный набор вычислительных формул дополнительной информации, превращает данный набор в алгоритм.
Языки программирования – это системы символов и правил их сочетания, предназначенные для взаимодействия человека со сложными машинами. Существуют сотни таких организованных систем, выполняющих различные функции. Чтобы сориентироваться в этом многообразии, специалисты создают общие классификации языков программирования, основанные на том или ином характерном признаке.
Языки программирования могут быть сгруппированы по десяткам различных признаков. Они являются принципиально важными или имеют прикладное значение. Наблюдается сильная зависимость классификации языков программирования от истории развития. С годами технологии усложнялись и кардинально изменялись, на первый план выходило удобство программиста, появлялись эффективные алгоритмы, сложные команды и новые уровни абстракции.
Основные классификации языков программирования по видам и механизму работы базируются на следующих параметрах:
Особенности лексики и грамматики в совокупности с уровнем абстракции и степенью удобства для человека.
Базовая концепция и методология составления алгоритмов.
Способ представления данных.
Организация процесса взаимодействия с машиной, механизм исполнения программ.
Область жизни, в которой применяется язык.
Историческая эпоха, в которую языковая система была сформирована.
Составить четкую классификацию языков и систем программирования нельзя, но возможно разделить и систематизировать их по принципиально важным признакам
Удобство для человека
Инструкции, написанные на машинном языке, понятны компьютеру, но крайне неудобны для человека. В них трудно разобраться, их практически невозможно быстро изменить или составить с их помощью сложный алгоритм. Для повышения эффективности программисты поднялись на новые уровни абстракции и научили машину принимать более человекопонятные инструкции и самостоятельно переводить их в машинный код. Рассмотрим классификацию и особенности языков программирования разного уровня:
Машинный код. Это тоже язык программирования, на котором при должной подготовке можно написать инструкцию.
Низкий уровень. По-настоящему низкоуровневыми являются языки ассемблера, которые используют нативные машинные команды, закодированные с помощью мнемонических кодов.
Средний уровень. Системы программирования этой группы могут считаться и низко- и высокоуровневыми, в зависимости от конкретных представлений о степень абстракции. Сюда можно отнести C и C++.
Высокий уровень. Эти языки позволяют создавать сложные алгоритмы, но требуют дополнительной обработки перед выполнением, поэтому сгенерированный ими код менее эффективен и выполняется медленнее.
Сверхвысокий уровень. Эта немногочисленная группа характеризуется появлением сверхмощных команд и операторов.
Сюда можно отнести Алгол-68
Особенностью языков низкого уровня является их машинозависимость. Они тесно привязаны к особенностям организации конкретного типа ЭВМ, но в целом похожи друг на друга.
Машинный язык — единственный язык, понятный ЭВМ. Он реализуется аппаратно: каждую команду выполняет некоторое электронное устройство. Программа на машинном языке представляет собой последовательность команд и данных, заданных в цифровом виде.
Данные на машинном языке представлены числами и символами.
Операции являются элементарными и из них строится вся программа.
Ввод программы в цифровом виде производился непосредственно в оперативную память.
Естественно, что процесс программирования был очень трудоемким, разобраться в программе даже автору было довольно сложно, а эффект от применения ЭВМ был довольно низким.
Этот этап в развитии языков программирования показал, что программирование является сложной проблемой, трудно поддающейся автоматизации, но именно программное обеспечение определяет в конечном счете эффективность применения ЭВМ. Поэтому на всех последующих этапах усилия направлялись на совершенствование интерфейса между программистом и ЭВМ языка программирования.
Стремление программистов оперировать не цифрами, а символами, привело к созданию мнемонического языка программирования, который называют ассемблером, мнемокодом, автокодом. Этот язык имеет определенный синтаксис записи программ, в котором, в частности, цифровой код операции заменен мнемоническим кодом.
Языки низкого уровня обеспечивают:
высокую скорость выполнения и максимальную компактность создаваемых программ;
прямое взаимодействие с аппаратными ресурсами;
полный контроль над памятью
Основные недостатки низкоуровневых языков:
для каждого типа ЭВМ необходимо использовать определенную систему команд, зависящую от особенностей функционирования машины;
сложность и низкая скорость процесса программирования;
высокая вероятность появления ошибок, которые сложно отследить;
отсутствие мобильности программ, невозможность запустить их на ЭВМ другого типа.
Высокоуровневые системы программирования не привязаны к определенной машинной системе команд и могут выполняться на любом компьютере. Благодаря высокому уровню абстракции они могут себе позволить использовать различные концепции и методологии в составлении инструкций.
Поэтому классификация языков программирования высокого уровня очень обширна и сложна.
Принципиальными отличиями языков высокого уровня от языков низкого уровня являются:
использование переменных;
возможность записи сложных выражений;
расширяемость типов данных за счет конструирования новых типов из базовых;
расширяемость набора операций за счет подключения библиотек подпрограмм;
слабая зависимость от типа ЭВМ.
Для машинно-независимых языков не требуется полного знания специфики компьютеров. С их помощью можно записывать программу в виде, допускающем ее реализацию на ЭВМ с различными типами машинных операций, привязка к которым возлагается на соответствующий транслятор.
Причина бурного развития и применения высокоуровневых языков программирования заключается в быстром росте производительности
ЭВМ и хронической нехватке программистских кадров.
Промежуточное место между машинно-независимыми и машинно- зависимыми языками отводится языку Си. Он создавался при попытке объединения достоинств, присущих языкам обоих классов. Данный язык обладает рядом особенностей:
максимально использует возможности конкретной вычислительной архитектуры; из-за этого программы на языке
Си компактны и работают эффективно;
позволяет налучшим образом использовать огромные выразительные средства современных языков высокого уровня.
Обработка программы машиной
Чтобы выполнить сложную инструкцию, компьютер прежде всего должен понизить ее абстрактность и перевести на понятный для себя язык. Способ, которым это делается, называется моделью исполнения.
Выделяют две основных модели и одну гибридную:
• Компиляция - единовременный перевод всей программы в машинный код.
• Интерпретация - последовательное выполнение каждого выражения.
• Транскомпиляция - перевод на язык более низкого уровня, например C или ассемблер, и его последующая компиляция.
Для перевода необходима специальная программа-транслятор - компилятор или интерпретатор, без которой работа с языком невозможна
Интерпретация представляет собой пооператорную трансляцию и последующее выполнение оттранслированного оператора исходной программы. Его присутствие необходимо от начала и до самого конца работы программы
Существует два основных недостатка метода интерпретации:
постоянное нахождение транслятора в памяти ЭВМ; интерпретирующая программа должна располагаться в памяти
ЭВМ на протяжении всего процесса выполнения исходной программы. Другими словами, она должна занимать некоторый установленный объем памяти
повторная обработка повторяющихся команд, процесс трансляции одного и того же оператора повторяется такое число раз, которое должна исполнять эта команда в программе. Это приводит к резкому снижению производительности работы программы.
Несмотря на это, интерпретируемые языки очень удобны для циклической разработки и отладки, так как позволяют быстро вносить изменения в программу. Трансляторы-интерпретаторы являются достаточно распространенными, так как они поддерживают диалоговый режим.
Компилятор же трудится только один раз, сразу преобразуя всю инструкцию в понятный для компьютера вид - машинный код или некий промежуточный байт-код, а затем покидает память ЭВМ.
Процессы трансляции и выполнения при компиляции разделяются во времени: сначала исходная программа в полном объеме переводится на машинный язык, после чего оттранслированная программа может многократно исполняться. Для трансляции методом компиляции необходим неоднократный «просмотр» транслируемой программы, т. е.
трансляторы-компиляторы
являются многопроходными.
Трансляция методом компиляции носит название объектного модуля,
который представляет собой эквивалентную программу в машинных кодах. Необходимо, чтобы перед исполнением объектный модуль обрабатывался специальной программой ОС и преобразовывался в
загрузочный модуль.
Здесь выполнение отделено от процесса трансляции, что является более эффективной.
Основные недостатки компиляционной модели: большая сложность.
Прежде чем перевести программу на понятный машине язык,
Применяют также трансляторы интерпретаторы-компиляторы,
объединяющие в себе достоинства обоих принципов трансляции.
Четкого разграничения систем не существует, так как традиционно интерпретируемые языки могут быть скомпилированы и наоборот.
Классификация языков программирования высокого уровня по модели исполнения:
Интерпретируемые - Python, Haskell, PHP, JavaScript.
Компилируемые сразу в машинный код: C, C++, Fortran, ASM.
Компилируемые в байт-код: Python, Java.
Транскомпилируемые: Haskell, Fortran, C, C++.
Принципиальный способ взаимодействия
Высокоуровневые языки используются в машинно-независимых системах программирования. Такие системы программирования в сравнении с машинно-ориентированными системами предстают более простыми в использовании. Высокоуровневые языки могут быть разделены по основной парадигме программирования. Существуют десятки методологий составления программ, некоторые из которых очень похожи друг на друга, поэтому создать четкую систему различий невозможно.
Языки программирования высокого уровня подразделяют на процедурно-ориентированные, проблемно-ориентированные и объектно-ориентированные.
Процедурно-ориентированные языки применяются для записи процедур или алгоритмов обработки информации на каждом определенном круге задач.. Требуют явного последовательного описания алгоритма решения задачи. Операторы при этом объединяются в процедурные группы, отделенные от самих данных. Примеры процедурных языков – Фортран, Pascal, Basic,
С;
Проблемно-ориентированные языки используются для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники.
Максимально формализовано описывают саму задачу и требуемый результат. Решение при этом должно логически следовать из этого описания;
Примеры проблемно ориентированных языков: Лисп, Пролог, VHDL.
объектно-ориентированные. Имеют в основе концепцию объекта, объединяющего в себе данные и методы их обработки.
Большинство из этих языков являются версиями процедурных и проблемных языков, но программирование с помощью языков
Языки последней группы описывают все сущности в виде независимых объектов, скрывающих в себе сложные механики. Основными концепциями ООП (объектно-ориентированного программирования) являются:
инкапсуляция - скрытие функционала внутри объекта;
наследование одними объектами методов других;
полиморфизм - изменение сути с сохранением внешнего интерфейса.
Можно составить также классификацию языков объектно- ориентированного программирования по способу реализации основных концепций этого подхода - наследования, инкапсуляции и полиморфизма. Помимо классических механизмов существуют другие, например прототипный, используемый в JavaScript.
Методология ООП считается самой прогрессивной, эффективной и в некотором смысле модной. Однако в ряде случаев для решения конкретной задачи более эффективными могут быть другие подходы, например функциональный
Поколения языков программирования
Классификация языков программирования по истории их появления считается условной, так как не учитывает особенности конкретных систем. Однако она позволяет проследить, как менялись со временем концепции и усложнялись задачи, стоящие перед программистами.
В попытках связать классификацию и эволюцию языков программирования выделились несколько крупных групп, названных поколениями:
Первое поколение - машинные языки низкого уровня, привязанные к реализации конкретной ЭВМ. "Программы" на этих языках выглядели как ряды переключателей, приведенных в нужное положение, или перфокарты (перфоленты). Таким образом, все команды представляли собой последовательность нулей и единиц - бинарный код. Пример: язык ARM-процессора.
Во втором поколении языки стали немного понятнее для человека, но отвязать их от конкретного аппарата так и не удалось. Это время языков ассемблера с его мнемоническими
Пример: Макроассемблер.
Языки третьего поколения сняли с программиста заботу о непринципиальных деталях составления инструкций, таких как перевод программы в машинный код. Теперь компьютер научился делать это самостоятельно. Синтаксис и лексика приблизились к человеческим, стали понятнее. В этом поколении зародились практически все современные языки высокого уровня с широкой областью применения, независимо от их парадигмы:
PHP, Fortran.
В четвертом поколении уровень абстракции возрос еще больше, резко сужая область использования. К этой группе относятся такие специфичные языки, как FoxPro, Simulink, SQL. Появились языки визуального программирования: CAD-пакеты, системы
RAD.
Наконец, языки пятого поколения должны были сами писать программы, получая лишь описание от программиста. Эта задумка так и не была реализована полностью, так как для составления эффективного алгоритма иногда недостаточно прямой машинной логики, а требуется еще человеческая интуиция и смекалка. Примерами языков пятого поколения являются MathCAD, Prolog и Mercury.
По сути, поколения языков в точности соответствуют этапам программирования, рассмотренным в начале статьи, перечисленным в обратном порядке. Изначально программист все операции брал на себя, а машина лишь выполняла заданную последовательность действий.
Теперь же ЭВМ способна выдавать результат по формализованному описанию задачи.
Облегчение труда программиста сопровождается увеличением нагрузки на машину, программа выполняется медленнее и требует больших ресурсов.
Несмотря на то что технический прогресс движется семимильными шагами, языки первых поколений вовсе не исчезли. Они применяются в областях, требующих максимальной простоты и эффективности.
Область применения
Каждый язык программирования хорош в своей области, для которой он создавался. Так, для программирования микроконтроллеров используются ассемблеры, а с Java там делать нечего. Низкоуровневое программирование драйверов эффективно с C, который позволяет строго контролировать ресурсы памяти. Для веб-программирования стоит выбрать скриптовые языки PHP и JavaScript, интерпретатор которого встроен в каждый современный браузер. Важные банковские программы написаны на Java, обеспечивающем контроль ошибок.
Аэрокосмические - тоже на Java или на Паскале, который даже уборку мусора отдает на контроль программисту.
Все языки хороши, нужно лишь подобрать соответствующий задаче
Важность классификации
Сложно разделить сотни существующих систем взаимодействия человека и ЭВМ на несколько четких групп. И все же обзор классификаций языков программирования кратко прослеживает историю их эволюции и глубже раскрывает заложенные в них идеи.
Каждый язык одновременно относится к нескольким из перечисленных групп - он может быть строго типизированным, компилируемым и объектно-ориентированным одновременно.
Поэтому нельзя рассматривать многообразие систем программирования через призму какой-то одной классификации
Изобретение языка программирования высшего уровня позволило нам общаться с машиной, понимать её (если конечно Вам знаком используемый язык), как понимает американец немного знакомый с русским языком древнюю азбуку Кириллицы. Проще говоря, мы в нашем развитии науки программирования пока что с ЭВМ на ВЫ.
Поверьте мне, это не сарказм вы только посмотрите как развилась наука программирования с того времени, как появились языки программирования, а ведь язык программирования высшего уровня, судя по всему ещё младенец. Но если мы обратим внимание на темпы роста и развития новейших технологий в области программирования, то можно предположить, что в ближайшем будущем, человеческие познания в этой сфере, помогут произвести на свет языки, умеющие принимать, обрабатывать и передавать информации в виде мысли, слова, звука или жеста.
Вопросы для самопроверки:
1. Что такое алгоритм?
2. Какие условия нужно учитывать при создании алгоритма?
3. Что характеризует исполнителя алгоритма?
4. Перечислите основные свойства алгоритма
5. Перечислите способы записи алгоритма
6. Что такое язык программирования?
7. По каким основным признакам классифицируют языки программирования?
8. Какое принципиальное отличие языков низкого уровня от языков высокого уровня?
9. Какие есть модели обработки программы компьютером?
10. Какие существуют методологии программирования?
Название дисциплины
Тема 1. ………………….
Блок 1. Основы систем программирования
Тема 2. Проблемы разработки сложных программных систем.
Жизненный цикл и процессы разработки ПО.
Технология программирования
Цели изучения темы:
ознакомить студентов с понятием сложных программных систем;
сформировать базу знаний о процессах разработки программного обеспечения.
Задачи изучения темы:
сформировать знания о особенностях и принципах жизненных циклов программ.
В результате изучения данной темы Вы будете
знать:
понятие и особенности жизненного цикла программ;
модели жизненных циклов;
методологии разработки ПО;
уметь:
отличать программы с малым временем жизни и с большим временем жизни;
применять программы с малым и с большим временем жизни.
владеть:
методами и критериями оценивания качества программного обеспечения.
Учебные вопросы темы:
1. Жизненный цикл программного обеспечения: понятие, стандарты, процессы.
2. Методологии разработки ПО.
Основные термины и понятия, которые Вам предстоит изучить:
жизненный цикл,
каскадная модель, итерационная модель, Rational
Unified Process, экстремальное программирование, Microsoft Solutions
Framework.
Вопрос 1. Жизненный цикл программного обеспечения: понятие,
стандарты, процессы
Первое поколения ЭВМ отличалось конструктивной простотой и небольшими возможностями. Поэтому человек, решавший задачу на такой ЭВМ, должен был быть и программистом, и специалистом в области решаемой задачи, и разбираться в устройстве ЭВМ.
С развитием ВТ увеличились ее возможности, вызвавшие развитие программирования, которое потребовало произвести разделение труда не только между программистами и представителями других профессий, но и в среде программистов. Следствием стало создание программ как отчуждаемых самостоятельных продуктов, которые обладают всеми свойствами любого промышленного изделия, а программирование превратилось в индустриальную отрасль.
Появилось понятие жизненного цикла программы, т.е. времени всех этапов развития – от возникновения, до полного прекращения ее эксплуатации вследствие морального старения или потери необходимости решения некоторой задачи.
Разработка ПО невозможна без понимания жизненного цикла программ. Рядовому пользователю это, может быть, и не нужно знать, но основные стандарты желательно усвоить.
Под жизненным циклом любого программного продукта принято
понимать время его существования, начиная со стадии разработки и
до момента полного отказа от использования в выбранной сфере
применения вплоть до полного изъятия приложения из обихода.
Комплексы программ создаются, эксплуатируются и развиваются во времени. Жизненный цикл программных средств включает в себя все этапы развития: от возникновения потребности в программе, определением целевого назначения, до полного прекращения использования этого программного средства, вследствие его морального старения или потере необходимости решения соответствующих задач.
По длительности жизненного цикла все программы делятся на два класса – с малым и большим временем жизни.
Этим классам соответствуют 2 подхода в их создании:
- гибкий (как объект научного творчества);
- жестко стандартизированный (промышленный).
Программы с малым сроком жизни обычно создаются для решения научных или инженерных задач, когда главную ценность имеет результат.
Программы с большим сроком жизни создаются для регулярной обработки информации или управления в процессе функционирования сложных систем.
Программы первого типа допускают тиражирование, оформляются документацией, как любое промышленное изделие и представляют собой отчуждаемый программный продукт.
Программы с малой длительностью эксплуатации создаются в основном для решения научных и инженерных задач, для получения конкретных результатов вычислений. Такие программы относительно невелики от 1 до 10000 команд. Разрабатываются как правило одним специалистом или маленькой группой, не предназначены для тиражирования и передачи для последующего использования в другие коллективы. ЖЦ таких программ состоит из длительного интервала системного анализа и форматизации проблемы, значительного этапа проектирования программ и относительно небольшого времени эксплуатации и получения результатов.
Требования, предъявляемые к функциональным и конструктивным характеристикам, как правило не формализуются, отсутствуют оформленные испытания программ и показатели их качества контролируются только разработчиками, в соответствии с неформальными представлениями.
Сопровождение и модификация таких программ не нужны и их ЖЦ завершается после получения результатов вычислений. Основные затраты в ЖЦ таких программ приходятся на этапы системного анализа и проектирования, которые продолжаются от месяца до одного или двух лет. В результате ЖЦ редко превышает три года, т.е. основное время идет на анализ и проектирование.
Программы с большой длительностью эксплуатации создаются для регулярной обработки информации и управления в процессе функционирования сложных вычислительных систем. Размеры программных средств могут изменяться в широких пределах (от 1 до бесконечности команд), однако все они обладают свойством познаваемости и возможности модификации в процессе использования различными специалистами. Программы такого класса допускают тиражирование.
Они сопровождаются документацией как промышленные изделия и представляют собой отчуждаемый программный продукт.
Проектированием и эксплуатацией программного средства могут заниматься большие коллективы специалистов, для чего необходима формализация требуемых технических характеристик комплекса программ и их компонент. А также формализированые испытания и определение достигнутых показателей качества программных средств.
Модели жизненного цикла
Существует несколько моделей жизненного цикла.
Каскадная модель жизненного цикла (англ. waterfall model) была предложена в 1970 г. Уинстоном Ройсом. Она предусматривает
последовательное выполнение всех этапов проекта в строго фиксированном порядке. Переход на следующий этап означает полное завершение работ на предыдущем этапе. Требования, определенные на стадии формирования требований, строго документируются в виде технического задания и фиксируются на все время разработки проекта.
Каждая стадия завершается выпуском полного комплекта документации, достаточной для того, чтобы разработка могла быть продолжена другой командой разработчиков.
Этапы проекта в соответствии с каскадной моделью:
1. формирование требований;
2. проектирование;
3. реализация;
4. тестирование;
5. внедрение;
6. эксплуатация и сопровождение.
В каскадной модели переход от одной фазы проекта к другой предполагает полную корректность результата предыдущей фазы. В больших проектах этого добиться практически невозможно. Поэтому такая модель пригодна только для разработки небольшого проекта.
(Сам У. Ройс не придерживался данной модели и использовал модель итерационную).
Итерационная модель. Альтернативой каскадной модели является модель итеративной и инкрементальной разработки (англ. iterative and incremental development, IID), получившей от Т. Гилба в 70-е гг. название эволюционной модели. Модель IID предполагает разбиение жизненного цикла проекта на последовательность итераций, каждая из которых напоминает «мини-проект», включая все процессы разработки в применении к созданию меньших фрагментов функциональности, по сравнению с проектом в целом. Цель каждой итерации — получение работающей версии программной системы, включающей функциональность, определённую интегрированным содержанием всех предыдущих и текущей итерации. Результат финальной итерации содержит всю требуемую функциональность продукта. Таким образом, с завершением каждой итерации продукт получает приращение — инкремент — к его возможностям, которые, следовательно, развиваются эволюционно.
Стандартизация жизненного цикла приложения
Среди систем, предопределяющих условия и требования, предъявляемые к таким процессам, сегодня можно назвать только три основных:
Каждая стадия завершается выпуском полного комплекта документации, достаточной для того, чтобы разработка могла быть продолжена другой командой разработчиков.
Этапы проекта в соответствии с каскадной моделью:
1. формирование требований;
2. проектирование;
3. реализация;
4. тестирование;
5. внедрение;
6. эксплуатация и сопровождение.
В каскадной модели переход от одной фазы проекта к другой предполагает полную корректность результата предыдущей фазы. В больших проектах этого добиться практически невозможно. Поэтому такая модель пригодна только для разработки небольшого проекта.
(Сам У. Ройс не придерживался данной модели и использовал модель итерационную).
Итерационная модель. Альтернативой каскадной модели является модель итеративной и инкрементальной разработки (англ. iterative and incremental development, IID), получившей от Т. Гилба в 70-е гг. название эволюционной модели. Модель IID предполагает разбиение жизненного цикла проекта на последовательность итераций, каждая из которых напоминает «мини-проект», включая все процессы разработки в применении к созданию меньших фрагментов функциональности, по сравнению с проектом в целом. Цель каждой итерации — получение работающей версии программной системы, включающей функциональность, определённую интегрированным содержанием всех предыдущих и текущей итерации. Результат финальной итерации содержит всю требуемую функциональность продукта. Таким образом, с завершением каждой итерации продукт получает приращение — инкремент — к его возможностям, которые, следовательно, развиваются эволюционно.
Стандартизация жизненного цикла приложения
Среди систем, предопределяющих условия и требования, предъявляемые к таким процессам, сегодня можно назвать только три основных:
ГОСТ 34.601-90;
ISO/IEC 12207:2008;
Oracle CDM.
Для второго международного стандарта имеется российский аналог.
Это ГОСТ Р ИСО/МЭК 12207-2010, «Информационная технология.
Системная и программная инженерия. Процессы жизненного
цикла программных средств». Но жизненный цикл программного обеспечения, описываемый в обоих правилах, является идентичным по сути. Данный стандарт, устанавливает общую структуру процессов жизненного цикла программных средств, на которую можно ориентироваться в программной индустрии. Стандарт не предлагает конкретную модель жизненного цикла. Его положения являются общими для любых моделей жизненного цикла, методов и технологий создания ПО. Он описывает структуру процессов жизненного цикла, не конкретизируя, как реализовать или выполнить действия и задачи, включенные в эти процессы.
Виды ПО и апдейты
Современные информационные системы таковы, что для них устанавливаются общепринятые понятия области применения.
Например, есть системные программы и утилиты, средства мультимедиа, драйверы устройств, офисные приложения и т. д. Для любого типа программных продуктов можно определить этапы жизненного цикла существования.
Для его продления чаще всего применяются средства обновления (как для операционных систем, так и для платформ и прикладного ПО).
Наверное, не нужно объяснять, что любой пользователь компьютерной системы на основе Windows проходил этап обновления самой системы или компонентов вроде Microsoft .NET Framework или виртуальной машины Java.
Вопрос 2. Методологии разработки ПО
Различные варианты итерационного подхода реализованы в большинстве современных методологий разработки:
Rational Unified Process
Extreme Programming
Microsoft Solutions Framework
Rational Unified Process (RUP) (рациональный унифицированный процесс) — методология разработки программного обеспечения, которая поддерживается компанией Rational Software (IBM). В методологии даются рекомендации по всем этапам разработки: от моделирования бизнеса до тестирования и сдачи в эксплуатацию
готовой программы. В качестве языка моделирования используется язык Unified Modelling Language (UML).
Экстремальное программирование – одна из гибких методологий разработки программного обеспечения. Название методологии исходит из идеи применить полезные традиционные методы и практики разработки программного обеспечения, подняв их на новый
«экстремальный» уровень. Так, например, практика выполнения ревизии кода, заключающаяся в проверке одним программистом кода, написанного другим программистом, в «экстремальном» варианте представляет собой «парное программирование», когда один программист занимается написанием кода, а его напарник в это же время непрерывно просматривает только что написанный код.
Microsoft Solutions Framework (MSF) — методология разработки программного обеспечения, предложенная корпорацией Microsoft.
MSF опирается на практический опыт Microsoft и описывает управление людьми и рабочими процессами в процессе разработки решения. MSF представляет собой согласованный набор концепций, моделей и правил.
Полный жизненный цикл разработки продукта состоит из четырех фаз, каждая из которых включает в себя одну или несколько итераций.
Начальная стадия (Inception)
Определение масштабов проекта и объема необходимых ресурсов.
Определяются основные требования, ограничения и ключевая функциональность продукта. Оцениваются риски. Планирование действий. При завершении начальной фазы оценивается достижение этапа жизненного цикла цели (англ. Lifecycle Objective Milestone), которое предполагает соглашение заинтересованных сторон о продолжении проекта.
Уточнение (Elaboration)
Документирование требований. Проектирование, реализация и тестирование исполняемой архитектуры. Уточнение сроков и стоимости. Снижение основных рисков. Успешное выполнение фазы разработки означает достижение этапа жизненного цикла архитектуры (англ. Lifecycle Architecture Milestone).
Построение (Construction)
В фазе «Построение» происходит реализация большей части функциональности продукта: дизайн приложения завершен, исходный код написан. Фаза Построение завершается первым внешним релизом системы и вехой начальной функциональной готовности (Initial Operational Capability).
Внедрение (Transition)
В фазе «Внедрение» создается финальная версия продукта и передается от разработчика к заказчику. Это включает в себя
Экстремальное программирование – одна из гибких методологий разработки программного обеспечения. Название методологии исходит из идеи применить полезные традиционные методы и практики разработки программного обеспечения, подняв их на новый
«экстремальный» уровень. Так, например, практика выполнения ревизии кода, заключающаяся в проверке одним программистом кода, написанного другим программистом, в «экстремальном» варианте представляет собой «парное программирование», когда один программист занимается написанием кода, а его напарник в это же время непрерывно просматривает только что написанный код.
Microsoft Solutions Framework (MSF) — методология разработки программного обеспечения, предложенная корпорацией Microsoft.
MSF опирается на практический опыт Microsoft и описывает управление людьми и рабочими процессами в процессе разработки решения. MSF представляет собой согласованный набор концепций, моделей и правил.
Полный жизненный цикл разработки продукта состоит из четырех фаз, каждая из которых включает в себя одну или несколько итераций.
Начальная стадия (Inception)
Определение масштабов проекта и объема необходимых ресурсов.
Определяются основные требования, ограничения и ключевая функциональность продукта. Оцениваются риски. Планирование действий. При завершении начальной фазы оценивается достижение этапа жизненного цикла цели (англ. Lifecycle Objective Milestone), которое предполагает соглашение заинтересованных сторон о продолжении проекта.
Уточнение (Elaboration)
Документирование требований. Проектирование, реализация и тестирование исполняемой архитектуры. Уточнение сроков и стоимости. Снижение основных рисков. Успешное выполнение фазы разработки означает достижение этапа жизненного цикла архитектуры (англ. Lifecycle Architecture Milestone).
Построение (Construction)
В фазе «Построение» происходит реализация большей части функциональности продукта: дизайн приложения завершен, исходный код написан. Фаза Построение завершается первым внешним релизом системы и вехой начальной функциональной готовности (Initial Operational Capability).
Внедрение (Transition)
В фазе «Внедрение» создается финальная версия продукта и передается от разработчика к заказчику. Это включает в себя
программу бета-тестирования, обучение пользователей, а также определение качества продукта. В случае, если качество не соответствует ожиданиям пользователей или критериям, установленным в фазе Начало, фаза Внедрение повторяется снова.
Выполнение всех целей означает достижение вехи готового продукта (Product Release) и завершение полного цикла разработки.
Стадия проектирования
Теперь несколько слов непосредственно о стадиях разработки.
Жизненный цикл ПО изначально включает в себя планирование проекта, анализ системных и целевых требований, возможности предварительного или детального проектирования, кодирование и тестирование, возможность применения программ в специализированных системах и т. д.
Модели жизненного цикла программного обеспечения предполагают, что изначально поставленная задача по созданию программного обеспечения должна сводиться к разработке универсальных приложений или программных продуктов, использующих определенную среду запуска.
Разработка
Системы разработки представляют собой языки программирования.
Проектирование программного обеспечения на первой стадии может сводиться именно к этому.
Будет ли это C+/C++, Java, Delphi или тот же Pascal – не столь важно.
Вопрос состоит в том, насколько созданное приложение сможет интегрироваться в операционную систему и работать без сбоев.
В этом смысле 1 жизненный цикл программного обеспечения является временем его тестирования от начальной инсталляции продукта до его полного удаления вследствие несоответствия требованиям системы, неработоспособности или невозможности выполнения изначально поставленных задач.
Последующие этапы
Дальнейшее сопровождение, определяющие жизненный цикл программного обеспечения, сводится к тому, чтобы произвести кодирование и получение исходного кода приложения.
В случае его бесплатного (открытого) распространения применяется так называемый сертификат на основе лицензии GNU, что предусматривает возможность изменения самого программного продукта по желанию стороннего пользователя, знакомого с языком программирования, с помощью которого приложение создавалось.
Если речь идет о закрытом коде, можно воспользоваться утилитами вроде Disassembler. Но в этом случае можно добиться только
Выполнение всех целей означает достижение вехи готового продукта (Product Release) и завершение полного цикла разработки.
Стадия проектирования
Теперь несколько слов непосредственно о стадиях разработки.
Жизненный цикл ПО изначально включает в себя планирование проекта, анализ системных и целевых требований, возможности предварительного или детального проектирования, кодирование и тестирование, возможность применения программ в специализированных системах и т. д.
Модели жизненного цикла программного обеспечения предполагают, что изначально поставленная задача по созданию программного обеспечения должна сводиться к разработке универсальных приложений или программных продуктов, использующих определенную среду запуска.
Разработка
Системы разработки представляют собой языки программирования.
Проектирование программного обеспечения на первой стадии может сводиться именно к этому.
Будет ли это C+/C++, Java, Delphi или тот же Pascal – не столь важно.
Вопрос состоит в том, насколько созданное приложение сможет интегрироваться в операционную систему и работать без сбоев.
В этом смысле 1 жизненный цикл программного обеспечения является временем его тестирования от начальной инсталляции продукта до его полного удаления вследствие несоответствия требованиям системы, неработоспособности или невозможности выполнения изначально поставленных задач.
Последующие этапы
Дальнейшее сопровождение, определяющие жизненный цикл программного обеспечения, сводится к тому, чтобы произвести кодирование и получение исходного кода приложения.
В случае его бесплатного (открытого) распространения применяется так называемый сертификат на основе лицензии GNU, что предусматривает возможность изменения самого программного продукта по желанию стороннего пользователя, знакомого с языком программирования, с помощью которого приложение создавалось.
Если речь идет о закрытом коде, можно воспользоваться утилитами вроде Disassembler. Но в этом случае можно добиться только