Файл: Обзор языков программирования высокого уровня (Современные языки программирования).pdf
Добавлен: 31.03.2023
Просмотров: 82
Скачиваний: 2
У Java имеются традиционно сильные позиции в корпоративном секторе. Также она является основным языком программирования в распределенной обработке большого количества данных Hadoop. Стоит упомянуть и мобильный сектор, в котором программы для лидирующей платформы (Android) пишутся на Java.
Библиотеки Java предоставляют различные динамические структуры, но при самостоятельной реализации динамических структур нужно учитывать сборщик мусора, который должен освободить память после удаления элемента, что может приводить к задержкам выполнения в самый неподходящий момент.
4. C# создавался с оглядкой на Java, это очень похожие языки. C# также использует концепцию промежуточного байт-кода, который затем интерпретируется в общеязыковой исполняющей среде (CLR — Common Language Runtime), имеется автоматическое управление памятью. Язык очень тесно связан с платформой .NET, которая предоставляет множество как коммерческих, так и бесплатных библиотек. Также есть возможность работать со старыми интерфейсами Win32 и COM [3]. С одной стороны такая интеграция технологий является весомым преимуществом, если проект рассчитан в основном на Windows, с другой стороны это сильно ограничивает переносимость на другие платформы. Стоит заметить, что существуют открытые реализации платформы .NET, включая компилятор для C# – Mono. Но помимо неполной поддержки возможностей .NET, а следовательно и работы C# программ, существуют юридические риски, связанные с патентами Microsoft. По указанным причинам многие сообщества разработчиков скептически относятся к Mono, что негативно сказывается на распространении этой платформы в отличной от Windows среде.
C# очень популярен в корпоративном секторе и закономерно является лидером в разработке приложений для Windows-платформ.
Ситуация с динамическими структурами для .NET (C#) аналогична таковой в Java, также имеется большой выбор структур.
5.Objective-C является подмножеством языка C, дополняя его объектно-ориентированными возможностями. Особенностью языка можно считать механизм обмена сообщениями, когда выполняемый код выбирается исполнительной средой динамически, а не во время компиляции, тип объекта определяется во время выполнения [4]. Также язык достаточно прост для изучения. Существует мнение, что своей популярности он добился только из-за того, что Apple выбрала его в качестве основного для своей платформы. Впрочем, этот язык действительно не столь популярен вне платформы Apple.
Для Objective-C ситуация с динамическими структурами данных похожа на таковую с языком Си, когда в стандартной библиотеке их нет, но можно воспользоваться сторонними источниками или написать самому.
6. JavaScript (JS) появился как дополнение к Java для программирования интерактивных веб-страниц [15], со временем став доминирующим языком программирования на клиентской части веба (в браузере). Сам язык является объектно-ориентированным (прототипо-ориентированным) с динамической типизацией и сборкой мусора. Первые реализации были основаны на интерпретации исходного кода, что сильно сказывалось на скорости выполнения. В дальнейшем были написаны различные JS движки, которые использовали как промежуточный байт-код, так и компиляцию сразу в машинный код. Отдельно стоит выделить движок от Google — V8. Благодаря его скорости, эффективности и открытой лицензии он получил широкое распространение не только в браузерах, но и на стороне сервера. К примеру, на его основе создана платформа Node.js, предоставляющая возможности асинхронного программирования с неблокирующим вводом/выводом и превращающая JavaScript из узкоспециализированного языка в язык общего назначения. JS часто ругают за непривычную реализацию объектно-ориентированного программирования через прототипы.
В JavaScript благодаря динамической типизации и автоматическому управлению памятью можно создавать динамические структуры, не заботясь о типе элементов и выделении памяти для них. Стоит рассмотреть две основные структуры, которые являются основами для остальных: массивы и ассоциативные массивы (словари). Не смотря на то, что они и называются массивами, их реализация в большинстве JS движках использует списковые структуры. С одной стороны мы получаем удобный инструмент, которым легко пользоваться, и который достаточно быстр, но с другой стороны из-за его универсальности, он может быть не самым оптимальным решением в случае, когда предъявляются повышенные требования к производительности и используемым ресурсам.
7. Python является высокоуровневым языком общего назначения и поддерживает различные парадигмы программирования. Особенностями языка являются минималистичный синтаксис и использование отступов в качестве выделения блоков, что делает код удобным для чтения, повышается производительность разработки [8]. Язык легок в обучении, имеет множество библиотек для решения задач из самых разных областей. Существуют реализации языка под различные платформы, что позволяет говорить о его высокой кроссплатформенности. В зависимости от реализации используются различные подходы к исполнению кода, начиная от простой интерпретации до компиляции в промежуточный байт-код и его последующего выполнения.
К недостаткам Python можно отнести не такую высокую производительность, как у компилируемых языков, но существуют и развиваются проекты по увеличению быстродействия, например, PyPy и Pyston. Также не всем нравятся принудительные отступы, но такое навязывание заставляет придерживаться стандартов форматирования кода, что является большим преимуществом языка.
Python нашел широкое применение в задачах автоматизации, системном администрировании, в веб-разработке, распределенных вычислениях и научных исследованиях.
Ситуация с динамическими структурами данных аналогична таковой с JavaScript. Также имеются удобные и универсальные инструменты (словари и списки), за которые приходится расплачиваться быстродействием и повышенными требованиями к ресурсам.
Сравнение языков программирования
Теперь выделим те качества в языках программирования, по которым их можно сравнивать между собой. Хотя этому процессу присуща определенная доля субъективизма и личных предпочтений, благодаря чему он нередко становится предметом священных войн, постараемся все же опираться на факты.
Рассмотрим основные критерии оценки языков программирования [19].
1. Скорость разработки. В современном мире это очень важный критерий, так как в условиях конкуренции зачастую успех продукта определяется тем, как быстро он может выйти на рынок, сколько времени потребуется для реализации дополнительных возможностей. Сюда же можно отнести доступность библиотек для различных задач, развитость среды разработки для того или иного языка. Явными лидерами здесь являются сценарные языки программирования, такие как Python, Ruby, Perl. Согласно проведенным экспериментам, они позволяют создавать программы в 2-3 раза быстрее, нежели компилируемые языки со строгой типизацией [11].
2. Читабельность и поддержка. Насколько легко понимать и сопровождать код (чаще чужой). Также сюда можно отнести количество специалистов по данному языку. Чем запутаннее код и меньше специалистов, тем дороже будет поддержка проектов на этом языке. К примеру, не без основания ходит шутка о том, что Perl является языком только для написания кода («write only»), но никак не для чтения. Так как сам язык позволяет (и даже поощряет) выражать одни и те же вещи различными способами, зачастую это приводит к плохо читаемому коду, особенно если он был написан не очень опытным разработчиком. Другим примером может служить Кобол. Сейчас его практически не преподают в университетах, но данный язык считался лидером по количеству кода, написанному на нем, поэтому специалистов будет найти все труднее и труднее, а стоить их работа будет дороже.
Также немаловажным фактором является типизация языка программирования. В больших и серьезных проектах предпочтительнее использовать статическую типизацию, так как это позволяет отслеживать ошибки еще на уровне компиляции.
Больше других современных языков этому критерию соответствуют Java и C#.
3. Надежность. В первую очередь надежность программ зависит от самого разработчика. В качестве разработчика может выступать группа людей. Существует множество факторов, которые влияют на конечный продукт. Например, квалификация разработчиков, временные рамки, сложность проекта, используемая методология и так далее. Тем не менее многие языки позволяют не допустить часть ошибок. К примеру, в C/C++ разработчику самостоятельно нужно заботиться о выделении/освобождении памяти, невыходе за границы массивы и так далее. Другие языки, такие как Java, C#, Python, JavaScript ограничивают использование этих возможностей, что положительно сказывается на надежности кода. Еще одним источником проблем является динамическая типизация, поэтому языки со статической типизацией являются более надежными, так как позволяют отследить эти ошибки еще на этапе компиляции. Суммируя выше сказанное, можно сделать вывод, что наиболее надежными из популярных языков программирования являются Java и C#.
4. Переносимость. Под этим критерием подразумевается возможность переноса программы на другую платформу, доступность и качество средств разработки, сред выполнения для различных платформ. Казалось бы, что в данной номинации должна безоговорочно победить Java, но не все платформы поддерживают JVM, очень часто из-за недостатка вычислительных ресурсов, например, во встраиваемых устройствах. В таких случаях хорошим выбором будут C и C++, где желательно низкоуровневое взаимодействие с операционной системой выносить на отдельный уровень или использовать кроссплатформенные
библиотеки (например, QT).
5. Быстродействие и потребляемые ресурсы. В современном мире труд программистов стоит дороже «железа», поэтому чаще выгоднее приобрести более мощное оборудование, нежели оптимизировать программное обеспечение, и тем более использовать другой язык, который будет потреблять меньше ресурсов. Но существуют области, где этот критерий играет одну из ключевых ролей. Например, встраиваемая техника, системное программное обеспечение.
Естественно, что многое зависит от квалификации разработчика, используемых алгоритмов и структур данных. Поэтому можно создать программу на C, которая будет работать медленнее таковой, написанной на Java или Python [11]. Но если считать, что квалификация разработчиков одинакова, то лидерами по этому критерию являются C и C++.
Выводом для вышесказанного должно стать понимание того, что, зная слабые и сильные стороны языков программирования, для каждого типа задач нужно выбирать наиболее подходящий язык. Не существует языков, которые справляются со всеми задачами лучших других. У каждого языка есть свои сильные и слабые стороны. Поэтому при выборе оного нужно исходить из потребностей и задач, для которых планируется его применение.
В данной курсовой работе для практической части был выбран язык C++, потому что он позволяет работать как на относительно низком уровне, так и использовать более высокоуровневые абстракции. Первая возможность отлично подходит для демонстрации принципов организации динамических данных, а используя инструменты объектно-ориентированного программирования, можно отделить внутреннюю реализацию от внешней, что является одним из принципов построения сложных и надежных систем.
Также в большей степени верно высказывание о том, что научившись решать вопросы на C++, вы сможете это делать на других языках программирования [20].
Динамические структуры данных
Обычно при изучении языков программировании первыми идут статические данные. Эти данные не меняют свои размеры и взаимное расположение во время своего существования. Но в реальных программах зачастую заранее неизвестно, каков будет объем данных, сколько памяти нужно выделить на их хранение. Можно, конечно, взять с запасом, но это будет неэффективное использование памяти, и в итоге все равно можно упереться в выделенный объем. В таких случаях стоит использовать динамические структуры данных.
Динамическими структурами данных называют данные, количество элементов в которых, их взаиморасположение и связи могут меняться во время выполнения программы. В отличие от динамических массивов, где выделяется непрерывный участок памяти, в динамических структурах элементы могут располагаться на несмежных участках памяти и связываются друг с другом с помощью указателей.
Элемент динамической структуры состоит из полей данных, в которых хранится необходимая информация, и полей связи [6]. Поля данных могут состоять в свою очередь из других структур, а в полях связи хранится один или несколько указателей в зависимости от типа динамических данных.
Так как память для элементов выделяется блоками по мере необходимости, и не требуется их физическая смежность, поэтому количество элементов ограничено лишь потребностями программы и объемом доступной памяти в системе. Также преимуществом такого подхода является то, что при изменении последовательности элементов не требуется их перемещение — достаточно поменять соответствующие указатели.