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

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

Содержание:

ВВЕДЕНИЕ

Если задаться вопросом, с каким языком связано начало современной эпохи программирования, ответ будет прост - с языком С. Данный язык разработал Д.Ритч в 70х прошлого столетия для компьютера PDP 11 компании DEC (Digital Equipment Corporation), где применялась ОС UNIX. В то время именно язык С, несмотря на присутствие развитых определенных языков программирования, определил направление всего будущего программирования.

Язык С++ разработали в 80е годы в Bell Laboratories. По своей сути, С++ - это расширение языка С, его главное преимущество от своего предшественника, и от языков более высшего уровня в том, что в С++ присутствует поддержка объектно-ориентированного программирования, перегруженных операций, а также наличие возможности разработать полномасштабные windows-приложения.

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

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

Цель данной работы - ознакомиться с историей возникновения и развития языков программирования С++ и Java.

В ходе поставленной цели будут решены следующие задачи:

- изучить программирование на С++: дать понятие языков программирования С и С++, их краткую историю развития и базовые понятия;

- изучить программирование Java: дать понятие языка программирования Java, его историю и базовые понятия;

- провести сравнение исследуемых языков программирования.

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

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

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

ГЛАВА 1. ПРОГРАММИРОВАНИЕ НА С++

1.1. Понятие языков программирования С и С++

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

Рассмотрим особенности данного языка.

Эффективность. Заключается в том, что программы, которые написаны на зыке С - небольшого размера с одновременно большой скоростью исполнения.

Лаконичность. Означает то, что запись алгоритма выразительная и краткая.

Компактность. Язык содержит небольшое количество встроенных средств и ключевых слов.

Мощность. Мощность применения достигается при помощи за использования большого числа библиотек.

Переносимость. Компиляторы созданы для всех ОС и аппаратных платформ, вследствие чего программу можно скомпилировать и запустить практически всюду.

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

С другой стороны, эти недостатки и дали возможность создать исполняемый код, по эффективности приближающийся к программе на языке Ассемблера. В 1981 году появляется язык С++, который многие называют “С с классами“. Автор языка - Бъярн Страуструп.

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

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

1.2. Краткая история развития языков С и С++

Язык С (по-русски произносится как «Си») был разработан сотрудником фирмы AT&T из подразделения Bell Labs Денисом Ритчи в 1972г. во время совместной работы с Кеном Томпсоном над ОС UNIX. Прообразом С послужил язык Би (B), разработанный К. Томпсоном. Также большое влияние на С имел язык BCPL, автором которого был М. Ричардсоном.

Язык С разрабатывался в основном как инструмент для системного программирования. Благодаря прекрасному сочетанию лаконичности конструкций и богатства выразительных возможностей язык С сумел найти быстрое распространение и стать одним из самых популярных языков как прикладного, так и системного программирования. Компиляторы языка С работоспособны почти на всех типах современных ПК в операционных системах Windows, Mac OS, Linux, FreeBSD, Solaris и др.

В отличие от многих языков программирования (Ада, Алгол-60 и т.д.), вступавшими в силу только после принятия соответствующих национальных и международных стандартов, язык С изначально создавался в целях применения его как рабочего инструмента, который не ставил своей задачей широкое распространение. До 1989 года на язык С стандарта не существовало, и в роли формального описания авторы компиляторов (разработчики) применяли книгу Б. Кернигана и Д. Ритчи (первое издание), которая вышла в 1978 году в США ( на русский язык она была переведена в 1985году). Роль этой книги как неформального стандарта для языка С осталась и по сей день. Не случайно во всей литературе и различной документации по компиляторам ссылка на эту работу обозначается специальным сокращением K&R.

Первый официальный стандарт языка С приняли в 1989годув Американском национальном институте стандартов (American National Standards Institute -- ANSI). Эту версию языка на практике обозначается С89. Также, данный стандарт приняла и Международная организация стандартов (International Standarts Organization -- ISO). В 1995г. стандарт С89 был незначительно изменен.

