Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Классификация языков программирования. Критерии выбора среды и языка разработки программ (Языки программирования)

Содержание:

Введение

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

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

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

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

Задачи исследования:

  1. Ознакомление с историей развития языков программирования.
  2. Рассмотрение классификации языков программирования.
  3. Обзор этапов разработки программ.
  4. Определение критериев выбора среды программирования и языка для разработки программы.

Для раскрытия темы, достижения поставленных целей и задач были использованы учебные пособия, научная литература, в том числе публикации в журналах, входящих в базы цитирования Web of Science и Scopus.

Глава 1. Языки программирования

1.1. История развития языков программирования

Программирование – в широком смысле представляет собой все технические операции, необходимые для создания программы, включая анализ требований и все стадии разработки и реализации. [11]

Язык программирования – формализованный язык для записи алгоритмов. Оформленные с помощью языков программирования алгоритмы называются программами для компьютера.

Язык программирования образуют три его составляющие: алфавит, синтаксис и семантика. [6]

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

Синтаксис – это правила построения фраз, позволяющие определить, правильно или неправильно написана та или иная фраза.

Семантика определяет смысловое значение предложений языка. [3]

На сегодняшний день в мире существует более сотни языков программирования. У каждого языка своя область применения.

Языки программирования делятся на уровни – чем меньше детализация алгоритма, тем выше уровень языка.

По этому критерию можно выделить следующие уровни языков программирования:

- машинные;

- машинно-ориентированные (ассемблеры);

- машинно-независимые (языки высокого уровня). [7]

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

Языки программирования можно разделить на процедурные и непроцедурные.

В начале 50-ых годов 20 века появился процедурный язык низкого уровня (машинно-ориентированный) – язык Ассемблера. Это язык, который представляет каждую команду машинного кода в виде условных символьных обозначений, мнемоник. [6]

В 50-е годы был создан язык Фортран (FORTRAN от FORmula TRANslating system – система трансляции формул). Этот язык программирования относится к процедурным языкам высокого уровня. Так же, как и первые вычислительные машины, этот язык предназначался, в основном, для проведения естественнонаучных и математичес­ких расчетов. В усовершенствованном виде этот язык сохранился до настоящего времени. Среди современных языков высокого уровня он является одним из наиболее используемых при про­ведении научных исследований. Относится к компилируемым языкам. Компилируемыми принято считать такие языки как C, C++, FORTRAN, Pascal, Ada. Это означает, что программы, написанные на этих языках, транслируются в машинный код данного компьютера перед началом выполнения. [5]

В 1957 году появился язык Алгол (ALGOL от ALGOrithmic Language – алгоритмический язык). Этот язык так же, как и Фортран, предназначался для решения науч­но-технических задач. Данный язык имеет логическую структуру, благодаря которой стал стандартным средством записи алгоритмов в научной литературе и применялся как средство обучения основам программирования. Algol вызвал интерес, но не привлек достаточного количества потребителей, т.к. не имел некоторых важных функций – обработки текстов, форматирования ввода/вывода.

Лисп (LISP от LISt Processing – обработка списков), созданный в 1960 году Джоном Маккарти. Ориентирован на структуру данных в форме списка и позволяет организовать эффективную обработку больших объемов текстовой информации. [7]

