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

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

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

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

Добавлен: 28.03.2023

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

Скачиваний: 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. Сравнительный анализ сред разработки приложений с точки зрения одной из отраслей

ЗАКЛЮЧЕНИЕ

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

Полиморфизм присутствует в нескольких ипостасях: в частности, можно пометить метод как virtual, и переопределить его в классе-наследнике. Также можно перегружать операторы, или создавать методы с одинаковой сигнатурой, но различными аргументами. Есть и виртуальные методы без тела. Они входят в состав абстрактных классов. Как и в Java, такие классы предоставляют свои данные только при инициализации потомков, а абстрактные методы должны быть переопределены[149][150].

ООП является основной парадигмой программирования на C#. Однако, этот ЯП не заставляет программировать в объектно-ориентированном стиле, реализуя, пусть и гораздо менее показательно, вообще все перечисленные в работе парадигмы программирования. Так, например, для императивного программирования, языку в наследство от C++ достались указатели и оператор безусловного перехода [3].

На C# возможно и функциональное программирование. Это обеспечивается синтаксисом[151], а также специальными классами – делегатами. Все эти классы отличаются тем, что представляют собой фактически ссылку на метод, с возможностью его отложенного вызова. Делегат может содержать в себе и несколько методов, или ссылку на несколько делегатов (каждый из которых может также ссылаться на несколько методов или делегатов). В этом случае, при его вызове, методы вызываются все и по порядку. Также, делегат можно инициализировать анонимным методом (см. приложение 4). Делегат, как и экземпляр любого класса, может быть создан, инициализирован и использован внутри другой функции[152][153].

Декларативная парадигма программирования на C# используется для простого управления большими контейнерами и коллекциями классифицируемых данных (см. приложение 4). В частности, в .NET Framework есть специальный внутренний декларативный язык запросов, LINQ. Он используется для обработки данных[154]. LINQ-запросы легко интегрируются в код на C#, как библиотечные функции или даже как часть синтаксиса (см. приложение 4)[155].

Данный язык является JIT-компилируемым. На стороне программиста происходит трансляция кода на C# в промежуточную форму, называемую кодом IL. Этот код, при запуске на компьютере конечного пользователя, компилируется в машинный по мере выполнения программы. В частности, компилируется каждый новый метод перед исполнением. После компиляции, метод запускается, а его машинный код остаётся в динамической памяти на случай вторичного использования. Последующие вызовы метода работают только с машинным кодом конечного процессора, что обеспечивает прирост производительности. Также, в процессе компиляции код может быть оптимизирован [13, с. 37 – 41].


Каждая законченная программа для .NET называется сборкой[156]. Сборки могут включать в себя один или несколько управляемых средой CLR модулей и ресурсных файлов. Это позволяет разделить логическую и физическую составляющие программы. Сборки имеют манифест, цифровую подпись, правила безопасности и некоторые другие важные атрибуты, которые могут быть прочитаны средой CLR при запуске приложения [13, с. 58 – 78].

Данный ЯП использует сборку мусора. Объекты ссылочных типов в нём могут иметь финализатор (иногда называемый также деструктором)[157]. Деструктор синтаксически выглядит аналогично таковым в C++ (см. приложение 5), но имеет немного другой смысл своего существования. На финализаторы всех объектов, созданных в ходе выполнения программы, создаётся ссылка в списке финализации, специальной внутренней коллекции данных. Каждый объект имеет набор корней. Корнем называется адрес в памяти, по которому находится ссылка на объект. Как только корней у объекта не остаётся – он становится кандидатом на сбор мусора. Сборщик мусора вызывается, когда среде не хватает памяти для инициализации новых ресурсов, когда накопилось слишком много объектов без корней, при завершении работы приложения и среды, или посредством явного вызова программистом[158]. Сначала он помечает все объекты с корнями, затем – сжимает память кучи, чтобы объекты в ней не фрагментировались, и улучшалась производительность. В случае если на объект есть ссылка в списке финализации, его удаление откладывается, пока его деструктор не будет вызван и не завершит работу. Сборщик мусора выполняется в отдельном потоке, не мешая работе основного приложения. Для удаления объектов с финализатором ему может понадобиться сделать несколько проходов [13].

