Programacion con Julia

Notebook

Programación con Julia

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ía de Python en última instancia se basan en métodos en Fortran o 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 conservando 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 busque otras opciones:

  • Falta de un sistema amplio y sencillo de paquetes para las tareas básicas: lectura de NetCDFs por ejemplo.
  • Muchas librerías para arrays, 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)
  • Las librarías de representación grafica no están muy desarrolladas, en particular para hacer representaciones geográficas.

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
  • 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
  • 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.