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

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

Содержание:

Введение.

Программное обеспечение, компьютерные приложения с огромной скоростью входят в нашу жизнь. Для разработки программного обеспечения необходимы специальные языки. Ранее они были более архаичными и упрощенными, но с годами их число начало расти, языки развиваются и усложняются. Это связано и с развитием техниками, и с поставленными задачами бизнеса экономического, военного, промышленного характера. Язык программирования это специфический язык, отличающий от обыденного языка принятого в общении и литературе. Он необходим для решения вышеуказанных задач. В своей работе мне хотелось дать определение языка программирования. Вкратце описать развитие языков до появления языка Си. Первого появившегося из трёх рассматриваемых. Рассмотреть каждый из них, хотя они по сути своей взаимосвязаны. Проследить историю возникновения и развития языков программирования Си (С++) и Java до наших дней. Рассмотреть сходства и различия. Достоинства и недостатки языков.

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

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

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

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

Первые языки программирования возникали ещё до появления современных электронных вычислительных машин: так в XIX веке были изобретены устройства, которые можно с долей условности назвать программируемыми - к примеру, музыкальная шкатулка (а позднее механическое пианино) посредством металлического цилиндра, а в 1804 г. Жаккардовый ткацкий станок посредством картонных карт. Для управления ими использовались наборы инструкций, которые в рамках современной классификации можно считать прототипами предметно-ориентированных языков программирования. Значимым можно считать «язык», на котором леди Ада Августа графиня Лавлейс в 1842 году написала программу для вычисления чисел Бернулли для Аналитической машины Чарльза Бэббиджа, который мог стать, в случае реализации, первым компьютером в мире, хотя и механическим с паровым двигателем.

В 1930—1940 годах, А. Чёрч, А. Тьюринг, А. Марков разработали математические абстракции (лямбда-исчисление, машину Тьюринга, нормальные алгоритмы соответственно) - для формализации алгоритмов.

В это же время, в 1940-е годы, появились электрические цифровые компьютеры и был разработан язык, который можно считать первым высокоуровневым языком программирования для ЭВМ - «Plankalkül», созданный немецким инженером К. Цузе в период с 1943 по 1945 годы.

Программисты ЭВМ начала 1950-х годов, в особенности таких, как UNIVAC и IBM 701, при создании программ пользовались непосредственно машинным кодом, запись программы на котором состояла из единиц и нулей и который принято считать языком программирования первого поколения (при этом разные машины разных производителей использовали различные коды, что требовало переписывать программу при переходе на другую ЭВМ).

Первым, практически реализованным, языком стал в 1949 году так называемый «Краткий код», в котором операции и переменные кодировались двухсимвольными сочетаниями. Он был разработан в компании Eckert-Mauchly Computer Corporation, выпускавшей UNIVAC-и, созданной одним из сотрудников Тьюринга, Джоном Мокли. Мокли поручил своим сотрудникам разработать транслятор математических формул, однако для 1940-х годов эта цель была слишком амбициозна. Краткий код был реализован с помощью интерпретатора.

Вскоре на смену такому методу программирования пришло применение языков второго поколения, также ограниченных спецификациями конкретных машин, но более простых для использования человеком за счёт использования мнемоник (символьных обозначений машинных команд) и возможности сопоставления имён адресам в машинной памяти. Они традиционно известны под наименованием языков ассемблера и автокодов. Однако, при использовании ассемблера становился необходимым процесс перевода программы на язык машинных кодов перед её выполнением, для чего были разработаны специальные программы, также получившие название ассемблеров. Сохранялись и проблемы с переносимостью программы с ЭВМ одной архитектуры на другую, и необходимость для программиста при решении задачи мыслить терминами «низкого уровня» - ячейка, адрес, команда. Позднее языки второго поколения были усовершенствованы: в них появилась поддержка макрокоманд.

С середины 1950-х начали появляться языки третьего поколения, такие как Фортран, Лисп и Кобол. Языки программирования этого типа более абстрактны (их ещё называют «языками высокого уровня») и универсальны, не имеют жёсткой зависимости от конкретной аппаратной платформы и используемых на ней машинных команд. Программа на языке высокого уровня может исполняться (по крайней мере, в теории, на практике обычно имеются ряд специфических версий или диалектов реализации языка) на любой ЭВМ, на которой для этого языка имеется транслятор (инструмент, переводящий программу на язык машины, после чего она может быть выполнена процессором).

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

