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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

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

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

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

1) анализ научной литературы по теме языков программирования;

2) анализ и классификация языков программирования;

3) изучение основных понятий и принципов функционирования интегрированных сред разработки программного обеспечения;

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

В работе использованы научные труды множества авторитетных авторов, таких как Вирт, Голицына, Грин, Кнут, Колмогоров, Коротков, Мейерс, Орлов, Пирс, Страуступ, Уэзерелл, Фридман, Харпер, Колдаев, Калашников, Черпаков, Опалева, Зыков, Кундиус, Добрынин, Заговоров, Зимин, Скрипкин и др. Все использованные источники характеризуются высокой надежностью, и опубликованы в известных издательствах, таких как Вильямс, Бином, ИНФРА-М, ЮФУ, Форум, БХВ-Питербург, Юрайт и др.

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

Понятие и основные термины

Язык программирования представляет собой систему обозначений, предназначенную для четкого описания программы или алгоритма для вычислительной машины. Все языки программирования относятся к искусственным языкам. Ключевым их отличием от языков естественных является ограниченный набор “слов” и крайне строгие правила их записи. "Слова" такого языка называют командами (или операторами). Из ключевого отличия языков программирования от естественных автоматически вытекает еще одно отличие - свободное толкование выражений, которое характерно для естественных языков, в языках программирования недопустимо. [1]

К языкам программирования предъявляются очень строгие требования. Основными из них являются [15]:

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

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

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

Уровень языка определяется степенью детализации последовательных действий (предписаний), и уровень тем выше, чем менее детализированы предписания. [13]

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

  • машинные языки;
  • машинно-оpиентиpованные языки (ассемблеры);
  • машинно-независимые (высокоуровневые) языки.

Машинно-ориентированные и машинные языки условно относят к низкоуровневым языкам. Такие языки требуют описания процесса обработки информации в мельчайших деталях. [2]

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

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

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

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

Классификация

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

Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального (например, байт-код, Microsoft.NET) процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских). [26]

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

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

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

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

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

Каждая модель процессора имеет свой собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной «архитектуры» (имеют одинаковую архитектуру набора команд). [9]

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

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

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

Программы на интерпретируемых языках (таких как Бейсик или Python) не транслируются в машинный код; вместо этого они либо исполняются непосредственно интерпретатором языка, либо транслируются в псевдокод (байт-код). Однако интерпретаторы этих языков (которые сами можно рассматривать как процессоры), как правило, представлены в машинном коде. [2]

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

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

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

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

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

Исходя из вышесказанного, следует сформулировать ключевые преимущества высокоуровневых языков программирования[21][22][25]:

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

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

Основными компонентами высокоуровневых языков являются[23]:

  • алфавит;
  • семантика;
  • синтаксис.

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

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

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

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

  • процедурные языки;
  • логические языки;
  • объектно-ориентированные языки.

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

Развитие процедурных языков началось с появления проблемно-ориентированных языков. Эти языки получили свое название в виду того факта, что в основу их создания легла не "машина" а "задача" - это значит, что первостепенную роль в языке играет специфика класса задач, для которых предполагается разработка решения. [13]

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

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

  • Algol и Fortran - языки, основным назначением которых является решение научно-технических задач;
  • Basic – создание решений для мелких вычислительных задач в режиме диалога;
  • Cobol – разработка решений для задач из области экономики. [2]

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

Вместе с тем, в середине 60-х были начаты разработки алгоритмических языков широкой направленности – универсальных языков. Как правило, в основу разработки этих языков закладывался принцип объединения функционала узко-ориентированных языков. Среди таких языков наибольшее распространение получили Ada, C, Modula, Pascal и PL/1. Но разумеется, как и всякий универсальный инструмент, во множестве конкретных случаев, такие языки оказались менее эффективными, чем узко-ориентированные. [26]

Логические языки (Prolog, Lisp, Mercury, KLO и др.) ориентированы не на запись алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В этих языках указывается, что дано и что требуется получить. При этом поиск решения задачи возлагается непосредственно на ЭВМ.

Объектно-ориентированные языки (Object Pascal, C++, Java, Objective Caml. и др.). Руководящая идея объектно-ориентированных языков заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое - объект.

Объектно-ориентированный подход использует следующие базовые понятия [24]:

  • объект — совокупность свойств (параметров) определенных сущностей и методов их обработки (программных средств);
  • свойство объекта — это характеристика объекта и его параметров. Все объекты наделены определенными свойствами, совокупность которых выделяют (определяют) объект;
  • метод обработки — это набор действий над объектом или его свойствами;
  • событие — это характеристика изменения состояния объекта;
  • класс объектов — это совокупность объектов, характеризующихся общностью применяемых к ним методов обработки или свойств.

