Написать пост

Вышел Kotlin/Native v0.9

Аватар Артем Гаврилов

В Kotlin/Native v0.9 изменения коснулись использования компилятора и стандартных библиотек Kotlin 1.3-M2, а также доработки элементов параллелизма.

Обложка поста Вышел Kotlin/Native v0.9

Разработчики Kotlin рассказали о выходе новой версии LLVM-бэкенда Kotlin/Native для компилятора языка. В v0.9 добавлена поддержка беззнаковых типов и интероперабельность с C, Objective-C/Swift. В новой версии доработаны простейшие элементы параллелизма, а также она работает с компилятором и стандартными библиотеками Kotlin 1.3-M2.

Поддержка беззнаковых типов

В версии 1.3 Kotlin получил поддержку беззнаковых типов в библиотеках JVM, Native и JavaScript. Поэтому код

			fun main(args: Array) {
println(maxOf(1u, UInt.MAX_VALUE))
}
		

будет корректно работать во всех формах языка Kotlin и выводить 4294967295. Операции стандартных библиотек поддерживают беззнаковые операнды.

Интероперабельность

Беззнаковые типы в Kotlin сопоставляются с аналогичными в C и Objective-C/Swift. В качестве примера код, который считывает данные в ByteArray:

			buffer.usePinned { pinned ->
    while (true) {
        val length = recv(commFd, pinned.addressOf(0), buffer.size.convert(), 0).toInt()
        .ensureUnixCallResult("read") { it >= 0 }
        if (length == 0) break
        send(commFd, pinned.addressOf(0), length.convert(), 0)
            .ensureUnixCallResult("send") { it >= 0 }
    }
}
		

В нескольких местах может произойти конвертация знаковых величин в беззнаковые (их можно узнать по типу convert()), но программный интерфейс ssize_t recv(int socket, void *buffer, size_t length, int flags); переводится в подпись языка Kotlin вида:

			typealias ssize_t = Long
typealias size_t = ULong
...
fun recv(arg0: Int, arg1: CValuesRef<*>?, arg2: size_t, arg3: Int): ssize_t
		

Простейшие элементы параллелизма

Доработана концепция замораживания объектов, которая появилась в Kotlin/Native v0.8. Простейшие элементы перемещены в пакет kotlin.native.concurrent. Основные изменения:

  • доработаны классы AtomicInt, AtomicLong, AtomicNativePtr и AtomicReference;
  • lazy правильно работает с замороженными объектами;
  • добавлен класс DetachedObjectGraph.

В качестве примера с классом DetachedObjectGraph код

			dispatch_async_f(asyncQueue, DetachedObjectGraph {
    Data(clock_gettime_nsec_np(CLOCK_REALTIME))
}.asCPointer(), staticCFunction {
    it ->
    initRuntimeIfNeeded()
    val data = DetachedObjectGraph(it).attach()
    println("in async: $data")
})
		

передаст права изменяемого объекта Data асинхронному списку на macOS.

Произошло изменение с переменными верхнего уровня. Доступ к ним осуществляется из основного потока приложения, попытки получения доступа иными путями приведут к генерированию исключения. Управление производится с помощью маркировок @ThreadLocal и @SharedImmutable, которые привязывают переменную к одному из потоков или замораживают её, соответственно.

Пакет kotlin.native

Весь код переместили из пакета konan в kotlin.native. Доработан интерфейс, а также переведены во внутренние или частные нативно-специфические операции, дополняющие друг друга в общей библиотеке stdlib. Это решение позволит использовать стандартные операции.

Дополнительные изменения

  • Kotlin/Native v0.9 теперь поддерживает API сопрограмм. При этом экспериментальные сопрограммы из kotlin.coroutines.experimental не поддерживаются компилятором или при их выполнении;
  • Компилятор и стандартные библиотеки Kotlin 1.3-M2 — основа текущей версии Kotlin/Native. Внутренние классы, беззнаковые типы и API общего генератора случайных чисел доступны на всех нативных объектах.

Разработчики ускорили темпы развития Kotlin/Native после выпуска предыдущей версии в середине июля 2018 года. В ней изменения коснулись безопасности многопоточного программирования, расширения функциональности библиотек и поддержки устройств iOS.

Следите за новыми постами
Следите за новыми постами по любимым темам
2К открытий2К показов