Добавлен: 05.04.2023
Просмотров: 473
Скачиваний: 1
Проанализировав таблицу, можно сделать вывод что ЯП Python, PHP, C#, Java и С++ самые популярные и уникальные в своём роде языки. Рассмотрим их историю и функции более подробно в следующей главе.
ГЛАВА 2. Виды современных языков программирования
Рассмотрим самые популярные современные языки программирования, а некоторые из них более подробно.
Алгоритмический язык (язык программирования) является одним из способов написания алгоритма. ЯП строго формализован, то есть все команды написаны по определенным правилам, и отклонения от этих правил не допускаются. Например, в русском языке, разделяя элементы перечисления, можно вставить запятую (,) или точку с запятой (;). А на ЯП при написании команд нельзя изменить ни одного символа – возникает ошибка [20].
Правила написания команд на определенном языке называются синтаксисом языка. Синтаксис определяет, какая команда будет считаться действительной, а какая - нет. Например, в Basic команды CLS и FOR I = 1–10 считаются действительными, а команды CLERSCREEN и FOR I FROM 1–10 считаются недействительными.
Каждая команда, написанная на ЯП, имеет определенное значение, то есть она заставляет компьютер выполнять определенные действия. Правила, определяющие значение команд, называются семантикой языка. Например, команда CLS вызывает очистку экрана.
У каждого языка есть алфавит – набор символов, который можно использовать при написании программ на этом языке. Различные версии одного и того же языка могут незначительно отличаться в алфавитном порядке [18].
Программа, написанная на ЯП, состоит из команд (операторов), которые определяют последовательность действий. Эти действия выполняются на некоторых объектах. Объектами могут быть числа, текстовые строки, переменные и другие. Языки отличаются друг от друга набором допустимых объектов и набором операций, которые можно выполнять над этими объектами.
Программа, написанная на ЯП, является просто текстовой. Чтобы компьютер мог выполнять команды, содержащиеся в этой программе, необходимо преобразовать программу в набор удобных для компьютера инструкций, написанных в двоичном формате (в коде). Этот перевод называется трансляцией.
По способу трансляции языки делятся на [1]:
- Компиляторы
- Интерпретаторы
В компиляторах перевод всего текста программы в код выполняется немедленно и создается исполняемый файл, который может выполняться повторно.
В интерпретаторах, когда программа запускается, каждая строка последовательно переводится в код и выполняется. Затем он переводится в код, выполняется другая строка и так далее.
По уровню (особенности построения) языки делятся на [1]:
- Машинно-ориентированные (ассемблеры)
Первым важным шагом является переход на ассемблер. Очевидно, не очень заметный шаг – переход к символическому кодированию машинных команд – на самом деле имел большое значение.
Программисту больше не приходилось иметь дело со сложными методами кодирования инструкций на аппаратном уровне. Кроме того, по существу идентичные инструкции часто кодируются совершенно разными способами в зависимости от их параметров.
Также была возможность использовать макросы и метки, что также облегчало создание, изменение и отладку программ. Был даже вид переносимости – существовала возможность разработать целое семейство машин с похожей системой команд и общим для них ассемблером, без необходимости обеспечения двоичной совместимости.
В то же время переход на новый язык был чреват отрицательными подводными камнями. Стало почти невозможно использовать все виды гениальных техник, похожих на упомянутые выше.
Кроме того, впервые в истории разработки программ появились два представления программы: в исходном и скомпилированном виде.
Сначала, когда ассемблеры переводили только мнемонику в машинные коды, одно легко переводилось в другое и наоборот, но затем, с появлением таких функций, как метки и макросы, разработка стала все сложнее и сложнее. В конце эры ассемблера возможность машинного перевода в обоих направлениях была полностью потеряна. В связи с этим было разработано большое количество специальных программ разработки, которые выполняют обратные преобразования, но в большинстве случаев они могут едва разделять код и данные. Кроме того, вся логическая информация (имена переменных, метки и т. д.) теряется навсегда. В случае проблемы декомпиляции языков высокого уровня примеры удовлетворительного решения проблемы полностью изолированы.
Каждый оператор языка является мнемоническим (условным) оператором машинной команды. Конечно, каждый тип процессора имеет свой собственный набор инструкций, что означает его собственный ассемблер. Ассемблеры используются для создания драйверов, программирования различных устройств, а также для записи фрагментов программ, для которых очень важна среда выполнения. Это происходит потому, что ассемблер может написать наиболее эффективную программу [4].
- Универсальные
Иногда они делятся на процедурные и объектно-ориентированные, но на данный момент граница между этими видами размыта. Эти языки чаще всего используются для решения самых разных задач. И хотя каждый из этих языков имеет свои особенности, что делает его наиболее эффективным для решения определенного типа проблемы, в принципе, любой язык программирования может быть выбран для решения любой проблемы.
2.1. С++
C ++ сочетает в себе свойства языков высокого и низкого уровня. По сравнению со своим предшественником, языком Си, наибольшее внимание уделяется поддержке объектно-ориентированного и обобщенного программирования.
C ++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. В его сферу входит создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов и игр. Существует множество реализаций языка C ++, как бесплатных, так и коммерческих, и для различных платформ. Например, на платформе x86 это GCC, Visual C ++, Intel C ++ Compiler, Embarcadero (Borland) C ++ Builder и другие. C ++ оказал огромное влияние на другие языки программирования, в основном Java и C #.
Синтаксис C ++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Многие программы, которые могут быть успешно переведены как компиляторами C, так и компиляторами C ++. Они довольно большие, но не содержат все возможные программы на C [22].
Достоинства и недостатки
Достоинства
- C++ содержит средства разработки программ контролируемой эффективности для широкого спектра задач, от низкоуровневых утилит и драйверов до весьма сложных программных комплексов. В частности:
- Высокая совместимость с языком Си: код на Си может быть с минимальными переделками скомпилирован компилятором C++. Внешне языковой интерфейс является прозрачным, так что библиотеки на Си могут вызываться из C++ без дополнительных затрат, и более того — при определённых ограничениях код на C++ может экспортироваться внешне не отличимо от кода на Си (конструкция extern "C").
- Как следствие предыдущего пункта — вычислительная производительность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Один из базовых принципов C++ — «не платишь за то, что не используешь» (см. Философия C++) — то есть ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования. Имеется возможность работы с памятью на низком уровне.
- Поддержка различных стилей программирования: традиционное императивное программирование (структурное, объектно-ориентированное), обобщённое программирование, функциональное программирование, порождающее метапрограммирование.
- Автоматический вызов деструкторов объектов в адекватном порядке (обратном вызову конструкторов) упрощает и повышает надёжность управления памятью и другими ресурсами (открытыми файлами, сетевыми соединениями, соединениями с базами данных и т. п.).
- Перегрузка операторов позволяет кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
- Имеется возможность управления константностью объектов (модификаторы const, mutable, volatile). Использование константных объектов повышает надёжность и служит подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять выбор метода в зависимости цели вызова (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при виде извне кода, использующего кэши и ленивые вычисления.
- Шаблоны C++ дают возможность построения обобщённых контейнеров и алгоритмов для разных типов данных. Попутно шаблоны дают возможность производить вычисления на этапе компиляции.
- Возможность встраивания предметно-ориентированных языков программирования в основной код. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.
- Доступность. Для C++ существует огромное количество учебной литературы, переведённой на всевозможные языки. Язык имеет высокий порог вхождения, но среди всех языков такого рода обладает наиболее широкими возможностями.
Недостатки
К числу обычно упоминаемых недостатков языка можно отнести:
- Отсутствие системы модулей. C++ унаследовал от Си подключение заголовочных файлов с помощью препроцессора. Это вынуждает дублировать описания объектов, порождает неочевидные требования к коду (см. правило одного определения) и увеличивает объём компилируемого текста, а значит и время компиляции.
- Наличие более чем одного механизма для выполнения одних и тех же задач, что усложняет язык и приводит к неоптимальному и небезопасному кодированию.
- Унаследованные от Си опасные и провоцирующие ошибки возможности (макроопределения, адресная арифметика, неявное приведение типов, возможность прямого управления распределением памяти).
- Отсутствие встроенных механизмов статической валидации времени жизни объектов, приводящее к внезапному краху программ из-за обращения к уничтоженной переменной, или из-за неправильной многопоточной работы с объектами.
- Шаблоны порождают объёмный и не всегда оптимальный код. Частичное определение шаблонов усложняет как сам язык, так и программы, где он используется.
- Множественное (в том числе виртуальное) наследование приводит к созданию громоздких иерархий классов, которые при любом изменении требований к программе могут потребовать серьёзного пересмотра.
- Сложный синтаксис и объёмная спецификация языка затрудняют его изучение.
- Язык не поощряет создание надёжного, легко читаемого и удобного в сопровождении кода, вместо этого зачастую предлагая выбор между короткими и простыми, но опасными средствами, унаследованными от Си, и новыми, объёмными и сложными, но более безопасными механизмами.
- Сложная и постоянно разрастающаяся стандартная библиотека, затрудняющая изучение языка.
2.2. С# (Sharp)
C # принадлежит к семейству языков с C-подобным синтаксисом, который наиболее близок к C ++ и Java. Язык имеет статистическую типизацию, поддерживает полиморфизмы, перегрузку операторов (включая явные и неявные операторы преобразования типов), делегаты, атрибуты, события, свойства, обобщенные типы и методы, итераторы, анонимные функции с поддержкой закрытия, LINQ, исключения, комментарии в формат XML [5].
Если вы изучили много предыдущих языков C ++, Delphi, Module, Smalltalk и особенно Java, то с C #, вы исключите некоторые модели, которые оказались проблематичными при разработке программных систем, например, в отличие от C ++, C # не поддерживает множественное наследование классов (между тем, множественное наследование интерфейсов разрешено).
C # был разработан как язык программирования прикладного уровня для CLR и, как таковой, зависит в первую очередь от возможностей самого CLR. Это в основном относится к системе типов C #, которая отражает BCL. Наличие или отсутствие определенных выразительных характеристик языка продиктовано возможностью перевода конкретной языковой характеристики в соответствующие конструкции CLR. Таким образом, с развитием CLR с версии 1.1 до 2.0, сам C # значительно вырос.
Существует несколько реализаций C# [5]:
- Реализация C# в виде компилятора csc.exe включена в состав .NET Framework (включая .NET Micro Framework, .NET Compact Framework и его реализации под Silverlight и Windows Phone 7).
- В составе проекта Rotor (Shared Source Common Language Infrastructure) компании Microsoft.
- Проект Mono включает в себя реализацию C# с открытым исходным кодом.
- Проект DotGNU также включает компилятор C# с открытым кодом.
- DotNetAnywhere[21] — ориентированная на встраиваемые системы реализация CLR, поддерживает практически всю спецификацию C# 2.0.
2.3. Python
Python – это язык программирования высокого уровня, который выводит детей на вершину обучения благодаря его интерпретируемости, простому синтаксису и широте применения.
Язык имеет четкий и согласованный синтаксис, взвешенную модульность и масштабируемость, которые облегчают чтение исходного кода программ, написанных на Python.
Дизайн языка Python основан на модели объектно-ориентированного программирования. Реализация ООП в Python элегантна, мощна и хорошо разработана, но в то же время довольно специфична по сравнению с другими объектно-ориентированными языками.
Возможности и особенности языка [8]:
- Классы являются одновременно объектами со всеми нижеприведёнными возможностями.
- Наследование, в том числе множественное.
- Полиморфизм (все функции виртуальные).
- Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
- Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
- Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
- Свойства (имитация поля с помощью функций).
- Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
- Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)
- Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
- Полная интроспекция.
- Классовые и статические методы, классовые поля.
- Классы, вложенные в функции и классы.