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

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

Содержание:

ВВЕДЕНИЕ

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

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

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

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

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

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

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

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

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

2. Рассмотреть сущность и понятие языка программирования.

3. Изучить классификацию языков программирования.

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

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

Теоретической основой исследования послужили труды отечественных и зарубежных авторов, посвященные проблемам классификации языков программирования и выбора среды и языка разработки программ: И.Ю. Баженовой, И.Г. Головина, И.А. Волковой, И.В. Черпакова, С.А. Орлова, М. Бен-Ари, Б. Керниган, Д. Ритчи, Т. Пратт, М. Зелковиц и др.

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

Например, в книге С.А. Орлова «Теория и практика языков программирования» вводятся определения языка с трех точек зрения: семиотической, практической и технологической, что способствует формированию необходимой панорамы представления о таком сложном объекте изучения, как язык программирования. Кроме того, в книге описываются формы и содержание критериев для оценки эффективности языков и рассматриваются способы построения этих критериев.

Учебник И.В. Черпакова «Основы программирования» содержит необходимый теоретический и практический материал, а также примеры, поясняющие понятия, связанные с задачами исследования.

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

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

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

1. ЯЗЫКИ ПРОГРАММИРОВАНИЯ

1.1. Сущность и понятие языка программирования

М. Бен-Ари характеризует язык программирования как набор правил, определяющих, какие последовательности символов составляют программу и какое вычисление описывает программа [2, с. 16].

Автор также трактует язык программирования как механизм абстрагирования. Он дает возможность программисту описать вычисления абстрактно и в то же время позволяет программе (обычно называемой ассемблером, компилятором или интерпретатором) перевести это описание в детализированную форму, необходимую для выполнения на компьютере [2, с. 17].

С точки зрения И.В. Черпакова, язык программирования – это формализованный язык, на котором описываются алгоритмы решения задач [25, с. 38].

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

Исходное определение языка программирования (далее – ЯП) – это знаковая система для планирования поведения компьютера .

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

Знаковая система

знаковая ситуация 1

<знак1, денотат1>

знаковая ситуация N

<знакn, денотатn>

...

Рисунок 1. Структура знаковой системы

Источник: Орлов С.А. Теория и практика языков программирования: Учебник. – СПб.: Питер, 2014. – C. 24

Знак – это обозначение или имя, денотат – значение, смысл. Примеры знаков и денотатов приведены в таблице 1.

Таблица 1

Знаки и денотаты

Знак

Денотат

Сообщение

Смысл

Буква

Звук

Слово

Понятие

Sqrt

Вычисление квадратного корня

lf-then-else

Разветвление вычислений

Источник: Орлов С.А. Теория и практика языков программирования: Учебник. – СПб.: Питер, 2014. – С. 25.

Опираясь на данные понятия, С.А. Орлов предлагает модифицированную формулировку языка программирования как правила образования знаков (синтаксис) и согласованные с ними правила образования денотатов (семантика) [22, с. 25].

В ЯП знаки – это элементы программ, а денотаты – характеристики поведения исполнителя (компьютера) [5, с. 21].

Практическое определение языка программирования заключется в том, что это средство общения между человеком (пользователем) и компьютером (исполнителем) [22, с. 25].

С помощью ЯП формируются сообщения для компьютера. Эти сообщения должны быть понятны компьютеру. Возможные ошибки разделяют на синтаксические, семантические и прагматические (рисунок 2) [22, с. 25].

Ошибки сообщений на языке программирования

синтаксические

прагматические

семантические

Рисунок 2. Классификация ошибок сообщений

Источник: Орлов С.А. Теория и практика языков программирования: Учебник. – СПб.: Питер, 2014. – C. 24

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

Семантические ошибки связаны с искажением смысла элементов сообщения, а прагматические ошибки – с искажением цели (назначения) элемента или сообщения.

Прагматические ошибки – самые трудные. Их примеры: часы хорошие-плохие, выяснение смысла программы без знания ее назначения [8, с. 20].

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

- oдинаковыми правилами разложения сообщения на составляющие (предмет синтаксиса);

- cогласованными правилами, придающими сообщению смысл (предмет семантики);