Роль основного API и рабочего инструмента в .NET играет так называемая стандартная библиотека классов, состоящая из нескольких пространств имён [3, с. 463]. Изначально .NET Framework создавался для операционной системы Windows, следовательно, и его библиотека классов рассчитывалась в основном на использование в данной ОС. Аргументом в пользу этого утверждения являются периодические упоминания Windows в технической документации и названиях пространств имён библиотеки[159]. К примеру, некоторые наследники класса SafeHandle, предназначенные для оперирования критическими и небезопасными ресурсами и их финализации, находятся в пространстве имён с лаконичным названием Microsoft.Win32.SafeHandles[160]. Также, существуют и дополнительные API для определённых ОС и версий платформы. В частности, в Mono существует библиотека Mono Class Library, отвечающая за дополнительный функционал для приложений, ориентированных на ОС Linux[161]. Основным же пространством имён стандартной библиотеки .NET Framework является System. Оно обеспечивает поддержку всех основных типов данных в C#. Рассмотрим некоторые возможности его дочерних пространств имён, описанные на официальном ресурсе компании Microsoft[162]:


  • Управление многопоточными приложениями, синхронизация и её примитивы.
  • Поддержка коллекций и контейнеров данных, транзакций, LINQ и SQL, работа с базами данных (включая параллельную обработку данных)[163].
  • Создание сетей, работа в Интернете. Специальные модули для поддержки ASP.NET, клиент-серверной технологии Microsoft[164].
  • Операции ввода и вывода, работа с файловой системой, идентификация аппаратного обеспечения.
  • Несколько специфических пространств имён для компиляции, поддержки рефлексии кода, генерации кода во время выполнения приложения и пр.
  • Обработка текстовой, звуковой, графической информации. Сюда также относятся такие новшества, как распознавание речи.
  • Специфические пространства имён для идентификаторов и модулей безопасности, шифрования и политики доступа.

Суммируя (см. таблицу 2), C# является не самым портабельным языком. Кроссплатформенные реализации .NET появились совсем недавно. С другой стороны, благодаря библиотеке и поддержке разных парадигм, он гибкий и читабельный. Синтаксис, как и в Java, несколько усложнён запретами. Также язык надёжен, хотя и допускает небезопасный код. Стоимость высокая.

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

По ходу Главы 2, характеристикам языков выставлялись баллы по шкале «Плохо» (0%) – «Средне» (50%) – «Хорошо» (100%). Такая наглядная система оценки языков частично позаимствована из книги Гослинга и МакГилтона [18, с. 69]. Попробуем выработать рекомендации для получившейся таблицы языков (см. таблицу 2).

Пример отрасли: системное программирование. Важнейшим критерием здесь является возможность быстро выполнить произвольный код без ограничений[165]. Уровень, на котором работает системный программист, поделён между ОС и аппаратным обеспечением[166]. ОС может быть устроена компонентно, иметь поддерживать абстрактные типы данных и иметь обширный системный API, аппаратное же обеспечение имеет свои аппаратно-зависимые операции и типы данных[167]. Таким образом, требования целостности языка разнятся: при работе только с операционной системой, типы данных и алгоритмы единообразны, в случае же программирования взаимодействий между системой, различным аппаратным обеспечением и/или прикладным ПО – наоборот.


Путём простого попарного сравнения (альтернативой ему может быть более сложный метод рангов, предлагаемый в частности С. Орловым)[168][169], можно предположить следующущий порядок значимости: универсальность (максимум), стоимость (минимум), портабельность (максимум), целостность (максимум или минимум), читабельность и надёжность (максимум). Размер уступок – разность (при поиске максимума) или сумма (при поиске минимума) значений 1-го оптимального варианта по текущему критерию и n-го оптимального варианта (где n меньше или равно номеру текущего критерия).

