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

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

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

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

Добавлен: 01.04.2023

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

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

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

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

История возникновения и развития языка программирования Java.

Java - строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретённой компанией Oracle). Разработка ведётся сообществом, организованным через Java Community Process, язык и основные реализующие его технологии распространяются по лицензии GPL. Права на торговую марку принадлежат корпорации Oracle.

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

История создания Java. Изначально язык назывался Oak («Дуб»), разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, вскоре Oak был переименован в Java. Назван в честь марки кофе Java, которая, в свою очередь, получила наименование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с аллюзией на кофе-машину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось.

В результате работы проекта мир увидел принципиально новое устройство, которое опередило своё время более чем на 10 лет. Устройство получило название Star7, но из-за большой стоимости в 50 долларов не смогло произвести переворот в мире технологии и постепенно забылось.


Star7 не пользовался популярностью в отличии от языка программирования Java и его окружения. Следующим этапом жизни языка стала разработка интерактивного телевидения. В 1994 году стало очевидным, что интерактивное телевидение было ошибкой.

С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же определённое распространение получила технология Java-апплетов - графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко.

Что касается основных особенностей языка, то программы на Java транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) - программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

Достоинством подобного способа выполнения программ является полная независимость байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание.

Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:

- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,

- обширное использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,

- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами архитектуры ARM).

По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10-30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией Google, согласно которому отмечается существенно более низкая производительность и большее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на C++.


Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы NET компанией Microsoft.

Разработка Java началась в 1990 году, первая официальная версия - Java 1.0, - была выпущена только 21 января 1996 года, а последняя Java SE 11, дата релиза которой - 25 сентября 2018 года.

Классификация платформ Java. Внутри Java существует несколько основных семейств технологий:

- Java SE - Java Standard Edition, основное издание Java, содержит компиляторы, API, Java Runtime Environment; подходит для создания пользовательских приложений, в первую очередь - для настольных систем.

- Java EE - Java Enterprise Edition, представляет собой набор спецификаций для создания программного обеспечения уровня предприятия. В 2017-м проект Java EE был передан Eclipse Foundation, после чего был переименован в Jakarta EE. Модули Java EE удалены из Java SE, начиная с 11-й версии.

- Java ME - Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например, в мобильных телефонах, КПК, встроенных системах;

- Java Card - технология предоставляет безопасную среду для приложений, работающих на смарт-картах и других устройствах с очень ограниченным объёмом памяти и возможностями обработки.

Сходства и различия между языками. Особенности.

О некоторых вещах из этой статьи говорилось выше, но сейчас мы рассмотрим сходства и различия, достоинства и недостатки трёх языков программирования, а поэтому избежать повторов совсем не удастся. Итак, несмотря на то, что большая часть кода C будет справедлива и для C++, C++ не является надмножеством C и не включает его в себя. Существует и такой верный для C код, который неверен для C++. Существуют и другие различия. Например, C++ не разрешает вызывать функцию main() внутри программы, в то время как в C это действие правомерно. Кроме того, C++ более строг в некоторых вопросах; например, он не допускает неявное приведение типов между несвязанными типами указателей и не разрешает использовать функции, которые ещё не объявлены.

Оригинальный Си продолжает развиваться и использоваться, и не только при сопровождении старого кода, но и в новых разработках. На Си разрабатываются не только программы управления оборудованием и драйвера, но и многие масштабные и сложные проекты, например, он является основным языком разработки операционных систем, на нём написаны игровые движки многих динамических игр, большое число прикладных приложений. Ряд специалистов высказывается за отказ от C++ в пользу Си. Они утверждают, что замена Си на C++ не повышает эффективность разработки, но приводит к ненужному усложнению проекта, снижению надёжности и увеличению затрат на сопровождение. В частности, по мнению Линуса Торвальдса, «C++ провоцирует на написание в дополнение к структурам и функциям Си значительного объёма кода, не имеющего принципиального значения с точки зрения функциональности программы».


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

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

Использование STL создаёт (помимо общих проблем шаблонов C++) множество проблем: она сложна, не всегда стабильна, ограничивает программиста предоставляемой реализацией, которая не всегда оптимальна для конкретной задачи. Многие её алгоритмы требуют описания для пользовательских типов нескольких конструкторов и переопределения операторов, что ещё больше раздувает код. При этом на Си доступны реализации структур и алгоритмов, предоставляемых STL.

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

Автоматизация управления памятью C++ (RAII, «умные указатели», сокрытие операций с памятью внутри библиотечных шаблонов) приводит к порождению приложений, гораздо более требовательных к памяти и скрывающих некоторые важные детали поведения кода. Низкоуровневое управление памятью в Си сложнее, но эффективнее и более предсказуемо.

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

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

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


Квалифицированных программистов на Си существенно больше, чем на C++.

Нет убедительных данных о преимуществе C++ перед Си ни по производительности программистов, ни по свойствам программ. Хотя есть исследования утверждающие, что программисты на Си тратят 30 % - 40 % общего времени разработки (не считая отладки) на управление памятью, при сопоставлении общей производительности разработчиков Си и C++ оказываются близки.

В задачах низкоуровневого программирования, особенно при ограниченных ресурсах и повышенных требованиях к надёжности, быстродействию и времени отклика, значительная часть новых возможностей C++ оказывается неприменимой из-за увеличения накладных расходов. Так, виртуальные функции требуют динамического вычисления реального адреса (RVA), шаблоны приводят к раздуванию кода и ухудшению возможностей оптимизации, библиотека времени исполнения (RTL) очень велика, а отказ от неё приведёт к отказу от большинства возможностей C++ (хотя бы из-за недоступности операций new/delete). В результате программисту придётся ограничиться функционалом, унаследованным от Си, что делает бессмысленным применение C++. Линус Торвальдс, говоря о выборе между C++ и Си, в низкоуровневых задачах замечает: «… единственный способ иметь хороший, эффективный, низкоуровневый и портируемый C++ сводится к тому, чтобы ограничиться всеми теми вещами, которые элементарно доступны в Си. А ограничение проекта рамками Си будет означать, что люди его не выкинут, и что будет доступно множество программистов, действительно хорошо понимающих низкоуровневые особенности и не отказывающихся от них из-за идиотской ерунды про «объектные модели»», «… когда эффективность является первостепенным требованием, «преимущества» C++ будут огромной ошибкой».

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

- Высокая совместимость с языком Си: код на Си может быть с минимальными переделками скомпилирован компилятором C++. Внешнеязыковой интерфейс является прозрачным, так что библиотеки на Си могут вызываться из C++ без дополнительных затрат, и более того - при определённых ограничениях код на C++ может экспортироваться внешне не отличимо от кода на Си (конструкция extern "C").

- Как следствие предыдущего пункта - вычислительная производительность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Один из базовых принципов C++ - «не платишь за то, что не используешь» - то есть ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования. Имеется возможность работы с памятью на низком уровне.