- cогласованными целевыми установками (предмет прагматики).

Технологическое определение состоит в том, что язык программирования – инструмент для производства программных услуг [20, с. 25].

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

Программы должны быть:

- надежными (содержать мало ошибок);

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

- заботливыми (должны уметь объяснять свои действия и ошибки пользователя).

С.А. Орлов сформулировал технологический критерий качества ЯП: язык тем лучше, чем проще производство (на его основе) программных услуг [20, с. 26].

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

Выделяют два вида трансляторов: интерпретаторы и компиляторы. Соответствующие операции перевода исходного текста программы в эквивалентную исполняемую форму носят название интерпретации и компиляции соответственно [26, с. 24].

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

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

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

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

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

Большинство языков программирования использует специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений. В период 1960-х - 1970-х гг. были разработаны основные парадигмы языков программирования, используемые в настоящее время, хотя во многих аспектах этот процесс представлял собой улучшение идей и концепций, заложенных еще в первых языках третьего поколения [4, с. 64]:

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

- язык ПЛ/1 (NPL) был разработан в 1960-х гг. как объединение лучших черт Фортрана и Кобола;

- язык Симула, появившийся примерно в это же время, впервые включал поддержку объектно-ориентированного программирования;

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

- в период с 1969 по 1973 гг. велась разработка языка Си, популярного и по сей день, и ставшего основой для множества последующих языков, например, столь популярных, как С++ и Java;

- в 1972 г. был создан Пролог – наиболее известный (хотя и не первый, далеко не единственный) язык логического программирования;

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

Каждый из этих языков породил по семейству потомков, и большинство современных языков программирования, в конечном счете, основано на одном из них. Кроме того, в 1960-1970-х гг. активно велись споры о необходимости поддержки структурного программирования в тех или иных языках [21, с. 90].

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

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

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

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

Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам – языком низкого уровня. В группу языков низкого уровня входят машинные языки и языки символического кодирования: Автокод, Ассемблер. Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т.е. являются машинно-зависимыми.

Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ [20, с. 90].

К языкам программирования высокого уровня относят Фортран (переводчик формул – был разработан в середине 50-х гг. программистами фирмы IBM и в основном используется для программ, выполняющих естественно-научные и математические расчеты), Алгол, Кобол (коммерческий язык – используется, в первую очередь, для программирования экономических задач), Паскаль, Бейсик (был разработан профессорами Дармутского колледжа – Джоном Кемени и Томасом Курцом), Си (Деннис Ритч – 1972 г.), Пролог (в основе языка лежит аппарат математической логики) и т.д. [11, с. 931].

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

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

Языки программирования также можно разделять на поколения [21, с. 90]:

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

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

- языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль;

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

- языки программирования пятого поколения: языки декларативные, объектно-ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.

Языки программирования также можно классифицировать на процедурные и непроцедурные. В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры Говоря о программировании в Интернете, часто имеют в виду создание публикаций с использованием языка разметки гипертекстовых документов – HTML. Применение специальных средств (HTML-редакторов) позволяет не только создавать отдельные динамически изменяющиеся интерактивные HTML-документы, используя при этом данные мультимедиа, но и редактировать целые сайты [10, с. 71].

В книге Т. Пратта и М.Зелковича языки программирования разделены на четыре группы [23]:

- императивные;

- аппликативные;

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

- объектно-ориентированные.

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

Кобелев И.А., Иванова Л.В., Чекушина В.Е. предлагают разделить все языки программирования четко на две группы: императивные и функциональные [14, с. 56].

Таблица 2

Классификация языков программирования по И.А. Кобелеву, Л.В. Ивановой, В.Е. Чекушиной

Синонимы

Императивные

Функциональные

процедурные, алгоритмические

аппликагивные

Память

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

Отсутствие «склада». Для полу- чения данных один «специалист» требует их непосредственно от другого «специалиста», тот от следующего.

Переменная

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

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

Теоретическая база

Принципы фон-Неймана, машина Тьюринга.

Исчисление Черча, вычислимые функции.

Режим работы

Компиляционный. Высокое быстродействие.

Интерпретационный. Режимы реального времени.