В середине 60-х годов разработан в качестве учебного языка язык Бейсик (Beginner's All-purpose Symbolic Instruction Code – универсальный символический код инструкций для начинающих, или, сокращенно, BASIC). Он был разработан профессорами Дартмутского колледжа (США) Т. Куртцем и Дж. Кемени в 1965 году для обучения студентов, незнакомых с вычислительной техникой. Этот язык, благодаря простоте, стал очень популярным. Особенно его популярность повысилась с появлением персональных компьютеров, где он стал одним из основных языков программирования. [6]

PL/I (Programming Language One) создан в 1967 году. По своим возможностям PL/I значительно мощнее многих других языков (Си, Паскаля).

В конце 60-х – начале 70-х гг. появился язык Форт (FORTH – четвертый). Этот язык стал применяться в задачах управления различными системами после того, как его автор Чарльз Мур написал на нем программу, предназначенную для управления радиотелескопом Аризонской обсерватории.

Появившийся в 1971 году язык Pascal был назван так в честь великого французского математика XVII века, изобретателя первой в мире арифметической машины Блеза Паскаля. Этот язык был создан швейцарским ученым, специалистом в области информатики Никлаусом Виртом. Язык Pascal первоначально разрабатывался как учебный, и, действительно, сейчас он является одним из основных языков обучения программирования в школах и вузах. [7]

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

На основе языка Паскаль в конце 70-х гг. был создан язык АДА, названный в честь одаренного математика Ады Лавлейс.

АДА является языком, победившим (май 1979 г.) в конкурсе по разработке универсального языка, проводимым Пентагоном с 1975 году. Разработчики – группа ученых во главе с Жаном Ихбиа. Победивший язык окрестили АДА, в честь Огасты Ады Лавлейс. Язык АДА – прямой наследник языка Паскаль. Этот язык предназначен для создания и длительного (многолетнего) сопровождения больших программных систем, допускает возможность параллельной обработки, управления процессами в реальном времени и многое другое, чего трудно или невозможно достичь средствами более простых языков. [7]

В настоящее время популярным среди программистов является язык C. Данный язык был создан в лаборатории Bell в 1972 году и первоначально не рассматривался как массовый. Он планировался для замены ассемблера, чтобы иметь возможность создавать столь же эффективные и компактные программы и в то же время не зависеть от конкретного типа процессора. На этом языке в 70-е годы написано множество прикладных и системных программ и ряд известных операционных систем (UNIX).

C++ – это объектно-ориентированное расширение языка Си, созданное Бьярном Страуструпом в 1980 году. Язык C++ обладает рядом свойств, которые делают его более совершенным языком по сравнению с C, однако наиболее важным является то, что он обеспечивает возможность объективно-ориентированного программирования. [12]

Java – этот язык был создан компанией Sun в начале 90-х годов на основе C++. Он призван упростить разработку приложений на основе C++ путем исключения из него всех низкоуровневых возможностей. Но главная особенность этого языка – компиляция не в машинный код, а в платформно-независимый байт-код (каждая команда занимает один байт). [17]

Язык программирования Python был создан голландским программистом Гвидо ван Россумом в 1991 году, изначально он задумывался как потомок языка ABC. Гвидо ван Россум дал имя языку от названия телесериала. После того, как Россум разработал язык, он выложил его в Интернет, где уже целое сообщество программистов присоединилось к его улучшению. Сейчас часто выходят новые версии этого высокоуровневого многоцелевого языка, которые легко интегрируются с компонентами, написанными на других языках программирования. [5]

C# - это язык программирования, сочетающий в себе концепции: контекстно-ориентированные и объектно-ориентированные, разработанный под руководством Андерса Хейлсберга в 2001 году инженерами компании Microsoft. На данный момент наличие компиляторов кодов С# позволяет запускать приложения без установки дополнительного программного обеспечения на платформе .NET. Разработчики C# учли все проблемные алгоритмы предшествующих языков, что позволило сделать его более стабильным. [19]

1.2 Классификация языков программирования

Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.). Машинно-ориентированные языки позволяют использовать все возможности и особенности машинно-зависимых языков [16]:

- высокое качество создаваемых программ;

- возможность использования конкретных аппаратных ресурсов;

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

- для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;

- трудоемкость процесса составления программ (особенно на машинных языках и ЯСК), плохо защищенного от появления ошибок;

- низкая скорость программирования;

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

У каждого компьютера свой определенный машинный язык, который предписывает компьютеру выполнение операций над операндами, поэтому машинный язык является командным. Но некоторые семейства электронных вычислительных машин (такие как ЕС ЭВМ, IBM/370/ и др.) имеют единый машинный язык для машин разной мощности. Информация о нахождении операндов и типе выполняемой операции сообщается в командах любого из них. [15]

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

Языки символического кодирования являются командными языками, как и машинные. Но стоит заметить, что коды операций и адреса в машинных командах заменены на символы-идентификаторы, и не представляют собой последовательность двоичных или восьмеричных цифр. Такая форма написание помогает запоминанию смысловых содержаний операций и минимизирует число ошибок при написании программ. [8, 1]

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