В период с 1969 по 1973 годы велась разработка языка Си, популярного и по сей день и ставшего основой для множества последующих языков, например, столь популярных, как С++ и Java.

Языки программирования Си (С++) и Java.

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

Си - компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969-1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но впоследствии был перенесён на множество других платформ. Согласно дизайну языка, его конструкции близко сопоставляются типичным машинным инструкциям, благодаря чему он нашёл применение в проектах, для которых был свойственен язык ассемблера, в т.ч. как в операционных системах, так и в различном прикладном программном обеспечении для множества устройств - от суперкомпьютеров до встраиваемых систем. Язык программирования Си оказал существенное влияние на развитие индустрии программного обеспечения, а его синтаксис стал основой для таких языков программирования, как C++, C#, Java и Objective-C.

По мере развития язык сначала стандартизировали как ANSI C, а затем этот стандарт был принят комитетом по международной стандартизации ISO как ISO C, ставший также известным под названием C90. В стандарте С99 язык получил новые возможности, из которых в качестве наиболее значимых можно отметить массивы переменной длины и встраиваемые функции. А в стандарте C11 в язык добавили реализацию потоков и поддержку атомарных типов. Однако с тех пор язык развивается медленно, и в стандарт С18 попали лишь исправления ошибок стандарта C11.

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

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

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

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

Часть отсутствующих возможностей может имитироваться встроенными средствами (например, сопрограммы можно имитировать с помощью функций setjmp и longjmp), часть добавляется с помощью сторонних библиотек (например, для поддержки многозадачности и для сетевых функций можно использовать библиотеки pthreads, sockets и тому подобные; существуют библиотеки для поддержки автоматической сборки мусора), часть реализуется в некоторых компиляторах в виде расширений языка (например, вложенные функции в GCC). Существует несколько громоздкая, но вполне работоспособная методика, позволяющая реализовывать на Си механизмы объекто-ориентированного программирования (далее ООП), базирующаяся на фактической полиморфности указателей в Си и поддержке в этом языке указателей на функции. Механизмы ООП, основанные на данной модели, реализованы в библиотеке GLib и активно используются в фреймворке GTK+. GLib предоставляет базовый класс GObject, возможности наследования от одного класса и реализации множества интерфейсов.

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

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

Часть языков-потомков надстраивает Си дополнительными средствами и механизмами, добавляющими поддержку новых парадигм программирования (ООП, функциональное программирование, обобщённое программирование и пр.). К таким языкам относятся, прежде всего, C++ и Objective-C, а опосредованно - их потомки Swift и D. Также известны попытки улучшить Си, исправив его наиболее существенные недостатки, но сохранив его привлекательные черты. Среди них можно упомянуть исследовательский язык Cyclone (и его потомок Rust). Иногда оба направления развития объединяются в одном языке, примером может служить Go.

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

Язык программирования C++ был создан из Си и унаследовал его синтаксис, дополнив его новыми конструкциями в духе языков Simula-67, Smalltalk, Modula-2, Ada, Mesa и Clu. Основными дополнениями стали поддержка ООП (описание классов, множественное наследование, полиморфизм, основанный на виртуальных функциях) и обобщённого программирования (механизм шаблонов). Но помимо этого в язык внесено множество самых различных дополнений. На данный момент C++ является одним из наиболее распространённых языков программирования в мире и позиционируется как язык общего назначения с уклоном в системное программирование.

Изначально C++ сохранял совместимость с Си, которая была заявлена как одно из преимуществ нового языка. Первые реализации C++ просто переводили новые конструкции в чистый Си, после чего код обрабатывался обычным Си-компилятором. Для сохранения совместимости создатели C++ отказались от исключения из него некоторых часто критикуемых особенностей Си, вместо этого создав новые, «параллельные» механизмы, которые рекомендуется применять при разработке нового кода на C++ (шаблоны вместо макроопределений, явное приведение типов вместо автоматического, контейнеры стандартной библиотеки вместо ручного динамического выделения памяти и так далее). Однако в дальнейшем языки развивались независимо, и сейчас Си и C++ последних выпущенных стандартов являются лишь частично совместимыми: не гарантируется успешная компиляция программы на Си компилятором C++, а в случае успеха нет гарантии, что откомпилированная программа будет работать правильно. Особенно неприятны некоторые тонкие семантические различия, которые могут приводить к разному поведению одного и того же кода, синтаксически корректного для обоих языков. Например, символьные константы (символы, заключённые в одинарные кавычки) имеют тип int в Си и тип char в C++, так что объём памяти, занимаемый такими константами, в разных языках различается. Если программа чувствительна к размеру символьной константы, она будет работать по-разному, будучи откомпилирована трансляторами Си и C++.

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

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

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

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