Описание действий (ироцедурность).

Описание возможностей (декларативность).

Источник: Кобелев И.А., Иванова Л.В., Чекушина В.Е. Два типа языков программирования // Современные проблемы науки и образования. – 2014. – №4. – С. 56.

Императивные (процедурные) языки программирования (ЯП) задают вычисления как последовательность команд (операторов). Они ориентированы на компьютеры с архитектурой фон Неймана [20, с. 63].

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

Основные понятия императивных ЯП тесно связаны с компонентами компьютера [3, с. 230]:

- переменные различных типов (моделируют ячейки памяти);

- операторы присваивания (моделируют пересылки данных);

- повторения действий в форме итерации (моделируют хранение информации в смежных ячейках памяти).

Таблица 3

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

Переменные

Подпрограммы

Проблемы

Явно глобальные. Только базовые типы данных.

Слабо представлены

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

Появление областей видимости

Разделяются на

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

Хранение подпрограмм

Унификация подпрограмм

Активное применение указателей. Возвращение структурированных объек тов подпрограммами, как адресов этих объектов. Появление проблемы «очистки мусора».

Объединение в единое целое данных и средств их обработки (объекты).

Объектно-ориентированные языки программирования

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

Источник: Кобелев И.А., Иванова Л.В., Чекушина В.Е. Два типа языков программирования // Современные проблемы науки и образования. – 2014. – №4. – С. 56.

В языки программирования первой подгруппы получение информации обеспечивается, в основном, присваиванием. Появляется режим пакетной обработки информации. По сути, получение пакета – обобщение операции присваивания. Для работы этих языков программирования операционная система не нужна. Средства языка достаточны для замены операционной системы [16, с. 24].

Много персональных компьютеров («Ямаха», «БК») выпускались с встроенным языком программирования, таким, как Бейсик или Фокал. К языкам этой группы можно отнести ассемблер, интерпретаторы Basic, Фортран. Язык ассемблера можно и отделить, как имеющий слабую типизацию данных, «машиннозависимый» язык. Фортран тоже занимает особую позицию, но с другой стороны: имеет достаточно серьезную типизацию данных [10, с. 71].

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

Примерами языков программирования второй подгруппы являются: QBasic, Паскаль. Во всех рассмотренных языках сохраняется четкое разделение элементов программы на команды и выражения. И при выполнении программ, и при вычислении выражений часто приходится выполнять одинаковые действия, что организуется в виде подпрограмм [14, с. 59].

Подпрограммы – элементы программ получили название «процедуры», фактически, после объявления – отдельные команды программы. Подпрограммы – элементы выражений, называют функциями. С развитием теории алгоритмов, появляется отождествление понятий «алгоритм» и «функция». Как только мы представим исполнение программы вычислением некоторого результата (результатом, кроме данных, может быть и действие), а исходные данные сопоставим с аргументами, разница между процедурами и функциями стирается [14, с. 59].

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

Представителем языков программирования четвертой подгруппы можно считать языки dBASE, FoxPro. Работа с объектами появляется в очередных версиях языка Паскаль, Си и других [14, с. 60].

Языки группы объектно-ориентированных по сути одно и то же. Традиционными остались формы записи основных алгоритмических структур и объявление переменных, как у предшественников, но других различий почти нет. Basic → VisualBasic, Pascal → Delphi, C → C++→C#. Существенную часть программ на этих языках составляют объекты системных библиотек, одних и тех же [14, с. 60].

Функциональные (аппликативные) языки задают вычисления как вызовы функций [20, с. 67].

Синтаксис функциональной программы выглядит следующим образом: functionri(…function2 (function1 (данные))…). В начале вычислении к исходным данным применяется функция function1, затем к полученному промежуточному результату – function2 и т.д. В последнюю очередь применяется функция functionn. Она возвращает ожидаемый результат [20, с. 67].

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

Чтобы определить функцию, нужно придумать ее имя и задать вычисляемое ей выражение. Описание единичного действия – это вызов функции с конкретными аргументами. Описание программы – это описание последовательности вызовов отдельных функций [17, с. 97].

