Файл: Классификация языков программирования высокого уровня (Понятие языка программирования).pdf
Добавлен: 31.03.2023
Просмотров: 491
Скачиваний: 1
Программы в Пл/1 компилируются с помощью автоматических процедур. Язык использует многие свойства Фортрана, Алгола, Кобола. Однако он допускает не только динамическое, но и управляемое и статистическое распределения памяти.
Диалоговые языки
Появление новых технических возможностей поставило задачу перед системными программистами - создать программные средства, обеспечивающие оперативное взаимодействие человека с ЭВМ их назвали диалоговыми языками.
Эти работы велись в двух направлениях. Создавались специальные управляющие языки для обеспечения оперативного воздействия на прохождение задач, которые составлялись на любых раннее неразработанных (не диалоговых) языках. Разрабатывались также языки, которые кроме целей управления обеспечивали бы описание алгоритмов решения задач.
Необходимость обеспечения оперативного взаимодействия с пользователем потребовала сохранения в памяти ЭВМ копии исходной программы даже после получения объектной программы в машинных кодах. При внесении изменений в программу с использованием диалогового языка система программирования с помощью специальных таблиц устанавливает взаимосвязь структур исходной и объектной программ. Это позволяет осуществить требуемые редакционные изменения в объектной программе.
Бэйсик использует обозначения подобные обычным математическим выражениям. Многие операторы являются упрощенными вариантами операторов языка Фортран. Поэтому этот язык позволяет решать достаточно широкий круг задач.
Непроцедурные языки составляют группу языков, описывающих организацию данных, обрабатываемых по фиксированным алгоритмам (табличные языки и генераторы отчетов), и языков связи с операционными системами.
Позволяя четко описывать как задачу, так и необходимые для её решения действия, таблицы решений дают возможность в наглядной форме определить, какие условия должны быть выполнены прежде чем переходить к какому-либо действию. Одна таблица решений, описывающая некоторую ситуацию, содержит все возможные блок-схемы реализаций алгоритмов решения.
Снизу Вы можете увидеть таблицу 1 (которая показывает классификацию языков программирования по типам задач
|
Тип задачи |
Языки программирования |
|
Задачи искусственного интеллекта |
ЛИСП, ПРОЛОГ, Common Lisp, РЕФАЛ, Planner, QLisp |
|
Параллельные вычисления |
Fun, Apl, ML, SML, Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН |
|
Задачи вычислительной математики и физики |
Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН |
|
Разработка интерфейса, программ-оболочек, систем |
Forth, С, C++, АССЕМБЛЕР, МАКРОАССЕМБЛЕР, СИМУЛА-67,0 А К, Smalltalk, Java, РПГ |
|
Задачи вычислительного характера |
АЛГОЛ, ФОРТРАН, КОБОЛ, Ada, PL/1, БЕЙСИК, ПАСКАЛЬ |
|
Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка БД |
HTML, Perl, SQL, Informix 4GL, Natural, DDL, DSDL, SEQUEL |
Таблица 1
Глава 3. Общие ведомости и анализ языков программирования высокого уровня
Рейтинг языков программирования 2019, февраль
Тройка самых популярных языков программирования:
- Java
- C
- Python
Рейтинг Java продолжает расти: язык сохранил первое место и демонстрирует самые высокие показатели роста рейтинга — около 16%. Чуть меньший процент роста рейтинга у C — 12%, он также сохраняет второе место по сравнению со своей позицией год назад. А вот Python и C++ поменялись местами: Python переместился на третье место, хоть процент роста рейтинга у него и C++ схож — около 7,5%.
Рисунок 1. Топ-20 языков программирования
3.1 Язык C++
C++ — компилируемый, статически типизированный язык программирования общего назначения.
Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование. Язык имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.
C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также игр. Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.
Достоинства
C++ содержит средства разработки программ контролируемой эффективности для широкого спектра задач, от низкоуровневых утилит и драйверов до весьма сложных программных комплексов. В частности:
• Высокая совместимость с языком Си: код на Си может быть с минимальными переделками скомпилирован компилятором C++. Внешнеязыковой интерфейс является прозрачным, так что библиотеки на Си могут вызываться из C++ без дополнительных затрат, и более того — при определённых ограничениях код на C++ может экспортироваться внешне не отличается от кода на Си.
• Как следствие предыдущего пункта — вычислительная производительность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Один из базовых принципов C++ — «не платишь за то, что не используешь» (см. Философия C++) — то есть ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования. Имеется возможность работы с памятью на низком уровне.
• Поддержка различных стилей программирования: традиционное императивное программирование (структурное, объектно-ориентированное), обобщённое программирование, функциональное программирование, порождающее метапрограммирование.
• Автоматический вызов деструкторов объектов в адекватном порядке (обратном вызову конструкторов) упрощает и повышает надёжность управления памятью и другими ресурсами (открытыми файлами, сетевыми соединениями, соединениями с базами данных и т. п.).
• Перегрузка операторов позволяет кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
• Имеется возможность управления константностью объектов (модификаторы const, mutable, volatile). Использование константных объектов повышает надёжность и служит подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять выбор метода в зависимости цели вызова (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при виде извне кода, использующего кэши и ленивые вычисления.
• Шаблоны C++ дают возможность построения обобщённых контейнеров и алгоритмов для разных типов данных. Попутно шаблоны дают возможность производить вычисления на этапе компиляции.
• Возможность встраивания предметно-ориентированных языков программирования в основной код. Такой подход использует, например, библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.
• Доступность. Для C++ существует огромное количество учебной литературы, переведённой на всевозможные языки. Язык имеет высокий порог вхождения, но среди всех языков такого рода обладает наиболее широкими возможностями.
Недостатки
К числу обычно упоминаемых недостатков языка можно отнести:
• Отсутствие системы модулей. C++ унаследовал от Си подключение заголовочных файлов с помощью препроцессора. Это вынуждает дублировать описания объектов, порождает неочевидные требования к коду (см. правило одного определения) и увеличивает объём компилируемого текста, а значит и время компиляции.
• Наличие более чем одного механизма для выполнения одних и тех же задач, что усложняет язык и приводит к неоптимальному и небезопасному кодированию.
• Унаследованные от Си опасные и провоцирующие ошибки возможности, такие как макроопределения #define, адресная арифметика и неявное приведение типов.
• Возможность прямого управления распределением памяти провоцирует ошибки, приводящие к внезапному краху программ из-за разрушения стека или обращения к невыделенной памяти.
• Шаблоны порождают объёмный и не всегда оптимальный код. Частичное определение шаблонов усложняет как сам язык, так и программы, где оно используется.
• Объектно-ориентированная подсистема построена так, что оказывается затруднительно применять многие приёмы, обычные для других объектных языков.
• Множественное (в том числе виртуальное) наследование усложняет транслятор и приводит к созданию громоздких иерархий классов, которые при любом изменении требований к программе могут потребовать серьёзного пересмотра.
• Сложный синтаксис и объёмная спецификация языка затрудняют его изучение.
• Язык не поощряет создание надёжного, легко читаемого и удобного в сопровождении кода, вместо этого зачастую предлагая выбор между короткими и простыми, но опасными средствами, унаследованными от Си, и новыми, объёмными и сложными, но более безопасными механизмами.
• Сложная и постоянно разрастающаяся стандартная библиотека, затрудняющая изучение и дополнительно увеличивающая объём программ.
• Отсутствие или ограниченность поддержки ряда полезных технологий и методик программирования.
3.2 С++ и Java
Java не может считаться в полной мере языком, способным заменить C++, так как она принципиально непригодна для некоторых типов приложений, которые могут разрабатываться (и часто разрабатываются) на C++. Однако в области информационных систем общего назначения (учётные, бухгалтерские системы, пользовательские приложения и клиенты информационных систем), систем автоматизации бизнеса, Интернет-систем Java составляет вполне реальную конкуренцию C++. В качестве преимуществ Java обычно называют:
• Отсутствие поддержки указателей и адресной арифметики, ответственных за значительную долю ошибок в программах на C/C++.
• Автоматическая сборка мусора, значительно облегчающая управление памятью. Впрочем, нужно отметить, что эмпирическое исследование не обнаружило существенной разницы в скорости разработки на C++ и на Java.
• Наличие разработанной системы модулей и раздельной компиляции, значительно более быстрой и менее подверженной ошибкам, чем препроцессор и ручная сборка C++.
• Полная стандартизация от определения языка до деталей реализации.
• Как следствие предыдущего пункта и механизма компиляции в байт-код — реальная многоплатформенность.
• Встроенная многопоточность.
• Объектная система поддерживает единичное наследование и явно определяемые интерфейсы. Такая система позволяет обеспечить большинство преимуществ множественного наследования, не вызывая его негативных эффектов.
• Рефлексия значительно более развита, чем в C++ и позволяет реально определять и изменять структуру объектов во время работы программы.
• Встроенные средства безопасности, защищающие от распространённых ошибок программ C++, таких как переполнение буфера или выход за границы массива.
В то же время базовые архитектурные решения, такие как использование сборщика мусора и виртуальной машины, исполняющей байт-код, создаёт трудно преодолимые ограничения. Программы на Java, как правило, медленнее, требуют значительно больше памяти, к тому же виртуальная машина, обеспечивая многоплатформенность, одновременно изолирует программу от операционной системы: невозможно прямое обращение к API операционной системы и внешним библиотекам на других языках. Всё это приводит к тому, что Java малопригодна для создания низкоуровневых приложений, требующих прямого доступа к памяти и оборудованию, приложений реального времени, встроенных приложений, работающих в системах с ограниченными ресурсами.
3.3 Язык Python
Python — высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.
Python поддерживает структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное программирование. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений, высокоуровневые структуры данных. Поддерживается разбиение программ на модули, которые, в свою очередь, могут объединяться в пакеты.