Файл: История возникновения и развития языка программирования Си (С++) и Java(История и характеристика Java ).pdf

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

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

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

Добавлен: 04.04.2023

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

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

− Унаследованные от Си низкоуровневые свойства существенно тормозят и затрудняют прикладную разработку.

− Язык не содержит многих важных возможностей.

− Язык содержит опасные возможности, существенно снижающие качество программ сразу по всем показателям.

− Производительность труда программистов на языке оказывается неоправданно низка, а продукт труда – низкокачественным.

В книге «Дизайн и эволюция C++» Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++ (приводятся в сокращении):

  1. Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.
  2. Непосредственно и всесторонне поддерживать множество стилей программирования.
  3. Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.
  4. Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.
  5. Избежать разночтений между C и C++: любая конструкция, допустимая в обоих языках, должна в каждом из них обозначать одно и то же и приводить к одному и тому же поведению программы.
  6. Избегать особенностей, которые зависят от платформы или не являются универсальными.
  7. «Не платить за то, что не используется» — никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.
  8. Не требовать слишком усложнённой среды программирования.

C – это очень мощный язык программирования. Благодаря своей силе, C просто идеален, когда вам нужно получить полный контроль над создаваемой программой. Именно поэтому, большинство современных популярных операционных систем, таких как Windows, OSX и Linux, написаны именно на языке C. Почти все компьютеризированные устройства, полностью или частично, используют в своей работе язык C. От микроволновок, пультов дистанционного управления и калькуляторов до баз данных и управляющих механизмов Шаттлов — язык C настолько универсален, что используется почти повсеместно[20].

Если говорить коротко, то С++ это все тот же C, но только с большим набором опций. В то время, как оба эти языка рассматриваются, как языки программирования общего назначения, C в большей степени используется при разработке софта «более понятного для машины», такого как операционные системы, тогда как C++ применяется для более высокоуровневых приложений, таких как бухгалтерские программы и движки видео игр[21].


C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ[22].

Для больших проектов наподобие разработки веб-браузера, создания драйвера видеокарты или написания алгоритма для финансовых торгов, язык C++ является самым лучшим вариантом. Этот язык обладает таким качеством, как объектно-ориентированное программирование, что в C поддерживается с огромным трудом. Благодаря этому, для некоторых задач C++ является более подходящим нежели C, так как поможет решить одну и ту же задачу за меньшее количеств времени[23].

Движки большинства популярных сегодня компьютерных игр, таких как Call of Duty, Halo и FIFA написаны на языке С++. Также, большие анимационные студии наподобие Pixar, Disney и DreamWorks используют C++ в той или иной степени в своем анимационном софте. Благодаря своей надежности и скорости, язык C++ применяется также при разработке частных высокочастотных торговых алгоритмов, позволяющих фирмам с Wall Street продавать тысячи акций за доли секунды.

2.2. Возможности C++

C++ является одним из наиболее широко используемых языков программирования в мире. Грамотно сконструированные программы на языках C++ быстры и эффективны. Язык является более гибким, чем другие языки, поскольку его можно использовать для создания широкого спектра приложений — от интересных и ярких игр до высокопроизводительного научного программного обеспечения и драйверов устройств, внедренных приложений и клиентских приложений Windows.

Более 20 лет C++ используется для решения подобных и многих других задач. Возможно, вы не знаете, что все больше программистов С++ отказались от программирования вчерашнего дня в C-стиле и перешли к современной модели программирования С++.

Одно из начальных требований для C++ — обратная совместимость с языком C. С этого момента язык C++ эволюционировал через несколько итераций — C с классами, исходная спецификация языка C++ и множество последовательных усовершенствований. Из-за этого наследия C++ часто называют мультипарадигматическим языком программирования. В C++ доступны чисто процедурное программирование в C-стиле, которое содержит необработанные указатели, массивы, строки с конечным символом null, пользовательские структуры данных и другие компоненты, которые могут обеспечить высокую производительность или стать причиной ошибок и чрезмерной сложности кода.


Поскольку программирование в стиле языка C чревато подобными опасностями, одной из основных целей создания C++ было сделать программы безопасными, так и более простыми в написании, расширении и сопровождении. Уже на ранних этапах развития в языке C++ были полностью реализованы такие парадигмы программирования, как объектно-ориентированное программирование. С годами к этому языку были добавлены функции и стандартные библиотеки структур данных и алгоритмов, прошедшие тщательное тестирование. Именно благодаря этим дополнениям появился и существует современный стиль C++.

Современный язык C++ обеспечивает следующие возможности:

  • Область стека вместо кучи или статической глобальной области.
  • Автоматическое определение типа вместо явных имен типов.
  • Интеллектуальные указатели вместо необработанных указателей.
  • Типы std::string и std::wstring (см. <string>) вместо необработанных массивов char[].
  • Стандартная библиотека шаблонов (STL) содержит такие контейнеры как vector, list и map, а не необработанные массивы пользовательских контейнеров. См. <vector>, <list> и < map >.
  • Алгоритмы STL вместо закодированных вручную.
  • Исключения для сообщения о состояниях ошибки и их обработки.
  • Свободное от блокировок взаимодействие между потоками с помощью STL std::atomic<> (см. <atomic>) вместо других механизмов взаимодействия между потоками.
  • Встроенные лямбда-функции вместо небольших функций, реализованных отдельно.
  • Конструкции на основе диапазонов для циклов, позволяющие создавать более надежные циклы, которые работают с массивами, контейнерами STL и коллекциями Среда выполнения Windows в форме for ( for-range-declaration : expression ). Это часть базовой языковой поддержки. Для получения дополнительной информации

