Введение
В настоящее время язык программирования Java имеет большую популярность среди программистов. Язык активно развивается, появляются новые функции и возможности, увеличивающие производительность платформы. В связи с этим следует рассмотреть возможность взаимодействия java и низкоуровневого машинного кода, с целью оптимизации реализуемых программных продуктов.
Для того чтобы разобраться во взаимодействии java и ассемблера, нужно понимать принципы, лежащие в основе этих двух языков программирования. Java программы запускаются на специальной виртуальной java-машине, что позволяет создавать кроссплатформенные и безопасные программы. Преимуществом же ассемблера является низкоуровневый доступ к аппаратуре, позволяющий писать быстродействующие, занимающие малое количество памяти, программы. Разумеется, в данном случае программный код будет сильно зависеть от целевой платформы.
Устройство Java приложений
Как было указано выше, для запуска Java приложений требуется специальная Java машина, способная исполнять байт-код java. Из исходного текста Java-программы компилятором Java создается байт-код, который в свою очередь исполняется на Java Virtual Machine . Во многих java машинах совместно с интерпретатором байт-кода для повышения быстродействия используется JIT-компиляция часто исполняемых частей байт-кода в машинный код.
Цели совмещения java и ассемблера
Использование ассемблера совместно с языками высокого уровня несет в себе несколько очевидных преимуществ:
• Оптимизация.
С целью оптимизации код, реализующий наиболее критичные в отношении производительности части алгоритма, пишется вручную на ассемблере. Это позволяет программисту в полной мере использовать свою изобретательность и мощности вычислительной машины, не ограничиваться конструкциями компилятора.
• Получение доступа к специфичным процессорным инструкциям.
Некоторые процессоры поддерживают специальные инструкции, такие как test-and-set и сравнение с обменом— инструкции, которые могут быть использованы для реализации примитивов синхронизации и блокировок. Подавляющее большинство современных процессоров имеют идентичные или схожие инструкции, так как без них нельзя обойтись при реализации многозадачности.
• Системные вызовы.
Так как языки программирования высокого уровня довольно редко предоставляют прямую возможность делать системные вызовы, для этих целей используется ассемблерный код
Допустим существует проект, написанный на java и с течением времени ставший требовать оптимизации. Или же требуется написать программу, функционал которой в подавляющем большинстве случаев идеально подходит под предоставляемые java возможности, но требующий оптимизации в некоторых немногочисленных узких местах.
JavaNativeInterface
В большинстве популярных высокоуровневых языков программирования можно было бы воспользоваться ассемблерными вставками. Но в java у нас нет возможности вставить inline-функцию с машинным кодом. Одним из способов обойти данную проблему является Java Native Interface
Java Native Interface — стандартный механизм для запуска кода под управлением виртуальной машины Java, который написан на Ассемблере или С/С++ и скомпонован в виде динамических библиотек, что позволяет не использовать статическое связывание. Это дает возможность вызывать подпрограммы, написанные на ассемблере из программ на Java, и наоборот.
При помощи этого механизма появляется возможность взаимодействия байт-кода Java с системным или прикладным платформенно-ориентированным кодом, запущенным непосредственно под управлением различных операционных систем.
Заключение
Java программы рассчитаны на переносимость и безопасность, а не на быстродействие и экономию памяти, тем более что код, сформированный java компилятором исполняется не напрямую, а на виртуальной машине. В связи с этим ясно прослеживается проблема во взаимодействии высокоуровневого Java и низкоуровневого ассемблера. Но все же при потребности запустить машинный код из java программ для оптимизации или получения доступа к возможностям, закрытым для высокоуровневых языков, существует ряд инструментов, одним из которых является Java Native Interface.
Библиографические ссылки
Абрамова О.Ф. Обзор алгоритмов масштабирования растровой графики [Электронный ресурс] / О.Ф. Абрамова, А.Е. Иванов, А.Н. Инкин // European Student Scientific Journal : электрон. науч. журнал / РАЕ. - 2016. - № 2
Рыбанов А.А. Анализ существующего программного обеспечения в области учёта ГСМ [Электронный ресурс] / А.А. Рыбанов, И.А. Возжин // Форум молодых учёных : междунар. науч.-практ. периодическое сетевое издание. - 2017. - № 5
Лясин, Д.Н. Объектно-ориентированный анализ и проектирование программных систем: учеб. пособ.(гриф) . Доп. УМО вузов по университетскому политехническому образованию / Д.Н. Лясин, О.Ф. Абрамова; ВПИ (филиал) ВолгГТУ. - Волгоград, 2015. - 99 с.
Бородай С.С. Конструирование программно-информационной системы оценки метрических характеристик физических схем реляционных баз данных [Электронный ресурс] / С.С. Бородай, А.А. Рыбанов // Постулат : электрон. науч. журнал. - 2017. - № 5 . – 9 с.
Электронный ресурс: https://habr.com/company/jugru/blog/347200/