Язык С++ (по-русски читается «Си-Плюс-Плюс»)»Бьерн Страуструп. Язык программирования С++» , изд. Бином, М. - С.11-14., как развитие С, появился в 1979году. Его разработчиком стал Бьярни Страуструп, в то время он начал работать в BellLabs. Разработка и усовершенствование языка С++ вызвал от его создателя значительных усилий в течении 80-х - 90-х годов. В итоге, в 1998г. был принят ANSI/ISO-стандарт для языка С++. Если говорить общими словами, язык С++ - это объектно-ориентированная, усовершенствованная версия языка С. С++ построен на основе версии С89, которая содержала в себе все изменения 1995г., и теперь эту версию С89 называют С-подмножеством языка С++. Несмотря на то, что язык С++ задумывался как набор объектно-ориентированных расширений для языка С, впоследствии он смог развиться как самостоятельный язык программирования. Сегодня его новые средства почти в два раза увеличили объем исходного языка. Не нужно никаких доказательств, что С++ является одним из самых мощных компьютерных языков, разработанных до сих пор.

В 1999 году приняли второй ANSI/ISO - стандарт для языка С. Эта версия называется С99, включающая набор усовершенствований, а также некоторые новые средства. Одни из этих «новых» средств пришли из языка С++, а другие - представляют пользователю совершенно иные, новые возможности. Таким образом, отдельные элементы, привнесенные в С99, несовместимы с языком С++. Это значит, что с появлением версии С99 стандарт языка С больше не считается чистым подмножеством языка С++. К счастью, причина многих «несовместимостей» связана со средствами спец.назначения, которые можно легко преодолеть. В итоге, и этот вариант языка Сдает возможность создавать программы, которые будут совместимы с языком С++.

В последующие несколько лет велись работы с целью вырабатывания новых стандартов языков С и С++, завершившиеся в конце 2011года.

В октябре 2011года появился новый стандарт языка С++Джесс либерти, «Освой самостоятельно C++ за 21 день», изд. Дом «Вильямс», Москва - Санкт-Петербург - Киев, 2001. - С.14.. Его обозначение- C++11 или ISO/IEC 14882:2011. Полная его поддержка обещана в GCC 4.7.

А в декабре 2011г. принимают новый стандарт и для языка С. Эту версию условно называют С11 или ISO/IEC 9899:2011. Часть её возможностей уже сейчас поддерживается компилятором GCC.

Сегодня существует очень огромное количество С-подобных языков - языков, в основу которых лег язык С. Наиболее имеющие важность из них -- это языки C++ Бьярни Страуструпа, Java фирмы Sun и С# (читается Си-Шарп) фирмы Microsoft.

ГЛАВА 2. ПРОГРАММИРОВАНИЕ JAVA

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

Java - это язык программирования, разработанный компанией SunMicrosystems. Java - приложения обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной машине Java (JVM), независимо от самой архитектуры компьютера. Официальная дата выхода языка-23 мая 1995 года. Сегодня технология Java предоставляет инструменты для превращения статических веб-страниц в интерактивные динамические документы, а также возможность создания распределенных (независимых от платформы) приложений.

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

Гослинг, которому было чуть за 40, пришел в Sun в 1984 году из исследовательского отдела IBM. Его первая задача, проект, представляет собой интересную с технической точки зрения, но не коммерчески успешную новость оконного интерфейса. Он также написал GOSMACS, первую реализацию текстового редактора EMACS на языке C.

Благодаря деятельности в области потребительской электроники (позже ее назовут «зеленым» проектом) Гослинг и его коллеги смогли увидеть, какое значение имеют для потребителя показатели - надежность, стоимость, соответствие стандартам и простота. Если пользователи рабочих станций заинтересованы в высокой мощности и достаточно терпимы к высоким ценам, необходимости длительного обучения и наличию различных ошибок, то обычные потребители нуждаются в дешевых, простых в использовании и надежных устройствах. Чтобы иметь возможность успешно конкурировать на рынке бытовой электроники, фирмы должны воспринимать процессоры как обычный продукт, который в любой момент может быть заменен другим, более дешевым, и предоставлять возможность обеспечить обратную совместимость и соответствие стандартам, которые устанавливаются на долговременные устройства, будь то тостер или телевизор.

Принимая во внимание произношение в русском языке, мы видим, что сформировались две разные нормы этого языка - заимствованная англоязычная «джава» и традиционно-национальная «ява», что соответствует принятому произношению названия острова Ява.

