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

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

Содержание:

Введение

Computer with Binary NumbersКомпьютерные программы не могут существовать без определённого программирования – своеобразного языка между человеком и компьютером. Ныне языки программирования развиваются очень быстро, и их количество постоянно увеличивается.

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

C:\Users\admin\AppData\Local\Microsoft\Windows\INetCache\Content.Word\img40.pngЯзык программирования представляет собой набор спецификаций, определяющих его семантику и синтаксис для конкретных манипуляций данными и вычислений. Программирование помогает реализовать много сложных операций, позволяя компьютеру решать крайне сложные задачи, в том числе и выполнять защиту ПК от всевозможных вирусов с помощью bitdefender antivirus. Как способ передачи команд и приказов языки программирования являются четким руководством к действию. Ныне существует более 2500 тысяч языков программирования, и их количество стремительно возрастает. Множество из них соответствуют специальным международным стандартам; одни языки применяются только узким кругом людей, например, самими разработчиками; другие становятся популярными среди миллионов пользователей. Профессиональные программисты, зачастую, используют несколько различных языков программирования. Я попробую обсудить наиболее основные из них, языки программирования С(С++) и Java.

Раздел 1. История языка C/C++. Пример использования.

Благодаря чему сложился такой статус языка С? Исторически этот язык неотделим от операционной системы Unix, которая в наши дни переживает свое второе рождение. 60-е годы были эпохой становления операционных систем и языков программирования высокого уровня. В тот период для каждого типа компьютеров независимо разрабатывались ОС и компиляторы, а нередко даже свои языки программирования (вспомним, например, PL/I). В то же время, общность возникающих при этом проблем уже стала очевидной. Ответом на осознание этой общности стала попытка создать универсальную мобильную операционную систему, а для этого понадобился не менее универсальный и мобильный язык программирования. Таким языком стал С, а Unix стала первой ОС, практически полностью написанной на языке высокого уровня.

Он  был разработан Дэнисом Ритчи (Dennis Ritchie) в 1970-х годах для компьютера PDP 
11 компании DEC (Digital Equipment Corporation), в котором использовалась операционная система UNIX. Несмотря на то что некоторые известные языки программирования, в особенности Pascal, достигли к тому времени значительного развития и 
признания, именно язык С определил направление сегодняшнего программирования.

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

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

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

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

Итак, С возник как универсальный язык системного программирования. Но он не остался в этих рамках. К концу 80-х годов язык С, оттеснив Fortran с позиции лидера, завоевал массовую популярность среди программистов во всем мире и стал использоваться в самых различных прикладных задачах. Немалую роль здесь сыграло распространение Unix (а значит и С) в университетской среде, где проходило подготовку новое поколение программистов.

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

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

Первые попытки исправить эти недостатки стали предприниматься еще в начале 80-х годов. Уже тогда Бьерн Страуструп в AT&T Bell Labs стал разрабатывать расширение языка С под условным названием . Стиль ведения разработки вполне соответствовал духу, в котором создавался и сам язык С, - в него вводились те или иные возможности с целью сделать более удобной работу конкретных людей и групп.

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

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

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

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

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

Все это привело к тому, что многие разработчики вынуждены были сами исследовать лабиринты языковой семантики и самостоятельно отыскивать успешно работающие идиомы. Так, например, на первом этапе развития языка многие создатели библиотек классов стремились построить единую иерархию классов с общим базовым классом Object. Эта идея была заимствована из Smalltalk - одного из наиболее известных объектно-ориентированных языков. Однако она оказалась совершенно нежизнеспособной в C++ - тщательно продуманные иерархии библиотек классов оказывались негибкими, а работа классов - неочевидной. Для того чтобы библиотеками классов можно было пользоваться, их приходилось поставлять в исходных текстах.

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

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

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

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

Языку С# "досталось" богатое наследство. Он - прямой потомок двух самых успешных языков программирования (С и C++) и тесно связан с не менее успешным языком Java.

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

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

Листинг 1. С

1 #include <stdio.h> /* Подключаем функции ввода-вывода */

2

3 void main(void)

