Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Основная терминология программирования).pdf
Добавлен: 28.03.2023
Просмотров: 357
Скачиваний: 2
СОДЕРЖАНИЕ
1. Теоретические концепции языков программирования и программных сред
1.1. Основная терминология программирования
1.2. Классификация языков программирования по способу исполнения программ
1.3. Классификация языков программирования по уровню детализации
1.4. Классификация парадигм, реализуемых языками программирования
1.5. Критерии выбора сред и языков программирования
2. Некоторые современные языки программирования и их сравнение
2.2. Язык программирования C++
2.3. Язык программирования Java
2.4. Язык программирования Python
2.6. Сравнительный анализ языков программирования с точки зрения одной из отраслей
3. Некоторые современные среды разработки и их сравнение
3.1. Среда разработки Microsoft Visual Studio
3.2. Среда разработки NetBeans
3.4. Сравнительный анализ сред разработки приложений с точки зрения одной из отраслей
Библиотеки языка Java очень богаты на самые разнообразные классы. В частности, они обеспечивают примитивы синхронизации. Все модули библиотеки Java являются т.н. потокобезопасными: их одновременное использование из нескольких потоков не способно нарушить логику программы или вызвать неконтролируемое поведение. Также, библиотеки Java используются как API на Android. Вот только малая часть функционала (в список вошли только корневые, и не связанные со сторонними технологиями, библиотеки)[122][123]:
- java.lang, отвечающая за основные типы, поддерживаемые языком.
- java.io обеспечивает высокоуровневый потоковый ввод и вывод различных данных.
- java.net для работы в сети; она содержит сокеты, средства для работы со ссылками и telnet.
- java.util, библиотека с контейнерами и коллекциями данных: в частности, там находятся реализации хэш-таблиц и стека, а также классы Date (дата) и Time (время) [18, с. 16].
- java.awt – Abstract Windowing Toolkit, библиотека с инструментарием для создания графического пользовательского интерфейса.
- java.text – представляет форматы чисел, дат, и прочих данных.
- java.math – поддерживает математические операции с целыми числами или десятичными дробями.
- java.applet, библиотека классов для создания легковесных веб-приложений[124].
- java.security, инструменты для шифрования и безопасности.
Суммируя (см. таблицу 2), можно прийти к выводу, что Java – очень безопасный язык. Java легко портируется. Синтаксис усложнён запретами. Технологии Java нельзя применить в некоторых областях, требующих высокой производительности и универсальности. Стоимость трансляции, выполнения, и поддержки высокая.
2.4. Язык программирования Python
Python – это лёгкий в изучении ЯП, популярность и полезность которого в современном мире растёт. В частности, Python был удостоен первого места в The 2017 Top Programming Languages[125]. Индекс TIOBE этого ЯП тоже стабильно держится на относительно высоких позициях (см. таблицу 1).
Python применяется в основном для веб-приложений и серверного ПО[126]. Он позволяет строить наращиваемые и модульные программы. Кроме этого, по информации официального сайта, Python используется в ПО для инженерного анализа и компьютерной анимации[127]. Несмотря на простоту в изучении и работе, на нём можно писать самые разные по масштабу приложения. Крупные программы на этом языке поставляются в модульном виде [4, с. 46 – 47].
Данный язык является высокоуровневым. ПО на нём может быть исполнено множеством систем, а синтаксис позволяет оперировать очень абстрактными данными. Исходный код на Python обычно вообще никак не связан с ОС или аппаратным обеспечением, применяясь лишь в прикладных целях. Одной из целей создателей было сделать ЯП, программирование на котором проще чем на C, C++ или даже Java, и отнимает меньше времени. Также, упор сделан на более высокоуровневые типы данных, которые обеспечивали бы программисту возможность совершать много типовых операций единичными выражениями[128]. Этот ЯП, несмотря на его простоту освоения, может успешно применяться для сложных математических вычислений[129].
Данный язык поддерживает несколько парадигм программирования. В основном это ООП. Python позволяет создавать иерархии классов. Классы создаются по ходу исполнения программы. Внутри каждого класса могут быть объявлены именованные функции или переменные. Чтобы унаследовать один класс от другого, надо при описании наследника указать после его сигнатуры название прародителя в скобках. Прародителей может быть и несколько. В этом случае, наследование описанных в скобках классов происходит, как правило, слева-направо, методом поиска в глубину (от наследников к прародителям) [4, с. 160 – 163]. Это важно учитывать при построении сложных иерархий, когда у прародителей могут быть разные данные с одинаковой сигнатурой: наследуется самая первая, найденная в иерархии реализация (см. приложение 2). Однако, точный алгоритм построения иерархий сложнее. В некоторых редких случаях, реализация множественного наследования ведёт к ошибкам и не рекомендуется [4, с. 164]. С другой стороны, оно позволяет создавать в Python т.н. классы-примеси. Это наборы методов и данных, которые могут быть унаследованы другим классом. Все классы неявно наследуют от класса object [4, с. 75].
Любая именованная информация класса может быть инкапсулирована. За эту операцию отвечает добавление символов нижнего подчёркивания перед сигнатурой инкапсулируемого члена (см. приложение 2).
Методы в Python могут быть переопределены. Для этого достаточно, просто написать метод с такой же сигнатурой в классе-наследнике. Полиморфизм Python завязан не на принципы ООП, а на интерпретируемую структуру языка[130]. Обратной стороной этого является техническая возможность переопределить метод одноимённой переменной [4]. Поэтому с особой серьёзностью используются соглашения о наименовании тех или иных членов класса[131]; в частности, методы принято именовать глаголами, а данные – существительными, или, как вариант – писать названия методов заглавными, а данных – строчными буквами. В классе, отмеченном как абстрактный, можно создавать абстрактные методы. Экземпляры такого класса нельзя создавать [4, с. 182 – 188].
Кроме ООП, на Python возможно функциональное программирование. Наиболее часто ФП на этом языке употребляется для многозадачных приложений. Функциональная парадигма на Python поддерживается благодаря тому, что любую функцию можно применить в качестве аргумента или результата выражения. Также присутствуют специальные функции – генераторы, которые могут применяться для обработки контейнеров данных, использоваться как итераторы, и т.д. Генераторы также способствуют декларативному программированию на Python. Декларативный стиль часто применяется на этом языке для упрощения работы с большим количеством операций и/или данных [4, с. 130 – 155].
Python – интерпретируемый сценарный язык. Исходный текст на нём является по сути своей законченным скриптом, а файлы с этими скриптами обычно имеют расширение .py или .pyw[132]. Стандартная реализация интерпретатора может компилировать встроенные модули с кодом на Си, в целях оптимизации. Более того, существует интерактивный режим интерпретатора, в котором можно исполнять скрипты мгновенно, во время их написания. У языка есть множество реализаций [4, с. 23 – 25][133]:
- CPython, обычная реализация. Написана на Си.
- Jython, реализация Python с использованием JVM. Написана Джимом Хаганином на Java[134].
- Реализации Python на технологиях .NET Framework. Одна из них, созданная Брайаном Ллойдом, использует технологии классического CPython, может взаимодействовать при этом с компонентами .NET Framework. Также существует и более самобытная реализация Python, генерирующая промежуточный код IL, написанная создателем Jython.
- PyPy, экспериментальная попытка создать JIT-компилятор для Python. Поддерживает некоторые нововведения, не свойственные остальным реализациям.
В Python реализована сборка мусора. Для всех объектов в программе ведётся учёт. Как только на объект появляется новая ссылка – счётчик ссылок увеличивается, и наоборот [4, с. 59 – 60]. Сбор мусора срабатывает в зависимости от того, сколько объектов было создано и сколько объектов без ссылок засоряют память. Ненужный объект может быть и не удалён во время этой процедуры, а лишь перемещён в следующее поколение. Всего поколений три: от нулевого до второго. По умолчанию, в нулевом поколении может находиться 700 объектов, а в 1-м и 2-м до десяти. Пороговые значения можно произвольно изменить, либо вообще отключить сборщик мусора [4, с. 280 – 383].
Python может использовать самые разные API и библиотеки, в зависимости от интерпретатора. Так или иначе, стандартная библиотека Python, предоставляет следующие элементы[135][136]:
- Поддержку встроенных типов и выражений, работу со строками. Также, поддержку встроенных коллекций данных и исключений.
- Модули для математических операций. В частности, базовые классы для чисел, функций, генератор случайных чисел.
- Потоковый ввод и вывод, поддержку работы с файловой системой. Сюда входят модули для представления файлов, потоков, директорий.
- API для работы с базами данных. В частности, DB-API.
- Шифрование согласно алгоритмам MD5 и SHA1. Также доступен класс-обёртка над сокетами SSL.
- Модули межпроцессной коммуникации. Модули mutex и signal.
- Работу с Интернет-сервисами. Модули для клиент-серверной коммуникации с использованием HTTP, POP3, SMTP, telnet.
- Работу с архивами, документами и другими мультимедиа. Сюда относятся модули для работы с форматами wav, zip, текстом и гипертекстом.
- Некоторые специфические модули для работы в определённой ОС или на определённой машине. В частности, существуют специфические модули для Windows, OS X, Mac OS, UNIX.
- Некоторые специфические модули, необходимые для внутренней работы языка, его интерпретатора и окружения. К примеру, средства интерпретации, анализа кода и обратной инженерии, собственная внутренняя IDE[137].
Версии Python для JVM и .NET Framework могут использовать, помимо стандартной библиотеки Python, библиотеки Java[138][139] и .NET соответственно.
Суммируя (см. таблицу 2), Python очень портабельный, но не очень надёжный из-за особенностей множественного наследования и типизации. Библиотека позволяет применять его в различных областях. Язык очень лёгок, программы на нём легко читать и писать. Стоимость из-за механизма сборки мусора средняя.
2.5. Язык программирования C#
Язык C# был создан группой специалистов из Microsoft под руководством А. Хейлсберга. Microsoft требовался универсальный язык для их глобального проекта в области прикладной программной инженерии на ОС Windows, .NET Framework[140]. C# был спроектирован с этой целью. Впоследствии, появились свободные реализации .NET и для других платформ[141], а C# стал широко известен за пределами Windows-сообщества, на момент 2017 года занимая высокие позиции в рейтингах TIOBE и IEEE Spectrum [37] (см. таблицу 1).
.NET Framework состоит из нескольких компонентов, самыми значимыми из которых являются общеязыковая среда исполнения CLR, играющая роль, близкую к виртуальным машинам, и библиотека классов .NET, выполняющая функции API. С этими двумя компонентами могут работать самые разные языки программирования[142].
Данный язык является высокоуровневым. Он разрабатывался с учётом наработок Java и C++. Исполнение кода на C# зависит только от наличия .NET Framework на машине конечного пользователя. С точки зрения портируемости, важно отметить, что .NET Framework слишком тесно связан с Windows, некоторые версии этой ОС даже поставляются в комплекте с ним[143]. Однако энтузиастами были разработаны и кроссплатформенные варианты: в частности, технология Mono. На данный момент времени мало что мешает использовать приложения C# на Linux, Mac OS X, и на мобильных платформах. Создатели C# не стали идти по пути Java, и оставили некоторые возможности для низкоуровневого программирования. В частности, в этом языке можно использовать низкоуровневые указатели в стиле Си. Однако чтобы разрешить сборку такого кода, нужно установить параметр компиляции /unsafe[144]. В целом, C# можно назвать более простым и безопасным, чем C++, но обладающим схожим функционалом.
Основная концепция, на которую ориентировались создатели, это промышленное объектно-ориентированное программирование [13]. Язык содержит множество конструкций для ООП. Но не только для него.
Все типы данных в C# делятся на ссылочные типы (классы) и типы значений (структуры) [3, с. 59 – 67]. Первые и вторые могут включать в себя методы, поля и конструкторы. Методы и поля строго типизированы. Конструкторы представляют собой первые методы, выполняющиеся при инициализации объекта или типа (целиком). Конструкторы экземпляров структур имеют ограничения: они не могут создаваться без аргументов, и обязаны инициализировать содержимое структуры[145].
Ссылочные типы позволяют создавать иерархии классов. Все они неявно наследуют от корневого класса Object[146]. C# не поддерживает множественное наследование, вместо него реализована схема с интерфейсами. Интерфейсы, как и в Java, могут наследовать друг от друга и реализовываться в классах и структурах. Можно реализовать или унаследовать сразу несколько интерфейсов. Реализация интерфейсов и наследование в C# синтаксически выглядят одинаково (см. приложение 5)[147].
Существуют модификаторы доступа, которые можно задать каждому члену класса или структуры. Модификатор public делает информацию видимой для всех, private скрывает её, делая доступной только изнутри класса, protected – тоже скрывает, но оставляет доступ для наследников класса[148].