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

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 82

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Языку С# "досталось" богатое наследство. Он - прямой потомок двух самых успешных языков программирования (С и 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. Пример использования.

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 сервер, с минимально необходимыми функциональными свойствами.