Кобелев И.А., Иванова Л.В., Чекушина В.Е. предлагают классифицировать функциональные языки с опорой на используемые функции [14, с. 62].

Таблица 4

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

Функции

Примеры

1

Узкого класса

В языке программирования «Пролог» имеем функции, возвращающие результат только логического типа.

2

Разных классов

Язык программирования «Хаскел» работает с различными функциями.

В настоящее время существует несколько функциональных языков программирования, например, Душкин Р. В. выделяет [7]:

- Lisp (List processor). Считается первым функциональным языком программирования. Нетипизирован. Содержит массу императивных свойств, однако, в общем поощряет именно функциональный стиль программирования. Существует объектно-ориентированный диалект языка – CLOS.

- Scheme. Диалект Lisp’а, предназначенный для научных исследований в области computer science. При разработке Scheme был сделан упор на элегантность и простоту языка.

- ML (Meta Language). Семейство строгих языков с развитой полиморфной системой типов и параметризуемыми модулями.

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

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

- Gofer (GOod For Equational Reasoning). Упрощенный диалект Haskell’а. Предназначен для обучения функциональному программированию.

- Clean. Специально предназначен для параллельного и распределенного программирования. По синтаксису напоминает Haskell. Clean использует отложенные вычисления.

С некоторой натяжкой, к функциональным языкам программирования, можно отнести системы редактирования (работа в интерпретационном режиме со специализированными данными – тексты, изображения). Как примеры, назовем HTML, Flash. Представление о классификации языков программирования необходимы, например, при переводе алгоритмов с одного языка на другой.

С.А. Орлов выделянт также логические и объектно-ориентированные языки программирования.

Логические (декларативные) языки описывают не способ решения задачи, а саму задачу. Фактически они задают формализованное представление предметной области (например, язык Prolog) [20, с. 70].

Иногда логические языки называют языками, основанными на системе правил. Здесь осуществляется проверка некоторого разрешающего высказывания (утверждения), и в случае его истинного значения выполняется соответствующее действие [1, с. 82].

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

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

Объекты взаимодействуют друг с другом с помощью сообщений. Посылается сообщение объектом-источником в адрес объекта-приемника. Каждое сообщение – это запрос на выполнение операции объектом-приемником.

Описание объектов с общей структурой и поведением называется лддссо.и. Как и переменные, единичные объекты создаются по их описаниям. Только в роли описаний для переменных выступают тины данных, а в роли описаний для объектов – классы. Объект считается экземпляром класса.

Специфику объектно-ориентированного подхода определяют три принципа [20, с. 74]:

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

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

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

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

Первый объектно-ориентированный ЯП, Simula 67, был придуман норвежцами К. Нигаардом и У. Далом как расширение императивного языка Algol 60. Этот язык опередил свое время и был благополучно забыт.

Второй объектно-ориентированный ЯП, Smalltalk, появился в нужное время (1972-1980) и в нужном месте. Его автором стал Алан Кей из фирмы Xerox.

Широкое распространение получил язык C++, созданный Б. Страуструпом (1983).

Очень часто используются гибридные языки, реализующие сразу несколько парадигм: Ada 2005, Eiffel, Object Pascal (императивная и объектно-ориентированная парадигмы), CLOS (функциональная и объектно-ориентированная парадигмы) [20, с. 74].

Р.А. Кинзябулатова, А.Ю. Маврина подразделяют языки программирования на три категории: компилируемые, интерпретируемые и смешанные [13, с. 68].

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

К данной категории относятся различные языки программирования, основным из них является язык C. Этот язык был разработан в 1972 году специально для операционных систем семейства Unix, в последующие годы стремительно набрал большую популярность. На сегодняшний день почти на всех операционных системах установлен компилятор языка C. Язык C обладает многими качествами: например, является переносимым, то есть программа, написанная на данном языке может быть переведена на другой с малыми изменениями. Также этот язык не связан строгими ограничениями и имеет удобный стиль программирования [13, с. 68].

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

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

