Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

История возникновения и развития языка программирования Си (С++) и Java(История и характеристика Java )

Содержание:

Введение

Актуальность. В настоящее время C++ является одним из самых популярных языков программирования. С++ использовался в следующих проектах: MS Windows, SQL Server, DirectX, Edge и Office, KDE, Qt, MySQL, Opera, Adobe Photoshop, Facebook, Google Chrome, Blender, Inkscape, LibreOffice, Firefox, VLC, 7-ZIP, Stellarium и очень многих других (с большой долей вероятности, во всех крупных и значимых проектах).

На сегодняшний момент язык Java является одним из самых распространенных и популярных языков программирования. Первая версия языка появилась еще в 1996 году в недрах компании Sun Microsystems, впоследствии поглощенной компанией Oracle. Java задумывался как универсальный язык программирования, который можно применять для различного рода задач. И к настоящему времени язык Java проделал большой путь, было издано множество различных версий. Текущей версией является Java 10, которая вышла в марте 2018 года.

А Java превратилась из просто универсального языка в целую платформу и экосистему, которая объединяет различные технологии, используемые в целого ряда задач: от создания десктопных приложений до написания крупных веб-порталов и сервисов. Кроме того, язык Java активно применяется для создания программного обеспечения для целого ряда устройств: обычных ПК, планшетов, смартфонов и мобильных телефонов и даже бытовой техники. Достаточно вспомнить популярность мобильной ОС Android, большинство программ для которой пишутся именно на Java.

Цель работы – изучить историю возникновения и развития языка программирования Си (С++) и Java.

Достижение указанной цели определило постановку и решение следующих задач:

  • исследовать историю и характеристику Java;
  • изучить историю и основные особенности С++;
  • провести сравнение языков программирования Java и C++.

Предметом исследования можно назвать два языка программирования: C++ и Java.

Объектом исследования являются языки программирования Java и C++.

Теоретико-методологическую основу исследования составили научные труды, посвященные анализу языков программирования. При разработке и решении поставленных задач использовались методы сравнительного анализа, а также группировки.

Структура работы. Работа включает введение, две главы, заключение и список литературы.

Научно-методической основой работы служат труды отечественных и зарубежных ученых в области программирования. При выполнении работы использовалась научно-методическая литература, публикации в периодической печати и научных изданиях, материалы Интернет-порталов.

Глава 1. История и характеристика Java

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

Java - полностью объектно-ориентированный язык программирования. В Java отсутствует понятие процедур. С помощью Java мы можем решить различные задачи и тот же самый круг проблем, что и на других языках программирования. Java может использоваться для создания двух типов программ: Приложений и Апплетов[1].

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

 JAVA- это название языка программирования, который активно используется с 90-х годов прошлого столетия. Несмотря на то, что этот язык является открытым, т.е. его может свободно использовать каждый, на данный момент им владеет и его поддерживает компания Oracle Corporation. Java разрабатывался как язык программирования, который будет использоваться на любых устройствах, в результате на данном языке пишутся программы для компьютеров, смартфонов и даже телевизоров с технологией СМАРТ-ТВ.

Java очень популярный в финансовой и банковской индустрии. В первую очередь благодаря своей скорости работы и уровня безопасности. Java разработчики очень ценятся на рынке труда из-за дефицита. Этот язык программирования достаточно сложный для изучения и для новичков не всегда дается легко. Кроме всего прочего, приложения Android разрабатываются именно на Java. Это основная причина столь значительной популярности этого языка.

Java - это интерпретируемый и компилированный язык программирования. Исходный текст (файлы с расширением a Java) откомпилирован со справкой компилятора Java (javac), который преобразовывает исходный текст в байт-код (файлы с расширением a.class).

JAVA – это объектно-ориентированный язык программирования, разработанный Джеймсом Ослингом и запущен в 1995 году в качестве одного из ключевых компонентов платформы JAVA Sun Microsystems.

Cинтаксис языка взят у большинства из языка программирования С ++ и С, о том JAVA имеет более простую объективную модель и более низкий уровень объектов. JAVA – приложения как правило транслированы в байт-код (длина каждого кода операции – один байт). Который может быть обработан любимой виртуальной машиной JAVA (Java Virtual Mashine. JVM) независимо от компьютерной архитектуры.

