Файл: История возникновения и развития языка программирования Си(С++) и Java (История языка C/C++. Пример использования).pdf
Добавлен: 28.06.2023
Просмотров: 77
Скачиваний: 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 сервер, с минимально необходимыми функциональными свойствами.