Файл: История возникновения и развития языка программирования Си (С++) и Java.(История возникновения языка C).pdf
Добавлен: 24.04.2023
Просмотров: 246
Скачиваний: 1
Рисунок 2 – Иллюстрация истории языка С++
С++ – язык, прежде всего, индустриальный, т.е. более заметен в производственной сфере, чем в образовании или при изучении языков программирования. Он вырос в BellLabs, инспирированный разнообразными жесткими потребностями в области телекоммуникаций и системного программирования (включая драйверы устройств, сети и встроенные системы). Оттуда использование С++ распространилось практически на все отрасли: микроэлектроника, веб-приложения и инфраструктура, операционные системы, финансовые, медицинские, автомобильные, аэрокосмические приложения, физика высоких энергий, биология, производство энергии, машинное обучение, видеоигры, графика, анимация, виртуальная реальность и многое другое. Он в основном используется там, где стоящие перед разработчиками задачи требуют сочетания способности эффективно использовать оборудование и при этом управлять сложностью проекта. Множество применений С++ постоянно растет.
3. История возникновения языка Java
Java – это объектно-ориентированный язык программирования, разработанный Джеймсом Гослингом и его коллегами из SunMicrosystems в начале 1990-х годов. В отличие от обычных языков, которые обычно предназначены для компиляции в собственный (машинный) код или для интерпретации из исходного кода во время выполнения, Java предназначена для компиляции в байт-код, который затем запускается виртуальная машина Java. Сам язык заимствует много синтаксиса из C и C++, но имеет более простую объектную модель и меньше средств низкого уровня. Java только отдаленно связана с JavaScript, хотя они имеют схожие имена и имеют общий синтаксис[5].
Java был разработан Джеймсом Гослингом как проект под названием «Oak» в июне 1991 года. Цели Гослинга заключались в том, чтобы реализовать виртуальную машину и язык, который имел бы знакомую C-подобную нотацию, но с большей однородностью и простотой, чем C/C++. Первой публичной реализацией была Java 1.0 в 1995 году. Она обещала «WriteOnce, RunAnywhere» с бесплатными средами исполнения на популярных платформах. Это было довольно безопасно, и его безопасность была настраиваемой, позволяя ограничить доступ к сети и файлам. Основные веб-браузеры вскоре включили его в свои стандартные конфигурации. Вскоре вместе с появлением «Java 2» были разработаны новые версии для больших и малых платформ (J2EE и J2ME).
В 1997 году Sun обратилась к органу по стандартизации ISO / IEC JTC1, а затем к EcmaInternational, чтобы формализовать Java. Сейчас язык де-факто остается проприетарным стандартом, который контролируется с помощью процесса сообщества Java. Sun, а теперь Oracle делает большинство своих реализаций Java бесплатными, а доход генерируется специализированными продуктами, такими как JavaEnterpriseSystem. Вендор проводит различие между своим комплектом разработки программного обеспечения (SDK) и средой выполнения (JRE), которая является подмножеством SDK, главное отличие в том, что в JRE отсутствует компилятор.
В создании языка Java было пять основных целей:
- Он должен использовать методологию объектно-ориентированного программирования.
- Он должен позволять запускать одну и ту же программу в нескольких операционных системах.
- Он должен содержать встроенную поддержку для использования компьютерных сетей.
- Он должен быть предназначен для безопасного выполнения кода из удаленных источников.
- Он мог легко встраивать удачные элементы из других языков.
Для достижения целей сетевой поддержки и удаленного выполнения кода программисты на Java иногда считают необходимым использовать такие расширения, как CORBA, InternetCommunicationsEngine или OSGi[6].
Объектно-ориентированность относится к методу программирования и языкового проектирования. Хотя существует множество интерпретаций ОО, одной из основных отличительных идей является разработка программного обеспечения таким образом, чтобы различные типы данных, которыми она манипулирует, комбинировались с соответствующими операциями. Таким образом, данные и код объединяются в объекты. Объект может рассматриваться как отдельный набор поведения (кода) и состояния (данных). Принцип состоит в том, чтобы отделить вещи, которые меняются, от моментов, которые остаются прежними; часто изменение какой-либо структуры данных требует соответствующего изменения кода, который работает с этими данными, или наоборот. Такое разделение на согласованные объекты обеспечивает более устойчивую основу для проектирования программной системы.
Другой основной целью ООП является разработка более общих объектов, чтобы программное обеспечение стало более пригодным для повторного использования между проектами. Например, общий объект «клиент» должен иметь примерно одинаковый базовый набор поведений между различными программными проектами, особенно когда эти проекты пересекаются на некотором фундаментальном уровне, как это часто бывает в крупных организациях. В этом смысле, можно надеяться, что программные объекты можно рассматривать, скорее, как подключаемые компоненты, помогающие индустрии программного обеспечения строить проекты в основном из существующих и хорошо протестированных компонентов, что приводит к значительному сокращению времени разработки. Возможность многократного использования программного обеспечения привела к смешанным практическим результатам: дизайн действительно общих объектов плохо изучен, и отсутствует методология широкого распространения возможностей повторного использования.
Независимость от платформы означает, что программы, написанные на языке Java, должны работать одинаково на разнородном оборудовании. Нужно уметь писать программу один раз и запускать ее где угодно. Это достигается большинством компиляторов Java путем компиляции кода в байт-код – упрощенные машинные инструкции, специфичные для платформы Java. Затем код запускается на виртуальной машине (ВМ), программе, написанной в собственном коде на оборудовании хоста, которая интерпретирует и выполняет общий байт-код Java. Кроме того, предоставляются стандартизированные библиотеки, чтобы обеспечить доступ к функциям хост-машин (таким как графика, многопоточность и работа в сети) унифицированными способами. Хотя существует явная стадия компиляции, в какой-то момент байт-код Java интерпретируется или преобразуется в машинные инструкции JIT-компилятором.
Лицензия Sun/Oracle на Java настаивает на том, чтобы все реализации были «совместимыми». Это привело к судебному спору с Microsoft после того, как Sun заявила, что реализация Microsoft не поддерживает интерфейсы RMI и JNI и добавила собственные специфичные для платформы функции. В ответ Microsoft больше не поставляет Java с Windows, и в последних версиях WindowsInternetExplorer не может поддерживать Java-апплеты без стороннего подключаемого модуля. Тем не менее, Sun и другие разработчики бесплатно предоставили системы исполнения Java для этих и других версий Windows.
Первые реализации языка использовали интерпретируемую виртуальную машину для достижения переносимости. Эти реализации создавали программы, которые выполнялись медленнее, чем программы, скомпилированные в собственные исполняемые файлы, например, написанные на C или C ++, поэтому язык имел репутацию низкой производительности.
Переносимость – технически сложная цель, и успех Java в этой цели был неоднозначным. Хотя действительно возможно написать программы для платформы Java, которые ведут себя согласованно на многих хост-платформах, большое количество доступных платформ с небольшими ошибками или несогласованностями привело к тому, что некоторые из них пародировали лозунг Sun «WriteOnce, RunAnywhere», как «WriteOnce, DebugAnywhere»[7].
(1997)
JDK 1.1
Внутренние классы
(1996)
Java 1 (JDK 1.0)
(1995)
Бета-версияJava Development Kit (JDK)
(2002)
J2SE 1.4
XML и регулярные выражения
(2000)
J2SE 1.3
Виртуальная машина
(1998)
J2SE 1.2
Графический API
(2011)
JAVA SE 7
Поддержка 64-битной архиктуры
(2006)
JAVA SE 6
Работа с интеграцией
(2004)
J2SE5.0
Цикл For-each и работа с переменными
(2018)
JAVASE10
Единый JDK-репозиторий
(2017)
JAVASE9
Мультизадачная платформа
(2014)
JAVASE8
Работа с данными, машинным обучением
(2019)
JAVA SE 12
Унификация платформы
(2018)
JAVASE11
Веб-протоколы и сборщик мусора
Рисунок 3 – Иллюстрация истории языка Java
Одна из идей модели автоматического управления памятью в Java заключается в том, что программисты должны быть избавлены от необходимости выполнять ручное управление памятью. На некоторых языках программист выделяет память для создания любого объекта, хранящегося в куче, и отвечает за последующее ручное освобождение этой памяти для удаления любых таких объектов. Если программист забывает освободить память или пишет код, который не может это сделать своевременно, может произойти утечка памяти: программа будет использовать потенциально произвольно большой объем памяти. Кроме того, если область памяти освобождается дважды, программа может работать нестабильно и зависать. Наконец, в средах без сбора мусора существует определенная степень издержек и сложности пользовательского кода для отслеживания и завершения распределения.
В Java эту потенциальную проблему можно избежать с помощью автоматической сборки неиспользуемого кода. Программист определяет, когда создаются объекты, а среда выполнения Java отвечает за управление жизненным циклом объекта. Программа или другие объекты могут ссылаться на объект, удерживая ссылку на него (который с низкоуровневой точки зрения является его адресом в куче). Когда не остается ссылок на объект, сборщик Java автоматически удаляет недоступный объект, освобождая память и предотвращая утечку памяти. Утечки памяти могут все еще происходить, если код программиста содержит ссылку на объект, который больше не нужен – другими словами, они все еще могут происходить, но на более высоких концептуальных уровнях.
4. Различия между C++ и Java
Как С++, так и Java являются объектно-ориентированными языками программирования. От С Javaполучил в наследства синтаксис, а от С++ - объектную модель.
Академизм С и С++ помогает программистам быстрее освоить гибкий Java.Обратный эффект также имеет место быть, но реже.Есть еще одно сходство – среда как С++, так и Javaпредлагает программисту полный контроль над компилируемым кодом.
Оценим различия в коде на примере простейшей программы.
Код на С
#include <stdio.h> //стандартная библиотека С
int main() //объявление главной функции
{ //начало тела функции
printf("Hello, world!"); //вывод сообщения на экран
getchar(); //задержка открытого окна консоли
return 0; //возврат значения функции
} //конец тела функции
Код на С++
#include <iostream> //стандартная библиотека С++
int main() //объявление главной функции
{ //начало тела функции
cout<<"Hello, world!"; //вывод сообщения на экран
system("pause"); //задержка открытого окна консоли
return 0; //возврат значения функции
} //конец тела функции
Кодна Java
publicclassMain //объявлениекласса
{ //начало тела описания класса
publicstaticvoidmain(String[]args)//объявление метода
{ //начало тела описания метода
System.out.println("Helloworld"); //оператор выводавнутри метода
} //конец тела описания метода
} //конец тела описания класса
Как можно заметить, объектная логика осталась без изменений, однако архитектурно С и Java–различные языки. В С требуется вызывать библиотеки, которые содержат необходимую логику и операторы. Функция mainв С выполняется силами содержащих в ней операторов, а класс Mainв Javaнаходит метод main (заметим разницу в регистре: с точки зрения синтаксиса Java– эторазные имена) и передает ему управление. Здесь незаметно, но при наличии другого объекта, объявленные методы начали бы очень просто взаимодействовать друг с другом, чего в Cдобиться сложнее.
С++ сегодня – сугубо академический язык, который если и используется, то для оттачивания логики программиста и освоения объектного синтаксиса. Это язык, который уже достаточно давно уступил место более продвинутым, мощным и гибким решениям. И он больше не нужен.
Java –это даже не язык, а платформа, которая через специальные библиотеки и надстройки может приобрести возможности веб-, мобильной, настольной, серверной, корпоративной и даже игровой среды разработки. В этом отношении было бы гораздо более корректно сравнивать ее с C# –симметричным ответом с родной и очень качественной майкрософтовской архитектурой.
Синтаксис Java в значительной степени является производным от C++. Однако, в отличие от C++, который сочетает в себе синтаксис для структурированного, универсального и объектно-ориентированного программирования, Java изначально создавалась практически полностью объектно-ориентированной: все в Java является объектом с исключениями атомарных типов данных (порядковых и действительные числа, логические значения и символы) и все на Java написано внутри класса. Рассмотрим отличия более подробно (таблица 1).