Первоначально реализация ссылок на компиляторы JAVA, виртуальных машин и библиотек классов, была представлена ​​компанией Sun в 1995 году. В мае 1997 года вместе с JAVA Communitz Process Sun разработала технологию JAVA согласно GNU General Public License. Другие компании также искали альтернативы технологии предложенной Sun как GNU Compiler для JAVA и GNU Classpath.

Цель проектировщиков Java состояла в том, чтобы разработать язык, посредством которого программист мог записать код, который мог бы выполняться всегда, в любое время. 

История создания языка Java начинается в июне 1991 года, когда Джеймс Гослинг создал проект для использования в одном из своих многочисленных сет-топ проектов. Язык, который рос вне офиса Гослинга, как дуб, Oak - первоначальное название Java до 1995 года, после в дальнейшем история Java продолжалась под именем Green, а позже был переименован как Java.

Но официальной датой создания языка Java считается 23 мая 1995 года, после выпуска компанией Sun первой реализации Java 1.0. Она гарантировала «Напиши один раз, запускай везде», обеспечивая недорогой стоимостью на популярных платформах[2].

Джеймс Гослинг начал разрабатывать проект языка программирования JAVA в июле 1991 года, для использования его в одном из своих многочисленных проектов set – top box. Язык сначала называлась (Oak) “Дуб” в честь дуба, который рос перед офисом Гослинга, но в конце выбор был остановлен на JAVA, название было выбрано из списка случайным образом.

Гослинг решил предложить в дополнение к виртуальной машины, которая будет иметь стиль С С++. Sun выпустила свой продукт под именем JAVA 1.0. Девиз звучал (пишешь один раз запускаешь везде). Следует отметить и настроенную безопасность, которая позволяет использовать границу на уровне файлов доступа.

Большинство веб-браузеров владели возможностью запускать JAVA- апплеты (программные компонеты в двоичном коде выполняемых в окне браузера) на веб-страницах. Благодаря всему этому JAVA в очень короткое время стала очень популярным языком програмирования.

В декабре 1998 года появилась JAVA 2. Новая версия предлагала большинство конфигураций, созданных специально для различных типов платформ, например JDEE приложение типа enterprise в то время как stripped + down Sun МЭ был придуман для мобильных платформ. 

Sun переиминувала новые версии JD2 следующим образом: JAVA EE; JAVA ME; JAVA SE;  

JAVA остается стандартом, которым руководствуется JAVA Community Process (процесс, который позволяет заинтересованным лицами принимать участие в формировании будущих спецификаций JAVA). Sun предложила большинство частей JAVA бесплатно, независимо на статус владельца программного обеспечения. Доходы от JAVA поступают за счет продажи спецализированных продуктов, таких как Enterprise Java System[3].

13 ноября 2006 Sun запустила несколько программ JAVA в виде программного обеспечения, с открытым исходным кодом под лицензией GNU General Public License (лицензия на свободное программное обеспечение) [4].

8 мая 2008 Sun завершила процесс, который сделал пригодным для использования все коды ядра JAVA, с условием розширения свободного программного обеспечения с открытым кодом, кроме небольшой части кода, на которую Sun расширяет свои права.[5]

Разрабатывая язык специалисты руководствовались пятью задачами, которые были преобразованы в следующие принципы. 

⇒ простота в использовании, объектная ориентированность и легкость изучения

⇒ надежность и безопасность 

⇒ независимость от архитектуры 

⇒ возможность интерпретации 

⇒ интерактивность и динамичность

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

Главная их особенность – это обеспечение, несмотря на платформу, большого спектра модулей с системными интерфейсами. Стоит также отметить, что такая платформа обладает отличной безопасностью, потому подходит для любого сетевого окружения. У нее нейтральная архитектура, и это особо привлекательно для создания разных сетевых модулей. Итак, с использованием интерпретируемого и динамичного языка Java пользователь получает: Интерпретируемую среду, в которой с легкостью и быстротой создаются прототипы, не используя обычную сборку и перекомпиляцию. Среду, которую можно динамически расширить, ведь подгруздка классов проходит, когда это особо нужно и практически моментально. Отсутствие проблем с «хрупким базовым классом» ведь элементы встраиваются в память при загрузке, а не при компиляции[7].