Существуют языки-автокоды, которые включают в себя все возможности языков символического кодирования. Это достигается благодаря возможности расширенного введения команд.

В некоторых программах можно обнаружить некоторые довольно часто использующиеся командные последовательности, соответствующие определенным процедурам преобразования информации. Для эффективной реализации таких процедур необходимо оформлять их в виде специальных макрокоманд, включая их в язык программирования. Можно перевести макрокоманды в машинные команды. Существует два способа: расстановка и генерирование. Макрокоманда позволяет обеспечить передачу фактических параметров, превращая её в реальную машинную программу. Фактические параметры в процессе трансляции вставляются в остов – серию команд, реализующих требуемую функцию, которая обозначена макрокомандой. [5, 18]

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

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

Развитым автокодам присвоили название Ассемблера. На языках типа Ассемблера составляются сервисные программы и пр. [12]

Язык, который является средством для замены последовательности символов описывающих выполнение требуемых действий ЭВМ на более сжатую форму, называется Макрос. [13]

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

Макросы удобны тем, что имеют возможность одинаково работать и с программами, и с данными.

Машинно-независимые языки – это средство описания алгоритмов решения задач и информации, подлежащей обработке. Такие языки удобны в использовании для большого круга пользователей. Основным плюсом является то, что не требуется знания особенностей организации функционирования ЭВМ и ВС. [16]

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

Следовательно, командные последовательности, процедуры и подпрограммы, которые часто используются в машинных программах, представляются в высокоуровневых языках отдельными операторами. Это позволило программистам не тратить время на детальное расписывание вычислительного процесса на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма. [10, 17]

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

Универсальные языки были разработаны для широкого круга задач: научных, коммерческих, моделирования и пр. Первый универсальный язык был разработан фирмой IBM, ставший в последовательности языков Пл/1. Второй по мощности универсальный язык называется Алгол-68. Он позволяет работать с символами, разрядами, числами с фиксированной и плавающей запятой. Пл/1 имеет развитую систему операторов для управления форматами, для работы с полями переменной длины, с данными организованными в сложные структуры, и для эффективного использования каналов связи. Язык учитывает включенные во многие машины возможности прерывания и имеет соответствующие операторы. Предусмотрена возможность параллельного выполнение участков программ. [21]

Программы в Пл/1 компилируются с помощью автоматических процедур. Язык использует многие свойства Фортрана, Алгола, Кобола. Однако он допускает не только динамическое, но и управляемое и статистическое распределения памяти.

При появлении новых технических возможностей возникла задача перед системными программистами – создать программные средства, обеспечивающие оперативное взаимодействие человека с ЭВМ. Такие языки получили название – диалоговые. [17]

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

Потребность обеспечения оперативного взаимодействия с пользователем потребовала сохранения в памяти ЭВМ копии исходной программы даже в случае получения объектной программы в машинных кодах. При внесении изменений в программу с использованием диалогового языка система программирования при помощи специальных таблиц устанавливает взаимосвязь структур исходной и объектной программ. Такое взаимодействие позволило осуществить требуемые редакционные изменения в объектной программе. Примером диалогового языка является Бэйсик. [20]

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

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

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

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

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

1.3. Стили программирования

Работая над программой, программист, особенно начинающий, должен хорошо представлять, что программа, которую он разрабатывает, предназначена, с одной стороны, для пользователя, с другой – для самого программиста. Текст программы нужен прежде всего самому программисту, а также другим людям, с которыми он совместно работает над проектом. Поэтому для того, чтобы работа была эффективной, программа должна быть легко читаемой, ее структура должна соответствовать структуре и алгоритму решаемой задачи. Как этого добиться? Надо следовать правилам хорошего стиля программирования. Стиль программирования – это набор правил, которым следует программист в процессе своей работы. Очевидно, что хороший программист должен следовать правилам хорошего стиля. [14, 20]

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

- очевидную логику;

- естественные выражения;

- осмысленные имена;

- аккуратное форматирование;

- развернутые комментарии;

- отсутствие хитрых трюков и необычных конструкций.

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

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

Сводить понятие стиля программирования только к правилам записи текста программы было бы неверно. Стиль, которого придерживается программист, проявляется во время работы программы. Хорошая программа должна быть прежде всего надежной и дружественной по отношению к пользователю. [1, 9]

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

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