Интерпретируемый язык является кроссплатформенным, в отличие от компилируемого языка. Популярным примером данного языка является язык PHP. Данный язык входит в пятерку популярнейших языков программирования. Является схожим с языками C и Perl, поэтому знающим программистам не составит особого труда изучить PHP. Специально разработан в 1995 году для создания веб-сайтов. Является кроссплатформенным, то есть подходит для большинства операционных систем. Используется для того, чтобы создавать интернет-сайты, так как данный язык максимально эффективен с базой данных MySQL. Также плюсом является то, что РНР работает на стороне сервера, то есть не зависит от мощности компьютера и т.д. Чаще всего с PHP рекомендовано использовать сервер Apache, поскольку он является самым распространенным [15, с. 46].

3. Смешанный тип или компилируемо-интерпретируемые языки программирования переводятся не в машинный язык, а в байт-код. Далее этот байт-код интерпретируется на специальной виртуальной машине. Эти языки заключают в себе достоинства как компилируемых языков, так и интерпретированных. Но также они являются зависимы от виртуальных машин. К такой категории языков относятся Java и C# [13, с. 69].

Язык Java разработан в 1995 году командой Green. Сначала целью создания языка была возможность программирования на бытовых приборах, например, на телевизорах, холодильниках. Является упрощенной версией языка C, при этом имеет сборщик мусора, то есть процесс высвобождения памяти. Java является кроссплатформенным, многопоточным, доступным, простым в освоении. Популярной средой разработки приложений является Eclipce [16, с. 51].

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

2. КРИТЕРИИ ВЫБОРА СРЕДЫ И ЯЗЫКА РАЗРАБОТКИ

ПРОГРАММ

2.1. Факторы, влияющие на выбор среды разработки программ

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

По мнению Т. Пратт, М. Зелковиц, среда разработки (environment framework) состоит из вспомогательных средств и инструментов, отражающих в конечном счете инфраструктуру среды существования программы и используемых для управления разработкой программы. Она обеспечивает программиста необходимыми при разработке программ сервисами, позволяющими организовать хранение данных, быстро разработать графический интерфейс пользователя, обеспечить безопасность и коммуникационную связь с другими программами. Программисты неизбежно используют инфраструктурные сервисы как компоненты при разработке своих программ. Соответственно, иногда языки разрабатываются таким образом, чтобы облегчить доступ к этим сервисам [23, с. 58].

Среды программирования (иногда называемые также системами программирования) объединяют в себе различные инструментальные и вспомогательные средства для создания программ. В их состав обычно входят: транслятор (компилятор), отладчик, редактор связей, средства оптимизации программного кода, сервисные средства (например, текстовый, двоичный и шестнадцатеричные редакторы), библиотеки (наборы процедур и функций, реализованные в виде отдельных модулей), справочные системы [26, с. 39].

Когда в среде разработки программного обеспечения (далее – ПО) присутствуют все вышеназванные компоненты, тогда такую среду называют интегрированной. Такие среды разработки увеличивают темп, а также удобность разработки за счет: автоматизации, возможности производить весь цикл создания и разработки ПО. Обычно среда разработки ПО предназначена для разработки только на одном языке программирования. А такая среда разработки как интегрированная, предоставляет право выбрать создателю программы язык программирования для разработки, удобный разработчику (из языков поддерживаемых данной средой). Примером тому служат: Visual Studio, Komodo, Geany, Kylix, NetBeans, Eclipse [9, с. 186].

При выборе среды выполнения программы необходимо учитывать несколько факторов, а именно [17, с. 152]:

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

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

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

- наличие средств проектирования пользовательского интерфейса;

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

- надежность работы программы и защищенность от программных сбоев.

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

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

Наиболее часто используемыми являются визуальные среды Delphi, C++ Builder фирмы Borland (Inprise Corporation), Visual C++, Visual Basic фирмы Microsoft,Visual Ada фирмы IBM и др.

Между основными визуальными средами этих фирм Delphi, C++ Builder и Visual C++ имеется существенное различие: визуальные среды фирмы Microsoft обеспечивают более низкий уровень программирования «под Windows». Это является их достоинством и недостатком. Достоинством – так как уменьшается вероятность возникновения «нестандартной» ситуации, т.е. ситуации, не предусмотренной разработчиками библиотеки компонентов, а недостатком – так как это существенно загружает программиста «рутинной» работой, от которой избавлен программист, работающий с Delphi или C++ Builder. Много нареканий вызывает также интерфейс Visual C++, также ориентированный на «низкоуровневое» программирование [18, с. 14].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Критерий эффективности – это правило, служащее для сравнительной оценки качества различных ЯП. Критерий эффективности можно назвать правилом предпочтения сравниваемых вариантов [24, с. 52].