Существуют различные объектно-ориентированные технологии, которые обеспечивают выполнение важнейших принципов объектного подхода [16]:

  • инкапсуляция;
  • наследование.

Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса (т. е. скрытие деталей, несущественных для использования объекта). Инкапсуляция (объединение) означает сочетание данных и алгоритмов их обработки, в результате чего и данные, и процедуры во многом теряют самостоятельное значение. [4]

Класс может иметь образованные от него подклассы. При построении подклассов осуществляется наследование данных и методов обработки объектов исходного класса. [25]

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

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

Языки программирования сверхвысокого уровня

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

Сверхвысокоуровневый язык программирования (VHLL) — язык программирования с очень высоким уровнем абстракции. В отличие от языков программирования высокого уровня, где описывается принцип «как нужно сделать», в сверхвысокоуровневых языках программирования описывается лишь принцип «что нужно сделать». [25]

Термин впервые появился в середине 1990-х годов для идентификации группы языков, используемых для быстрого прототипирования, написания одноразовых скриптов и подобных задач. [25]

Так, разработчики Icon (и его диалекта Unicon) описывают его как VHLL. К языкам сверхвысокого уровня также часто относят такие современные скриптовые и декларативные (в частности функциональные) языки как Python, Ruby и Haskell, а также Perl и, предшествовавший ему, мини-язык AWK. [16]

Большой класс языков сверхвысокого уровня — это языки используемые для специфических приложений и задач (то есть предметно-ориентированные). В связи с этой ограниченностью они могут использовать синтаксис, который никогда не используется в других языках программирования, например, непосредственно синтаксис английского языка. [10]

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

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

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

Среда разработки включает в себя [8]:

  • компилятор и/или интерпретатор;
  • отладчик;
  • средства автоматизации сборки;
  • текстовый редактор (редактор кода).

Иногда содержит также средства для интеграции с системами управления версиями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя. Многие современные среды разработки также включают браузер классов, инспектор объектов и диаграмму иерархии классов — для использования при объектно-ориентированной разработке ПО. IDE обычно предназначены для нескольких языков программирования — такие как IntelliJ IDEA, NetBeans, Eclipse, Qt Creator, Geany, Embarcadero RAD Studio, Code::Blocks, Xcode или Microsoft Visual Studio, но есть и IDE для одного определённого языка программирования — как, например, Visual Basic, Delphi, Dev-C++. [22]

Частный случай IDE — среды визуальной разработки, которые включают в себя возможность наглядного редактирования интерфейса программы. [25]

Использование IDE для разработки программного обеспечения является прямой противоположностью способу, в котором используются несвязанные инструменты, такие как текстовый редактор, компилятор, и т. п. Интегрированные среды разработки были созданы для того, чтобы максимизировать производительность программиста благодаря тесно связанным компонентам с простыми пользовательскими интерфейсами. Это позволяет разработчику сделать меньше действий для переключения различных режимов, в отличие от дискретных программ разработки. Однако, так как IDE является сложным программным комплексом, то среда разработки сможет качественно ускорить процесс разработки ПО лишь после специального обучения. Для уменьшения барьера вхождения многие достаточно интерактивны, а для облегчения перехода с одной на другую интерфейс у одного производителя максимально близок, вплоть до использования одной IDE. [24]

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

Вывод:

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

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

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

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

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

При выборе среды и языка программирования учитываются следующие критерии [19]:

  • функциональные характеристики;
  • надежность;
  • простота использования;
  • эффективность;
  • сопровождаемость;
  • переносимость;
  • общие критерии;

Функциональные характеристики

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

Среда функционирования

Проектная среда [1]:

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

ПО/технические средства [3]:

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

Технологическая среда [14]:

  • поддерживаемая методология. Набор методов и методик, поддерживаемых средой разработки. Примерами являются структурный или объектно-ориентированный анализ и проектирование;
  • поддерживаемые языки. Все языки, используемые средой разработки. Примерами таких языков являются языки программирования (Кобол, Ада, С), языки баз данных и языки запросов (DDL, SQL), графические языки (Postscript, HPGL), языки спецификации проектных требований и интерфейсы операционных систем (языки управления заданиями);
  • совместимость с другими средствами. Способность к взаимодействию с другими средствами, включая непосредственный обмен данными (примерами таких средств являются текстовые процессоры, базы данных и другие средства). Возможность преобразования репозитория или его части в стандартный формат для обработки другими средствами;
  • соответствие стандартам технологической среды. Такие стандарты касаются языка, базы данных, репозитория, коммуникаций, графического интерфейса пользователя, документации, разработки, управления конфигурацией, безопасности, стандартов обмена информацией и интеграции по данным, по управлению и по пользовательскому интерфейсу.

Функции, ориентированные на фазы жизненного цикла

Моделирование – данные критерии определяют способность выполнения функций, необходимых для спецификации требований к ПО и преобразованию их в проект [5, 6, 7, 14, 26]:

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