Большая часть работы программиста связана с написанием исходного кода на одном из языков программирования. [19]

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

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

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

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

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

Процедурные языки характеризуются следующими особенностями:

- необходимостью явного управления памятью, в частности, описанием переменных;

- малой пригодностью для символьных вычислений;

- отсутствием строгой математической основы;

-высокой эффективностью реализации на традиционных ЭВМ.

Одним из важнейших классификационных признаков процедурного языка является его уровень. Уровень языка программирования определяется семантической (смысловой) емкостью его конструкций и степенью его ориентации на программиста. Язык программирования частично ликвидирует разрыв между методами решения различного рода задач человеком и вычислительной машиной. Чем более язык ориентирован на человека, тем выше его уровень. Дадим краткую характеристику реализованным на ПЭВМ языкам программирования в порядке возрастания их уровня. [8]

Двоичный язык является непосредственно машинным языком. В настоящее время такие языки программистами практически не применяются.

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

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

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

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

Сущность функционального (аппликативного) программирования определена, как способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени для функции, а единственным правилом композиции – оператор суперпозиции функции. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни, тем более, блок-схем, ни передачи управления. [18]

Роль основной конструкции в функциональных языках играет выражение. К выражениям относятся скалярные константы, структурированные объекты, функции, тела функций и вызовы функций. Функция трактуется как однозначное отображение из X в X, где X — множество выражений. [13]

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

-классы констант, которыми могут манипулировать функции;

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

- правила построения новых функций из базовых;

- правила формирования выражений на основе вызовов функций.

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

Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. В принципе, можно составлять программы и вообще без переменных. Кроме того, нет существенных различий между константами и функциями, то есть между программами и данными. В результате этого функция может быть значением вызова другой функции и может быть элементом структурированного объекта. Число аргументов при вызове функции не обязательно должно совпадать с числом параметров, указанных при ее описании. Перечисленные свойства характеризуют аппликативные языки как языки программирования очень высокого уровня. [5]

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

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

- высоким уровнем;

- строгой ориентацией на символьные вычисления;

- возможностью инверсных вычислений, то есть переменные в процедурах не делятся на входные и выходные;

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

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

В основе объектно-ориентированного стиля программирования лежит понятие объекта, а суть его выражается формулой: «объект - данные + процедуры». Каждый объект интегрирует в себе некоторую структуру данных и доступные только ему процедуры обработки этих данных, называемые методами. Объединение данных и процедур в одном объекте называется инкапсуляцией и присуще объектно-ориентированному программированию.

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

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

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

Выводы к Главе 1

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

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

Глава 2. Критерии выбора среды и языка разработки программ

2.1 Этапы разработки программ

Разработка программы состоит из нескольких этапов:

1. Постановка задачи:

- формулировка и анализ физической задачи;

- составление математической модели

- составление алгоритма задачи.

2. Создание программы:

- составление текста программы;

- ввод текста программы в компьютер;

- синтаксическая отладка программы;

- тестирование и семантическая отладка.

3. Документирование программы.

4. Запуск готовой программы и анализ полученных результатов.

Первый этап – математический, в ходе которого детально разбирается задача, для упрощения написания программы. В ходе первого этапа формулируется задача, далее при анализе задачи, формулировка может уточняться. Анализ задачи заключается в подробном просмотре задачи с определением и выявлением входной и выходной информации. На данном этапе программист имеет понятие с какими проблемами можно столкнуться в ходе дальнейшей работы над программой. [3, 7]

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

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

Существует несколько видов алгоритмов, они подробно представлены на рисунке 1. [6]

Рисунок 1. – Виды алгоритмов.

Свойства алгоритмов подробно рассмотрены в таблице [7]:

Характеристика свойств алгоритмов

Свойство алгоритма

Характеристика

1

дискретность

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

2

детерминированность

любое действие должно быть строго и недвусмысленно определено в каждом случае

3

конечность

каждое действие и алгоритм в целом должны иметь возможность завершения

4

массовость

один и тот же алгоритм можно использовать с разными исходными данными

5

результативность

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