Строятся критерии эффективности на основе частных показателей эффективности (показателей качества) Способ связи между частными показателями определяет вид критерия эффективности.

В качестве частных показателей обычно выступают [20, с. 31]:

- читабельность (легкость чтения и понимания программ);

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

- надежность (обеспечение минимума ошибок при работе программ);

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

- переносимость программ (легкость переноса программ из одной операционной среды в другую);

- универсальность (применимость к широкому кругу задач);

- четкость (полнота и точность официального описания языка).

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

Рассмотрим самые важные из показатели более подробно.

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

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

2. Простота. Простота сильно влияет на читабельность языка программирования. Язык должен предоставить простой набор конструкций, которые могут быть использованы в качестве базисных элементов при создании программы. Желательно обеспечить минимальное количество различных понятий с простыми правилами их комбинирования. Этому мешает наличие в языке нескольких способов описания одного и того же действия. Например, в языке С добавление единицы к целому числу можно записать четырьмя способами [20, с. 31].

Сильное воздействие на простоту оказывает синтаксис языка: он должен прозрачно отражать семантику конструкций, исключать двусмысленность толкования. Предельно лаконичный синтаксис удобен при написании программы, однако усложняет ее модификацию, поскольку в программе нелегко разобраться. Здесь нужен разумный компромисс – простота не должна быть чрезмерной, не должна приводить к загадкам расшифровки [6, с. 12].

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

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

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

Приведем примеры недостатка ортогональности в языках [6, с. 14]:

1. В языке Pascal функции могут возвращать значения только скалярного или указательного типов, а в языках С и C++ – значения всех типов, за исключением массивов (трактовка массивов в этих языках отличается от трактовки остальных типов). В функциональных языках, языках Ada и Python этот недостаток ортогональности устранен.

2. В языке С локальные переменные могут быть определены только в начале блока (составного оператора), а в C++ переменные определяются в любом месте блока (ио. конечно, перед использованием).

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

В языках Smalltalk и Python, напротив, все величины являются объектами, а все типы ссылочными тинами. Таким образом, в этих языках применяется лишь семантика ссылки и все коллекции объектов создаются в ортогональном стиле.

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

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

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

5. Легкость создания программ (Writability) отражает удобство языка для написания программ в конкретной предметной области. Поскольку в каждой предметной области программы имеют свою специфику, очень важно выбирать язык, который ее учитывает. Например, если речь идет об исследовании искусственного интеллекта, следует использовать язык Prolog или LISP, а при решении задач научных вычислений – язык Fortran [20, с. 33].

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

6. Концептуальная целостность языка. Концептуальная целостность языка включает в себя три взаимосвязанных аспекта: простоту, ортогональность и единообразие понятий. Простота языка предполагает использование минимального числа понятий. Ортогональность позволяет комбинировать любые языковые конструкции по определенным правилам. Единообразие понятий требует согласованного, единого подхода к описанию и использованию всех понятий [20, с. 33].

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

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

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

7. Естественность для приложений. Синтаксис языка должен способствовать легкому и прозрачному отображению в программах алгоритмических структур предметной области. Любой из типовых алгоритмов (последовательный, разветвляющийся, циклический, параллельный) имеет естественную структуру, которая должна поддерживаться программными операторами реализующего языка. Язык должен предоставлять структуры данных, операции и структуры управления, адекватные решаемой задаче [20, с. 33].

Естественность – это одна из важнейших причин популярности того или иного языка. Язык, ориентированный на характерные черты предметной области, .может сильно упростить создание для нее программных приложений. Приведем примеры языков с очевидной направленностью на решение конкретных классов задач: Prolog (поддерживает дедуктивные рассуждения), Perl (предназначен для записи различных сценариев) [16, с. 69].

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

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