Вспомнив опыт своей диссертации, Страуструп решил дополнить язык C (преемник BCPL) возможностями, имеющимися в языке Симула. Язык C, будучи базовым языком системы UNIX, на которой работали компьютеры Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами. В результате практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию Симула-подобных классов), так и с точки зрения времени вычислений (благодаря быстродействию C). В первую очередь в C были добавлены классы (с инкапсуляцией), наследование классов, строгая проверка типов, inline-функции и аргументы по умолчанию. Ранние версии языка, первоначально именовавшегося «C with classes» («Си с классами»), стали доступны с 1980 года.

Разрабатывая C с классами, Страуструп написал программу cfront - транслятор, перерабатывающий исходный код C с классами в исходный код простого C. Это позволило работать над новым языком и использовать его на практике, применяя уже имеющуюся в UNIX инфраструктуру для разработки на C. Новый язык, неожиданно для автора, приобрёл большую популярность среди коллег и вскоре Страуструп уже не мог лично поддерживать его, отвечая на тысячи вопросов.

К 1983 году в язык были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Получившийся язык уже перестал быть просто дополненной версией классического C и был переименован из C с классами в «C++». Его первый коммерческий выпуск состоялся в октябре 1985 года.

До начала официальной стандартизации язык развивался в основном силами Страуструпа в ответ на запросы программистского сообщества. Функцию стандартных описаний языка выполняли написанные Страуструпом печатные работы по C++ (описание языка, справочное руководство и так далее). Лишь в 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; после принятия технических исправлений к стандарту в 2003 году - следующая версия этого стандарта - ISO/IEC 14882:2003.

Немного о развитии и стандартизации языка. В 1985 году вышло первое издание «Языка программирования C++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта. В 1989 году состоялся выход C++ версии 2.0. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены. В 1990 году вышло «Комментированное справочное руководство по C++», положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и булевский тип.

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

В 1998 году был опубликован стандарт языка ISO/IEC 14882:1998 (известный как C++98), разработанный комитетом по стандартизации C++ (ISO/IEC JTC1/SC22/WG21 working group). Стандарт C++ не описывает способы именования объектов, некоторые детали обработки исключений и другие возможности, связанные с деталями реализации, что делает несовместимым объектный код, созданный различными компиляторами. Однако для этого третьими лицами создано множество стандартов для конкретных архитектур и операционных систем.

В 2003 году был опубликован стандарт языка ISO/IEC 14882:2003, где были исправлены выявленные ошибки и недочёты предыдущей версии стандарта.

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

С 2009 года велась работа по обновлению предыдущего стандарта. Предварительной версией нового стандарта, сначала был C++09, а спустя год - C++0x (впоследствии переименованный в C++11), куда были включены дополнения в ядро языка и расширение стандартной библиотеки, в том числе большую часть TR1.

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

Никто не обладает правами на язык C++, он является свободным. Однако сам документ стандарта языка (за исключением черновиков) не доступен бесплатно. В рамках процесса стандартизации, ISO выпускает несколько видов изданий. В частности, технические доклады и технические характеристики публикуются, когда «видно будущее, но нет немедленной возможности соглашения для публикации международного стандарта». До 2011 года было опубликовано три технических отчёта по C++: TR 19768: 2007 (также известный как C++, Технический отчёт 1) для расширений библиотеки в основном интегрирован в C++11, TR 29124: 2010 для специальных математических функций, и TR 24733: 2011 для десятичной арифметики с плавающей точкой. Техническая спецификация DTS 18822:. 2 014 (по файловой системе) была утверждена в начале 2015 года, и остальные технические характеристики находятся в стадии разработки и ожидают одобрения