Java является одним из самых популярных языков программирования. Как большой, так и малый бизнес переполнен софтом написанным на этом языке. Поэтому, если у вас есть идея по созданию инновационной программы для бизнеса, Java, вполне возможно, наиболее подходящий для этого язык. Тоже самое касается и разработки приложений под платформу Android, так как Java является основным языком по написанию программ среди разработчиков под операционную систему Google[8].

Большое количество популярных приложений на платформе Android, такие как Angry Birds, Temple Run и Candy Crush Saga, написаны на языке Java. Тоже самое, касается и большей части платного софта написанного для авиакомпаний, государственных и банковских учреждений[9].

1.2. Преимущества языка программирования Java в современном программировании

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

В отличии от Qt, также обладающего описываемым свойством – Java гораздо более функционален и понятен в концепции объектно-ориентированной модели. Графический интерфейс пользователя Java, позволяет ему конкурировать с другими компонентно-ориентированными языками. Используются разные платформы: Swing, Java FX, SWT[10].

Несомненный плюс Java это многопоточность. Java имеет в своей базе язык C++, что позволяет ему работать с потоками, распараллеливая приложение. Отличительной особенностью также является то, что Java оптимизирован для многопоточности – более того, обеспечивается производительность с сотнями потоков, чего не могут себе позволить остальные языки. Виртуальная машина Java предоставляет платформо-независимый способ выполнения кода, благодаря абстрагированию от различий в операционных системах и архитектурах центрального процессора[11].

Благодаря виртуальной машине обеспечивается корректная работа с целевой платформой – обработка исключений происходит не на уровне системы, а на уровне обертки для языка. Так же Java имеет открытый исходный код. Разработка языка была завершена под лицензией GPL, что предполагает доступ к исходным кодам языка, его использование и распространение. Данный ход, несомненно, привлекает множество специалистов, по аналогии с Linux (также распространяемого по GPL), что позволило Java стать двигателем многих частных проектов. К сожалению, язык Java не лишён недостатков. Одним из них является «хардкор скобок». Применение скобок для обозначения программного блока – с одной стороны достоинство (не критичность к форматированию кода), с другой минус (излишние символы и перегруженность).

На данный момент коду, написанному на Java, проблематично сохранять читабельность и стилистику – из-за артефакта, который он перенес с собой из C++, а именно – открывающие и закрывающие скобки. Альтернативой Java является его аналог – C#, притом C# перенес из Java наиболее удачные моменты и возможности. Написание кода на C# более легкое (многие функции доступны по умолчанию), более интуитивно понятное (благодаря интеллектуальной подсказке), и более правильное – благодаря умному сборщику мусора, оптимизированной типизации и подключаемости сторонних пакетов NuGet.

Итогом выходит, что ближайший аналог для Java обходит его по большинству параметров – и притом активно используется как в корпоративных, так и в частных разработках. Java произвел фурор в свое время, как и Cobol, Pascal, NoSQL, и также, как и эти языки – Java пришел из прошлой эпохи.

На текущий момент Java заимствует реализации других языков, в спешке не успевая оптимизировать и привести их к определенному программному виду – в результате у Java множество объектов для работы, притом таковые объекты или используются неправильно, или являются аналогом другого языка (примеры: коллекции, лямбда-функции, GUI-платформы).

Популярность Java объясняется просто – это банальное нежелание многих разработчиков переучиваться и изучать новые семантически правильные языки. Весь свой успех Java снискал только в самом своем начале, успешно заменив в корпоративной разработке C++ и только улучшив, корректно дополнив его[12].

