Анализ нововведений в объектно-ориентированном языке программирования Java

Актуальные проблемы авиации и космонавтики - 2014. Информационные технологии

УДК 004.432.2

А. А. Достова Научный руководитель - В. В. Тынченко Сибирский государственный аэрокосмический университет имени академика М. Ф. Решетнева, Красноярск

АНАЛИЗ НОВОВВЕДЕНИЙ В ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ЯЗЫКЕ ПРОГРАММИРОВАНИЯ JAVA

Проводится краткий анализ основных появившихся возможностей в объектно-ориентированном языке программирования Java8.

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

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

Функциональными интерфейсами называются интерфейсы, имеющие только один абстрактный метод. Неважно, сколько данный интерфейс будет содержать в себе default-методов, главное - чтобы он содержал один и только один абстрактный класс. Для проверки данного требования, используется аннотация @FunctionalInterface, работающая по принципу @Override, она отслеживает, не добавлен ли второй абстрактный метод в тело функционального интерфейса, и, в случае обнаружения такового, компилятор выдаст ошибку компиляции [1].

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

Еще одним нововведением является коллекция Steam, позволяющая распараллеливать вычисления в

потоках, что значительно увеличивает скорость и уменьшает сложность управления данными. Операции над потоками бывают или промежуточными (intermediate) или конечными (terminal). Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же поток. Таким образом, предоставляется возможность строить цепочки из нескольких операций над одним и тем же потоком. Операции над потоками могут выполняться как последовательно, так и параллельно. Это позволяет задействовать возможности многоядерных процессоров. Во время последовательной обработки Stream каждый элемент обрабатывается по очереди. А в параллельном режиме массив разбивается на части, каждая из которых обрабатывается в отдельном потоке. Затем результаты обработки собираются в общий результат. Stream - это одноразовый объект, т. е. обработать данные в нем можно один раз. Поэтому для получения полезного результата можно применить окончательную (terminal) функцию, и пока к Stream не применена окончательная функция, результат обработки не вычисляется.

В Java 8 были расширены возможности ассоциативных массивов (map). Ассоциативные массивы не поддерживают потоки. Вместо этого ассоциативные массивы теперь поддерживают различные полезные методы, которые решают часто встречаемые задачи. Существует известная проблема, связанная с тем, как String.hashCode() реализован в Java. Если большое число параметров имеют одинаковый хеш, это вызовет чрезмерную нагрузку на CPU при работе с HashMap. Такая ситуация может возникнуть, если приложение подвергнется denial-of-service атаке. Сейчас корзины в HashMap используют связанный список для хранения значений. Если есть большое число коллизий, тогда сложность работы со структурой изменяется от 0(1) до O(N). Теперь при достижении определенного числа элементов в корзине она переключится на использование сбалансированного дерева, что снижает сложность алгоритма до 0(log n) [3].

Java 8 содержит совершенно новый API для работы с датами и временем. Тип Clock предоставляет доступ к текущей дате и времени. Часовые пояса представлены типом Zoneld. Доступ к ним можно получить при помощи статических фабричных методов. Часовые пояса содержат смещения, которые важны для конвертации дат и времени в местные. Тип LocalTime представляет собой время с учетом часового пояса. Тип LocalTime содержит различные фабричные методы, которые упрощают создание новых экземпляров, а также парсинг строк. Тип LocalDate представляет кон-

Секция «Информационнее системы и технологии»

кретную дату. Объекты ЬосаЮа1е неизменяемы и являются аналогом ЬосаШше. Тип ЬосаЮа1еТ1ше представляет собой комбинацию даты и времени. Объекты ЬосаЮа1еТ1ше неизменяемы и работают аналогично ЬосаШше и ЬосаЮа1е. Форматирование даты-времени работает так же, как и форматирование даты или времени в отдельности. В отличие от _]ауа.1ех1№тЬегРогта1, новый Ба1еТ1шеРогшайег является неизменяемым и потокобезопасным.

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

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

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

1. Сайт объектно-ориентированного языка программирования Java : офиц. сайт. URL: http://home. java.net (дата обращения: 22.03.2014).

2. Сайт, посвященный Java : интернет-журнал. URL: http://www.javaworld.com (дата обращения: 22.03.2014).

3. Сайт ORACLE : офиц. сайт. URL: http://docs. oracle.com/javase/8/docs/ (дата обращения: 22.03.2014).

© Достова А. А., 2014

УДК 004.032.26

Ю. А. Истомина Научный руководитель - В. В. Тынченко Сибирский государственный аэрокосмический университет имени академика М. Ф. Решетнева, Красноярск

ОСОБЕННОСТИ ПРОЦЕССА ПРОЕКТИРОВАНИЯ НЕЙРОСЕТЕВЫХ МОДЕЛЕЙ

ПРОИЗВОЛЬНОЙ АРХИТЕКТУРЫ

Обосновывается актуальность добавления возможности моделирования рекуррентных нейронных сетей в систему Network Modeler. Рассматривается преимущество использования генетических алгоритмов для обучения и подбора архитектуры сетей данного типа.

Искусственные нейронные сери пользуются популярностью для решения различных сложных технических задач. Классификация нейронных сетей разделяет их на сети прямого и обратного распространения. Широко применяются многослойные нейронные сети прямого распространения сигнала. Такой класс сетей обладает достаточной вычислительной мощностью, подходит для решения различных типов задач, кроме того, прост для понимания и подробно описывается в литературе [1-3].

На сегодняшний день автором разработано программное обеспечение (ПО) Network Modeler для проектирования полносвязных нейронных сетей с прямым распространением сигнала [4]. Однако моделирование динамических процессов на сетях прямого распространения возможно только искусственными приемами, например, когда сетью на каждом шаге прогнозируется малое изменение состояния для исследуемого динамического объекта. Чтобы расширить диапазон решаемых задач и устранить недостатки программного обеспечения Network Modeler предлагается дополнить функции разработанной системы возможностью построения сетей с обратными связями (рекуррентных).

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

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

Примерами нейронных сетей данного вида являются следующие.

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

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