В марте 2016 года в России была создана рабочая группа РГ21 С++. Группа была организована для сбора предложений к стандарту C++, отправки их в комитет и защиты на общих собраниях Международной организации по стандартизации (ISO).

Вкратце от истории названия. Имя языка, получившееся в итоге, происходит от оператора унарного постфиксного инкремента C ++ (увеличение значения переменной на единицу). Имя C+ не было использовано потому, что является синтаксической ошибкой в C и, кроме того, это имя было занято другим языком. Язык также не был назван D, поскольку «является расширением C и не пытается устранять проблемы путём удаления элементов C».

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

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

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

- Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.

- Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.

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

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

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

- Не требовать слишком усложнённой среды программирования.

Дальнейшее развитие С++. Текущий стандарт языка ISO/IEC 14882:2017 был опубликован в декабре 2017 года. Неофициально его обозначают как C++17. Следующая версия стандарта, запланированная на 2020 год, имеет неофициальное обозначение C++20.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- Перегрузка операторов позволяет кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.

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

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

- Возможность встраивания предметно-ориентированных языков программирования в основной код. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.

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

Что касается недостатков, то к их числу можно отнести:

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

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

- Унаследованные от Си опасные и провоцирующие ошибки возможности, такие как макроопределения #define, адресная арифметика и неявное приведение типов.

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

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

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

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

- Сложный синтаксис и объёмная спецификация языка затрудняют его изучение.

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

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

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

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

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

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

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

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

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

- Рефлексия значительно более развита, чем в C++ и позволяет реально определять и изменять структуру объектов во время работы программы.

- Встроенные средства безопасности, защищающие от распространённых ошибок программ C++, таких как переполнение буфера или выход за границы массива.

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

С точки зрения производительности, то программы, написанные на Java, имеют репутацию более медленных и занимающих больше оперативной памяти, чем написанные на языке C. Тем не менее, скорость выполнения программ, написанных на языке Java, была существенно улучшена с выпуском в 1997-1998 годах так называемого JIT-компилятора в версии 1.1 в дополнение к другим особенностям языка для поддержки лучшего анализа кода (такие, как внутренние классы, класс StringBuffer, упрощённые логические вычисления и так далее). Кроме того, была произведена оптимизация виртуальной машины Java - с 2000 года для этого используется виртуальная машина HotSpot. По состоянию на февраль 2012 года, код Java 7 приблизительно в 1,8 раза медленнее кода, написанного на языке Си.

Объектными являются переменные любого типа, кроме примитивного. Явных указателей в Java нет. В отличие от указателей C, C++ и других языков программирования, ссылки в Java в высокой степени безопасны благодаря жёстким ограничениям на их использование.

Нельзя преобразовывать объект типа int или любого другого примитивного типа в указатель или ссылку и наоборот.

Заключение.

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

1111.jpg

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

1. Берд Б. Java 9 для чайников = Java For Dummies, 7th edition. - М.: «Диалектика», 2018. - 624 с. - ISBN 978-5-9500296-1-5, 978-1-119-23555-2.

2. Блох Д. Java. Эффективное программирование = Effective Java. - 3-е. - М.: Диалектика, 2019. - 464 с. - ISBN 978-5-6041394-4-8.

3. Гослинг Д., Джой Б., Стил Г., Брача Г., Бакли А. Язык программирования Java SE 8. Подробное описание, 5-е издание = The Java Language Specification, Java SE 8 Edition (5th Edition) (Java Series). - М.: «Вильямс», 2015. - 672 с. - ISBN 978-5-8459-1875-8.

4. Гукин Д. Язык программирования Си для «чайников» = C For Dummies. - М.: Диалектика, 2006. - С. 352. - ISBN 0-7645-7068-4.

5. Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. - 2-е изд. - М.: Вильямс, 2007. - С. 304. - ISBN 0-13-110362-8.

6. Лонг Ф., Мохиндра Д., Сикорд Р.С., Сазерленд Д.Ф., Свобода Д. Руководство для программиста на Java: 75 рекомендаций по написанию надежных и защищённых программ = Java Coding Guidelines: 75 Recommendations for Reliable and Secure Programs. - М.: «Вильямс», 2014. - 256 с. - ISBN 978-5-8459-1897-0.