9. Выразительность. Выразительность языка может характеризовать две возможности. С одной стороны, она означает наличие очень мощных средств для представления структур данных и действий, описывающих большой объем вычислений с помощью очень маленькой программы (языки APL, Snobol, Icon. SETL) [20, с. 34].

С другой стороны, выразительность позволяет записывать вычисления в более удобной и компактной форме. Например, в языке С запись х++ удобнее и короче записи х = х + 1. Аналогично, булевы операции and then и or else в языке Ada позволяют указать сокращенное вычисление булевых выражений. В языке Pascal циклы с известным количеством повторений проще создавать с помощью оператора for, чем с помощью оператора while. Несомненно, что все эти возможности облегчают разработку программ.

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

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

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

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

В языках Pascal, Ada и Java диапазон изменения индексов является частью объявления массива и тоже подвергается проверке. Такая проверка очень важна для обеспечения надежности программы, поскольку индексы, выходящие за пределы допустимого диапазона, часто создают серьезные проблемы [17, с. 86].

- Обработка исключений. Исключением называют аварийное событие, которое обнаруживается во время выполнения программы (аппаратом исключений). В результате авария устраняется и программа продолжает работу. Подобный механизм значительно повышает надежность вычислений. Языки Ada, C++, C# и Java позволяют обрабатывать исключения, хотя во многих других языках этот механизм отсутствует [20, с. 35].

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

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

- Стоимость выполнения программы. Она во многом зависит от структуры языка. Язык, требующий многочисленных проверок типов во время выполнения программы, будет препятствовать быстрой работе программы [22, с. 60].

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

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

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

- Стоимость трансляции программы. Размер этой стоимости зависит от возможностей используемого компилятора. Чем совершеннее методы оптимизации, тем дороже стоит трансляция. В итоге создается эффективный код: резко сокращается размер программы и/или возрастает скорость ее работы.

- Стоимость создания, тестирования и использования программы. Этот фактор стоимости удобно проиллюстрировать на примере среды для языка Smalltalk. Данная среда состоит из окон, меню, механизма ввода данных с помощью мыши и набора средств, позволяющих свободно оперировать со Smalltalk-программой. Здесь программное решение может быть спроектировано, закодировано, протестировано, изменено и использовано с минимальными затратами времени и сил программиста [20, с. 36].

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

- Стоимость сопровождения программы. Многочисленные исследования показали, что значительную часть стоимости используемой программы составляет не стоимость разработки, а стоимость сопровождения программы. Сопровождение – это процесс изменения программы после ее поставки заказчику. Сопровождение включает в себя [20, с. 36]:

- исправление ошибок (17% времени и стоимости);

- изменения, связанные с обновлением операционного окружения (18% времени и стоимости);

- усовершенствование и расширение функций программы (65% времени и сто- имости).

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

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

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

ЗАКЛЮЧЕНИЕ

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

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

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

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

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

1) сложность и трудоемкость процесса проектирования программного обеспечения для конкретной среды;

2) наличие инструментальных средств разработки программного обеспечения;

3) возможность внесения корректив в программу в процессе эксплуатации;

4) наличие средств проектирования пользовательского интерфейса;

5) скорость выполнения программы;

6) надежность работы программы и защищенность от программных сбоев.

