Programación con Julia

JULIA-BLOG
Scientific Computing Julia

Notebook

Experiencias programando con Julia

Resumen Con este post, comienza un blog sobre Julia, un lenguaje de programacion relativamente reciente que intenta dar una respuesta al llamado problema de los dos lenguajes.

Mis dos herramientas hasta el momento para programar en entornos científicos han sido Fortran y Python, en principio ninguno me ha servido por si solo para resolver los problemas de cálculo científico de mí día a día (aparte del uso de la shell, como bash, y programas puntuales en C). Más allá de que los programas de climatología y transferencia radiativa que uso están en Fortran, la realidad es que parte de las librerías de Python en última instancia se basan en métodos en Fortran o en C para las partes de cálculo intensivo: basta ver que parte de los métodos en scipy son wrappers a programas en Fortran/C. Con todo Python ha mejorado en los últimos tiempos, y hay aproximaciones como PyPy, numba etc que intentan soslayar el problema de los dos lenguajes.

De todos modos en mi experiencia programando en Python, desearía en múltiples ocasiones tener varias de las siguientes posibilidades:

  • Compilar el código en lugar de ser interpretado
  • Poder definir los tipos asociados a las variables en lugar del tipado dinámico de Python.
  • Conservar, si es posible, una versión interpretada que es útil en situaciones particulares.
  • Seguir teniendo la posibilidad de interactuar con código C o Fortran.
  • Forzar o posibilitar una programación más próxima a como se formulan las funciones en matemáticas y dar la posibilidad de componer funciones/código de modo similar a como se hace en matemáticas.

Mi decisión inicial fue Haskell (sobretodo por el último punto) que aún considero la mejor opción formal: es posible invocar ghci que permite una versión interactiva. El sistema de tipos me parece ejemplar aunque requiere bastante esfuerzo habituarse. Permite usar funciones C/Fortran aunque no es particularmente sencillo. Sin embargo ha habido dos aspectos que han hecho que busqué otras opciones:

  • Falta de un sistema amplio y sencillo de paquetes para las tareas básicas: lectura de NetCDFs por ejemplo. Existe un paquete llamado hnetcdf, sin embargo su integración con otras librerias no esta al nivel de xarray o similar.
  • Hay muchas librerías para arrays (demasiadas seguramente para un novato), que poseen una curva de aprendizaje nada suave, además de no saber cual es la mejor opción (Massiv, Repa, accelerate…)
  • El sistema de paquetes, Cabal, es en primera instancia un poco confuso (como lo fue en los inicios de python pypi), aunque una vez que te habituas acabas viendolo como natural.
  • Las librarías de representación gráfica no están muy desarrolladas, en particular para hacer representaciones geográficas. Esta ha sido la principal causa de buscar alternativas.

En función de estas circunstancias he buscado otras alternativas: rust, nim entre otros. Sin embargo, he optado por Julia:

  • Su sistema de paquetes es muy sencillo y práctico.
  • Su documentación esta bien organizada y aunque aun no hay tantos recursos como en Python posee un rápido crecimiento.
  • La curva de aprendizaje es rápida debido a una sintaxis sencilla.

Además,

  • Es posible definir/fijar el tipo de las variables con notable flexibilidad (multiple dispach).
  • Las librería de arrays y álgebra lineal parecen bastante consolidadas (de hecho estan en la libreria standard).
  • Hay bastantes opciones para la visualización aunque aún no hay una librería consolidad para la representación de mapas (geográficos).
  • Es posible usar representación Unicode en el código, para variables, funciones etc, lo que agiliza y simplifica notablemente la notación.
  • El código compilado on the fly es notablemente rápido, cercano a C/Fortran.

Nota:

Tras trabajar con Julia en algunas librerias, se observa bastante progreso y mucha actividad en los foros. Si que hecho de menos la posibilidad de crear ejecutables, que aunque no es una prioridad, es una aspecto en el que parece que se esta trabajando dentro de los programadores que llevan el proyecto. Algunas curiosidades:

  • Se puede indicar el tipo (type) mediante la sintaxis: x::Float64, x::Int etc… esto recuerda a Haskell que posee una sintaxis similar. En el caso de Python3 es posible anotar con x:Int por ejemplo, pero no tiene ningun efecto en el codigo, y es meramente para ayudar a quien lea el codigo.
  • Me gusta el modo de introducir estructuras (nuevos tipos)
  • Han introducido la composicion de funciones, que denuevo me gusta ya que me recuerda la programacion funcional y Haskell.