Сам язык C++ также развивался. Сравним следующие фрагменты кода. Этот фрагмент показывает, как обстояли дела в C++ раньше:

А этот фрагмент показывает, как та же задача решается в C++ сейчас:

В современном C++ не следует использовать операторы new и delete или явную обработку исключений, поскольку вместо этого можно использовать интеллектуальные указатели. При использовании вычета типа auto и лямбда-функции можно написать код быстрее, сделать его более сжатым и понятным. Кроме того, цикл for_each проще и удобнее в использовании, а также в меньшей степени подвержен непреднамеренным ошибкам, чем цикл for. Можно использовать для написания приложения стандартный текст и минимум строк кода. Кроме того, этот код можно сделать безопасным в отношении исключений и в отношении памяти, исключая необходимости обрабатывать выделение и освобождение или коды ошибок.


Современный C++ включает два типа полиморфизма: во время компиляции, с помощью шаблонов, и в среде выполнения, путем наследования и виртуализации. В целях повышения эффективности можно объединить два типа полиморфизма. Шаблон STL shared_ptrиспользует внутренние виртуальные методы для выполнения удалений без усилий. Однако не злоупотребляйте виртуализацией для полиморфизма, если лучше использовать шаблон. Шаблоны могут быть очень мощными.

Если вы начинаете работать с С++ после другого языка, особенно после управляемого языка, в котором большинство типов — ссылочные типы, и лишь немногие — типы значений, знайте, что классы С++ — это типы значений по умолчанию. Однако можно указывать их как ссылочные типы для получения полиморфного поведения, которое соответствует концепции объектно-ориентированного программирования.

Удобно представлять это себе так: типы значений относятся, скорее, к управлению памятью и макетом, ссылочные типы относятся, скорее, к базовым классам и виртуальным функциям для поддержки полиморфизма. По умолчанию типы значений являются копируемыми — каждый из них имеет конструктор копии и оператор присваивания копированием. При определении ссылочного типа сделайте класс недоступным для копирования, отключив конструктор копий или оператор назначения копирования и воспользовавшись виртуальным деструктором, поддерживающим полиморфизм. Типы значений также связаны с содержимым, то есть, если они копируются, необходимо предоставить два независимых значения, которые можно изменить по отдельности.

Однако ссылочные типы, скорее, связаны с идентификацией — какой это объект — и иногда из-за этого называются полиморфными типами.

C++ переживает возрождение, потому что мощность снова становится приоритетом. Языки, например Java и C#, хорошо подходят, если важна продуктивность программиста, однако как только речь заходит о мощности и производительности, становятся очевидными их ограничения. Для повышения эффективности и мощности, особенно для устройств с ограниченным оборудованием, ничто не подходит лучше, чем современный С++.

Глава 3. Особенности реализации способов хранения и обработки данных на языках Java и C++


Стандартная библиотека шаблонов (STL) [4] – это набор хорошо сконструированных, обобщенных алгоритмов, контейнеров, а также различных вспомогательных функций в С++. Данная библиотека реализована в соответствии с парадигмой обобщенного программирования.

Библиотека STL содержит пять основных компонентов:

  • алгоритмы;
  • контейнеры;
  • итераторы;
  • функциональные объекты;
  • адаптеры.

Контейнеры реализованы как шаблоны классов, что даёт возможность для работы со многими типами данных. Каждый контейнер имеет ряд своих встроенных методов. Выбирать тот или иной контейнер необходимо в зависимости от представленной задачи, поэтому необходимым условием является знание функциональности и эффективности контейнеров.

В библиотеке STL существует большое количество контейнеров, они делятся на подгруппы:

контейнеры последовательностей (массив, вектор, дек, список);

контейнеры адаптеры (стек, очередь, очередь с приоритетом), использующие объекты других классов контейнеров и предоставляющие определенный интерфейс (по умолчанию дек);

контейнеры, основанные на структурах данных (set, map и др.). Для работы с контейнерами в библиотеке необходимо воспользоваться директивой #include <T>, где под T подразумевается название контейнера.

Рассмотрим некоторые, наиболее используемые из них:

1. Vector – множество элементов, которые хранятся в массиве, увеличивающемся по мере необходимости. Пример использования контейнера vector приведен на рисунке 2 при рассмотрении итераторов.

2. Set – это контейнер, хранящий уникальные значения – ключи в отсортированном виде, что позволяет осуществлять быстрый поиск. Реализуется как сбалансированное бинарное дерево поиска. Пример работы с контейнером Set приведен рисунке 1.

3. Map – контейнер, сохраняющий пары вида «ключ» – «значение», при этом пары находятся в отсортированном виде, что позволяет осуществлять быстрый поиск. Ключи уникальны. Также реализуется как сбалансированное бинарное дерево поиска.

Рисунок 1. Листинги кода с примером использования set в C++ (STL) и Java

Для доступа к элементам контейнеров алгоритмы библиотеки STL используют специальные объекты, называемые итераторами.

Итератор— объект, который позволяет перебирать все элементы коллекции, не учитывая особенности её реализации.

В С++ существуют следующие категории итераторов:

  • итератор ввода, перемещающийся только вперед и поддерживающий исключительно чтение;
  • итератор вывода, служащий для ссылки на область памяти, куда выводятся данные;
  • однонаправленный итератор, предназначенный для прохода по элементам в одном направлении и поддерживающий как чтение, так и запись адресуемого элемента;
  • двунаправленный итератор, предназначенный для прохода по элементам в любом направлении;
  • итераторы произвольного доступа, позволяющие получить доступ к любому элементу коллекции;
  • реверсивные итераторы – итераторы, движущиеся в обратном направлении.