Рассмотрим пример реализации элемента пользовательского интерфейса “Slider”. Перед нами стояла задача разместить на странице произвольное количество slider`ов и контролировать их состояние (получать или задавать определенные значения). Также нужна была возможность изменять внешний вид элементов ползунка (самой шкалы и рукояти). Отличительной важностью обладало соблюдение кроссбраузерности.

Для удобства и лучшей совместимости выбран браузер Internet Explorer, т.к. именно данный браузер зачастую устанавливается по умолчанию. И лишь после проверки, плагин можно конвертировать в иные популярные у пользователей браузеры, что позволит уменьшить количество случаев невозможности отображения скрипта. Так как реализуемый на html ползунок не отвечает заданным требованиям, была использована среда JavaScript для создания slider. Перед реализацией скрипта, подготавливаем css классы ползунка;

.slider {

background-image: url(gifka.gif);

background-repeat: repeat-x;

}

.knob {

position: relative;

background-image: url(gifka2.gif);

}

Данным кодом определяется фон и позиция кнопок. Вертикаль и горизонталь предполагается выполнить в одном стиле. Располагаться кнопка на slider`е будет относительно исходного места. Также определяем блочные элементы для размещения slider`ов:

<div id="sl"></div>

<div id="sl2"></div>

Чтобы не описывать каждый раз наш стиль внутри тега, выделяем стиль во внешнюю таблицу стилей, а к тегу при этом добавляем атрибут id с именем селектора. Непосредственно программный код на JavaScript класс slider`а:

function slider(elemId, sliderWidth, range1, range2, step) {

var knobWidth = 17; // ширина и высота бегунка

var knobHeight = 21; // меняется в зависимости от изображений

var sliderHeight = 21; // высота slider'а

var offsX,tmp; // вспомагательные переменные

var d = document;

var isIE = d.all || window.opera; // определяем модель DOM

var point = (sliderWidth-knobWidth-3)/(range2-range1); // point - количество пикселей на единицу значения

var slider = d.createElement('DIV'); // создаем slider

slider.id = elemId + '_slider';

slider.className = 'slider';

d.getElementById(elemId).appendChild(slider);

var knob = d.createElement('DIV'); // создаем ползунок

knob.id = elemId + '_knob';

knob.className = 'knob';

slider.appendChild(knob); // добавляем его в документ

knob.style.left = 0; // бегунок в нулевое значение

knob.style.width = knobWidth+'px';

knob.style.height = knobHeight+'px';

slider.style.width = sliderWidth+'px';

slider.style.height = sliderHeight+'px';

var sliderOffset = slider.offsetLeft; // sliderOffset - абсолютное смещение slider'а

tmp = slider.offsetParent; // от левого края в пикселях (в IE не работает)

while(tmp.tagName != 'BODY') {

sliderOffset += tmp.offsetLeft; // тут его и находим

tmp = tmp.offsetParent; } if(isIE) // в зависимости от модели DOM { // назначаем слушателей событий

knob.onmousedown = startCoord;

slider.onclick = sliderClick;

knob.onmouseup = endCoord;

slider.onmouseup = endCoord;

}

else {

knob.addEventListener("mousedown", startCoord, true);

slider.addEventListener("click", sliderClick, true);

knob.addEventListener("mouseup", endCoord, true);

slider.addEventListener("mouseup", endCoord, true);

}

// функции установки/получения значения

function setValue(x) // установка по пикселям

{

if(x < 0) knob.style.left = 0;

else if(x > sliderWidth-knobWidth-3) knob.style.left = (sliderWidth-3-knobWidth)+'px';

else {

if(step == 0) knob.style.left = x+'px';

else knob.style.left = Math.round(x/(step*point))*step*point+'px';

}

d.getElementById('info').value = getValue(); / это вывод значения примера

}

function setValue2(x) // установка по значению

{ if(x < range1 || x > range2) alert('Value is not included into a slider range!');

else setValue((x-range1)*point);

d.getElementById('info').value = getValue();

}

function getValue()

{return Math.round(parseInt(knob.style.left)/point)+range1;} //

слушатели событий

function sliderClick(e) {

var x;

if(isIE) {

if(event.srcElement != slider) return; //IE onclick bug

x = event.offsetX - Math.round(knobWidth/2);

}

else x = e.pageX-sliderOffset-knobWidth/2;

setValue(x);

}

function startCoord(e) {

if(isIE) {

offsX = event.clientX - parseInt(knob.style.left);

slider.onmousemove = mov;

}

else {

slider.addEventListener("mousemove", mov, true);

}

}

function mov(e) {

var x;

if(isIE) x = event.clientX-offsX;

else x = e.pageX-sliderOffset-knobWidth/2;

setValue(x);

}