Реализация - затрагивает функции, связанные с созданием исполняемых элементов системы (программных кодов) или модификацией существующей системы. Многие из перечисленных ниже критериев зависят от конкретных языков и включают следующие [7, 11, 12, 16, 25]:

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

Тестирование - включает следующие критерии [10, 17, 22]:

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

Общие функции

Приведенные ниже критерии определяют функции сред разработки, охватывающие всю совокупность фаз ЖЦ.

Поддержка всех этих функций осуществляется посредством репозитория.

Документирование [3]:

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

Управление конфигурацией [1, 25]:

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

Управление проектом [3, 24]:

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

Качественные характеристики

Надежность

Факторы, характеризующие показатель надежности [15, 17]:

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

Простота использования

Факторы, повышающие простоту использования [23, 25, 26]:

  • адаптируемость к конкретным требованиям пользователя. Адаптируемость к различным алфавитам, режимам текстового и графического представления (слева-направо, сверху-вниз), различным форматам даты, способам ввода/вывода (экранным формам и форматам), изменениям в методологии (изменениям графических нотаций, правил, свойств и состава предопределенных объектов) и др.;
  • допустимое время реакции на действия пользователя (в зависимости от среды);
  • доступность и качество учебных материалов. Они могут включать компьютерные учебные материалы, учебные пособия, курсы;
  • качество диагностики (понятность и полезность диагностических сообщений для пользователя);
  • качество документации (полнота, понятность, удобочитаемость, полезность и др.);
  • локализация (в соответствии с требованиями данной страны);
  • онлайновые подсказки (полнота и качество);
  • простота освоения. Трудовые и временные затраты на освоение среды;
  • простота работы с инструментарием (как для начинающих, так и для опытных пользователей);
  • простота установки и обновления версий.
  • требования к уровню знаний. Квалификация и опыт, необходимые для эффективного использования среды;
  • удобство пользовательского интерфейса. Удобство расположения и представления часто используемых элементов экрана, способов ввода данных и др.;
  • унифицированность пользовательского интерфейса (по отношению к другим средствам, использующимся в данной организации).

Эффективность

Показатели эффективности [11, 15, 23]:

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

Сопровождаемость

Характеристики сопровождаемости [6, 7, 8]:

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

Переносимость

Показатели мобильности [1, 8]:

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

Общие критерии

Различные, значимые факторы, не относящиеся к качественным или функциональным показателям самой среды и/или языка[3, 6, 7, 8]:

  • доступность и качество обучения. Обучение может проводиться на территории поставщика, пользователя или где-либо в другом месте;
  • затраты. Включают стоимость приобретения, установки, начального сопровождения и обучения. Следует учитывать цену для всех необходимых конфигураций (включая единственную копию, несколько копий, локальную лицензию, лицензию для предприятия, сетевую лицензию);
  • лицензионная политика. Доступные возможности лицензирования, право копирования (носителей и документации), любые ограничения и/или штрафные санкции за вторичное использования (подразумевается продажа пользователем продуктов, в состав которых входят некоторые компоненты средств, использовавшиеся при разработке продуктов);
  • оценочный эффект (уровень продуктивности, качества и т.д.). Такая оценка может потребовать экономического анализа;
  • поддержка поставщика. Доступность, реактивность и качество услуг, предоставляемых поставщиком для пользователей среды. Такие услуги могут включать телефонную "горячую линию", местную техническую поддержку, поддержку в самой организации;
  • профиль дистрибьютора. Общие показатели возможностей дистрибьютора. Профиль дистрибьютора может включать величину его организации, стаж в бизнесе, финансовое положение, список любых дополнительных продуктов, деловые связи (в частности, с другими дистрибьюторами данного средства), планируемая стратегия развития;
  • профиль продукта. Общая информация о продукте, включая срок его существования, количество проданных копий, наличие, размер и уровень деятельности пользовательской группы, система отчетов о проблемах, программа развития продукта, совокупность применений, наличие ошибок и др.;
  • сертификация поставщика. Сертификаты, полученные от специализированных организаций в области создания ПО (например, SEI и ISO), удостоверяющие, что квалификация поставщика в области создания и сопровождения ПО удовлетворяет некоторым минимально необходимым или вполне определенным требованиям. Сертификация может быть неформальной, например, на основе анализа качества работы поставщика;
  • экспортные ограничения.

Процесс выбора

Процесс выбора тесно взаимосвязан с процессом оценки и включает следующие действия [3]:

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

В процессе выбора возможно получение двух результатов [7]:

  • запрос на получение дополнительной информации к процессу оценки;
  • рекомендаций по выбору конкретной среды.

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

Процесс оценки и выбора может преследовать несколько целей, включая одну или более из следующих [20]:

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

Входной информацией для процесса оценки является [6]:

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

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

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