Sun придерживается первого варианта-везде английское произношение. Иногда в обиходе используется и жаргонное слово «жаба» (например, изображение жабы есть на календарях группы русских Java-пользователей (JavaUsersGroup).

Java – это не только название самого языка, но и платформа для создания и выполнения приложений на его основе.

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

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

В конце 1992 года, приложив, по словам тогдашнего инженера проекта Патрика Нотона, «огромные усилия по доработке дуба и других компонентов», команда Green project выпустила «*7 «- устройство типа КПК, названное Гослингом»ручным пультом дистанционного управления».

«За полтора года мы сделали столько же, сколько другие крупные команды Sun сделали за три года», - с гордостью отмечает Нотон. - Операционная система GreenOS, язык, инструменты, пользовательский интерфейс, новая аппаратная платформа, три пользовательских чипа... и каждый этап был связан с риском, потому что мы использовали совершенно новые технологии.»

До прихода в команду Green 30-летний Нотон возглавлял проект Sun по разработке пользовательской среды OpenWindow.

Небольшие размеры устройства *7 выставляли в выгодном свете компактность и эффективность кода, составлявшего ядро технологии. Этот продукт широко демонстрировался на солнце, он смог произвести впечатление на таких важных людей, как Скотт Макнили и Билл Джой, но что с ним случилось потом, остается неизвестным.

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

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

Если у нас есть такие инструменты, как Java и Web, мы можем получить изначально организованную систему, - подчеркивает Гомслинг. «Если вы создаете клиентскую часть приложения на Java, то для ее запуска достаточно перейти на соответствующую страницу. Установка проста-достаточно разместить необходимое программное обеспечение на веб-сервере. И проблем с миграцией не будет, благодаря тому, что существует только одна версия приложения». Многие компании, по словам Гослинга, уже организуют базы данных в виде веб - страниц с использованием Common Gateway Interface (CGI) - специфического стандарта для запуска внешних программ на HTTP-сервере.

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

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

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

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

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

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

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

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

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

Принципиальная возможность:

- автоматическое управление памятью;

- расширенные возможности обработки исключений;

- богатый набор инструментов фильтрации ввода-вывода;

- набор стандартных коллекций, таких как массив, список, стек и т. д.

- простые инструменты для создания сетевых приложений (в том числе с использованием протокола RMI);

- наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;

- встроенные языковые средства для создания многопоточных приложений;

- единый доступ к базам данных:

- на уровне отдельных SQL-запросов-на основе JDBC, SQLJ;

- на уровне концепции объектов, которые имеют возможность храниться в базе данных - на основе Java Data Objects и Java Persistence API;

- поддержка шаблонов (начиная с версии 1.5);

- параллельное выполнение программ.

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

Рождению языка Java предшествовала довольно интересная история. В 1990 году разработчик программного обеспечения Sun Microsystems Патрик Нотон понял, что устал поддерживать сотни различных программных интерфейсов, используемых в компании, и сообщил исполнительному директору Sun Microsystems и своему другу Скотту Макнили о своем намерении перейти в NeXT. Макнили, в свою очередь, попросил Нотона составить список причин его недовольства и предложить решение проблем, как будто он был Богом и мог сделать все, что угодно.

Не ожидая, что кто-то обратит внимание на его письмо, Нотон изложил свои претензии, безжалостно критикуя недостатки SunMicrosystems, в частности, разрабатываемую в то время программную архитектуру. К удивлению Нотона, его письмо увенчалось успехом: оно было разослано всем ведущим инженерам SunMicrosystems, которые немедленно откликнулись и выразили свою горячую поддержку коллеге и одобрение его взглядов на ситуацию в SunMicrosystems. Обращение было одобрено высшим руководством компании, а именно Биллом Джоем, основателем SunMicrosystems, и Джеймсом Гослингом, боссом Нотона.

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

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

Команда приступила к разработке нового объектно-ориентированного языка программирования, получившего название Oak, в честь дерева, которое росло под окном Гослинга.

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

Нотон предложил использовать Oak для создания интернет-приложений. Так Oak стал самостоятельным продуктом, и вскоре были написаны Oak compiler и Oak browser «WebRunner». В 1995 году SunMicrosystems решила анонсировать новый продукт, переименовав его в Java (единственное разумное объяснение названия-любовь программистов к кофе). Когда Java попала в руки интернета, возникла необходимость запускать Java-апплеты-небольшие программы, загружаемые через Интернет. Webrunner был переименован в HotJava, а Netscape начал поддерживать Java-продукты.

2.3. Сравнение языков программирования С++ и Java

И Java, и C++ — объектно-ориентированные языки программирования, но на этом их сходства, пожалуй, заканчиваются, а вот отличий между ними достаточно много.

Начнем с основы java. Java — чистый объектно-ориентированный язык программирования; следовательно, в Java все является объектом (однокорневая иерархия, поскольку всё исходит от java.lang.Object).

В то время как в C++ не существует подобной корневой иерархии. C++ поддерживает как процедурное, так и объектно-ориентированное программирование; поэтому он называется гибридным. Ниже в таблице приведены основные характеристики этих языков и их отличия.

Таблица 1

Сравнение С++ и Java

Java

C++

Java не поддерживает указатели (pointers), шаблоны (templates), объединения (unions), перегрузку операторов (operator overloading), структур и т.д. Изначально было заявлено, что в языке Java нет никаких указателей, но многим программистам было непонятно, как можно работать без указателей, и тогда стали говорить, что их ограниченное количество. Java поддерживает так называемые «ссылки» (“references”). Ссылки имеют во многом схожую с указателями в С++ функцию, но на указателях в Java невозможно совершать арифметические действия. У ссылок есть типы, и они типобезопасны (type-safe). Их нельзя интерпретировать как адрес raw, а небезопасная конверсия запрещена.

C++ поддерживает структуры, объединения (unions), шаблоны (templates), перегрузку операторов (operator overloading), указатели (pointers) и адресную арифметику указателей (pointer aritdmetic).

Java поддерживает автоматическое управление освобождением динамической памяти. Она, в отличие от C++, не поддерживает деструкторы.

C++ поддерживает деструкторы. Эта функция автоматически активируется при уничтожении объекта.

Java не поддерживает условную компиляцию и включение.

Условное включение (#ifdef #ifndef type) – одна из основных функций C++.

Java обладает встроенной поддержкой потоков (tdreads). В Java есть класс потоков, который наследуется для создания нового потока и переопределения метода run.

C++ не имеет встроенной поддержки потоков. Для этих целей используются нестандартизированные библиотеки третьих сторон.

Java не поддерживает параметры по умолчанию. В Java нет оператора разрешения контекста (::). Определения метода должны происходить внутри класса, поэтому нет нужды в разрешении конфликта.

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

В Java нет оператора перехода «goto». Сохраняются ключевые слова «const» and «goto» несмотря на то, что они не используются.

C++ обладает оператором перехода «goto». Однако, использование оператора перехода «goto» не приветствуется.

Java не предоставляет множественное наследование, по крайней мере, не так, как C++.

C++ поддерживает множественное наследование. Для устранения неоднозначности в случае её возникновения во время множественного наследования используется ключевое слово «virtual».

Обработка исключений «exceptions» в Java отличается, поскольку деструкторы отсутствуют. К тому же в Java команды «try/catch» должны определяться в том случае, если функция указывает, что может сгенерировать исключения «exception».

В то время, как в C++ может не включать команды «try/catch» несмотря на то, что эта функция генерирует исключения.

В Java есть метод перегрузки «metdod overloading», но отсутствует перегрузка операторов «operator overloading». Класс «Stringclass» не использует операторы + и += для соединения строк «strings», а строковые выражения «Stringexpressions» используют автоматическое преобразование типов, но это особенная встроенная опция (built-in case).

C++ поддерживает как перегрузку метода, так и перегрузку оператора.

Java имеет встроенную поддержку комментариев к документации (/** ... */); поэтому исходные файлы Java могут содержать собственную документацию, которая читается отдельным инструментом, обычно Javadoc, и переформатироваться в HTML. Это упрощает ведение документации.

C++ не поддерживает комментарии к документации.

Java, по большей мере, интерпретируется, поэтому не зависит от платформы.

C++ генерирует объектный код; тот же код может не запускаться на разных платформах.

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

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

Для общего представления о том, что будет с C++ в следующем году, вкратце рассмотрим некоторые из новых функций, изменений и дополнений, которые ждут в C++ 20. От улучшенной проверки типов и сообщений об ошибках компилятора до Python-подобной обработки строк и планов по замене системы #include.

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

Ещё в C++ 11 было введено ключевое слово constexpr как дополнение к обычному объявлению const, определяющему константное выражение, которое можно вычислять во время компиляции. Это открывает множество возможностей оптимизации для компилятора, например позволяет явно заявить, что функция будет возвращать постоянное значение. Это помогает более чётко показать намерение функции, избегая потенциальных проблем в будущем.

Технически между этими двумя функциями выше нет разницы, и любая из них будет возвращать константное значение, допустимое для присваивания переменной типа const. Разница лишь в том, что функция bar() делает это в явном виде. В случае foo() это скорее побочный эффект и без полного контекста не очевидно, что возвращаемое значение функции должно быть константой. Использование constexpr устраняет любые сомнения и позволяет избежать возможных побочных эффектов, что сделает код более стабильным в долгосрочной перспективе. Сonstexpr подвергался нескольким переработкам ещё до релиза C++ 20. Особенно это касается снятия ранее существующих ограничений на использование этих переработок. Самое главное, новый стандарт позволяет использование функций типа virtual constexpr. Разработчики могут использовать try/catch внутри constexpr (при условии отсутствия исключений внутри) и менять члены внутри объединения.

Более того, std::string, std::vector, а также множество других ранее пропущенных в стандартной библиотеке функций будут полностью использовать constexpr. Если необходимо проверить, действительно ли фрагмент кода выполняется внутри определения константы, сделать это можно с помощью функции std::is_constant_evaluated(), которая возвращает соответствующее логическое значение.

Стоит обратить внимание, constexpr-код подразумевает, что он может быть вычислен во время компиляции и является допустимым константным выражением. Но это не обязательно, и нет гарантии, что вычисление произойдёт во время компиляции, оно может быть отложено на время выполнения. Это в основном важно для проведения оптимизации компилятором и не влияет на поведение программы, но также показывает, что constexpr — это в первую очередь отметка о намерении сделать функцию константной.

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

Константные выражения — не единственные изменения в C++ 20, призванные улучшить проверку времени компиляции и обеспечить стабильность.

С технической точки зрения это не совсем новая вещь, концепты (Concepts) превратились из экспериментальной функции в полноценную часть языкового стандарта. Это позволяет добавлять семантические ограничения к шаблонам и в конечном счёте делает общие всплывающие подсказки при программировании более конкретными.

В некоторой степени связанные с особенностями типа (type traits), концепты обеспечивают соответствие используемых в шаблоне данных указанному набору критериев и проверяют это в начале процесса компиляции. Например вместо проверки объекта на is_integral используется объект типа Integral. В результате, если определённое требование концепта не выполнено, компилятор может выдать короткое и значимое сообщение об ошибке вместо дампинга большого количества ошибок и предупреждений откуда-то из глубин кода шаблона, что не будет иметь особого смысла без дальнейшего копания в этом коде.

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

Некоторые базовые концепты будут предоставлены в стандартной библиотеке, и если вы не хотите ждать обновлённых компиляторов, GCC имеет экспериментальные концепты, реализованные ещё с версии 6. Вы можете включить их с помощью параметра командной строки -fconcepts. Обратите внимание, что в первоначальном проекте и текущей справочной документации имена концептов были определены по типу CamelCase, но они будут изменены на snake_case, чтобы сохранить согласованность со всеми другими стандартными идентификаторами.

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

Как и концепты, диапазоны также перешли из экспериментального состояния в стандарт языка. Диапазоны зависят от концептов и используют их для улучшения обработки старого итератора, позволяя добавлять ограничения к обработанным значениям. Помимо типов, ограничивающих значения, диапазоны воспринимают представления (Views) как особую форму диапазона, позволяющую манипулировать данными или фильтровать их, возвращая изменённую версию данных исходного диапазона в качестве ещё одного диапазона. Например, есть вектор целых чисел, и необходимо получить все чётные значения в квадрате — диапазоны и представления помогут вам в этом.

Со всеми этими изменениями компилятор окажет гораздо большую помощь при проверке типов и представит более полезные сообщения об ошибках.

Если говорить про сообщения об ошибках и про вывод в целом, библиотека libfmt в соответствии с предложением её автора будет интегрирована в языковой стандарт как std::format. Это обеспечит функциональность форматирования строк как в Python. По сравнению со всей неловкостью метода cout и тем фактом, что использование printf() в контексте C++ — это нечто неправильное, такое дополнение будет очень желанным.

Форматирование в стиле Python предлагает почти те же функции, что и printf(), только с другим синтаксисом формата строки. Оно устраняет избыточность и предлагает некоторые полезные дополнения, такие как двоичное целочисленное представление и центрированный вывод с или без символов заполнения. Самое большое преимущество — это возможность определять правила форматирования для пользовательских типов. На первый взгляд такой метод похож на __str__() в Python или toString() в Java, но при этом он также добавляет собственные типы форматирования.

В качестве примера рассмотрим strftime(). Хоть это и функция C, которая ведёт себя как snprintf(), отличие состоит в том, что она определяет пользовательские конкретные символы преобразования для своей строки формата и ожидает struct tm в качестве аргумента. Правильно реализованный std::format может быть расширен, чтобы вести себя так же, как грядущее дополнение к библиотеке std::chrono.

В C++ 20 появилась ещё одна экспериментальная функция — source_location, обеспечивающая удобный доступ к имени файла, номеру строки или имени функции из текущего контекста вызова. В сочетании с std::format это основной кандидат для реализации пользовательской функции ведения журнала и практически современная альтернатива макросам препроцессора вроде __FILE__ и __LINE__.

Постепенное исключение препроцессора является долгосрочной целью в будущем C++ (consteval заменяет макрофункции, source_location заменяет один из наиболее часто используемых макросов). Модули — новый способ разделения исходного кода, который в конечном счёте призван заменить всю систему #include.

Пока одни разработчики говорят, что давно пора внести такие изменения, другие относятся к добавлению модулей достаточно критично. Некоторые разработчики заявили о своей обеспокоенности по поводу их текущего состояния. Каково бы ни было ваше собственное мнение, можно с уверенностью сказать, что это серьёзное изменение всей сущности языка и в то же время достаточно сложное мероприятие, которое не произойдёт быстро. Если вы хотите познакомиться с модулями поближе, GCC и Clang уже в некоторой степени их поддерживают.

Это только малая часть всего списка, например Coroutines — ещё одна важная функция, которая будет добавлена в C++ 20. Но чтобы описать все изменения, потребуется ещё хотя бы одна статья. Поэтому просто перечислим их:

• новая библиотека синхронизации;

• кооперативное прерывание потоков;

• оператор <=> для трёхсторонних сравнений;

• using enum для уменьшения шума от разделении пространств имен;

• пакет дополнений к лямбда-выражениям;

• частичный отказ от volatile (части языка, важные для volatile, не изменятся).

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

Что касается Java, то это один из самых прорывных языков, который сменил популярный в 1990-х C++. С тех пор он уступил долю рынка более современным языкам. К тому же из-за громоздкости язык не совсем подходит для индустрии облачных технологий, но он остается крайне востребованным как язык приложений для бизнеса.

• Виртуальная машина Java, которая исполняет байт-код, считается произведением искусства разработчиков ПО.

• Благодаря длительному доминированию в индустрии у Java есть огромная экосистема из библиотек, фреймворков и инструментов.

• Язык продолжает развиваться, и сейчас ведется активная работа, чтобы приспособить Java для работы с облачными технологиями.

• По оценке Tiobe, последние 20 лет Java входит в тройку самых популярных языков программирования. На Github язык занимал вторую строчку с 2014 по 2018 год, и лишь в прошлом году опустился на третью строчку. По оценке PYPL, Java теряет популярность, но по-прежнему удерживает вторую строчку рейтинга.

• По спросу на специалистов на рынке труда в США (по данным Indeed) Java уступает только одному языку — Python. По средней зарплате язык занимает шестую строчку.

• Java широко применяется для разработки приложений для бизнеса, обработки больших объемов данных, веб-разработки и создания приложений для Android.

ЗАКЛЮЧЕНИЕ

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

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

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

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

Свойства языка Java:

- язык программирования объектно-ориентирован, оснащен богатой библиотекой классов и в то же время довольно прост в освоении;

- цикл разработки приложения сокращается за счет того, что система строится на базе интерпретатора;

- приложение автоматически переносится на несколько платформ и операционных систем;

- благодаря встроенной системе сбора мусора программист освобождается от необходимости явного управления памятью;

- приложение легко поддерживается и модифицируется, так как модули могут быть загружены из сети;

- приложение имеет встроенную систему безопасности, которая предотвращает незаконный доступ и проникновение вирусов.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Бьерн Страуструп. Язык программирования С++, М. - изд. Бином, 2010. - 1136с.
  2. Джесс либерти, «Освой самостоятельно C++ за 21 день». Москва - Санкт-Петербург - Киев, изд. Дом «Вильямс». - 2001. - 834с.
  3. Джон Родли Создание Java-апплетов. - TheCoriolis Group,Inc.,1996, Издательство НИПФ «ДиаСофт Лтд.»,1996 - 654с.
  4. Герберт Шилдт. C + + для начинающих. Пер. с англ. М: ЭКОМПаблишерз 2007. - 546с.
  5. Герберт Шилдт. Полный справочник по C + + 4-е издание. Пер. с англ. М: издательский дом «Вильямс» 2010. - 543с.
  6. Майкл ЭферганJava: справочник.- QUE Corporation, 1997, Издательство «Питер Ком», 1998. - 687с.