Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Основная терминология программирования).pdf
Добавлен: 28.03.2023
Просмотров: 336
Скачиваний: 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. Сравнительный анализ сред разработки приложений с точки зрения одной из отраслей
ВВЕДЕНИЕ
Данная работа посвящена классификации языков и сред программирования, специфике и проблемам, возникающим с конкретными языками программирования в ходе разработки программных продуктов в конце XX – начале XXI века.
На сегодняшний день количество средств для разработки ПО, подходов к разработке ПО и разнообразных программных решений вкупе со стандартами и сопроводительной документацией – настолько велико, а концепции, существовавшие ещё во второй половине XX века вполне обособленно друг от друга – настолько переплетены и интегрированы друг с другом, что проблема относительно точной систематизации всех накопившихся решений и опыта полностью заслуживает обсуждения. Это стало одним из факторов написания работы по этой теме.
Объектом исследования данной работы являются языки программирования.
Предметом исследования данной работы являются возможности и ограничения языков программирования, их библиотек и сред разработки ПО, при решении практических задач.
Основной целью работы является поиск наиболее оптимального способа принятия решений в области выбора среды и языка программирования для деловых, производственных, и исследовательских (образовательных) целей. Для выполнения этой задачи, требуется:
- Проанализировать фундаментальные концепции и составить терминологический аппарат.
- Рассмотреть реализацию данных концепций на примере конкретных языков, попутно рассмотрев их особенности и перспективы, и описав их в рамках терминологического аппарата.
- Рассмотреть практику использования языков программирования и IDE для них, описав попутно потребности нескольких секторов IT-отрасли в тех или иных технологиях.
- Выработать единую методику для оценки качества жизненного цикла ПО.
- Проверить методику на практическом примере, в рамках одной из отраслей.
В Главе 1 должны быть проанализированы основные концепции и идеологии программирования, а также теоретические возможности их применения, составляется терминологический аппарат работы. В конце Главы 1 будут выработаны критерии оценки языков и сред для них и методика дальнейшего практического исследования.
В Главе 2 рассматриваются примеры реализации концепций из Главы 1 теми или иными языками, описываются их возможности и ограничения. В качестве примеров для классификации выбраны языки, занимавшие в 2017-м году первые 5 позиций в рейтингах компании TIOBE и профильного журнала IEEE Spectrum одновременно (стоит отметить, что они совпадают). Они будут рассматриваться с точки зрения теоретических концепций, проанализированных в Главе 1, и в конце Главы 2 будет практически проверена методика поиска оптимального языка, выработанная в Главе 1, на примере конкретной задачи и выборки данных по результатам обзора языков.
В Главе 3 рассматривается статистика использования нескольких сред разработки. В работе будут рассмотрены среды разработки, удовлетворяющие максимальные потребности пользователей и одновременно имеющие широкую известность, исходя из данных таблицы Leaders отчёта крупного исследования компании G2 Crowd за 2017-й год; в качестве второго источника, для уже более подробного сравнения сред, была выбрана статья Лучанинова и Ленкина 2016-го года. Третьим источником служит актуальный на момент зимы 2018 года рейтинг статистического портала TrustRadius. Будут рассмотрены среды, упомянутые во всех источниках информации, а также имеющие в той или иной мере актуальную поддержку всех языков из Главы 2. Аналогично, будет проведено исследование их эффективности для решения одной из задач.
На основании информации, описанной в главах данной работы, делаются суждения о возможностях той или иной технологии программирования для той или иной задачи. В качестве источников информации для работы намеренно было отдано предпочтение работам высококвалифицированных практиков, статьям из технических журналов, посвящённых международной практике IT, а также национальным и международным техническим стандартам (ГОСТ, ECMA). В качестве источников информации по тем или иным конкретным технологиям используются официальные технические документы крупных компаний (Microsoft, Oracle) и отдельных проектов (Mono, NetBeans, Python, Android). Значительная часть этих источников в контексте работы дублирует друг друга, для объективности.
Основными теоретическими источниками послужили работы Карделли, Барендрегта, несколько учебно-методических русскоязычных изданий (такие как «Архитектура компьютера» Таненбаума, «Теория и практика языков программирования» Орлова), и несколько государственных стандартов РФ. Надёжность и достоверность данных источников трудно переоценить, потому что многие из них фактически заложили основы современной программной инженерии. Среди книг по языкам программирования, использованных в ходе подготовки материала, стоит выделить труды Кернигана и Ритчи, Гослинга, Рихтера, Страуструпа, так как. эти авторы принимали непосредственное участие в создании описываемых ими технологий. Также, были использованы книги справочного и учебного характера – труды Бизли по Python, Шилдта по Java, Подбельского по C#.
1. Теоретические концепции языков программирования и программных сред
1.1. Основная терминология программирования
Для составления любых анализов и классификаций, необходимо принять во внимание несколько простых терминов, присущих программированию целиком.
Программирование - процесс проектирования определённых последовательностей инструкций, направленных на решение определённой задачи (т.н. алгоритмов)[1], для дальнейшей реализации этих алгоритмов, транслированных в технические данные, вычислительной техникой (в частности, компьютером)[2]. Запись алгоритма, предназначенная для реализации таким способом, называется программой, а работоспособная программа вместе с технической документацией по её эксплуатации – программным обеспечением (ПО)[3]. Создание программного обеспечения, как и разработка любых алгоритмов вообще, является тяжёлым и кропотливым процессом, требующим высоких созидательных и аналитических способностей, а потому на момент второй половины XX – первой половины XXI века, разработка ПО является уделом людей[4].
То, какие команды исполняет процессор, определяется архитектурой команд процессора[5]. В совокупности, язык, на котором исполняются команды процессора, называется машинным языком[6]. Команды на машинном языке, в соответствии с принципами программного управления Джона фон Неймана, помещаются перед выполнением в основную память, на оперативное запоминающее устройство (ОЗУ) [9, с. 43 – 45].
Язык программирования (ЯП) – это формальный язык, предназначенный для человекочитаемого (но при этом достаточно чёткого) описания логики программы. В современном мире программы в буквальном смысле пишутся на языках программирования. Получившийся текст называется исходным, и в дальнейшем, благодаря своей однозначности, может быть переведён в машинный код и исполнен[7].
Каждый язык программирования обладает своим уникальным синтаксисом. Синтаксис, в свою очередь, состоит из примитивных элементов - атомов. Атомы обычно не описываются в исходном тексте сами по себе, а комбинируются в т.н. лексемы, минимально допустимые синтаксические конструкции[8]. С точки зрения семантики, синтаксис языков программирования в обязательном порядке предоставляет программисту средства для описания данных, используемых в программе, и действий, производимых над данными. Данные, используемые программой, могут быть изменяемыми и неизменяемыми. Изменяемые элементы данных называются переменными, а неизменяемые - константами. Выражение – явное описание минимального законченного действия, которое может совершить программа с данными для получения одного результата. Данные, участвующие в выражении, называются операндами[9]. Данные классифицируются по типам. Объекты данных с похожими наборами значений, функционированием, и объёмом занимаемой памяти[10], можно рассматривать как объекты с одинаковым типом данных[11].
Технические инструменты, используемые программистами для создания программного обеспечения, часто собираются в одну программу, называемую средой разработки (IDE). Иногда среда разработки включает также системы контроля версий и браузеры компонентов программы. Такой подход повышает удобство разработки и сопровождения программного обеспечения. Также любая такая среда может быть адаптирована под нужды определённого разработчика. Использование IDE тесно связано с моделью разработки программного обеспечения – совокупностью объектов и операций, определяющих процессы, совершаемые программистом[12].
1.2. Классификация языков программирования по способу исполнения программ
Готовый исходный текст программы должен быть понят компьютером. На практике за любое понимание исходного текста машиной отвечает транслятор, или его подвид[13], интерпретатор. Строго говоря, транслятор отвечает не только за подготовку программы к запуску в машинном коде, но и вообще за любой её перевод с одного ЯП на другой (в т. ч. и в машинный код)[14]. Язык, на который должна быть транслирована исходная программа, называется целевым (выходным)[15]. И в этом аспекте языки программирования делятся на 2 большие группы: компилируемые (транслируемые) и интерпретируемые[16]. Также существуют комбинированные варианты реализации исходных текстов языков[17], в частности, при помощи технологии виртуальных машин. Виртуальная машина – это фактически программная (иногда и аппаратная [32]) надстройка над аппаратным компьютером, позволяющая смоделировать на нём абстрактный компьютер с компилируемым или интерпретируемым языком в роли машинного кода[18]. Реализацию исходного текста посредством виртуальной машины сложно описать с точки зрения чистой трансляции или чистой интерпретации[19].
В компилируемых языках исходный текст сразу переводится в машинный код или в промежуточный код виртуальной машины, на стороне программиста, в составе специального ПО для компиляции (компилятора либо ассемблера)[20]. Транслятор компилируемого в машинный код языка собирает из исходной программы программу в машинных кодах, пригодную для выполнения. Некоторые особенности трансляции в машинный код:
- Быстродействие получившейся программы: компьютер конечного пользователя сразу приступает к выполнению программы, написанной понятным процессору машинным языком.
- Конечному пользователю не требуется ничего, кроме самой программы и совместимого аппаратного обеспечения, для её запуска[21]
- Сложность восстановления исходного текста при наличии только выходного исполняемого файла[22].
- Результаты компиляции в машинный код представляют собой инструкции для строго определённого типа компьютеров[23].
- Программа полностью загружает себя в память, засоряя её.
Программа на интерпретируемом языке распространяется, как правило, в виде упрощённого промежуточного представления исходного кода, либо в исходной форме. В ходе её обработки на компьютере конечного пользователя специальной программой-интерпретатором, каждая необходимая в данный момент команда в коде транслируется, и программа выполняется покомандно[24]. Некоторые особенности интерпретируемых языков:
- Программа переводится в машинный код последовательно по ходу своего выполнения, т.е. некоторые части программы могут быть никогда не обработаны, если это не потребовалось по ходу выполнения программы[25]
- Учитывая, что программа транслируется в машинный язык только на стороне пользователя, ответственность за аппаратную совместимость перекладывается с программиста на пользователя и его интерпретатор.
- Интерпретация может отрицательно повлиять на производительность, т.к. в отличие от компиляции реальный процессор получает машинный код для выполнения дольше[26].
- В случае если потребуется повторное использование элементов программы, они будут интерпретированы несколько раз, тратя лишнее время.
У интерпретируемых языков есть специфический подвид – скриптовые (сценарные) ЯП[27]. Файлы этих языков представляют собой сценарии (скрипты), и предназначаются для модульного, иногда опционального, использования в больших проектах. Скриптовые ЯП ориентируются на применение в этой отрасли, и успешно используются для Интернет-проектов, крупного модульного ПО и системного администрирования[28].
Компиляцию и интерпретацию во многих современных языках стараются совмещать, чтобы скомбинировать их достоинства[29]. Наиболее наглядная такая система исполнения программы упоминается в трудах Э. Таненбаума как «Just-In-Time (JIT) компиляция». Она тесно связана с концепцией виртуальной машины. Некоторые особенности JIT-компилируемых языков: