Файл: История возникновения и развития языка программирования С/С++ и Java.pdf
Добавлен: 29.06.2023
Просмотров: 52
Скачиваний: 3
Сегодня Java не только проникает в Интернет, но и является невидимой силой многих приложений и устройств, которые питают нашу повседневную жизнь. С мобильных телефонов до карманных устройств, игр и навигационных систем для решений для электронного бизнеса [26].
В 1997 году Sun обратилась к органу стандартов ISO/IEC JTC1, а затем к Ecma International, чтобы формализовать Java, но вскоре отказалась от этого процесса. Java остается проприетарным стандартом де-факто, который контролируется через Java Community Process. Sun делает большую часть своих реализаций на Java доступными бесплатно, при этом доходы генерируются специализированными продуктами, такими как Java Enterprise System. Sun отличает его Software Development Kit (SDK) и Runtime Environment (JRE), который является подмножеством SDK, причем основное отличие заключается в том, что в JRE отсутствует компилятор.
3 JAVA
3.1 ЭТАПЫ РАЗВИТИЯ JAVA
В 1998 году выходит J2SE 1.2 (Java2 Standard Edition) основными изменениями, которой являлись:
- интегрированный графический API Swing;
- ключевое слово strictfp;
- JIT-компилятор в Sun JVM для Java-плагина.
В 2000 году выходит J2SE 1.3 основными изменениями, которой являлись:
- включен Hotspot JVM;
- RMI изменен для поддержки совместимости с CORBA;
- Java Naming and Directory Interface (JNDI);
- Java Debugger Architecture (JPDA);
- Java Sound.
В 2002 году выходит J2SE 1.4 — это был первый выпуск платформы Java, разработанный в рамках процесса java community, как JSR 59. основными изменениями, которой являлись:
- регулярное выражение;
- цепочка исключений;
- API ввода-вывода изображений, для чтения и записи изображений;
- включение Java Web start.
В 2004 выходит J2SE 5.0 под кодовым именем Tiger. Добавлены новые языковые функции:
- Generics;
- Metadata;
- Autoboxing;
- Enumeratations;
- Swing;
- Var args;
- коллекции статического импорта и т. д.
В 2006 выходит Java SE 6 основными изменениями, которой являлись:
- поддержка языка Scripting Language;
- улучшенная поддержка веб-сервисов через JAX-WS;
- поддержка JDBC 4.0;
- поддержка подключаемых аннотаций;
- усовершенствования JVM, включая оптимизацию производительности синхронизации и компилятора;
- алгоритмы сбора Garbaze.
Java SE 7.0 D 2011 г. Java SE 7.0 основными изменениями, которой являлись:
- поддержка JVM для динамического языка;
- новая библиотека для параллельных вычислений;
- автоматическое управление ресурсами.
Java SE 8.0 18 марта В 2014 г. Вышла Java SE 8.0 включавшая различные исправления ошибок и улучшения
3.2 ФИЛОСОФИЯ СОЗДАНИЯ ЯЗЫКА JAVA
В создании языка Java было пять основных целей:
1. Он должен был использовать методологию объектно-ориентированного программирования.
2. Он должен позволять выполняться одной и той же программы на нескольких операционных системах.
3. Он должен содержать встроенную поддержку для использования компьютерных сетей.
4. Он должен быть разработан для безопасного выполнения кода из удаленных источников.
5. Он должен быть удобным в использовании, выбрав то пункты, которые считалось хорошей частью других объектно-ориентированных языков.
Для достижения целей сетевой поддержки и удаленного выполнения кода разработчикам Java иногда приходится использовать такие расширения, как CORBA, Internet Communications Engine или OSGi [21].
Первая характеристика, объектной ориентации («OO»), относится к методу программирования и языкового дизайна. Хотя существует много интерпретаций OO, одна из основных отличительных идей заключается в разработке программного обеспечения, так что различные типы данных, которыми он управляет, объединяются вместе с их соответствующими операциями. Таким образом, данные и код объединяются в сущности, называемые объектами. Объект можно рассматривать как автономный пучок поведения (кода) и состояния (данных). Принцип состоит в том, чтобы отделить вещи, которые изменяются от вещей, которые остаются неизменными; часто изменение в некоторой структуре данных требует соответствующего изменения кода, который работает с этими данными, или наоборот. Это разделение на когерентные объекты обеспечивает более стабильную основу для разработки программной системы [23].
Другой основной целью программирования OO является разработка более общих объектов, чтобы программное обеспечение могло стать более многоразовым между проектами. Например, общий «клиентский» объект должен иметь примерно один и тот же базовый набор поведения между различными проектами программного обеспечения, особенно когда эти проекты перекрываются на каком-то фундаментальном уровне, как это часто бывает в крупных организациях. В этом смысле программные объекты, можно рассматривать как подключаемые компоненты, помогающие разработчикам программного обеспечения строить проекты в основном из существующих и проверенных образцов, что приводит к значительному сокращению времени разработки. Повторное использование программного обеспечения встретило смешанные практические результаты с двумя основными трудностями: дизайн действительно универсальных объектов плохо понимается, а методология для широкого распространения возможностей повторного использования отсутствует.
Вторая характеристика, независимость от платформы, означает, что программы, написанные на языке Java, должны работать аналогично на разных аппаратных средствах. Разработчик должен иметь возможность написать программу один раз и запустить ее в любом месте.
Это достигается большинством компиляторов Java путем компиляции кода языка Java в байт-код (в частности, байт-код Java) - упрощенные машинные инструкции, характерные для платформы Java. Затем код запускается на виртуальной машине (VM), программе, которая интерпретирует и выполняет общий байт-код Java. Кроме того, стандартизованные библиотеки предоставляются для обеспечения единого доступа к функциям хост-машин (таких как графика, потоковая передача и сетевое взаимодействие). Хотя есть явный этап компиляции, в какой-то момент байт-код Java интерпретируется или преобразуется в собственные машинные инструкции компилятором JIT.
Существуют также реализации компиляторов Java, которые компилируют собственный код объекта, такой как GCJ, удаляя промежуточную стадию байт-кода, но вывод этих компиляторов можно запускать только в одной архитектуре.
Лицензия Sun на Java настаивает на том, чтобы все реализации были «совместимыми». Это привело к юридическому спору с Microsoft после того, как Sun заявила, что реализация Microsoft не поддерживает интерфейсы RMI и JNI и добавила собственные функции платформы. В ответ Microsoft больше не переносит Java с Windows, а в последних версиях Windows Internet Explorer не может поддерживать Java-апплеты без стороннего плагина. Тем не менее, Sun и другие разработчики, предоставили доступные системы времени исполнения Java бесплатно для этих и других версий Windows.
Первые реализации языка использовали интерпретированную виртуальную машину для обеспечения переносимости. В этих реализациях выполнялись программы, которые выполнялись медленнее, чем программы, скомпилированные для собственных исполняемых файлов, например, написанные на C или C++, поэтому язык приобрёл репутацию плохой производительности. Более поздние реализации JVM создают программы, которые работают значительно быстрее, чем раньше, используя несколько методов [24].
Первый метод - просто скомпилировать непосредственно в собственный код, например, более традиционный компилятор, полностью пропуская байт-коды. Это обеспечивает хорошую производительность, но в ущерб переносимости.
Второй метод, известный как компиляция «точно в момент времени» (JIT), переводит байт-коды Java в собственный код во время запуска программы, что приводит к выполнению программы, которая выполняется быстрее, чем интерпретируемый код, но также приводит к сбоям на этапе компиляции во время выполнения.
Более сложные виртуальные машины используют динамическую перекомпиляцию, в которой виртуальная машина может анализировать поведение запущенной программы и выборочно перекомпилировать, и оптимизировать критические части программы. Динамическая перекомпиляция может обеспечить оптимизацию, превосходящую статическую компиляцию, потому что динамический компилятор может использовать варианты оптимизации на знаниях о среде выполнения и наборе загруженных классов.
Переносимость - это технически трудная цель, и успех Java в этой цели был смешанным. Хотя на самом деле можно писать программы на платформе Java, которые ведут себя последовательно на многих системах, но большое количество доступных платформ с небольшими ошибками или несогласованностями привело к тому, что некоторые слоганы «Write once, Run anywhere» (писать один раз, запускать везде) в Sun называли «Write once, debug anywhere» (писать один раз, отлаживать везде).
Независимая от платформы Java, однако, очень успешна с серверными приложениями, такими как веб-сервисы, сервлеты и Enterprise JavaBeans, а также с встроенными системами на основе OSGi с использованием встроенных сред Java.
3.3 АВТОМАТИЧЕСКАЯ СБОРКА МУСОРА И ДРУГИЕ ФУНКЦИИ
Одна из идей, лежащих в основе модели автоматического управления памятью в Java, заключается в том, что программистам следует избавиться от необходимости выполнять ручное управление памятью.
На некоторых языках программист выделяет память для создания любого объекта, хранящегося в куче, и отвечает за последующее ручное освобождение этой памяти для удаления любых таких объектов. Если программист забывает освободить память или пишет код, которому не удается сделать это своевременно, может произойти утечка памяти: программа будет потреблять потенциально произвольно большой объем памяти. Кроме того, если область памяти освобождается дважды, программа может стать нестабильной и может произойти сбой. Наконец, в среде, не содержащей мусора, существует определенная степень накладных расходов и сложность пользовательского кода для отслеживания и завершения распределения.
В Java эта потенциальная проблема была решена автоматической сборкой мусора. Программист определяет, когда создаются объекты, а Java отвечает за управление жизненным циклом объекта.
Программа или другие объекты могут ссылаться на объект, удерживая ссылку на него (которая с низкоуровневой точки зрения является ее адресом в куче). Когда ссылки на объект не сохраняются, сборщик мусора Java автоматически удаляет недостижимый объект, освобождая память и предотвращая утечку памяти. Утечки памяти могут все еще возникать, если код программиста содержит ссылку на объект, который больше не нужен, другими словами, они все равно могут возникать, но на более высоких концептуальных уровнях.
Использование сборщика мусора в языке может также повлиять на парадигмы программирования. Если, например, разработчик предполагает, что стоимость выделения/запоминания памяти низкая, они могут выбирать более свободно использовать конструирование объектов, а не предварительное инициализирование, удерживание и повторное использование. Благодаря небольшой стоимости потенциальных штрафных санкций (построение больших/сложных объектов внутри цикла) это облегчает изоляцию потоков (нет необходимости синхронизировать, поскольку разные потоки работают на разных объектных экземплярах) и скрытие данных. Использование переходных неизменных ценностей-объектов минимизирует побочные эффекты [19].
Сравнивая Java и C++, на C++ можно реализовать аналогичную функциональность (например, модель управления памятью для конкретных классов может быть разработана на C++ для улучшения скорости и уменьшения фрагментации памяти), с возможной стоимостью дополнительного времени разработки и некоторыми сложностями приложения. В Java сборка мусора встроена и практически незаметна для разработчика. То есть разработчики могут не иметь понятия о том, когда будет собираться сбор мусора, поскольку это может не обязательно соответствовать любым действиям, явно выполняемым кодом, который они пишут. В зависимости от предполагаемого приложения это может быть выгодным или невыгодным: программист освобождается от выполнения задач низкого уровня, но в то же время теряет возможность писать код нижнего уровня.
Синтаксис Java в основном соткан из ниток C++. Однако, в отличие от C++, который сочетает в себе синтаксис структурированного, общего и объектно-ориентированного программирования, Java была построена с нуля до практически полностью объектно-ориентированной: все в Java является объектом. В Java есть несколько новшеств, отличный от других языков, которые являются его сильной стороной.
Java-апплеты - это программы, встроенные в другие приложения, обычно на веб-странице, отображаемой в веб-браузере. Пример кода в приложении А.