Элементы процесса включают [7]:

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

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

Определение списка критериев основано на пользовательских требованиях и включает [6]:

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

Вывод:

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

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

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Вирт Н. Алгоритмы+структуры данных=программы: моногр. / Н. Вирт. - М.: Вильямс, 2015. - 707 c.
  2. Голицына, О.Л. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. — М.: Форум, НИЦ ИНФРА-М, 2013. — 400 c.
  3. Граничин О.Н. Информационные технологии и системы в современном менеджменте. / О.Н. Граничин, В.И. Кияев. - СПб.: Изд-во СПбГУ-ВВМ, 2014. — 897 с.
  4. Грин Д. Математические методы анализа алгоритмов. / Д. Грин, Д. Кнут. - М.: Вильямс , 2015. - 398 c.
  5. Добрынин А.С., Койнов Р.С., Кулаков С.М. Модель неполного жизненного цикла программного обеспечения // Вестник Астраханского государственного технического университета. Серия: Управление, вычислительная техника и информатика. № 2 / 2015. С 65-70
  6. Заговор О.В. Учет особенностей ИТ-проектов при определении их жизненного цикла // Восточно-Европейский журнал передовых технологий. 2011г. – С 8-14.
  7. Зимин В.В. Основы управления жизненным циклом сервиса систем информатики и автоматизации (лучшие практики ITIL): учеб. пособие / В.В. Зимин, А.А. Ивушкин, С.М. Кулаков, К.А. Ивушкин. - Кемерово: Кузбассвузиздат, 2013. - 196 с.
  8. Зыков С.В. Основы современного программирования: Учебное пособие для вузов / С.В. Зыков. - М.: ГЛТ , 2012. - 444 c.
  9. Калашников О.А. Ассемблер — это просто. Учимся программировать. 2 изд. / О.А. Калашников. - СПб.: БХВ-Петербург, 2014. - 336 с.
  10. Кнут Д. Искусство программирования, том 4, A. Комбинаторные алгоритмы, часть 1 = The Art of Computer Programming, Volume 4A: Combinatorial Algorithms, Part 1 / под ред. Ю. В. Козаченко. — 1. — М.: Вильямс, 2013. — Т. 4. — 960 p.
  11. Колдаев В.Д. Архитектура ЭВМ: Учебное пособие / В.Д. Колдаев, С.А. Лупин. - М: Издательский Дом "ФОРУМ", 2013. - 384 с.
  12. Колмогоров А.Н. Теория информации и теория алгоритмов. / А.Н. Колмогоров - М.: Вильямс, 2017. - 240 c.
  13. Коротков М.А. Основы теории алгоритмов. / М.А. Коротков, Е.О.Степанов. - М.: Вильямс, 2016. - 174 c.
  14. Кундиус В.А. Теоретические основы разработки и реализации языков программирования / В.А. Кундиус. - М.: КноРус, 2013. - 184 c.
  15. Мейерс С. Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14 / С. Мейерс — М.: Вильямс, 2016. — 304 с.
  16. Опалева Э.А. Языки программирования и методы трансляции / Э.А. Опалева, В.П. Самойленко. - М.: БХВ-Петербург, 2015. - 480 c.
  17. Орлов С. Теория и практика языков программирования: Учебник для вузов. Стандарт 3-го поколения. / С. Орлов. - СПб.: Питер, 2013 - 688 с.
  18. Пирс Б. Типы в языках программирования. / Б. Пирс. — М.: Добросвет, 2012. — 680 с.
  19. Семакин И.Г. Основы алгоритмизации и программирования: Учебник для студ. учреждений сред. проф. образования / И.Г. Семакин, А.П. Шестаков. - М.: ИЦ Академия, 2013. - 304 c.
  20. Скрипкин К.Г. Экономическая эффективность информационных систем./ К.Г. Скрипкин – М.: ДМК, 2012. - 212 с.
  21. Страуступ, Б. Язык программирования С++. Специальное издание / Б. Страуступ. — М.: Бином, 2015. — 1136 c.
  22. Уэзерелл Ч. Этюды для программистов. / Ч. Уэзерелл. - М.: Вильямс, 2015. - 801 c.
  23. Фридман, А.Л. Основы объектно-ориентированного программирования на языке Си++ / А.Л. Фридман. — М.: Гор. линия-Телеком, 2012. — 234 c.
  24. Черпаков И. В. Основы программирования. Учебник и практикум / И.В. Черпаков. - М.: Юрайт, 2016. - 220 c.
  25. Языки программирования и компиляторы — 2017: труды конференции / Южный федеральный университет; под ред. Д. В. Дуброва. — Ростов-на-Дону: Издательство Южного федерального университета, 2017. — 282 с.
  26. Robert Harper. Practical Foundations for Programming Languages. — version 1.37 — licensed under the Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License., 2012. — 544 p.