Второй этап создания программы заключается в разработке программного обеспечения [4].

Сначала, записывают алгоритм задачи при помощи одного из языков программирования, эта задача требует повышенной концентрации внимания. Затем происходит отладка программы – в ходе которой исправляются все допущенные ошибки. Наиболее распространенными являются синтаксические ошибки в тексте программы. Синтаксическая отладка позволяет определить расположение синтаксической ошибки в тексте и её характер. Оператор исправляет ошибку и повторяет трансляцию до тех пор, пока не будут исправлены все синтаксические ошибки. Необходимо обращать внимание точному синтаксису используемых вами функций, объектов, методов и свойств. [7]

Далее, после отладки, наступает процесс тестирования - динамического контроля программы. Тестирование – процесс деструктивный и заключается в проверке правильности программы при её выполнении на компьютере. Разработчики относятся к процессу тестирования творчески. Целью проведения тестирования является обнаружение в ней ошибок. При чем тестирование считается удачным и положительным, в случае обнаружения ошибок, и наоборот неудачным, если ошибку не удалось выявить.

Часто стараются избежать тестирования программы её автором, а разработчики не тестируют программное обеспечение единолично, обращаясь к организациям, специализирующимся на тестировании программных средств. [12]

Основные принципы организации тестирования отражены на рисунке 2.

Рисунок 2. – Принципы тестирования.

При структурном тестировании наиболее слабым из критериев является хотя бы однократное выполнение каждого выполнения программы, а более сильный критерий – минимум однократное прохождение каждой ветви алгоритма, или C1. [5]

Так же распространено использование подбора тестов, обеспечивающих переход в программе, пропуская при этом критерий С1. К примеру, в программе, написанной на языке Pascal, при использовании конструкции цикла WHILE x AND y DO… , применение критерия покрытия условий требует проверки обоих вариантов выхода из цикла: NOT x и NOT y.

Существуют конструкции, требующие по критерию покрытия условий два теста, например IF A AND B THEN… , A=true, B=false и A=false, B=true, при которых может не выполняться оператор, расположенный в then – ветви оператора if. Практически единственным средством, предоставляемым современными системами программирования, является возможность определения частоты выполнения различных операторов программы. Но с помощью этого инструмента поддержки тестирования можно проверить выполнение только слабейшего из критериев полноты - покрытие всех операторов. Правда, с помощью этого же инструмента можно проверить и выполнение критерия С1. Но для этого предварительно текст программы должен быть преобразован таким образом, чтобы все конструкции условного выбора (IF, CASE или SWITCH) содержали ветви ELSE или DEFAULT, хотя бы и пустые. [5]

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

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

При сравнении пошагового и монолитного тестирования можно отметить следующие преимущества первого подхода:

  1. меньшая трудоемкость (при монолитном тестировании требуются 5 драйверов и 5 заглушек; при пошаговом тестировании требуются или только 5 драйверов - если модули подключаются “снизу вверх”, - или только 5 заглушек - если модули подключаются “сверху вниз”);
  2. более раннее обнаружение ошибок в интерфейсах между модулями (их сборка начинается раньше, чем при монолитном тестировании);
  3. легче отладка, то есть локализация ошибок (они в основном связаны с последним из подключенных модулей);
  4. более совершенные результаты тестирования (более тщательная проверка совместного использования модулей).

При использовании пошагового тестирования возможны две стратегии подключения модулей: нисходящая и восходящая. [14]

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

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

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

Так как после тестирования главного модуля процесс проверки может продолжаться по-разному, стараются придерживаться правил:

  1. в первую очередь к тестированию должны подключаться модули, содержащие операции ввода-вывода;
  2. критические (т.е. наиболее важные) для программы модули также должны тестироваться в первую очередь.

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

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

Достоинства восходящего тестирования:

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

- нет необходимости совмещать проектирование с тестированием;

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

Недостаток восходящего тестирования:

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

Однозначного вывода о преимуществах в различных видах тестирования нет, но в большинстве случаев разработчики отдают предпочтение восходящему тестированию. [18]

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

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

На данный момент широко распространены 3 способа отладки программы:

- пошаговая отладка программ с заходом в подпрограммы;

