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

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

Содержание:

Введение

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

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

Как известно, современные приложения должны быть, в первую очередь, безопасны, отличаться высокой производительностью, быть работоспособными в распределенной среде, нейтральными к архитектуре. Данные факторы способствовали пересмотру взглядов на сам процесс создания и распределения приложений на множестве ЭВМ различной архитектуры и следующей ступенью на лестнице прогресса языков программирования стал язык Java, который первоначально назывался Oak ("Дуб"). Работа над его созданием началась в 1991 году в компании Sun Microsystems. Основной движущей силой разработки Java был Джеймс Гослинг (James Gosling). Java — это структурный объектно-ориентированный язык программирования, синтаксис и основополагающие принципы которого "родом" из C++, он удовлетворяет всем вышеперечисленным требованиям.

Объект: история языков программирования Cи, C++ и Java.

Предмет: возникновение и развитие языков программирования Cи, C++ и Java.

Цель работы: изучить историю возникновения и развития языков программирования Си, (C++) и Java.

Задачи:

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

Глава I. Программирование на Cи и C++

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

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

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

Язык С++ который многие называют (Си с классами) был создан Бьерном Страуструпом (Bjame Stroustrup) в 1979 году в компании Bell Laboratories (г. Муррей-Хилл, шт. Нью-Джерси) он способствовал добавлению в привычный Си методы объектного языка – классы, служащие для представления внутренней структуры объектов, механизм наследования и новые средства работы с динамической памятью и с вводом/выводом. Благодаря данным средствам появилась возможность не только писать объектно-ориентированные программы, но и создавать библиотеки шаблонов, классов – т.е. расширить инструментарий пользователя и сферу применения самого языка [2].

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

История развития языков Си и С++

Создание Си знаменует собой начало современной эпохи программирования. Язык Си был разработан Деннисом Ритчи (Dennis Ritchie) в 1970-е годы для программирования на мини – ЭВМ DEC PDP-11 под управлением операционной системы Unix. Несмотря на то, что в ряде предшествовавших языков, в особенности Pascal, был достигнут значительный прогресс, именно Си установил тот образец, которому до сих пор следуют в программировании [3].

Язык Си появился в результате революции в структурном программировании в 1960-е годы. До появления структурного программирования писать большие программы было трудно, поскольку логика программы постепенно вырождалась в так называемый "макаронный" код — запутанный клубок безусловных переходов, вызовов и возвратов, которые трудно отследить. В структурированных языках программирования этот недостаток устранялся путем ввода строго определенных управляющих операторов, подпрограмм с локальными переменными и других усовершенствований. Благодаря применению методов структурного программирования сами программы стали более организованными, надежными и управляемыми [1].

Хотя в то время существовали и другие структурированные языки программирования такие как (Pascal, Ada) именно в Си впервые удалось добиться удачного сочетания эффективности, изящества и выразительности. Благодаря своему краткому, но простому синтаксису в сочетании с принципом, ставившим во главу угла программиста, а не сам язык, Си быстро завоевал многих сторонников. Сейчас уже нелегко представить себе, что Си оказался своего рода "струей свежего воздуха", которого так не хватало программистам.
В итоге Си стал самым распространенным языком структурного программирования в 1980-е годы [3].

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

Язык С++ был создан Бьерном Страуструпом (Bjane Stroustrup) в 1979 году в компании Веll Laboratories (г. Муррей-Хилл, шт. Нью-Джерси). Сначала новый язык получил имя "Си с классами" (С with Classes), но в 1983 году он стал называться С++. Страуструп построил С++ на фундаменте языка Си, включающем все его средства, атрибуты и основные достоинства. Для него также остается в силе принцип Си, согласно которому программист, а не язык, несет ответственность за результаты работы своей программы. Именно этот момент позволяет понять, что изобретение С++ не было попыткой создать новый язык программирования. Это было скорее усовершенствование уже существующего (и при этом весьма успешного) языка [2].

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

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

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

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

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

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

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