7. Подбельский В. В., Фомин С. С. Курс программирования на языке Си: учебник. - М.: ДМК Пресс, 2012. - 318 с. - ISBN 978-5-94074-449-8.

8. Прата С. Язык программирования C (C11). Лекции и упражнения, 6-е издание = C Primer Plus, 6th Edition. - М.: Вильямс, 2015. - 928 с. - ISBN 978-5-8459-1950-2.

9. Прата С. Язык программирования С: Лекции и упражнения = C Primer Plus. - М.: Вильямс, 2006. - С. 960. - ISBN 5-8459-0986-4.

10. Сиддхартха Р. Освой самостоятельно C++ за 21 день, 7-е издание (C++11) = Sams Teach Yourself C++ in One Hour a Day, 7th Edition. - М.: «Вильямс», 2013. - 688 с. - ISBN 978-5-8459-1825-3.

11. Стефенс Д. Р. C++. Сборник рецептов. - КУДИЦ-ПРЕСС, 2007. - 624 с. - ISBN 5-91136-030-6.

12. Страуструп Б. Программирование: принципы и практика использования C++, 2001.

13. Страуструп Б.. Язык программирования C++ = The C++ Programming Language / Пер. с англ. - 3-е изд. - СПб.; М.: Невский диалект - Бином, 1999. - 991 с. - 3000 экз. - ISBN 5-7940-0031-7 (Невский диалект).

14. Страуструп Б. Язык программирования C++. Специальное издание = The C++ programming language. Special edition. - М.: Бином-Пресс, 2007. - 1104 с. - ISBN 5-7989-0223-4.

15. Столяров А. В. Язык Си и начальное обучение программированию / Сборник статей молодых учёных факультета ВМК МГУ. - Издательский отдел 16. Хорстманн К. Java. Библиотека профессионала, том 1. Основы. 10-е издание = Core Java. Volume I - Fundamentals (Tenth Edition). - М.: «Вильямс», 2017. - 864 с. - ISBN 978-5-8459-2084-3.

17. Хорстманн К. Java SE 8. Вводный курс = Java SE 8 for the Really Impatient. - М.: «Вильямс», 2014. - 208 с. - ISBN 978-5-8459-1900-7.

18. Хорстманн К. Java SE 9. Базовый курс = Core Java SE 9 for the Impatient. - М.: «Вильямс», 2018. - 576 с. - ISBN 978-5-6040043-0-2, 978-0-13-469472-6.

19. Хортон А.. Visual C++ 2010: полный курс = Ivor Horton’s Beginning Visual C++ 2010. - М.: Диалектика, 2010. - С. 1216. - ISBN 978-5-8459-1698-3.

20. Шилдт Г. Java. Полное руководство, 10-е издание = Java. The Complete Reference, 10th Edition. - М.: «Диалектика», 2018. - 1488 с. - ISBN 978-5-6040043-6-4.

21. Шаран К. Java 9. Полный обзор нововведений = Java 9 Revealed. - М.: «ДМК Пресс», 2018. - 544 с. - ISBN 978-5-97060-575-2.

22. Шилдт Г.: Полное руководство, классическое издание = C: The Complete Reference, 4th Edition. - М.: Вильямс, 2010. - С. 704. - ISBN 978-5-8459-1709-6.

23. Шилдт Г. Теория и практика C++ = Shildt's Expert C++. - СПб.: BHV - Санкт-Петербург, 1996. - ISBN 0-07-882209-2, 5-7791-0029-2.

24. Эванс Б.Д., Гоф Д, Ньюленд К. Java: оптимизация программ. Практические методы повышения производительности приложений в JVM. - М.: Диалектика, 2019. - 448 с. - ISBN 978-5-907114-84-5.

25. Эккель Б.. Философия Java = Thinking in Java. - 4-е изд. - СПб.: Питер, 2018. - 1168 с. - ISBN 978-5-496-01127-3.

26. Языки программирования Ада, Си, Паскаль = Comparing and Assessong Programming Languages Ada, C, and Pascal / Фьюэр А., Джехани Н. - М.: Радио и Связь, 1989. - 368 с. - 50 000 экз. - ISBN 5-256-00309-7.