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

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

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

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

Добавлен: 25.04.2023

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

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

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

Опять же, точно так же как и Си не является в чистом виде языком программирования высокого уровня (из за того, что позволяет выполнить слишком много возможностей), C++, строго говоря, не является объектно ориентированным языком программирования. Мешают этому такие его особенности, как наличие виртуальных функций (потому что при разговоре о полиморфизме никто никогда не оговаривает того, что некоторые методы будут участвовать в нем, а некоторые — нет), присутствие до сих пор функции main() и т.п. Кроме того, в C++ нет таких сущностей, как, например, метаклассы (хотя они, наверное, не так уж сильно и нужны) и интерфейсы (вместо них используется множественное наследование). Тем не менее, C++ на текущий момент один из самых популярных (если не самый популярный) язык программирования. Не смотря на все его недостатки, он позволяет в итоге написать программу с использованием объектно ориентированных подходов (а программы, которые этого требуют, обычно очень большие) и при этом достаточно «быструю». Этому способствует именно наличие виртуальных функций (т.е., то, что программист сам разделяет еще во время проектирования, где ему понадобится полиморфизм, а где будет достаточно объединить некоторые функции в группу по некоторому признаку), обязательное наличие оптимизатора и прочее. Все это позволяет при грамотном использовании написать работающую программу. Правда, достаточно часто встречаются примеры неграмотного использования, в результате чего выбор C++ для реализации проекта превращается в пытку для программистов и руководства.

Основное отличие C++, когда он только зарождался, была явная поддержка объектно ориентированного подхода к программированию. Надо понимать, что программировать с использованием ООП и ООА можно где угодно, даже если инструментарий явно его не поддерживает; в качестве примера можно взять библиотеку пользовательского интерфейса GTK+, которая написана на «чистом» Си и использованием принципов объектно- ориентированного «дизайна». Введение в язык программирования средств для поддержки ООП означает то, что на стадии компиляции (а не на стадии выполнения программы) будет производиться проверка совместимости типов, наличия методов и т.п. Это достаточно удобно.

Важной вехой в развитии программирования явилось создание и широкое распространение языка С++. Этот язык, сохранив средства ставшего общепризнанным стандартом для написания системных и прикладных программ языка Си (процедурно ориентированный язык), ввел в практику программирования возможности нового технологического подхода к разработке программного обеспечения, получившего название «объектно ориентированное программирование». [4]


2.1 Структура языка С++

Структура языка С++ показана на рисунке 2.

Рисунок 2. Структура языка С++

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

В следующей части рисунка представлены средства языка – операторы, предназначенные для:

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

Далее на рисунке представлены модули – относительно самостоятельные фрагменты программы для функционально законченной обработки данных, оформленные в виде функций.

В следующей части рисунка представлены средства и механизмы объектно-ориентированного программирования. Представлен новый тип данных, объединяющий данные и функции их обрабатывающие в единое целое – объект.

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

2.2 Достоинства и недостатки

С++ - это мощный язык, который содержит средства для создания эффективных программ почти любого назначения, от утилит до драйверов низкого уровня до сложных программных комплексов. Достоинствами такого языка является:

  1. Поддержка различных стилей и технологий программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы);
  2. Пользовательские функции-операторы, позволяющие кратко и емко записывать выражения над пользовательскими типами в естественной алгебраической форме;
  3. Используя шаблоны, возможно создание обобщённых контейнеров и алгоритмов для разных типов данных, а также специализировать и вычислять на этапе компиляции;
  4. Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов. Это упрощает (достаточно объявить переменную) и делает более надёжным освобождение ресурсов (память, файлы, семафоры и т. п.), а также позволяет гарантированно выполнять переходы состояний программы, не обязательно связанные с освобождением ресурсов (например, запись в журнал);
  5. Высокая совместимость с языком Си, позволяющая использовать весь существующий Си-код (код на Си может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на Си, обычно могут быть вызваны из C++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на Си, вызывать код, написанный на С++);
  6. Возможность работы на низком уровне с памятью, адресами.

Часть недостатков C++ достались по наследству от его предка – Си. Возможно, они вызваны из-за большей совместимости Си. Это такие недостатки как:

  1. Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращения значений. В сочетании с обилием операций это позволяет, хотя и не обязывает, создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков Си и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль;
  2. Синтаксис, провоцирующий ошибки;
  3. Препроцессор, унаследованный от Си, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme и Nemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы Си/C++);
  4. C++ позволяет пропускать break в ветви оператора switch с целью последовательного выполнения нескольких ветвей. Такой же подход принят в языке Java. Есть мнение, что это затрудняет понимание кода. Например, в языке C# необходимо всегда писать либо break, либо использовать goto case N для явного указания порядка выполнения.