- пошаговая отладка программ с выполнением подпрограммы как одного оператора;

- выполнение программы до точки остановки.

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

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

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

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

2.2. Выбор среды и языка разработки программ

Среда разработки (IDE) – это сочетание текстового редактора и компилятора. Разработка, компиляция и запуск своих программ осуществляется непосредственно в IDE. Интегрированные среды разработки упрощают процесс составления программ, так как написание кода компиляция и запуск программ выполняются в одной программе – IDE. Ещё одной важной особенностью IDE является то, что IDE помогает быстро найти и исправить ошибки компиляции. [5]

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

Экспертная система – это система искусственного интеллекта, построенная на основе глубоких специальных знаний о некоторой предметной области (полученных от экспертов-специалистов этой области). Экспертные системы – один из немногих видов систем искусственного интеллекта, которые получили широкое распространение, и нашли практическое применение. [21]

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

Для понимания выбранной предметной области следует знать значение следующих понятий:

Операционная система (ОС):

- Windows;

- Mac OC;

- Linux;

- Unix.

Разрядность ОС:

- 86;

- 64;

- 32.

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

- Pascal;

- Basic;

- Scala;

- Cobol;

- Ruby;

- MatLab;

- SQL;

- Perl;

- Lisp;

- Fortran;

- Python;

- PHP;

- Java;

- C#;

- C++;

- C;

- Assembler.

Назначение:

- Для обучения;

- Для работы.

Доступ:

- Платный;

- Свободный.

Компилятор:

- Встроенный;

- Внешний.

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

Разрабатываемая экспертная система должна выбирать оптимальную IDE, на основе предъявляемых к ней требований. [5]

В процессе функционирования система использует значения следующих параметров, вводимых пользователем:

1. выбор языка программирования;

2. выбор операционный системы;

3. выбор разрядности ОС;

4. выбор назначения;

5. выбор доступа;

6. выбор компилятора.

К сожалению, языки программирования сложно сравнивать и оценивать. [19]

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

Какие же факторы должны учитываться при выборе языка программирования?

Ясно, что на первое место ставится соответствие языка программирования типу решаемой задачи. Если оказывается, что несколько языков подходит для решения данной задачи, то следует отдать предпочтение языку, которым программист лучше владеет, поскольку трудно написать хорошую программу на языке, который плохо усвоен. [18]

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

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

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

Исторически наиболее простыми языками считают машинные языки и языки ассемблера первых ЭВМ. Речь идет не о простоте изучения, а о простоте реализации языка для машины. [5]

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

Простота в некоторых языках программирования подменяется свойством «модульность», под которым понимается возможность работать, используя лишь подмножество языка. Иными словами, программист может не изучать язык полностью, а овладеть только теми его элементами, которые он считает необходимыми для своих задач. [18]

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

Ключевые (зарезервированные) слова облегчают синтаксический анализ языка, однако их не должно быть слишком много. [7]

Простоте языка способствует единообразие в символике. Негативный пример: в языках семейства dBase знак «=» – это и присвоение, и проверка на равенство; а «;» – это и разделитель операторов, и перенос на другую строку.

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

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

Методы трансляции очень быстро развиваются, а теория трансляторов еще далека от завершения. В настоящее время самый «быстрый» транслятор – фирмы Borland.

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

Если оптимизация программы компилятором предусмотрена, то с помощью механизма указаний можно давать указания компилятору относительно того, что является критерием оптимизации – быстродействие или объем занимаемой памяти. Не следует пренебрегать таким показателем качества языка, как эффективность объектного кода, достаточно учесть следующее: сложность задач, решаемых с помощью ЭВМ, растет быстрее, чем производительность и ресурсы вычислительных систем. [2]

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

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

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

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

Продуманный выбор имен в программе облегчает чтение программы.

Достижением в этой области можно считать «венгерскую нотацию», которая названа в честь родины ее создателя Charles Simonyi. Согласно ей имена функций строят по принципу «глагол – существительное». Например: Creat Window – создать окно. [15]

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