Относительно критериев выбора языка разработки программ, то здесь на первый план выходят: 1) читабельность; 2) простота; 3) ортогональность; 4) структурированность потока управления в программе; 5) легкость создания программ; 6) концептуальная целостность языка; 7) естественность для приложений; 8) поддержка абстракций; 9) выразительность; 10) надежность и 11) стоимость.

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

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

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

  1. Баженова И.Ю. Языки программирования: Учебник / Под ред. В.А. Сухомлина. – М.: Академия, 2012. – 368 с.
  2. Бен-Ари М. Языки программирования. Практический сравнительный анализ: Учебник по языкам программирования / Пер. с англ. В.С. Штаркмана, М.Н. Яковлевой; Под ред. В.С. Штаркмана. – М.: Мир, 2000. – 366 с.
  3. Быканов Н.П. Классификация языков программирования // Международный журнал социальных и гуманитарных наук. – 2016. – Т. 5. №1. – С. 229-232
  4. Бьянкуцци Ф., Уорден Ш. Пионеры программирования: Диалоги с создателями наиболее популярных языков программирования // Пер. сангл. С. Маккавеева. – СПб.; М.: Символ, 2011. – 603 с.
  5. Головин И.Г., Волкова И.А. Языки и методы программирования: Учебник. – М.: Академия, 2012. – 304 с.
  6. Дешко И.П., Кряженков К.Г., Цветков В.Я. Системная и программная инженерия: Учебное пособие. – М.: МАКС Пресс, 2018. – 79 с.
  7. Душкин Р.В. Квантовые вычисления и функциональное программирование. – М.: ДМК-Пресс, 2015. – 232 с.
  8. Егоров А.Н., Крупенина Н.В. Языки программирования: Учебное пособие. – СПб.: Изд-во Гос. ун-т морского и речного флота им. адм. С.О. Макарова, 2014. – 240 с.
  9. Иванова Г.С. Технология программирования: Учебник. – 3-е изд., стер. – М.: КноРус, 2013. – 333 с.
  10. Идрисов Р.И., Одинцов С.П., Шилов Н.В. Онтологический подход к проблеме классификации компьютерных языков: состояние и перспективы // Системная информатика. – 2013. – №1(1). – С. 63-78.
  11. Ильичев М.В. Эволюция языков программирования // Экономика и социум. – 2016. – №10 (29). – С. 931-933.
  12. Керниган Б., Ритчи Д. Язык программирования С // Пер. с англ. и ред. В.Л. Бродового. – 2-е изд., перераб. и доп. – М.: Вильямс, 2017. – 288 с.
  13. Кинзябулатова Р.А., Маврина А.Ю. Классификация языков программирования // Наука: прошлое, настоящее, будущее: Сборник статей: Международной научно-практической конференции // Отв. ред. А.А. Сукиасян. – Уфа: Аэтерна, 2016. – С. 68-69.
  14. Кобелев И.А., Иванова Л.В., Чекушина В.Е. Два типа языков программирования // Современные проблемы науки и образования. – 2014. – №4. – С. 56-63.
  15. Колисниченко Д.Н. PHP и MySQL. Разработка веб-приложений. – 6-е изд., перераб. и доп. – СПб.: БХВ-Петербург, 2017. – 640 с.
  16. Лазарева И.М. Теория языков программирования и методы трансляции: Учебное пособие. – Мурманск: Изд-во МАГУ, 2018. – 97 с.
  17. Ляхович В.Ф., Молодцов В.А., Рыжикова Н.Б. Основы информатики: Учебник. – М.: КНОРУС, 2018. – 346 с.
  18. Наумов В.Ю. Информатика и программирование: Основы программирования на языке С++. – Волгоград: Изд-во ВолгГТУ, 2017. – 246 с.
  19. Опалева Э.А., Самойленко В.П. Языки программирования и методы трансляции: Учебное пособие. – СПб: БХВ-Петербург, 2014. – 471 с.
  20. Орлов С.А. Теория и практика языков программирования: Учебник. – СПб.: Питер, 2014. – 688 с.
  21. Пахунов А.В. Языки программирования: классификация, особенности, критерии выбора // Современная наука. – 2015. – №4. – С. 89-91.
  22. Пономарев О.П. Языки программирования: Учебное пособие. – Белгород: Изд-во Белгородского ун-та кооп., экономики и права, 2013. – 107 с.
  23. Пратт Т., Зелковиц М. Языки программирования: Разработка и реализация // Пер. с англ. А. Михайловой. – 4-е изд. – СПб.: Питер, 2002. – 688 с.
  24. Стативко Р.У., Лазебная Е.А. Языки программирования: Учебное пособие. – Белгород: Изд-во БГТУ, 2015. – 131 с.
  25. Черпаков И.В. Основы программирования: Учебник и практикум. – М.: Юрайт, 2018. – 219 с.
  26. Чурсин В.Б. Системное программное обеспечение. Трансляторы: Учебное пособие. – Орск : Изд-во ОГТИ, 2017. – 102 с.