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

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.03.2023

Просмотров: 306

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1. Теоретические концепции языков программирования и программных сред

1.1. Основная терминология программирования

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

1.3. Классификация языков программирования по уровню детализации

1.4. Классификация парадигм, реализуемых языками программирования

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

2. Некоторые современные языки программирования и их сравнение

2.1. Язык программирования C

2.2. Язык программирования C++

2.3. Язык программирования Java

2.4. Язык программирования Python

2.5. Язык программирования C#

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

3. Некоторые современные среды разработки и их сравнение

3.1. Среда разработки Microsoft Visual Studio

3.2. Среда разработки NetBeans

3.3. Среда разработки Eclipse

3.4. Сравнительный анализ сред разработки приложений с точки зрения одной из отраслей

ЗАКЛЮЧЕНИЕ

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

Раньше IDE рассматривались в контексте одного конкретного языка программирования[68], однако современные IDE – мультиязычные. Есть и современные исследования этого вопроса. Одна из таблиц исследования Grid℠ компании G2 Crowd[69], «Satisfaction by Category», содержит результаты опросов пользователей относительно использования в бизнесе, простоты установки, использования и администрирования, а также качество поддержки разных IDE. В разных российских источниках, озвучивались, суммируя, следующие критерии[70][71]:

  • доступность и простота установки[72]
  • возможность реализовать поставленные задачи
  • отказоустойчивость и критерии времени отклика
  • требования к ОС и переносимости
  • контроль версий
  • удобство использования (наличие справки и поддержки, изменение кода, понятность и расширяемость)
  • системные требования

Выбор же самого языка программирования – задача также сложная. Наиболее часто встречающиеся критерии[73][74]:

  • Стоимость написания программы и её поддержки. Сюда включаются также затраты на обучение, затраты на исполнение программы, затраты на IDE, память вычислительных устройств. Поэтому, для рассмотрения ЯП, предлагается использовать стоимость трансляции программы, выполнения и сопровождения. Эти критерии тождественны качеству оптимизации кода при трансляции, нагромождению семантики (например, при сборке мусора или проверках типов), степени сложности прочтения исходного текста.
  • Системные требования к программе, её портабельность, возможность развёртывания на разных системах.
  • Гибкость и универсальность языка, возможность применения его для широкого круга задач без подключения сторонних технологий.
  • Концептуальная целостность языка. Обоснованность ограничений[75], единый подход ко всем конструкциям языка. Несколько менее важной частью этой характеристики является скромность синтаксиса.
  • Естественность языка. Значение этого параметра субъективно: оно меняется в зависимости от того, насколько ЯП подходит для реализации того или иного прикладного алгоритма.
  • Читабельность и надёжность. Надёжность зависит от наличия обработки некритических ошибок (исключений), системы типов, и степени читабельности языка. Читабельность – от спецификации данных (что опять связано с типизацией), и от степени абстракции (модульности, понятных человеку алгоритмов). Эти характеристики могут быть особо важны в проектах, с большим количеством разработчиков. Из-за их взаимной зависимости они объединены.

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

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

В отличие от прочих областей «научного» профиля, при рарзарботке искусственного интеллекта требуются символьные, а не числовые, данные, а также возможность совершенствования кода непосредственно во время работы программы. Для разработки ИИ считаются приоритетными технологии функционального и декларативного программирования[79][80], интерпретации и JIT-компиляции, самоидентификации кода во время исполнения.

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

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


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

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

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

Языки ассемблерного типа облегчают подробную работу с процессором. Для решения же задач, не связанных с аппаратным обеспечением, были созданы более абстрактные ЯП. Языки с абстракцией назвали высокоуровневыми; в противовес им, ассемблеры и машинный код можно выделить в единую низкоуровневую группу. Более того, об уровне языка можно косвенно судить по степени автоматизации работы с памятью и наличию API для высокоуровневых операций в системе. Эти 2 пункта влияют на сам процесс программирования и должны быть рассмотрены более подробно.

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

2. Некоторые современные языки программирования и их сравнение


2.1. Язык программирования C

Язык программирования C (далее по тексту – Си) был создан для нужд ядра UNIX-подобных операционных систем. Создателями этого ЯП являются Д. Ритчи и К. Томпсон[85]. Несмотря на изначальную ориентацию на системное и прикладное ПО для UNIX, Си - очень гибкий язык: он рассчитан на применение практически в любой области. Известны случаи системного программирования на Си, создания крайне высокопроизводительных и кроссплатформенных программ [7, с. 11]. Си – многократный «язык года» по версии TIOBE, и на момент 2017-2018 гг. является, судя по рейтингам IEEE Spectrum и TIOBE, одним из самых востребованных ЯП [37, 48].