В октябре 2011года появился новый стандарт языка [6]. Его обозначение – C++11 или ISO/IEC 14882:2011. Полная его поддержка обещана в GCC 4.7. А в декабре 2011г. принимают новый стандарт и для языка Си. Эту версию условно называют С11 или ISO/IEC 9899:2011. Часть её возможностей уже сейчас поддерживается компилятором GCC.

Помимо С++, существуют два других современных языка программирования: Java и С# (C Sharp). Язык. Jаvа разработан компанией Sun Microsystems, а С# (C Sharp) – компанией Мicrоsоft [2].

Базовые понятия языков Си и С++

Алфавит языка представляет собой набор знаков (символов), который допустим в данном языке. Такое определение справедливо и для языка человека, и для языков программирования.

В языке С++ алфавит можно условно разделить на группы знаков:

  • прописные и строчные латинские буквы (A, B,..., Z, a, b,..., z);
  • арабские цифры (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
  • специальные знаки: ", { } | [ ] ( ) + - / % \ ; '. : ? < = > _ ! & * # ~ ^;
  • пробельные символы – это символы пробела, табуляции, перехода на новую строку [6].

Идентификатор – это имя какого-либо объекта программы. Например, имена дают переменным, функциям, классам и так далее. Имя может состоять из латинских букв, цифр и символа _ (символ подчеркивания). Начинаться имя может с буквы или символа подчеркивания, но не с цифры. Важно учитывать, что прописные и строчные латинские буквы, используемые в идентификаторах, считаются различными (это требование является общим для всех Си-подобных языков: Си, С++, С#, Java, Perl и многих других. В таких же языках, как Fortran, Pascal, Basic не делается различия в именах между прописными и строчными латинскими буквами).

Пример допустимых идентификаторов:

  • Alfa Alfa;
  • ALFA x _x a25 i_tek.

Обратим внимание: здесь alfa, Alfa и ALFA – разные имена.

Имена, подобные приведённым ниже, ни в коем случае нельзя использовать в качестве идентификаторов:

  • 25a (начинается с цифры);
  • Дождь (кириллица не допустима).

Общепринятые рекомендации по использованию имён:

  • желательно, чтобы имя объекта было осмысленным, но не обязательно;
  • в качестве имён констант используйте имена, состоящие из прописных латинских букв, например: AI, GAMES;
  • не используйте имена, начинающиеся с символа подчеркивания, так как такие имена часто используют разработчики компиляторов для своих целей;
  • чем больше область видимости имени, тем более выразительным и длинным должно быть имя.

Короткие однобуквенные или двухбуквенные имена допустимы только внутри небольших блоков программы, внутри коротких функций пользователя. Длина имени в большинстве случаев не ограничена, но на длину внешних имён (имён библиотек, функций) может накладывать ограничение операционная система [6].

Ключевые (зарезервированные) слова – это слова, которые можно использовать в программе только по их прямому назначению, то есть эти имена нельзя использовать для обозначения, например, своих переменных [2].

В языке С++ имеется 63 ключевых слова. Все они приведены в (Прил.1). Константы – это неизменяемые величины. В языке C++ имеется пять типов констант: целые, вещественные, символьные, строковые и булевы.

1. Целые константы Правила языка допускают использование трёх видов целых констант: десятичных, шестнадцатеричных и восьмеричных. Основание определяется префиксом в записи константы. Для десятичных констант префикс не нужен.

Десятичное целое – это последовательность десятичных цифр, начинающаяся не с нуля (если это не число нуль), например:

  • 100 25 0 2007

Восьмеричное целое – это последовательность цифр, начинающаяся с 0 и не содержащая десятичных цифр старше 7, например:

  • 015 – восьмеричное представление десятичного целого 13;
  • 025 – восьмеричное представление десятичного целого 21.

Шестнадцатеричное целое – это последовательность шестнадцатеричных цифр (0, 1,…, 9, А, B, С, D, Е, F), перед которой записаны символы 0х или 0Х, например:

  • 0х25 – шестнадцатеричное представление десятичного целого 37;
  • 0ХFF – шестнадцатеричное представление десятичного целого 255.

2. Вещественные константы. Для представления вещественных (нецелых) чисел используются константы, представляемые в памяти компьютера в форме с плавающей точкой. Каждая вещественная константа состоит из следующих частей:

  • целая часть (десятичная целая константа);
  • десятичная точка;
  • дробная часть (десятичная целая константа);
  • признак показателя "е" или "Е"; показатель десятичной степени (десятичная целая константа, возможно, со знаком).

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

125. 3.14159265 1.0е-5 .314159Е25 0.0

3. Символы, или символьные константы. Для изображения отдельных знаков, имеющих индивидуальные внутренние коды, используются символьные константы. Каждая символьная константа – это лексема, которая состоит из изображения символа и ограничивающих апострофов. Например: 'A', 'a', '5', '?', и так далее [8].

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

Ниже приведен их список:

  • '\n' – перевод строки;
  • '\t' – горизонтальная табуляция;
  • '\r' – возврат каретки (курсора) к началу строки;
  • '\\' – обратная косая черта \;
  • '\'' – апостроф (одиночная кавычка);
  • '\"' – кавычка (символ двойной кавычки);
  • '\0' – нулевой символ;
  • '\a' – сигнал-звонок;
  • '\b' – возврат на одну позицию (на один символ);
  • '\f' – перевод страницы;
  • '\v' – вертикальная табуляция;
  • '\?' – знак вопроса.

Нужно обратить внимание на то, что перечисленные константы изображаются двумя или более литерами, а обозначают они одну символьную константу, имеющую индивидуальный двоичный код. Управляющие последовательности являются частным случаем Escape – последовательностей (ESCAPE-sequence), к которым также относятся лексемы вида '\ddd' либо'\xhh' или '\Xhh', где '\ddd' – восьмеричное представление любой символьной константы. Здесь d – восьмеричная цифра (от 0 до 7). Например, '\017' или '\233' а '\xhh' или '\Xhh' – шестнадцатеричное представление любой символьной константы. Здесь h – шестнадцатеричная цифра (от 0 до F). Например, '\x0b', '\x1A', и так далее [1].

Символьная константа (символ) имеет целый тип, то есть символы можно использовать в качестве целочисленных операндов в выражениях.

4. Строки, или строковые константы. Строки вообще-то не относятся к константам языка С++, а представляют собой отдельный тип его лексем. Для них в литературе используется еще одно название: «строковые литералы». Строковая константа определяется как последовательность символов заключенная в двойные кавычки (не в апострофы) например: "Это строка"

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

В этом случае, как и в представлениях отдельных символьных констант, их изображения начинаются с обратной косой черты '\' например: "\n Текст \n разместится \n на 3-х строках"

Представления строковых констант в памяти компьютера подчиняются следующим правилам. Все символы строки размещаются подряд, и каждый символ (в том числе представленный Escape – последовательностью) занимает ровно 1 байт. В конце записи строковой константы компилятор помещает символ '\0'.

Таким образом, количество байтов, выделяемое в памяти компьютера для представления значения строки, на единицу больше, чем число символов в записи этой строковой константы [4].

При работе с символьной информацией важно помнить, что длина символьной константы, например, 'A' равна 1 байту, а длина строки "A" равна 2 байтам, так как строка заканчивается нуль-символом ('\0').

5. Булевы константы. Имеется всего два значения: true – истина и false – ложь.

6. Комментарии, комментарий – это последовательность любых знаков (символов), которая используется в тексте программы для её пояснения. Обычно в тексте программы делают вводный комментарий к программе в целом (автор, название программы, дата и так далее). Дают комментарии к отдельным фрагментам текста программы, смысл которых не является очевидным. Важно дать объяснение не только того, что делается, а с какой целью это делается. Комментарии важны всегда будь то создание программа для себя, или для работы других программистов [2].

Комментарии игнорируются компилятором языка программирования, они имеют значение только для пользователя. В языке С++ имеется два вида комментариев: однострочные и многострочные.

Однострочный комментарий – начинается с символов // (две косые черты). Всё, что записано после этих символов и до конца строки, считается комментарием. Например:

// Это текст комментария – Hello, world!

Многострочный комментарий – начинается парой символов /* (косая черта и звёздочка) и заканчивается символами */ (звёздочка и косая черта). Текст такого комментария может занимать одну или несколько строк. Всё, что находится между знаками /* и */, считается комментарием. Например:

/* Это мой большой

многострочный комментарий – Hello, world! */

В языке С++ определен ряд заголовков (header), которые обычно содержат информацию, необходимую для программы. Который представляет собой внешний исходный файл, помещаемый компилятором в начало программы с помощью директивы #include[2].

Пространства имен – относительно недавнее дополнение к языку С++. Приведем пример: using namespace std.

Прocтранство имен (namespace) создает декларативную область, в которой могут размещаться различные элементы программы. Пространство имен позволяет хранить одно множество имен отдельно от дрyгoго. С помощью этого средства можно упростить организацию больших программ. Ключевое слово using информирует компилятор об использовании заявленного пространства имен (в данном случае std). Именно в пространстве имен std объявлена вся библиотека стандарта С++. Таким образом, используя пространство имен std, мы упрощаем доступ к стандартной библиотеке языка. Поскольку пространства имен – относительно новое средство, старые компиляторы могут его не поддерживать [2].

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

Глава II Программирование Java

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

Главными причинами, побуждающими к созданию нового языка программирования, служат совершенствование искусства программирования и изменения в вычислительной среде. И Java не является исключением из этого правила. Опираясь на богатое наследие Си и С++, этот язык программирования расширен и дополнен средствами, отражающими текущее положение дел в программировании. Отвечая потребностям возникшей интерактивной среды, Java предоставляет средства, упрощающие создание прикладных программ с распределенной архитектурой [5].

Java – язык программирования, который был разработан в компании SunMicrosystems Джеймсом Гослингом, Патриком Нотоном, Крисом Уортом, Эдом Фрэнком и Майком Шериданом. Первоначально он назывался Oak («дуб»), но в 1995 году, когда за его продвижение на рынке взялись маркетологи, и он был переименован в Java [5].

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

Язык Java очень похож на языки Си и С++. От С язык Java унаследовал синтаксис, а от С++ – объектную модель. Сходство Java с языками Си и С++ играет важную роль. Во-первых, многие программисты знакомы с синтаксисом Си и С++, что упрощает изучение языка Java. Те же, кто освоил Java, могут без труда изучить Си и С++. Во-вторых, тем, кто программирует на Java, не приходится изобретать колесо. Они могут успешно применять уже известные и хорошо зарекомендовавшие себя подходы. Современная эпоха в программировании, по существу, началась с языка Си. Затем появился язык С++, а после него – Java. Имея такое богатое наследство, Java предоставляет программистам производительную и логически согласованную среду, в которой были реализованы лучшие из уже известных решений и добавлены новые средства, необходимые для интерактивной среды. Очень важно отметить тот факт, что вследствие своей схожести языки Си, С++ и Java сформировали концептуальную основу для профессионального программирования. При переходе от одного языка к другому программистам не приходится преодолевать глубокие "пропасти" принципиального характера. Один из принципов проектирования, заложенных в основу Си и С++, заключается в предоставлении программисту широчайших полномочий. Разработчики Java также следовали этому принципу. Если не учитывать ограничения, накладываемые средой Интернета, то следует признать, что Java предоставляет программисту полный контроль над кодом. Если вы умеете грамотно программировать, это будет видно по вашим программам. Недостаток опыта также отразится на ваших программах. Одним словом, Java – язык не для дилетантов, а для профессионалов [5].

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

Беря во внимание произношение в русском языке, мы видим, что образовались две разные нормы данного языка – заимствованная англоязычная «Джава» и традиционно-национальная «Ява», которая соответствует принятому произношению названия острова Ява. Компания Sun придерживается первого варианта – англоязычного произношения везде. Иногда в обычной жизни применяют и жаргонное слово «Жаба» (например, изображение жабы есть на календариках группы российских пользователей Java (JavaUsersGroup) [7].

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

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

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

Как это ни удивительно, на первых порах сами разработчики языка не ставили перед собой задач разработки интернет-приложений. Их целью было создание платформенно-независимого языка, на котором можно было бы писать встраиваемое программное обеспечение для различной бытовой аппаратуры с микропроцессорным управлением, в том числе тостеров, микроволновых печей и пультов дистанционного управления. Как правило, в устройствах подобного типа применялись контроллеры на базе микропроцессоров различной архитектуры, а исполняемый код, генерируемый компиляторами большинства существовавших в то время языков программирования, был ориентирован на определенные типы процессоров. Характерным тому примером может служить язык С++. Несмотря на то, что программу, написанную на С++, можно выполнить на процессоре практически любого типа, сделать это можно, лишь скомпилировав ее в исполняемый код команд конкретного процессора. Создание компиляторов – длительный и трудоемкий процесс, поэтому в поисках оптимального решения Гослинг и другие члены рабочей группы остановились на межплатформенном языке, для которого компилятор генерировал бы код, способный выполняться на разных процессорах в различных вычислительных средах. В конце концов их усилия увенчались созданием языка, известного теперь под названием Java. В то время как разработчики Java уточняли детали создаваемого ими языка, началось бурное развитие "Всемирной паутины", во многом определившей будущее Java. Если бы не формирование веб-сообщества, язык Java, вероятно, нашел бы лишь ограниченное применение, главным образом в разработке программ, встраиваемых в специализированные контроллеры. Но как только широкодоступный Интернет стал реальностью, появилась острая потребность в переносимых программах, что и послужило причиной для выдвижения Java на передний план в качестве основного языка разработки подобных программ [5].

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

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

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

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

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

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

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

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

Основные возможности:

  • автоматическое управление памятью;
  • расширенные возможности обработки исключительных ситуаций;
  • богатый набор средств фильтрации ввода/вывода;
  • набор стандартных коллекций, таких как массив, список, стек и тому подобное;
  • наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI – программный интерфейс вызова удаленных методов в языке Java.);
  • наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
  • встроенные в язык средства создания многопоточных приложений;

Унифицированный доступ к базам данных:

  • на уровне отдельных SQL-запросов на основе JDBC, SQLJ;
  • на уровне концепции объектов, обладающих способностью к хранению в базе данных – на основе Java Data Objects и Java Persistence API;
  • поддержка шаблонов (начиная с версии 1.5);
  • параллельное выполнение программ [5].

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

История Java восходит к 1991 году, когда группа инженеров из компании Sun Microsystems под руководством Патрика Нотона (Patrick Naughton) и члена совета директоров (и разностороннего специалиста) Джеймса Гослинга (James Gosling) занялась разработкой языка, который можно было бы использовать для программирования бытовых устройств, например, контроллеров для переключения каналов кабельного телевидения. Подобные устройства не обладают большими вычислительными мощностями и объемом оперативной памяти, и поэтому новый язык должен был быть простым и способным генерировать очень компактный код. Кроме того, разные производители могут выбирать разные процессоры для контроллеров, и поэтому было очень важно не привязываться к конкретной их архитектуре. Проект создания нового языка получил кодовое название "Green" [7].

В конце 1992 года, предприняв, по выражению тогдашнего инженера проекта Патрика Нотона (Patrick Naughton), "огромные усилия по доработке Oak и других компонентов", коллектив проекта "Green" выпустил "*7" - устройство типа PDA, названное Гослингом "ручным пультом дистанционного управления" [7].

Стремясь получить компактный и независимый от платформы код, разработчики решили создать переносимый язык, способный генерировать промежуточный код для виртуальной машины. Большинство сотрудников компании Sun Microsystems имели опыт работы с операционной системой Unix, поэтому в основу разрабатываемого ими языка был положен язык C++, а не Lisp, Smalltalk или Pascal. Как сказал Гослинг в своем интервью: "Язык — это всегда средство, а не цель". Сначала Гослинг решил назвать его Oak (Дуб). (Возможно потому, что он любил смотреть на дуб, росший прямо под окнами его рабочего кабинета в компании Sun Microsystems.) Затем сотрудники компании узнали, что слово "Oak" уже используется в качестве имени ранее созданного языка программирования, и изменили название на Java [7].

Тем временем в рамках Интернета начала развиваться система под названием World Wide Web (Всемирная паутина). Ключевым элементом этой системы является браузер, превращающий гипертекстовые данные в изображение на экране. В 1994 году большинство пользователей применяли некоммерческий веб-браузер Mosaic, разработанный в суперкомпьютерном центре университета штата Иллинойс в 1993 г. Частично этот браузер был написан Марком Андреессеном (Mark Andreessen), подрядившимся работать за 6,85 доллара в час. В то время Марк заканчивал университет, и браузер был его дипломной работой. (Затем он достиг известности и успеха как один из основателей и ведущих специалистов компании Netscape.)

В 2014 году была выпущена версия Java 8 с наиболее существенными изменениями почти за двадцать лет существования этого языка. В версии Java 8 предпринята попытка внедрить стиль "функционального" программирования, чтобы упростить выражение вычислений, которые могут выполняться параллельно. Все языки программирования должны развиваться, чтобы оставаться актуальным, и в этом отношении язык Java проявил себя с наилучшей стороны. В таблице сведены данные об этапах развития языка и библиотек Java (Прил.4) [7].

Базовые понятия языка

Алфавит языка Java состоит из букв, десятичных цифр и специальных символов. Буквами считаются латинские буквы (кодируются в стандарте ASCII), буквы национальных алфавитов (кодируются в стандарте Unicode, кодировка UTF-16), а также соответствующие им символы, кодируемые управляющими последовательностями

Буквы и цифры можно использовать в качестве идентификаторов, то есть имен переменных, методов и других элементов языка программирования. Правда, при использовании в идентификаторах национальных алфавитов в ряде случаев могут возникнуть проблемы – эти символы будут показываться в виде вопросительных знаков [4].

Как буквы рассматривается только часть символов национальных алфавитов. Остальные символы национальных алфавитов – это специальные символы. Они используются в качестве операторов и разделителей языка Java и не могут входить в состав идентификаторов.

Латинские буквы ASCII:

  • ABCD...XYZ – заглавные (прописные);
  • abcd...xyz – строчные;
  • Дополнительные "буквы" ASCII;
  • _ – знак подчеркивания;
  • $ – знак доллара.

Национальные буквы на примере русского алфавита:

  • АБВГ…ЭЮЯ - заглавные (прописные);
  • абвг…эюя – строчные;
  • Десятичные цифры0 1 2 3 4 5 6 7 8 9.

В исходном коде Java (так называемые литерные константы) могут быть десятичными или шестнадцатеричными. Они записываются либо символами ASCII, или символами Unicode следующим образом.

Десятичные константы записываются как обычно. Например: 137.

Шестнадцатеричная константа начинается с символов 0x или 0X (цифра 0, после которой следует латинская буква X), а затем идет само число в шестнадцатеричной нотации. Например: 0x10 соответствует; 0x2F соответствует, и так далее [5].

Целая константа в обычной записи имеет тип int. Если после константы добавить букву L (или l, что в тесте видно хуже, но в среде разработки выделяется цветом), она будет иметь тип long, обладающий более широким диапазоном значений, чем тип int.

Поясним теперь, что такое шестнадцатеричная нотация записи чисел и зачем она нужна. Информация представляется в компьютере в двоичном виде как последовательность бит.

Бит – это минимальная порция информации, он может быть представлен в виде ячейки, в которой хранится или ноль, или единица. Но бит – слишком мелкая единица, поэтому в компьютерах информация хранится, кодируется и передается байтами – порциями по 8 бит [5].

Под "ячейкой памяти" будет пониматься непрерывная область памяти с последовательно идущими адресами, выделенная программой для хранения данных [4].

Мы привыкли работать с числами, записанными в так называемой десятичной системе счисления. В ней имеется 10 цифр (от 0 до 9), а в числе имеются десятичные разряды. Каждый разряд слева имеет вес 10 по сравнению с предыдущим, то есть для получения значения числа, соответствующего цифре в каком-то разряде, стоящую в нем цифру надо умножать на 10 в соответствующей степени [5].

В программировании десятичной системой счисления пользоваться не всегда удобно, так как в компьютерах информация организована в виде бит, байт и более крупных порций. Человеку неудобно оперировать данными в виде длинных последовательностей нулей и единиц. В настоящее время в программировании стандартной является шестнадцатеричная система записи чисел. Например, с ее помощью естественным образом кодируется цвет, устанавливаются значения отдельных бит числа, осуществляется шифрование и дешифрование информации, и так далее. В этой системе счисления все очень похоже на десятичную, но только не 10, а 16 цифр, и вес разряда не 10, а 16. В качестве первых 10 цифр используются обычные десятичные цифры, а в качестве недостающих цифр, больших 9, используются заглавные латинские буквы A, B, C, D, E, F: 0 1 2 3 4 5 6 7 8 9 A B C D E F. То есть A=10, B=11, C=12, D=13, E=14, F=15.

Заметим, что в шестнадцатеричной системе счисления числа от 0 до 9 записываются одинаково, а превышающие 9 отличаются. Для чисел от 10 до 15 в шестнадцатеричной системе счисления используются буквы от A до F, после чего происходит использование следующего шестнадцатеричного разряда. Десятичное число 16 в шестнадцатеричной системе счисления записывается как 10. Для того, чтобы не путать числа, записанные в разных системах счисления, около них справа пишут индекс с указанием основания системы счисления. Для десятичной системы счисления это 10, для шестнадцатеричной 16 [5].

Для десятичной системы основание обычно не указывают, если это не приводит к путанице. Точно так же в технической литературе часто не указывают основание для чисел, записанных в шестнадцатеричной системе счисления, если в записи числа встречаются не только "обычные" цифры от 0 до 9, но и "буквенные" цифры от A до F. Обычно используют заглавные буквы, но можно применять и строчные [5].

Так же в Java, как и в Cи есть зарезервированные слова для синтаксических конструкций языка, причем их назначение нельзя переопределять внутри программы (Прил. 2) [5]. Их нельзя использовать в качестве идентификаторов (имен переменных, подпрограмм и т.п.), но можно использовать в строковых выражениях.

В языке Java только 8 примитивных (скалярных, простых) типов: boolean, byte, char, short, int, long, float, double.

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в (Прил. 3) [5].

Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java) когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte, причем в Java, в отличие от других языков, он не является беззнаковым. Типы float и double могут иметь специальные значения. Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float – так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы (Прил. 3) [5].

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

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

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

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

Характерные особенности Java Создатели Java составили официальное техническое описание, в котором объяснялись цели и достоинства нового языка. В этом документе приведено одиннадцать характерных особенностей Java. Этот язык

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

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

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

Заключение

Анализ научно-методической литературы позволил нам сделать следующие выводы:

  1. С появлением языков Си и C++ произошел стремительный прорыв в развитии всего программирования. С++ и сегодня занимает доминирующее положение среди всех зыков программирования в мире. Благодаря ему множество программистов разрабатывает огромное число различных проектов. И в будущем этот язык программирования сохранит свои позиции, совершенствуясь изо дня в день.
  2. Язык Java является объектно-ориентированным и поставляется с достаточно объемной библиотекой классов. Благодаря библиотекам классов Java значительно упростилась разработку мобильных приложений, ведь в распоряжение программиста предоставлены мощные средства для решения распространенных задач. Вследствие этого программист имеет возможность больше внимания уделить решению прикладных задач, а не таких, как, например, организация динамических массивов, взаимодействие с ОС или реализация элементов пользовательского интерфейса.
  3. Язык С++ занимает лидирующие позиции он изо дня в день совершенствуется и хорошо подходит для разработки приложений – Windows. Java прекрасный язык программирования. Многие программисты отдают предпочтение именно ему, а не языку С, C++ или С#. Он значительно упрощает разработку мобильных и Web приложений.

Библиографический список

  1. Страуструп Б. Язык программирования С++. Специальное издание. : Пер. с англ. — М.: Издательский дом "Бином", 2011. — 1136 с.
  2. Шилдт Г. Полный справочник по С++. : Пер. с англ. — М.: Издательский дом "Вильяме", 2006. — 800 с.
  3. Шилдт Г. C# 4.0: полное руководство. : Пер. с англ. — М.: Издательский дом "Вильямс", 2011. —1056 с.
  4. Эферган М. Java: справочник.- QUE Corporation. : Пер. с англ. — М.: Издательство "Питер Ком", 1998. — 687 с.
  5. Шилдт Г. Java 8: руководство для начинающих, 6-е издание. : Пер. с англ. — М.: Издательский дом "Вильямс", 2015. – 720 с.
  6. Либерти Д. Освой самостоятельно C++ за 21 день. : Пер. с англ. — М.: Издательский дом "Вильямс", 2001. — 834 с.
  7. Хорстманн, К C. Java. Библиотека профессионала, том 1. Основы. 10-е издание. : Пер. с англ. — М.: Издательский дом "Вильямс", 2016. — 864 с.
  8. Базовые понятия языка // URL: http://victor192007.narod.ru/files/cpp01.html.

Приложение

Приложение 1.

Ключевые слова подмножества C языка C++

(Шилдт Г. Полный справочник по С++: 2006. — 35 с.)

asm

do

if

return

typedef

auto

double

inline

short

typeid

bool

dynamic_cast

int

signed

typename

break

else

long

sizeof

union

case

enum

mutable

static

unsigned

catch

explicit

namespace

static_cast

using

char

export

new

struct

virtual

class

extern

operator

switch

void

const

false

private

template

volatile

const_cast

float

protected

this

wchar_t

continue

for

public

throw

while

default

friend

register

true

delete

goto

reinterpret_cast

try

Приложение 2.

Ключевые слова Java

(Шилдт Г. Java 8: руководство для начинающих, 6-е издание: 2015. – 54 с.)

abstract

byte

case

const

continue

catch

char

class

else

enum

default

do

double

finally

float

extends

false

final

implements

import

for

goto

if

long

native

instanceof

int

interface

private

protected

new

null

package

static

super

public

return

short

throw

throws

switch

synchronized

this

void

volatile

transient

true

try

while

Приложение 3.

Встроенные элементарные типы Java

(Шилдт Г. Java 8: руководство для начинающих, 6-е издание: 2015. – 59 с.)

Тип

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

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

boolean

не определено

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, а также , , NaN

double

8

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

Приложение 4.

Этапы развития языка Java

(Хорстманн, К C. Java. Библиотека профессионала, том 1. Основы. 10-е издание: 2016. — 864 с.)

Версия

Год выпуска

Новые языковые средства

Количество классов

и интерфейсов

1.0

1996

Выпуск самого языка

211

1.1

1997

Внутренние классы

477

1.2

1998

Отсутствуют

1524

1.3

2000

Отсутствуют

1840

1.4

2002

Утверждения

2723

5.0

2004

Обобщенные классы, цикл в стиле for each, автоупаковка,

аргументы переменной длины, метаданные, перечисления,

статический импорт

3279

6

2006

Отсутствуют

3793

7

2009

Оператор switch со строковыми метками ветвей, ромбовидный

оператор, двоичные литералы, усовершенствованная обработка

исключений

4024

8

2014

Лямбда-выражения, интерфейсы с методами по умолчанию,

потоки данных и библиотеки даты и времени

4240