function endCoord() {

if(isIE) slider.onmousemove = null;

else slider.removeEventListener("mousemove", mov, true); } // объявляем функции

setValue2 и getValue как методы класса

this.setValue = setValue2;

this.getValue = getValue; } // конец класса

var mysl1 = new slider('sl', 300, 0, 200, 20);

var mysl2 = new slider('sl2', 400, 100, 200, 0);

Параметры данного класса:

  • elemId – ID элемент, внутри которого размещен ползунок.
  • sliderWidth – длина ползунка, измеряемая в пикселях.
  • max- максимальное значение элемента, соответствующее крайнему правому положению ползунка.
  • min – Минимальное значение элемента, соответствующее крайнему левому положению ползунка.
  • range1, range2 – нижняя и верхняя границы значений ползунка.
  • step- шаг изменения значения ползунка. (0 – единичный шаг)

Получаем следующий результат относительно slider`:

Если в ползунке больше одной рукоятки, следует применять values, отвечающий за массив значений. Для этого следует указать (для получения и установления):

mysl1.setValue(80); // устанавливаемое значение должно попадать в диапазон slider'а mysl2.getValue();

Результатом будет отображение кнопок, при активации которых на нужном слайдере будут появляться значения, равные заданным, но следует соблюдать пропорции между длиной, диапазоном и шагом, что бы избежать нелинейных значений:

Данный плагин получил огромное распространение, благодаря своей относительной простоте и большому функционалу. Плагин Slider позволяет превращать блочные элементы, такие как div`ы, в элементы управления, которые называются ползунками. Установить нужный диапазон значений, изменение громкости, ценовые рамки, все это чаще всего реализовывается с помощью Slider`a. Однако по прошествии времени Java не предложил ничего принципиально нового – из-за вполне понятных функциональных ограничений, накладываемых на него еще более старым, но все еще мощным предком. Единственное, что сейчас удерживает Java на плаву – пресловутая кроссплатформенность, главный довод любителей Java. Однако сейчас каждый разработчик использует различные инструменты для различных задач, и использовать один инструмент, как ранее – попросту не имеет смысла.

Глава 2. История и развитие языка программирования C++

2.1.История и краткая характеристика языка программирования C++

C++ один из самых популярных языков программирования, также является ООП. Главная особенность представляет набор предопределенных классов, типы данных которых могут быть созданы несколько раз. Классы: можно дополнительно разместить членов функции для реализации определенных функций. Несколько объектов определенного класса могут быть определены для реализации функций в классе. Объекты могут быть определены как экземпляры, созданных во время выполнения. Эти классы также могут быть унаследованы от других новых классов.

Создание языка программирования Си положило начало новой эпохе программирования. Язык был разработан Деннисом Ритчи для создания операционной системы UNIX[13].

Си возник в результате начавшейся в 60-е годы революции в структурном программировании. В то время большие программы представляли собой тяжело отслеживаемый, длинный набор вызовов, возвратов, безусловных переходов, так называемый «макаронный код». Структурное программирование Си, сменив такие языки, как Алгол и Фортран, облегчило жизнь программиста. Сейчас программист — высокооплачиваемая профессия, на сайте поиска работы HeadHunter — hh.ua ежедневно публикуются сотни интересных предложений как для начинающих программистов для работы системным администратором, так и для профи — для разработки программного обеспечения[14].

В Кембриджском университете в начале 60-х годов задались целью написать язык, на котором можно было бы писать другие языки. Впоследствии к ним подсоединился Лондонский университет. Этот язык, восходящий корнями к Алголу, назвали CPL (Combine Programming Language). Язык Си явился логическим итогом этой работы и впитал многие конструкции CPL. Компилятор Си, в соответствии с традицией, заложенной Николаусом Виртом, написан на самом Си[15].

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

Другая причина того, что в 1980-е годы язык C++ превратился в самый распространенный и популярный среди языков структурного программирования, – это его емкий, но простой синтаксис. Язык C++ – это удачное сочетание эффективности, выразительности и изящества.

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

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

Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#. C++ содержит средства разработки программ контролируемой эффективности для широкого спектра задач, от низкоуровневых утилит и драйверов до весьма сложных программных комплексов[18].

Перегрузка операторов позволяет кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме. Имеется возможность управления константностью объектов (модификаторы const, mutable, volatile).

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

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

Недостатки языка С++[19]:

− Плохо продуманный синтаксис сужает спектр применимости языка (что, с учётом претензий на «универсальность», делает его крайне неудобным в некоторых задачах).

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

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

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

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

В книге «Дизайн и эволюция 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 используют специальные объекты, называемые итераторами.

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

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

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

Функциональные объекты (функторы) – конструкции, позволяющие использовать объект как функцию. Чаще всего функторы в С++ используются в качестве предикатов, псевдозамыканий или функций сравнения в алгоритмах STL, например, в for_each().

Алгоритмы STL универсальны, они могут работать с различными структурами данных – это и классы контейнеров STL, и структуры данных, определенные пользователем и удовлетворяющие требованиям выбранного алгоритма. Это достигается благодаря получению доступа к элементам контейнера посредством итераторов. Java Collections Framework (JCF) [6] – это набор связанных классов и интерфейсов, используемых для хранения и обработки данных.

В основе всех коллекций в Java лежит применение того или иного интерфейса. На вершине иерархии JCF располагаются следующие два интерфейса: Collection (позволяет определять основные методы работы с простыми наборами элементов), а также Map (предоставляет методы для работы с данными вида «ключ» – «значение»). Интерфейс Collection расширяет интерфейс Iterable, именно поэтому в Java все объекты коллекций возможно перебирать в цикле по типу for-each.

Интерфейсы и классы коллекций для создания однопоточного приложения хранятся в пакете java.util, а для создания многопоточного – java.util.concurrent. Именно поэтому перед использованием коллекций необходимо подключить данные пакеты. Схематично вся система коллекций в Java представлена на рисунке 2.

Рисунок 2. Коллекции в Java

Интерфейс List представляет собой неупорядоченную коллекцию элементов, допускающую дублирующиеся значения. Наиболее широко используемой реализацией интерфейса List является ArrayList (массив с автоматически изменяемым размером при добавлении новых элементов). Интерфейс Set является неупорядоченным множеством элементов без повторений. Реализуется с помощью HashSet, LinkedHashSet, TreeSet. Пример реализации интерфейса Set за счет TreeSet приведен на рисунке 1.

Интерфейс Queue представляет собой коллекцию, осуществляющую хранение элементов в порядке необходимом для их обработки. Одним из ключевых методов интерфейса Collection является метод Iterator<E> iterator(). Он возвращает итератор, то есть объект, реализующий интерфейс Iterator, который в свою очередь возвращает поочередно все элементы коллекции. Для того чтобы использовать итераторы в Java необходимо подключить специальный пакет java.util.Iterator. Данный интерфейс содержит следующие методы:

hasNext() (возвращает значения типа boolean в зависимости от того есть элементы в коллекции или нет);

next() (возвращает следующий элемент в коллекции);

remove() (позволяет удалить элемент, который был возвращен последним вызовом next() и многие другие).

Пример работы итераторов приведен в листингах кода рисунке 3 посредством их использования в коллекциях vector (C++) и ArrayList (Java).

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

Далее, в таблице 1, приведены особенности и различия каждого из инструментов.

Таблица 1

Основные отличия библиотеки STL в C++ и Java Collections Framework в Java

STL (C++)

JCF (Java)

Алгоритмы не зависят от контейнера, с которым они работают.

Алгоритмы организованы контейнером.

Программист, используя библиотеку STL, должен контролировать освобождение памяти.

В Java нет необходимости контролировать работу с памятью.

В STL контейнеры могут содержать указатели на объекты или сами объекты (при применении "&").

В Java коллекции всегда содержат только указатели на объекты.

В STL не используются интерфейсы.

JCF очень сильно опирается на интерфейсы.

STL использует семантику значений. Присваивание одного контейнера другому копирует всю коллекцию.

Java использует ссылочную семантику. Присваивание коллекций присваивает только ссылку.

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

В Java имеется интерфейс Iterable, который содержит один метод – iterator(). Кроме того, в Java нет итераторов, обеспечивающих произвольный доступ к элементам коллекций.

В C++ функциональный объект создаётся с помощью класса у которого перегружен operator().

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

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

Заключение

Java – это объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems (в последующем приобретенной компанией Oracle). Дата официального выпуска – 23 мая 1995 г.

Цель проектировщиков Java состояла в том, чтобы разработать язык, посредством которого программист мог записать код, который мог бы выполняться всегда, в любое время. 

Самой выдающейся чертой языка Java является то, что его приложения компилируются в специальный байт-код и выполняются в специальной виртуальной машине в любой операционной системе и на любом оборудовании. На этом языке программирования могут создаваться веб-приложения для london escort service, мобильные приложения или программы, «удобочитаемые» на любом компьютере. К уже реализованным всемирно известным проектам на Java относятся Amazon, eBay, Yandex.

C++ один из самых популярных языков программирования, также является ООП. Главная особенность представляет набор предопределенных классов, типы данных которых могут быть созданы несколько раз. Классы: можно дополнительно разместить членов функции для реализации определенных функций. Несколько объектов определенного класса могут быть определены для реализации функций в классе. Объекты могут быть определены как экземпляры, созданных во время выполнения. Эти классы также могут быть унаследованы от других новых классов.

Создание языка программирования Си положило начало новой эпохе программирования. Язык был разработан Деннисом Ритчи для создания операционной системы UNIX.

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

Список литературы

Java навсегда! 12 причин длительного доминирования Java [Электронный ресурс]. Режим доступа: https://habrahabr.ru/post/201612/. Дата обращения: 06.12.2018.

Архангельский, А. Я. C++Builder. Работа с документами Excel / А.Я. Архангельский. - М.: Бином-Пресс, 2016. - 480 c.

Боровский, А. C++ и Pascal в Kylix 3. Разработка интернет-приложений и СУБД / А. Боровский. - М.: БХВ-Петербург, 2015. - 544 c.

Взгляд изнутри. Виртуальная машина Java [Электронный ресурс]. Режим доступа: http://learn.javajoy.net/jvm-inside. Дата обращения: 06.12.2018.

Гарнаев, Андрей WEB-программирование на Java и JavaScript / Андрей Гарнаев , Сергей Гарнаев. - Москва: СПб. [и др.] : Питер, 2017. - 718 c.

Герберт Шилдт Java 8 // Полное руководство. – М.: «Вильямс», 2015. – С. 1376.

Гриффитс, Д. Изучаем программирование на C / Д. Гриффитс, Д. Гриффитс. - М.: Эксмо, 2015. - 624 c.

Гукин, Д. Для "чайников". Программирование на C / Д. Гукин. - М.: Вильямс, 2016. - 384 c.

Дейтел, П. Android для программистов: создаём приложения / П. Дейтел, Х. Дейтел, Э. Дейтел, М. Моргано. – СПб.: Питер, 2013. – 560 с.

Краткий обзор GUI-фреймворков для Java [Электронный ресурс]. Режим доступа: http://eax.me/java-swing/. Дата обращения: 01.12.2018.

Лекция 1: Общие представления о языке Java [Электронный ресурс]. – URL: http://www.intuit.ru/studies/courses/569/425/lecture/9665 (дата обращения: 06.12.2018).

Отличия Java от C++ [Электронный ресурс] // Справочник CodeNet – все для программиста. – URL: http://www.codenet.ru/ webmast/java/02.php (дата обращения: 06.12.2018).

Перри, Г. Программирование на C для начинающих / Грег Перри , Дин Миллер. - М.: Эксмо, 2015. - 368 c.

Полубенцева, М. C/C++. Процедурное программирование / М. Полубенцева. - М.: БХВ-Петербург, 2014. - 448 c.

Понамарев, В. Программирование на C++/C# в Visual Studio .NET 2003 / В. Понамарев. - М.: БХВ-Петербург, 2015. - 917 c.

Прата. С. Язык программирования C++. Лекции и упражнения / Стивен Прата. - М.: Вильямс, 2015. - 445 c.

Свободная энциклопедия. Java. [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Java. Дата обращения: 06.12.2018.

Секунов, Н. Программирование на C++ в Linux / Н. Секунов. - М.: БХВ-Петербург, 2016. - 425 c.

Хорстманн, К. С. Java. Библиотека профессионала, том 1. Основы: пер. с англ. // Кей С. Хорстманн, Гари Корнелл. – Т. 1. – 9-е изд. – М.: ООО «И.Д. Вильямс», 2014. – 684 с.

Язык программирования Java [Электронный ресурс]. – URL: http:// www.codenet.ru/webmast/java/02.php (дата обращения: 06.12.2018).

  1. Гарнаев, Андрей WEB-программирование на Java и JavaScript / Андрей Гарнаев , Сергей Гарнаев. - Москва: СПб. [и др.] : Питер, 2017. - 718 c.

  2. Дейтел, П. Android для программистов: создаём приложения / П. Дейтел, Х. Дейтел, Э. Дейтел, М. Моргано. – СПб.: Питер, 2013. – 560 с.

  3. Лекция 1: Общие представления о языке Java [Электронный ресурс]. – URL: http://www.intuit.ru/studies/courses/569/425/lecture/9665 (дата обращения: 06.12.2018).

  4. Хорстманн, К. С. Java. Библиотека профессионала, том 1. Основы: пер. с англ. // Кей С. Хорстманн, Гари Корнелл. – Т. 1. – 9-е изд. – М.: ООО «И.Д. Вильямс», 2014. – 684 с.

  5. Язык программирования Java [Электронный ресурс]. – URL: http:// www.codenet.ru/webmast/java/02.php (дата обращения: 06.12.2018).

  6. Герберт Шилдт Java 8 // Полное руководство. – М.: «Вильямс», 2015. – С. 1376.

  7. Взгляд изнутри. Виртуальная машина Java [Электронный ресурс]. Режим доступа: http://learn.javajoy.net/jvm-inside. Дата обращения: 06.12.2018.

  8. Свободная энциклопедия. Java. [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Java. Дата обращения: 06.12.2018.

  9. Java навсегда! 12 причин длительного доминирования Java [Электронный ресурс]. Режим доступа: https://habrahabr.ru/post/201612/. Дата обращения: 06.12.2018.

  10. Краткий обзор GUI-фреймворков для Java [Электронный ресурс]. Режим доступа: http://eax.me/java-swing/. Дата обращения: 01.12.2018.

  11. Взгляд изнутри. Виртуальная машина Java [Электронный ресурс]. Режим доступа: http://learn.javajoy.net/jvm-inside. Дата обращения: 01.02.2018.

  12. Свободная энциклопедия. Java. [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Java. Дата обращения: 06.12.2018.

  13.  Полубенцева, М. C/C++. Процедурное программирование / М. Полубенцева. - М.: БХВ-Петербург, 2014. - 448 c.

  14. Боровский, А. C++ и Pascal в Kylix 3. Разработка интернет-приложений и СУБД / А. Боровский. - М.: БХВ-Петербург, 2015. - 544 c.

  15. Понамарев, В. Программирование на C++/C# в Visual Studio .NET 2003 / В. Понамарев. - М.: БХВ-Петербург, 2015. - 917 c.

  16. Секунов, Н. Программирование на C++ в Linux / Н. Секунов. - М.: БХВ-Петербург, 2016. - 425 c.

  17. Архангельский, А. Я. C++Builder. Работа с документами Excel / А.Я. Архангельский. - М.: Бином-Пресс, 2016. - 480 c.

  18. Прата. С. Язык программирования C++. Лекции и упражнения / Стивен Прата. - М.: Вильямс, 2015. - 445 c.

  19. Перри, Г. Программирование на C для начинающих / Грег Перри , Дин Миллер. - М.: Эксмо, 2015. - 368 c.

  20. Отличия Java от C++ [Электронный ресурс] // Справочник CodeNet – все для программиста. – URL: http://www.codenet.ru/ webmast/java/02.php (дата обращения: 06.12.2018).

  21. Гриффитс, Д. Изучаем программирование на C / Д. Гриффитс, Д. Гриффитс. - М.: Эксмо, 2015. - 624 c.

  22. Гукин, Д. Для "чайников". Программирование на C / Д. Гукин. - М.: Вильямс, 2016. - 384 c.

  23. Белов В. Н., Ковалёв А. И., Новиков С. А. Реализация элемента пользовательского интерфейса Slider с помощью JavaScript // Современные наукоемкие технологии. 2016. № 10–2. С. 224–228.