Типы значений в языке программирования Kotlin
1 Санкт-Петербургский государственный университет Математическое обеспечение и администрирование информационных систем Кафедра информационно-аналитических систем Зареченский Михаил Алексеевич Типы значений в языке программирования Kotlin Курсовая работа Научный руководитель: к. ф.-м. н. доц. Михайлова Е. Г. Санкт-Петербург 2015
2 SAINT PETERSBURG STATE UNIVERSITY Software and Administration of Information Systems Chair of The Analytical Information Systems Mikhail Zarechenskiy Value Types in Kotlin programming language Course Work Scientific adviser: Associate professor Elena Mikhaylova Saint Petersburg 2015
3 Оглавление Введение 4 Постановка задачи 5 1. Обзор существующих подходов Типы значений в Scala Типы значений в Java Список литературы 7 3
4 Введение Существующие виды типов в языке программирования Java 8 [1] и виртуальной машине Java [2] можно классифицировать на две группы: ссылочные и примитивные. Примитивными являются 8 типов, которые определены на уровне виртуальной машины: byte, short, int, long, float, double, char и boolean. Каждый отдельный элемент примитивного типа является уникальным и не имеет идентичных себе элементов. В свою очередь ссылочные типы задают идентичность, то есть несколько экземпляров одного типа могут быть идентичны между собой. Однако возможность определения идентичности для типов может негативно сказаться на производительности программы [5]. Это особенно важно для небольших неизменяемых объектов. Вопервых, для всех объектов выделяется память под описание заголовка объекта (от 8 до 16 байт) и на указатель (от 4 до 8 байт), кроме этого требуются дополнительные затраты на разыменование указателя при обращении к данным объекта. Во-вторых, поскольку для неизменяемых объектов не требуется задавать идентичность, подобные типы хочется рассматривать как некоторый вид примитивных типов. Типы, для которых не выделяется специального места в heap и обращение к которым происходит напрямую, а не через указатель, называются типами значений(value types). Данная концепция существует в таких языках программирования, как C#, Swift и другие. В то время как поддержка данных типов запланирована на десятую версию Java проект Valhalla [4], уже сейчас можно прототипировать типы значений в других JVM-ориентированных языках программирования. Целью данной работы является изучение и прототипирование типов значений в языке программирования Kotlin. Kotlin это JVM-ориентированный, статически типизированный язык программирования. Особенностью данной работы является то, что Kotlin взаймодействует с Java в обе стороны: из кода, написанного на Kotlin, можно обращаться к коду, написанному на Java, и наоборот. Поэтому при реализации типов значений в Kotlin необходимо учитывать запланированное появление типов значений в Java и необходимость их совместимости между собой. 4
5 Постановка задачи Целью данной работы является поддержка типов значений в языке программирования Kotlin. Для достижения данной цели в рамках курсовой работы были поставлены следующие задачи: Проанализировать существующие подходы к реализации типов значений в JVMориентированных языках. Описать основные ограничения, накладываемые на типы значений виртуальной машиной Java. Определить взаимодействия типов значений между Kotlin и Java. 5
6 1. Обзор существующих подходов При расширении существующего набора типов языка программирования, в данном случае типами значений, появляется ряд вопросов, которые не всегда имеют однозначный ответ. В данной работе будут рассматриваться следующие вопросы, связанные с введением типов значений: правила подстановки (subtyping), правила задания типов значений (containment), совместимость с существующими типами и инкапсуляция для типов значений. Для рассмотрения существующих подходов к реализации типов значений был выбран язык программирования Scala [3] и проект Valhalla [4]. Язык программирования Scala также является JVM-ориентированным, поэтому ограничения типов значений в Scala на текущий момент свойственны именно платформе и могут быть схожи с ограничениями при реализации типов значений в Kotlin. Проект Valhalla, в свою очередь, нацелен на добавление типов значений в Java Типы значений в Scala Синтаксис задания типа значений в Scala выглядит следующим образом: c l a s s Wrapper ( val underlying : Int ) extends AnyVal Стоит заметить, что для описания типов значений в Scala переиспользуются устоявшиеся конструкции для задания классов. Маркером того, что данный класс является типом значений, служит обязательное наследование класса от типа AnyV al. Перечислим основные ограничения, накладываемые на типы значений в Scala: 1. Конструктор должен иметь только один параметр, чей тип не является типом значений. 2. В качестве членов типа можно определять только функции. 3. Нельзя переопределять методы equals и hashcode. 4. Данный тип является нерасширяемым, то есть не может иметь наследников. Ограничения 3 и 4 связаны с семантикой типов значений, в то время как остальные ограничения являются следствием того, что виртуальная машина Java на текущий момент не поддерживает типы значений, а значит, могут быть ослаблены в будущем Типы значений в Java 10 6
7 Список литературы [1] The Java Language Specification / James Gosling, Bill Joy, Guy Steele et al February. [2] The Java Virtual Machine Specification / Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley February. [3] Odersky Martin. The Scala Language Specification June. [4] Project Valhalla. [Online; accessed 17-December-2015]. [5] Rose John, Goetz Brian, Steele Guy. State of the Values April. 7