4 {

5 int М[10]; /* Массив из 10 целых, счет с 0 */

6 int N;

7 for (N=0; N<10; ++N) /* Вводим не более 10 чисел */

8 if (EOF == scanf ("%d, M+N))

9 break; /* Если конец файла, прерываем цикл */

10

11 for (-N; N>=0; --N) /* Проходим массив в обратном */

12 if (M[N]%2) /* порядке и выводим нечетные */

13 printf("%d\n", M[N]);

14 }

  • Строка 3. В C/C++ выполнение программы всегда начинается с функции main.
  • Строки 7 и 11. В заголовке цикла через точку с запятой указываются начальная установка, условие продолжения и правило пересчета параметра цикла. Операции ++ и -/- - известнейшие из сокращений языка С, означающие инкремент и декремент переменной, то есть увеличение и уменьшение ее значения на единицу.
  • Строка 8. Функция scanf вводит по формату, заданному первым параметром, значения переменных, адреса которых заданы остальными параметрами. Здесь адрес, куда вводится значение, вычисляется с помощью адресной арифметики, к адресу расположения массива Мприбавляется смещение на N элементов. Тот же эффект можно получить, записав &M[N].
  • Строка 12. Операция % вычисляет остаток от деления. Условие оператора if считается выполненным, если численное значение выражения отлично от нуля.
  • Строка 13. Функция printf - печать по формату действует аналогично scanf, но вместо адресов ей передаются значения, подлежащие выводу.

1 #include <iostream.h>

2

3 template <class T> class Array

4 {

5 public: Array (T Size=1) : M (new T[Size]), N(Size), n(0) {}

6 Array (void) { delete [] М;}

7 T Count (void) const { return n; }

8 T operator [] (int i) const { return M[i]; }

9 void Add (Т Data);

10 private:

11 T* М; // Адрес распределенной памяти

12 int N, n; // N - распределено; n - использовано

13 };

14

15 template <class T> void Array<T>::Add( T Data )

16 { if (N-n) // Если использовано все распределенное

17 { int* P = new T[N+=10]; // место, распределим побольше

18 for (int i=0; i<n; ++i) // скопируем туда данные

19 P[i] = M[i];

20 delete [ ] М; // освободим старое место

21 М = P; // запомним новый адрес

22 }

23 М[n++] = Data; // занесем число в массив, увеличив счетчик

24 }

25

26 void main (void)

27 { Array<int> A; // Массив целых переменного размера

28 while (1) // Бесконечный цикл

29 { int N;

30 cin >> N; // cin - стандартный поток ввода

31 if (cin.eof()) break; // Выход из цикла по концу файла

32 A.Add( N ); // Добавляем введенное число в массив

33 }

34 for (int N=A.Count()-1; N>=0; --N) // Проходим по массиву

35 if ( A[N]%2)

36 cout <<A[N] <<"\n"; // Выводит число и перевод строки

37 } // Здесь вызовется деструктор Array<Т>, и освободит память

  • Строки 3-13. Объявляется темплетный класс Аrray с параметром Т. Он представляет собой массив переменного размера объектов типа Т. Конечно, в нашей задаче нет никакой необходимости использовать темплетный класс. Однако нам хотелось продемонстрировать, как на C++ создается полиморфная структура данных, способная работать с любым типом элементов.
  • Строка 5. Конструктор класса. В нем инициализируется представление объекта. Например, в поле М заносится адрес блока памяти, заказанного операцией new T[Size].
  • Строка 8. Пример перегрузки операции []. Функция operator [] будет вызываться, когда квадратные скобки будут появляться справа от объекта класса Array .
  • Строка 9. Эта функция основная в реализации. Она добавляет элементы в массив, расширяя его при необходимости. Поскольку она сложнее остальных, ее определение вынесено из описания класса. Функции, описанные в теле класса, реализуются в C++ не вызовом, а inline-подстановкой. Это ускоряет работу программы, хотя увеличивает ее размер.
  • Строки 15-24. Определение функции Аrrау::Add(T) (между прочим, это ее полное имя).
  • Строка 27. Создаем объект типа Array. Темплет Аггау параметризируется типом int.

Раздел 2. История создания языка Java. Пример использования.http://edu.cps.tver.ru/wp-content/uploads/100px-Java_logo.png

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

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

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

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

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

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

Java 1.0

Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только 26 августа 1996 года.

Java 1.2

К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Язык практически не изменился — было добавлено одно ключевое слово strictfp. Платформа получила следующие дополнения:

Библиотека Swing для создания графического интерфейса пользователя.

Коллекции (JSR 166).

Поддержка файлов Policy и цифровых сертификатов пользователя.

Библиотека Accessibility.

Java 2D.

Поддержка технологии drag-and-drop.

Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.

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

Полная поддержка технологии CORBA.

JIT-компилятор, улучшенная производительность.

Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ.

Java 2

В данном случае встречается путаница. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по JDK 1.2 (бывшее название — Java 2). Вместе с тем по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределённые приложения (2011).

В то время, когда, как известно, Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если JDK 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, это приводит к полной путанице.

Java 5.0

Спецификация Java 5.0 была выпущена в сентябре 2004 года. C этой версии изменена официальная индексация, вместо Java 1.5 правильнее называть Java 5.0. Внутренняя же индексация Sun осталась прежней — 1.x. Минорные изменения теперь включаются без изменения индексации, для этого используется слово «Update» или буква «u», например, Java Development Kit 5.0 Update 22. Предполагается, что в обновления могут входить как исправления ошибок, так и небольшие добавления в API, JVM.

В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:

Перечислимые типы (англ. enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.

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

Перечисление может реализовывать интерфейсы.

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

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

Средства обобщённого программирования (англ. generics) — механизм, аналогичный Eiffel (позже также появились и в C#, принципиально отличаются от шаблонов C++), дающий возможность создавать классы и методы с полями и параметрами произвольного объектного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.

Методы с неопределённым числом параметров.

Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-обёртками (например, между int — Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.

Разрешён импорт статических полей и методов.

В язык введён цикл по коллекции объектов (итератор, англ. foreach).

Было введено использование Javadoc-комментариев, которые используются для автоматического оформления документации по комментариям в исходном коде.

Java 6

Релиз версии состоялся 11 декабря 2006 года. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Минорные изменения, как и в Java 5.0, вносятся в обычные обновления версии, например, Java Standard Edition Development Kit 6 Update 27. Внесены следующие изменения:

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

Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями).

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

Организована система управления кэшем и добавлена поддержка параметра «no-cache» в HTTP-запросе.

JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой.

Java HTTP Server, позволяет создать полноценный HTTP сервер, с минимально необходимыми функциональными свойствами.

Повысилась скорость вычислений на 70 %, скорость операций ввода-вывода возросла в два раза.

Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами .gif.

Исправлено большое количество ошибок.

Java 7

Релиз версии состоялся 28 июля 2011 года. В финальную версию Java Standard Edition 7 не были включены все ранее запланированные изменения. Согласно плану развития (план «Б»), включение нововведений будет разбито на две части: Java Standard Edition 7 (без лямбда-исчисления, проекта Jigsaw, и части улучшений Coin) и Java Standard Edition 8 (все остальное), намеченный на конец 2012 года.

В новой версии, получившей название Java Standard Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок, было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standard Edition 7 использован не проприетарный пакет JDK, а его открытая реализация OpenJDK, а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров Oracle с участниками мировой экосистемы Java, комитетом JCP (Java Community Process) и сообществом OpenJDK. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standard Edition 7 собраны на основе кодовой базы OpenJDK, сама эталонная реализация полностью открыта под лицензией GPLv2 с исключениями GNU ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям относится интеграция набора небольших языковых улучшений Java, развиваемых в рамках проекта Coin, добавлена поддержка языков программирования с динамической типизацией, таких, как Ruby, Python и JavaScript, поддержка загрузки классов по URL, обновлённый XML-стек, включающий JAXP 1.4, JAXB 2.2a и JAX-WS 2.2 и другие.

За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом.

Список нововведений:

Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java для поддержки динамически-типизированных языков.

Строгая проверка class-файлов — class-файлы версии 51 (Java Standard Edition 7) или более поздней версии должны быть проверены typechecking-верификатором; JVM не должна переключаться на старый верификатор.

Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования:

Использование класса String в блоке switch.

Закрытие используемых ресурсов в блоке try (try-with-resources) — работает при использовании интерфейса AutoCloseable.

Объединённая обработка исключений в блоке catch (multi-catch exceptions) — перечисление обрабатываемых исключений в catch (… | … | …).

Повторное выбрасывание исключений (rethrowing exceptions) — передача возникшего исключения «вверх» по стеку вызовов.

Подчёркивания в числовых литералах для лучшего восприятия больших чисел.

Изменение вывода типа в Java generic при создании объекта.

Использование двоичных чисел (binary literals) — префикс «0b» укажет, что используется двоичное число.

Упрощение вызова методов varargs — уменьшение предупреждений при вызове метода с переменным числом входящих переменных.

Модификация загрузчика классов (class-loader) — избежание тупиковых ситуаций в неиерархической топологии загрузки классов.

Закрытие ресурсов, открытых URLClassLoader.

Обновление коллекций (JSR 166).

Поддержка Unicode 6.0.

Отделение языка пользователя и языка пользовательского интерфейса — обновление обработки языков для отделения локали от языка пользовательского интерфейса.

Новые интерфейсы I/O для платформы Java (nio.2).

Использование JDBC 4.1 и Rowset 1.1.

Java 8

Релиз версии состоялся 19 марта 2014 года.

Список нововведений:

Полноценная поддержка лямбда-выражений.

Ключевое слово default в интерфейсах для поддержки функциональности по умолчанию.

Ссылки на методы.

Функциональные интерфейсы (предикаты, поставщики и т. д.)

Потоки (stream) для работы с коллекциями

Новое API для работы с датами

Java 9

Список нововведений:

Интеграция jigsaw.

Обновление Process API для лучшего взаимодействия с не-Java процессами операционной системы.

Новый HTTP-клиент с поддержкой HTTP 2.0, веб-сокетов и заменой устаревшему HttpURLConnection.

Классификация платформ Java

Внутри Java существуют несколько основных семейств технологий:

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

Java EE — Java Enterprise Edition, представляет собой набор спецификаций для создания программного обеспечения уровня предприятия.

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

JavaFX — технология, являющаяся следующим шагом в эволюции Java как Rich Client Platform; предназначена для создания графических интерфейсов корпоративных приложений и бизнеса.

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

Применения платформы Java

Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: RuneScape, Amazon, eBay, LinkedIn[29], Yahoo!.

Следующие компании в основном фокусируются на Java (J2EE) технологиях: SAP, IBM, Oracle. В частности, СУБД Oracle Database включает JVM как свою составную часть, обеспечивающую возможность непосредственного программирования СУБД на языке Java, включая, например, хранимые процедуры.

Производительность

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

Некоторые платформы предлагают аппаратную поддержку выполнения для Java. К примеру, микроконтроллеры, выполняющие код Java на аппаратном обеспечении вместо программной JVM, а также основанные на ARM процессоры, которые поддерживают выполнение байткода Java через опцию Jazelle.

Примитивные типы

В языке Java только 8 примитивных (скалярных, простых) типов: boolean, byte, char, short, int, long, float, double. Существует также вспомогательный девятый примитивный тип — void, однако переменные и поля такого типа не могут быть объявлены в коде, а сам тип используется только для описания соответствующего ему класса, для использования при рефлексии. Кроме того, с помощью класса Void можно узнать, является ли определённый метод типа void:Hello.class.getMethod("main", Array.newInstance(String.class, 0).getClass()).getReturnType() == Void.TYPE.

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией, и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причём в Java, в отличие от других языков, он не является беззнаковым. Типы float и double могут иметь специальные значения +\infty-\infty и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float — так же, но с приставкой Float вместо Double. Минимальные и максимальные значения, принимаемые типами float и double, тоже стандартизованы.

Тип

Длина (в байтах)

Диапазон или набор значений

boolean

1 в массивах, 4 в переменных

true, false

byte

1

−128..127

char

2

0..216−1, или 0..65535

short

2

−215..215−1, или −32768..32767

int

4

−231..231−1, или −2147483648..2147483647

long

8

−263..263−1, или примерно −9.2·1018..9.2·1018

float

4

-(2-2−23)·2127..(2-2−23)·2127, или примерно −3.4·1038..3.4·1038, а также -\infty\infty, NaN

double

8

-(2-2−52)·21023..(2-2−52)·21023, или примерно −1.8·10308..1.8·10308, а также -\infty\infty, NaN

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

Преобразования при математических операциях

В языке Java действуют следующие правила:

  1. Если один операнд имеет тип double, другой тоже преобразуется к типу double.
  2. Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
  3. Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
  4. Иначе оба операнда преобразуются к типу int.

Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в C++[34].

Шаблоны в Java (generics)

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

// Объявление обобщённого класса

class GenericClass<E> {

E getFirst() { ... }

void add(E obj) { ... }

}

// Использование обобщённого класса в коде

GenericClass<String> var = new GenericClass<String>();

var.add("qwerty");

String p = var.getFirst();

Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <T extends A & B & C...> требует, чтобы тип-параметр T реализовывал интерфейсы A, B, C и так далее, а конструкция <T super C>требует, чтобы тип-параметр T был типом C или одним из его предков.

В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.

Проверка принадлежности к классу

В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).

Далее функция getClass(), определённая для всех объектов, выдаёт объект типа Class. Для каждого класса создаётся не более одного описывающего его объекта типа Class, поэтому эти объекты можно сравнивать. Так, например, foo.getClass() == bar.getClass() будет истинно, если объекты foo и bar принадлежат к одному классу.

Кроме того, объект типа Class любого типа можно получить так: Integer.class, Object.class.

Прямое сравнение классов не всегда является оптимальным средством проверки на принадлежность к классу. Зачастую вместо него используют функциюisAssignableFrom(). Эта функция определена у объекта типа Class и принимает объект типа Class в качестве параметра. Таким образом, вызовFoo.class.isAssignableFrom(Bar.class) вернёт true в случае, если Foo является предком класса Bar. Так как все объекты являются потомками типа Object, вызов Object.class.isAssignableFrom() всегда вернёт true.

В паре с упомянутыми функциями объекта типа Class используются также функции isInstance() (эквивалентно instanceof), а также cast() (преобразует параметр в объект выбранного класса).

Средства разработки ПО :

  • JDK — помимо набора библиотек для платформ Java SE и Java EE, содержит компилятор командной строки javac и набор утилит, также работающих в режиме командной строки.
  • NetBeans IDE — свободная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Oracle, владельцем технологии Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, PHP, Fortran и др.).
  • Eclipse IDE — свободная интегрированная среда разработки для Java SE, Java EE и Java ME[37]. Пропагандируется IBM, одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.)
  • IntelliJ IDEA — среда разработки для платформ Java SE, Java EE и Java ME. Разработчик — компания JetBrains. Распространяется в двух версиях: свободной бесплатной (Community Edition) и коммерческой проприетарной (Ultimate Edition).
  • JDeveloper — среда разработки для платформ Java SE, Java EE и Java ME. Разработчик — компания Oracle.
  • BlueJ — среда разработки программного обеспечения на языке Java, созданная в основном для использования в обучении, но также подходящая для разработки небольших программ.
  • Java для iOS — обучающее приложение и компилятор для iOS.
  • Geany — свободная среда разработки программного обеспечения, написанная с использованием библиотеки GTK2

Недостатки языка Java

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

В заключении

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

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

1. http://ssdd.clan.su/publ/sss/istorija/jazyki_si/2-1-0-1

2. http://progopedia.ru/language/ada/

3. https://ru.wikipedia.org/wiki/Java

4. http://aveweb.ru/article/read/java.html

5. http://uralcons.org/uchashhimsya/yazyki-programmirovaniya-v-sovremennom-mire.html

6. http://codenet.ru/progr/cpp/ccpphistory.php

7.http://bibliofond.ru/view.aspx?id=564378

8. http://ru.wikipedia.org/wiki/C_Sharp

9. Джошуа Блох. Java. Эффективное программирование = Effective Java. — М.: Лори, 2002

10. Монахов Вадим. Язык программирования Java и среда NetBeans. — 3-е изд.

11. Брюс Эккель. Философия Java = Thinking in Java. — 3-е изд.

12. Герберт Шилдт. Java 8. Полное руководство, 9-е издание = Java 8.

13. Кей С. Хорстманн, Гари Корнелл. Java. Библиотека профессионала, том 1. Основы. 9-е издание

14. Бьярне Страуструп. Программирование: принципы и практика использования C++, исправленное издание = Programming: Principles and Practice Using C++. — М.:«Вильямс», 2011. — С. 1248