Hace unos días, alguien preguntaba en Twitter por recomendaciones sobre algún lenguaje de programación para iniciar su aprendizaje. Ni corto ni perezoso contesté: “Swift”. La respuesta me dejó bastantes sorprendido ya que dijo: “No, gracias pero Swift es Apple”. Algún día os contaré las mil y una bondades sobre Swift como lenguaje de programación, pero hoy quiero hablaros de la separación entre el propio lenguaje de programación y las diferentes librerías compatibles o basadas en ellos.
Primero el lenguaje
Un lenguaje de programación es el conjunto de instrucciones, de palabras reservadas, la sintaxis incluyendo la puntuación y separación de instrucciones con las que podemos generar un programa que compilado o no, sea capaz de ejecutarse en una máquina. Seguro que la Wikipedia no dice lo mismo pero sí parecido y me gusta más mi definición.
Los lenguajes de programación pueden tener un creador o varios, particular o empresa, y pueden estar licenciados como software libre o ser propiedad de alguna compañía. Por ejemplo, Swift es Open Source, fue creado por Apple pero ahora mismo es mantenido por una comunidad de desarrolladores. Si, también hay otras empresas e incluso empleados de Apple pero forman parte de una comunidad e incluso tu, si tú, también podrías contribuir al desarrollo del lenguaje.
Una cosa que puede sorprender es que diferentes lenguajes pueden ser interoperables entre sí, es decir, podemos hacer una aplicación que utilice dos o más lengujes diferentes. Sin entrar en mucho detalle, la conexión entre ambos puede darse en varios niveles: código, código intermedio, binario… Pero antes de bucear en las profundidades y dar ejemplos concretos de la relación de los lenguajes, vamos a ver qué es un framework.
Librerías y frameworks
Crear programas complejos simplemente con el lenguaje puede ser una tarea ardua. Por ello, se crean librerías y éstas se agrupan en frameworks más complejos. Estas librerías no son más que líneas de código que proporcionan funcionalidades concretas, y mediante una interfaz más o menos sencilla, nos permiten realizar llamadas en nuestro código para no tener que implementar funcionalidades complejas o repetitivas. De esta forma no necesito enviar los datos bit a bit a un servidor si no que hay librerías que proporcionan abstracciones y me permiten llamar a un servicio web sin conocer todos los niveles que tiene una conexión HTTP.
Muchas de estas librerías son desarrolladas de forma conjunta con el lenguaje porque a fin de cuentas, proporcionan una funcionalidad tan básica que en el 99% de los casos no tendría sentido realizar uno mismo la implementación. Un ejemplo es Foundation que la librería mínima básica de Swift y que implementa acceso a la red, programación asíncrona, tipos básicos de datos… Incluso resulta complicado a veces separarlo del propio lenguaje.
De esta misma manera, existen librerías oficiales para determinados sistemas y otras denominadas “de terceros” que, con más o menos soporte, se crean para facilitar el desarrollo o para ayudar a programadores noveles a hacer cosas complicadas con menos esfuerzo. La utilización de las mismas queda a gusto del consumidor, personalmente prefiero implementar ciertas cosas por mi mismo y utilizar sólo las librerías oficiales pero seguro que para muchos es mejor utilizar librerías.
SDKs y demás herramientas
Genial, ya tenemos nuestro lenguaje para escribir código, nuestras librerías y frameworks que nos facilitan la vida y ¿ahora qué? Pues ya vienen los SDKs y las herramientas de desarrollo. Un SDK (Software Development Kit) es el conjunto de herramientas que nos permite realizar aplicaciones para una plataforma determinada. Con plataforma no quiero decir sistemas, porque existen SDKs como Xamarin o Cordova que generan aplicaciones compatibles con varios sistemas.
Los SDKs incluyen herramientas de edición de código, con sugerencias, autocompletado, etc… pero también programas de diseño de interfaz, de gestión de las preferencias y configuración de nuestros desarrollos. En resumen es todo lo necesario para poder desarrollar una aplicación y que se ejecute en un sistema X.
Con todo lo que sabemos, en este punto ya podemos relacionar los conceptos y ver ejemplos determinados. Empezaremos por algunas plataformas hasta llegar a los lenguajes y luego veremos lenguajes que pueden utilizarse en muchas plataformas.
Xamarin Se programa utilizando Visual Studio, propiedad de Microsoft y permite generar aplicaciones para Windows, macOS, iOS, Android… mediante las librerías .NET. Se programa en C# pero muchas de las librerías sobre las que está construido están desarrolladas utilizando C o C++. Vale, al final son superclases de C todo, pero veamos más ejemplos.
Android La herramienta oficial actual es Android Studio. Proporciona todas las librerías necesarias para el desarrollo así como el constructor de interfaces y la generación de ejecutables. Pueden utilizarse los lenguajes Java y/o Kotlin indistintamente y las librerías pueden estar programadas en cualquiera de ellos. Ambos lenguajes son interoperables (podemos hacer llamadas de uno a otro de forma simple) y además se pueden ejecutar sobre la máquina virtual de Java que da soporte a las aplicaciones de Android.
Apple Xcode es la herramienta que proporciona todos los SDKs para crear aplicaciones en plataformas de Apple. Cada una de las apps (al menos hasta septiembre) tienen su framework de desarrollo de aplicaciones: UIKit para iOS, AppKit para macOS, WatchKit para watchOS… que incluyen el diseño de las interfaces. Los lenguajes para usar son Swift u Objective-C. Los frameworks están construidos con este último ya que Swift hasta hace poco no era estable como para crear librerías independientes, pero con SwiftUI esto cambiará. El truco en este caso es que ambos lenguajes utilizan el mismo compilador llamado LLVM y mediante cabeceras simples pueden hacerse llamadas entre ellos.
Pero, ¿Swift es Apple o no?
¡No, no y mil veces no! Swift fue creado por Apple, empleados de Apple están inmersos en su desarrollo y sus plataformas utilizan el lenguaje pero hay mucho más Swift ahí fuera. Para empezar, Swift es compatible con Ubuntu, es decir, que podemos crear programas que se ejecuten sobre este sistema. Además Microsoft anunció que haría compatible Windows en cuanto el lenguaje fuera estable a nivel binario, cosa que ha pasado hace unos meses.
Por si esto fuera poco, existen frameworks que permiten crear servidores web completos de forma muy sencilla, segura y con un rendimiento muy alto. Por lo que podemos desarrollar servicios de backend para nuestras aplicaciones o una página web completa utilizando Swift.
Otro detalle muy importe es que el padre del lenguaje, Chris Lattner, tras dejar la compañía de la manzana y pasar por Tesla, ahora es el máximo responsable de TensorFlow, el framework de Machine Learning de Google y probablemente el más avanzado. Pues bien, TensorFlow está desarrollado en python (a saber: otro lenguaje de programación) y se están dando pasos para que las librerías sean interoperables con Swift. Además, y esto ya son rumores, como python se antoja algo lento a medida que se necesitan aplicaciones más robustas, se bajara la opción de que Swift pase a ser un lenguaje de primer nivel en cuanto a Machine Learning.
Por último y no menos importante, el nuevo sistema de Google llamado Fuchsia tendría soporte para Swift. Aunque la compañía del buscador dice que es un pasatiempo, muchas son las voces que aseguran que sería el sustituto de Android en unos años.
Espero que haya quedado un poco más claro quién es quién y, si no elijes Swift como lenguaje de programación para aprender, que al menos la razón no sea incorrecta.