December 22, 2017

Kotlin/Native 0.5: llamando a Kotlin desde Swift y C, LLVM 5 y más

Kotlin/Native 0.5: llamando a Kotlin desde Swift y C, LLVM 5 y más

Nos complace anunciar la liberación de Kotlin/Native v0.5, ¡edición navideña! Esta versión añade soporte para usar código de Kotlin/Native desde C, Objective-C y Swift, soporta desarrollo usando el simulador de iOS, junto a soporte de LLVM 5 así como crear WebAssembly desde hosts Linux y Windows.

Interoperatividad inversa desde Objective-C y Swift

En las versiones anteriores de Kotlin/Native añadimos soporte para llamar a los frameworks de Apple desde Kotlin/Native, siempre y cuando proporcionasen cabeceras de Objective-C. Ahora vamos un paso más allá y añadimos soporte para llamar a código Kotlin desde Swift y Objective-C. Para ello, hemos implementado una nueva opción de compilación. <code class="EnlighterJSRAW" data-enlighter-language="null">-produce framework. Genera un framework autocontenido, que se puede usar desde otras partes de vuestra aplicación, como si estuviese escrito en swift. Echemos un ojo al ejemplo de calculadora. Su UI está escrita en Swift, mientras que la lógica está escrita en Kotlin. El código Swift se entremezcla con el de Kotlin de forma transparente. Por ejemplo, esta línea de código Swift:

private let parser = KAPPartialParser(composer: KAPCalculator(), partialComposer: PartialRenderer())

crea una instancia de la clase Kotlin PartialParser, y le proporciona una instancia de la clase de Swift PartialRenderer que implementa una interfaz Kotlin ExpressionComposer.

Nótese que los tipos básicos como los números y las cadenas se mapean de forma transparente entre los mundos de Swift y Kotlin.

Para construir el proyecto, tenéis que abrirlo con XCode y compilarlo bien sea en un dispositivo real, o en el simulador. Echad un ojo al README.md para más detalles.

Y el código Kotlin en IntelliJ IDEA:

Interoperatividad inversa desde C

Para otras plataformas también hemos añadido soporte inverso de interoperabilidad, permitiendo llamar a código de Kotlin/Native desde el mundo exterior. El común denominador de los lenguajes modernos es C, así que ese ha sido el lenguaje con el que interoperamos. La opción de compilación <code class="EnlighterJSRAW" data-enlighter-language="null">-produce dynamic produce una librería dinámica (<code class="EnlighterJSRAW" data-enlighter-language="null">.dylib en macOS, <code class="EnlighterJSRAW" data-enlighter-language="null">.so en linux y <code class="EnlighterJSRAW" data-enlighter-language="null">.dll en Windows) que contiene todo lo necesario para trabajar con código Kotlin/Native. Para demostrar todo esto y hacerlo más fantástico, hemos creado una extensión de Python. Python llama a la implementación de C y desde C se llama a Kotlin tal que así:

if (PyArg_ParseTuple(args, "Lss", &session_arg, &string_arg1, &string_arg2)) { T_(Server) server = getServer(); T_(Session) session = { (void*)(uintptr_t)session_arg }; const char* string = __ kotlin.demo.Server.concat(server, session, string_arg1, string_arg2); result = Py_BuildValue("s", string); __ DisposeString(string); } else { result = Py_BuildValue("s", NULL); }

El compilador de Kotlin/Native produce una librería dinámica, y la herramienta de construcción de Python distutils produce otra librería dinámica que depende de esa otra. De esa forma el código launcher de Python llama a los objetos de Kotlin/Native via un puente en C y tanto los tipos primitivos como ambos objetos  se convierten de forma correcta. ¡Estupendo!

Otras mejoras

  • En Kotlin 1.2 añadimos el paquete <code class="EnlighterJSRAW" data-enlighter-language="null">kotlin.math a la librería estándar. Con Kotlin/Native v0.5 también soportamos dichas operaciones
  • Soportamos LLVM 5.0.0 en esta versión, así como el toolchain de clang y el generador de bitcode y el optimizador
  • Ahora se puede targetear a WebAssembly (<code class="EnlighterJSRAW" data-enlighter-language="null">-target wasm32) desde Linux y Windows (antes únicamente soportábamos hosts macOS)
  • Hemos mejorado el el API de Workers permitiendo consumir los resultados de forma fácil y permitiendo pasar valors primitivos desde y hacia el worker
  • Corrección de errores y mejoras

Enlaces de descarga

Los binarios se pueden descargar desde:

Feedback

Por favor, informad sobre bigs y problemas en el bug tracker de Kotlin. Y cualquier pregunta es bienvenida en el canal de Slack#kotlin-native (invitación aquí).