Шаг 1. Универсальность – C++, C# (-25 – C, Java, Python).

Шаг 2. Стоимость – C (+50 – C++).

Шаг 3. Целостность – C++ либо C, в зависимости от сферы приложения.

Шаг 4. Портабельность – Java, Python (-25 – C, C++, C#).

Шаг 5. Читабельность и надёжность – C++ (+16,7 – Java, C#).

В случае если программист работает с разнородной логикой, и на шаге 3 выбран максимум (Си), уступку на шаге 5 придётся увеличить.

Результатом данного анализа становится, в зависимости от условия, Си (оптимален для действий внутри операционной системы) или C++ (оптимален для многоуровневых взаимодействий). К сожалению, для аналогичной оценки сред разработки ПО для определённой области, требуется создать ещё одну таблицу, т.к. современные IDE не привязаны к языкам. Однако промежуточный результат выглядит правдоподобно. Язык Си часто относят к языкам системного программирования[170][171]. C++ также располагает инструментарием для создания системного ПО [172].

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

Из рассмотренных в данной работе языков, большинство (кроме Си) реализуют объектно-ориентированную схему. C++, C# и Python реализуют много парадигм одновременно.

Java и Python обладают лучшей портативностью из рассмотренных языков. Наиболее универсален C++ и C#, безопасностью кода и удобочитаемостью обладают C# и Java. Разработка на Си – наименее затратная.

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


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

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

Microsoft Visual Studio является платной средой разработки, хотя существует и бесплатная версия Community Edition, с некоторыми ограничениями[173]. Обе версии оперируют крупными модулями – решениями и проектами. Всего в линейке продуктов VS можно создавать как минимум 12 основных типов проектов. Проекты Visual Studio (далее VS) могут быть зависимыми или независимыми друг от друга. Именно эта среда более всех остальных ориентирована на работу с Windows и .NET Framework. Поддерживается Visual Basic, C/C++/C#, F#, Python и JavaScript. Она позволяет создавать на разных языках сборки, подписывать их и контролировать их версии[174][175]. Это очень практично для разработки и развёртывания крупного коммерческого ПО. Существуют и неофициальные дополнения, позволяющие использовать Visual Studio для работы с 32-битной версией Java Development Kit. На момент начала 2018-го года, 64-битные версии Java данным расширением не поддерживаются, а сам проект находится на стадии бета-версии[176].

Основная платформа данной IDE – ОС Windows. Для запуска самой IDE, и создания приложений в ней, требуется значительное количество ресурсов[177]. Основной пласт использования (37%) – промышленная разработка для крупного бизнеса. 30,9% использования среды – малый бизнес, 32,1% - средний рынок [40]. Относительно использования VS студентами, среда считается приемлемой для этих целей, но не самой подходящей и не самой простой[178].

Visual Studio известна своим проработанным до мелочей интерфейсом и оптимизацией работы потенциального программиста. Есть возможность настроить доступ к инструментам, оперировать несколькими окнами. Также существуют технологии работы с графическими интерфейсами (см. рис. 6).

Технология IntelliSense облегчает поиск тех или иных модулей в текстовом редакторе, позволяет ссылаться на те или иные данные в исходном тексте значительно быстрее (см. рис. 10). Она умеет анализировать метаданные сборок и визуально отображать их программисту[179].

Технология CodeLens позволяет просматривать некоторые данные о каждом элементе кода в редакторе (например, какие внешние элементы программы ссылаются на этот него, более ранние версии этого фрагмента кода и т.д.). При этом не теряется контекст, в котором работает программист. Также, среда имеет хорошую поддержку регулярных обновлений, и информативную справку (см. рис. 9 – 10).