Программы на Си легко портируются, и это считается очень сильной его стороной. Если чётко следовать особым стандартам написания кода, можно добиться даже полной переносимости [7, с. 11]. По критерию зависимости от аппаратного обеспечения данный ЯП является высокоуровневым. Однако стоит сделать ремарку: в нём достаточно много низкоуровневой семантики, чтобы даже сравнивать его с языками ассемблерного типа и использовать в схожих целях. В частности, об этом говорил Б. Страуструп[86]. В конце концов, этот ЯП может оперировать битами, регистрами процессора, оперативной памятью, в нём отсутствуют операции над сложными объектами, в пользу чисел и указателей (см. приложение 6), он оперирует небезопасными и непроверяемыми преобразованиями типов[87], а одной из целей его создания было системное программирование в UNIX (он даже в определённом смысле интегрирован с ней)[88].

Си является процедурным (императивным): в нём можно явно наблюдать и задавать, что именно будет делать компьютер, и как он будет выполнять ту или иную задачу. Это, вкупе с низкоуровневой семантикой, позволяет писать максимально экономичные программы, рационально расходующие системные ресурсы. В Си нет ни поддержки параллелизма, ни сложных составных объектов данных (хотя присутствуют примитивные структуры и контейнеры [7, с. 141 – 147]). Из управляющих конструкций, он предоставляет циклы, условия, группирование и подпрограммы, условный и безусловный переход [7]. Последний может сильно усложнить программу.

В Си присутствуют и функции, способные возвращать значение. Переменные, находящиеся в теле и среди аргументов функций, называются локальными. Обычно они являются т.н. автоматическими: они создаются заново при каждом новом обращении к функции [7, с. 44]. Возвращение значения происходит с помощью оператора return, после которого указывается возвращаемая переменная, константа, или выражение над ними. Можно создать и классическую процедуру (ничего не возвращающую), просто не указывая ничего после return, либо вообще опустив этот оператор. Язык позволяет и рекурсивный вызов функций [7, с. 81 – 84].


Основу синтаксиса данного ЯП составляют операторы присваивания, выхода из цикла или функции, побитового сдвига, равенства и т.д. Операторы могут использоваться блоками, что делает код более лаконичным [7, с. 69 – 80]. Программы на Си отражают возможности современных компьютеров. Так, присутствует возможность использовать регистровую память процессора для некоторых переменных [7, с. 97]. Количество регистров ограничено, но иногда это полезно для повышения производительности.

Си – чистокровный компилируемый язык, поэтому одну программу на нём нельзя написать для огромного количества устройств одновременно[89]; с другой стороны, программы на C элементарно могут быть скомпилированы в нескольких экземплярах из одного и того же исходника для любой программной и аппаратной платформы. Для обеспечения раздельной компиляции из разных исходных файлов, используются специальные заголовочные файлы [7, с. 95 – 96]. Там содержатся описания структур, функций, констант, используемых каждым файлом исходника и т.д. В Си есть препроцессор, обрабатывающий специальные директивы. Каждая директива должна занимать одну строку исходного текста и начинаться с символа #.Препроцессор имеет весьма опосредованное отношение к самому языку[90].

Создатели Си не ставили себе задачи реализовать одну из безопасных моделей менеджмента памяти. Вместо этого, они реализовали произвольный низкоуровневый доступ к ней. Память может быть выделена специальными функциями, как правило, с названием alloc. Для оперирования памятью используются низкоуровневые указатели. После того, как выделенный буфер памяти перестал быть нужным, он может быть освобождён с помощью процедуры, как правило, именуемой словом free. Обращения к free должны производиться в обратном вызовам alloc порядке[91].

Изначально в Си была предусмотрена библиотека ввода-вывода, отвечающая за взаимодействия с файловой системой, такие как файловый ввод и вывод, обработка ошибок, и т.д. У современных версий языка Си имеется более обширная библиотека классов. Внутри неё, помимо вышеописанных функций, находятся функции размещения объектов в памяти, средства для работы со строками, примитивные средства обработки ошибок и так далее [7, с. 260 – 280]. Библиотечные функции подключаются с помощью заголовочных файлов[92].

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