Проект Валгалла (язык Java)
Project Valhalla — это экспериментальный проект OpenJDK, предназначенный для разработки основных новых языковых функций для Java 10 и более поздних версий. О проекте было объявлено в июле 2014 года. Он представляет собой экспериментальную попытку компании Oracle под руководством инженера Брайана Гетца . [ 1 ]
Планируемые функции
[ редактировать ]Valhalla развивает функции и улучшения языка Java в следующих областях: [ 2 ]
- Типы значений ; высокоэффективные небольшие «объекты» без наследования.
- Общая специализация ;
List<int>
например. - Реифед Дженерикс ; сохранение фактического типа во время выполнения.
- улучшенная поддержка « изменчивости ».
Эти функции потребуют изменений как синтаксиса, так и изменений на уровне виртуальной машины.
Проектная деятельность
[ редактировать ]Проект организован в списке рассылки OpenJDK Project Valhalla. Проект Валгалла начался на экспериментальной стадии с первого объявления и ранних предварительных предложений.
Опубликовано по состоянию на январь 2022 г.:
- Анонс проекта Валгалла
- Первоначальное предложение «Типы значений»
- Первоначальное предложение «Общая специализация»
- Государство Валгалла, Раздел 1: Дорога в Валгаллу
- Государство Валгалла, Раздел 2: Языковая модель
- Государство Валгалла, Раздел 3: Модель JVM
- Государство Валгалла, Раздел 4: Схема перевода
Экспериментальные прототипы OpenJDK также можно собрать из репозиториев Mercurial. Они начинают включать в себя множество функций специализации. Обратите внимание, что это исходные коды Gnu Make/C++, и для создания OpenJDK требуются технические знания. см . в инструкциях по сборке OpenJDK Подробности .
Компоненты проекта
[ редактировать ]Проект разделен на несколько JEP (предложения по улучшению JDK):
- Проект JEP: объекты значений (предварительная версия)
- JEP 401: Примитивные классы (предварительная версия)
- JEP 402: Классы для основных примитивов (предварительная версия)
- Проект JEP: Universal Generics (предварительная версия)
Классы значений
[ редактировать ]Классы значений являются ссылочными типами, как и все существующие классы Java. Однако они отказываются от возможности иметь идентичность. Это означает, что ==
оператор сравнивает экземпляр класса значений по равенству их компонентов, а не по тождеству. Кроме того, синхронизация экземпляров классов значений не удастся.
Классы значений по-прежнему поддерживаются null
, поскольку они являются ссылочными типами. Ожидается, что виртуальная машина Java сможет воспользоваться дополнительными ограничениями классов значений, чтобы исключить распределение типов значений в куче в подавляющем большинстве случаев. Однако сохранение экземпляров классов значений в поле или их преобразование в интерфейс все равно потребует выделения.
Существующие типы в Java API, такие как java.util.Optional
известны как классы на основе значений и являются кандидатами на превращение в классы значений в будущем выпуске JDK.
Примитивные классы
[ редактировать ]Примитивные классы подчиняются всем ограничениям классов значений, но не являются ссылочными типами. Это означает, что они отказываются от возможности поддерживать null
. Вместо этого их значения по умолчанию — это нулевое значение для каждого из типов компонентов ( 0
для числовых типов, false
для логических значений, null
для ссылочных типов и нулевое значение для вложенных примитивных классов.
Все примитивные классы хранятся «инлайн», то есть без выделения кучи. Массивы примитивных классов не требуют перенаправления указателя из массива в кучу. При необходимости будут вставлены преобразования, чтобы «упаковать» примитивный класс в версию самого класса значения и наоборот.
Классы для основных примитивов
[ редактировать ]Этот JEP предназначен для выражения классических примитивных типов виртуальной машины Java (byte, char, short, int, long, boolean, float, double) как примитивных классов.
Традиционно восемь примитивных типов рассматриваются отдельно от всех остальных типов. Предоставление из них объявлений примитивных классов устраняет большую часть этого специального регистра, что приводит к более элегантной и простой для понимания системе типов.
Технические преимущества и последствия
[ редактировать ]Производительность доступа к памяти и эффективность «коробочного» доступа к значениям — основные области, на которые следует обратить внимание с помощью этих функций. Функции «Тип значения» и «Общая специализация» (при применении к спискам или коллекциям) сокращают использование памяти, но, что более важно, позволяют избежать косвенного обращения к указателю, которое обычно приводит к промаху в кэше. [ 3 ] [ 4 ]
Вместо списка или массива ссылок на объекты, указывающих на значения данных, разбросанные по памяти, усовершенствования Project Valhalla позволят потенциально размещать значения списка или массива линейно — без косвенности — в виде последовательного блока памяти.
Типы значений рассматриваются как «Коды как класс, работают как int!» [ 5 ] Синхронизация и наследование будут исключены для типов значений. Они больше не будут требовать идентификации объекта и связанных с ним затрат памяти/указателей, хотя смогут принимать «коробочную» форму для совместимости. [ 4 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Гетц, Брайан. «Добро пожаловать в Валгаллу!» . Почтовый архив OpenJDK . OpenJDK . Проверено 12 августа 2014 г.
- ^ Эванс, Бен. «Oracle запускает проект Valhalla для Java» . ИнфоQ . Инфомир . Проверено 12 августа 2014 г.
- ^ Крилл, Пол. «Предложен проект следующего поколения Valhalla; типы значений, общая специализация и улучшенные изменчивые параметры возглавляют список пожеланий для проекта Valhalla» . JavaWorld . Инфомир . Проверено 12 августа 2014 г.
- ^ Перейти обратно: а б «Типы значений и список <int> появятся в Java 10?» . LiterateJava.com . Проверено 12 августа 2014 г.
- ^ Роуз, Джон; Гетц, Брайан; Стил, Гай. «Состояние ценностей» . OpenJDK . Проверено 12 августа 2014 г.