Блочность структуры завоевала широкое признание благодаря очевидным выгодам, ощущаемым как в процессе реализации языка, так и при программировании. Идеи структурного программирования наиболее естественным образом реализуются именно в языках с блочной структурой. Ясность структуры программы дает программисту большие преимущества. Структурную программу легче проектировать, понимать, сопровождать. В настоящее время по ряду объективных причин сложилась ситуация, когда первым языком программирования, с которым сталкивается начинающий, является Бейсик, который имеет слаборазвитую структуру данных, а также метки и условные переходы как средство реализации сложных алгоритмов. Все это не позволяет рекомендовать Бейсик в качестве учебного средства при изучении программирования. Его считают «вредным» языком, прививающим плохой стиль. Однако Бейсик имеет и положительные качества как самый распространенный и достаточно простой язык. [3, 7]

Выводы к Главе 2

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

Заключение

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

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

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

Библиография

1. Алексеев А.Ю. Динамические структуры данных / А.Ю. Алексеев, С.А. Ивановский, Д.В. Куликов. – СПб.: ГЭТУ. – 76 с.

2. Аузяк А.Г. Программирование и основы алгоритмизации / А.Г. Аузяк, Ю.А. Богомолов, А.И. Маликов, Б.А. Старостин. – Казань: КАИ, 2013. – 153 с.

3. Белов М.П. Основы алгоритмизации в информационных системах / М.П. Белов. – СПб.: СЗТУ, 2003. – 85 с.

4. Громов Ю.Ю. Интеллектуальные информационные системы и технологии: учебное пособие / Ю.Ю. Громов, Иванова О.Г., Алексеев В.В. – Тамбов: ТГТУ, 2013. – 244 с.

5. Джарратано Д. Экспертные системы: принципы разработки и программирование / Д. Джарратано, Г. Райли. – М.: Вильямс, 2006. – 1152 с.

6. Жданова Т.А. Основы алгоритмизации и программирования / Т.А. Жданова, Ю.С. Бузыкова. – Хабаровск: ТОГУ, 2011. – 56 с.

7. Кадырова Г.Р. Основы алгоритмизации и программирования / Г.Р. Кадырова. – Ульяновск: УлГТУ, 2014 г. – 95 с.

8. Каймин В.А. Информатика: учебник / В.А. Каймин. – М.: Проспект, 2011. – 272 с.

9. Кузнецов А.А. Основы информатики / А.А. Кузнецов. – М.: Дрофа, 1998. – 164 с.

10. Кушниренко А.Г. Информатика / А.Г. Кушниренко. М.: Дрофа, 1998. – 243 с.

11. Ляхович В.Ф. Основы информатики / В.Ф. Ляхович. – Ростов н/Д.: «Феникс», 2000. – 608 с.

12. Макаров В.Л. Программирование и основы алгоритмизации / В.Л. Макаров. – СПб.: СЗТУ, 2003. – 110 с.

13. Михелёв В.М. Базы данных и СУБД / В.М. Михелёв. – Белгород: Издательство БелГУ, 2007. – 200 с.

14. Николаев В.И. Теория алгоритмов / В.И. Николаев, И.В. Иванова. – СПб.: СЗТУ, 1995. – 131 с.

15. Рак И.П. Основы алгоритмизации и программирования / И.П. Рак, А.В. Терехов, А.В. Селезнев. – Тамбов: ТГТУ, 2004. – 24 с.

16. Семакин И.Г. Основы алгоритмизации и программирования / И.Г. Семакин, А.П. Шестаков. – М.: Издательский центр «Академия», 2012. – 400 с.

17. Строганов Р.П. Алгоритмическое обеспечение задач управления в АСУ ТП / Р.П. Строганов, В.Г. Давыдов, В.П. Васильев. – Л.: ЛПИ, 1989. – 312 с.

18. Трофимова Л.А. Управление знаниями / Л.А. Трофимова, В.В. Трофимов. – СПб.: СПбГУЭФ, 2012. – 77с. 

19. Шумова Е.О. Программирование на языке высокого уровня: Учебное пособие / Е.О. Шумова. – СПб.: СЗТУ, 2001. – 82 с.

20. Шауцукова Л.З. Информатика / Л.З. Шауцукова. – М.: Просвещение, 2000. – 200 с.

21. Библиотека программиста // URL: http://coders-library.ru/ (дата обращения 10.03.2019г.)