Собственными недостатками языка С++ являются:

  1. Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования, выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Менее распространённые языки Lisp/Scheme, Nemerle имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования;
  2. Явная поддержка функционального программирования присутствует только в будущем стандарте c++0x. Данный пробел устраняется различными библиотеками (Loki, Boost), использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования. [9]

2.3 История, развитие и особенности

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

Название C++ происходит от языка программирования C, в котором унарный оператор ++ обозначает увеличение значения переменной на 1. Сначала этот язык носил имя С с классами, затем стал называться C++. После буквы С добавлено именно два плюса, потому что один образует синтаксическую ошибку в языке С, а также это имя уже было занято.

С++ возник в начале 1980-х годов. Бьёрн Страуструп, сотрудник фирмы Bell Laboratories, усовершенствовал язык С под свои нужды. То есть, изначально создание нового языка он не планировал. Но в конце 70-х годов программист начал работать над задачами теории очередей (в моделировании телефонных вызовов), он обнаружил, что попытки применения действующих тогда языков моделирования, таких, как Симула и BCPL, оказываются неэффективными, а применение высокоэффективных машинных языков слишком сложно. Так, язык Симула имеет полезные для разработки большого программного обеспечения возможности, но все работает чересчур медленно, а язык BCPL достаточно быстр, но сильно близок к низкоуровневым языкам, он не подходит для разработки больших программ.

По объяснению Страуструпа, для создания нового языка программирования самой лучшей основой послужил язык С, так как он универсален, прост, переносим, быстр и функционален в исполнении многих задач, стыкуется со средой программирования UNIX. Страуструп добавил к С возможность работы с типами данных (классами) и объектами. Благодаря быстродействию С практические задачи моделирования оказались доступными для решения по времени разработки и вычислений. В первую очередь в C были добавлены типы данных, их наследование, проверка типов и аргументы по умолчанию. Первые версии языка, изначально называвшегося Си с классами, стали доступны с 1980 года. Затем Страуструп создал компилятор cfront, который перерабатывал код С++ в код простого С, что позволило сразу применять его на практике.


Язык стал невероятно популярен. К 1983 году в него были добавлены различные константы, виртуальные функции, ссылки, перегрузка функций и операторов, контроль пользователя над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев. В 1985 году вышло издание Языка программирования C++, это было первое описание языка, что из-за отсутствия официального стандарта было очень важно. В 1989 году состоялся выход второй версии C с новыми возможностями наследования, функциями и классами. В 1998 году был утвержден международный стандарт языка C++. Он является свободным, никто не обладает правом на владение им.

Стандарт C++ состоит из двух основных частей: описание стандартного сборника подпрограмм или объектов, используемых для разработки программ, и описание ядра языка. Кроме того, существует огромное количество нестандартных библиотек C++. В программах на C++ можно использовать многие библиотеки C.

Нововведениями C++ в сравнении с C являются:

  • поддержка объектно-ориентированного программирования;
  • поддержка обобщённого программирования;
  • новые типы данных;
  • исключения реакции программы на ошибки;
  • пространства имён (хранилища для группировки уникальных идентификаторов);
  • встраиваемые функции;
  • перегрузка операторов (существования в одной области видимости нескольких различных вариантов применения оператора);
  • перегрузка имён функций;
  • ссылки и операторы управления свободно распределяемой памятью;
  • дополнения к стандартной библиотеке.

Также часто сравниваются Java и C++ как языки, которые унаследовали синтаксис Си, несмотря на большие различия на всех уровнях. Java используется в конкретном секторе промышленности: безопасный язык с низким порогом вхождения для разработки прикладных приложений широкого рынка с высокими показателями адаптации к другой среде. С++ претендует на универсальное применение во всех задачах для всех категорий программистов, но не удовлетворяет в полной мере требованиям ни одной из заявленных сфер применимости. Базовая библиотека С++ в сравнении с Java имеет меньше ресурсов, но предоставляет свободу выбора сторонних библиотек.

Дальнейшее развитие языка будет идти путем дополнения в существующие стандартные библиотеки. Планом развития С++ на будущее является расширение обобщенного программирования. [7]

Глава 3 Язык программирования Java