Julia: Lenguaje para Alto Rendimiento

Mi especialidad son los lenguajes de alta concurrencia y distribución principalmente, pero a veces me planteo agregar un poco de alto rendimiento también a mis desarrollos y pensando, ¿cómo podría hacerlo sin necesidad cambiar todo de lenguaje o emplear código difícil de leer?

Julia es uno de esos lenguajes que te permiten agregar código de alto rendimiento manteniendo una legibilidad más que aceptable. Al igual que otros lenguajes como Lua o incluso Python o Perl, Julia permite incrustarse en cualquier lenguaje o programa pudiendo emplear código realizado en Julia dentro de nuestra aplicación.

En la web de Julia el lenguaje se anuncia como de alto rendimiento con un compilador JIT (Just-In-Time) también de alto rendimiento y un banco de pruebas frente a otros lenguajes como Fortran, Python, R, Matlab, Octave, Mathematica, JavaScript, Go o Lua. Teniendo en cuenta sus orígenes y su objetivo sale muy bien parado con respecto a sus competidores.

¿De dónde y por qué?

Julia fue desarrollado por un equipo de científicos para servir de apoyo al desarrollo a la creación de algoritmos para la resolución de cierto tipo de problemas de forma óptima. Antes de eso, el científico debía proceder a crear el algoritmo en un lenguaje de alto nivel (por facilidad y proximidad al lenguaje científico) como Matlab, Mathematica, R, … y en caso de necesitar mayor velocidad para obtener resultados antes, todo el código escrito debía transcribirse con mejores algoritmos a C o Fortran.

Jeff Bezanson, Stefan Karpinski, Viral B. Shah y Alan Edelman crearon el lenguaje y consiguieron evitar este problema implementando los mejores algoritmos (que ya usaban) para tratar los tipos de datos y obtener resultados rápidos escribiendo código de alto nivel. Escribiendo código en Julia.

La sintaxis…

La sintaxis recuerda a Python pero con matices de R. En la web nos dan de ejemplo el código de Mandelbrot:

function mandel(z)
    c = z
    maxiter = 80
    for n = 1:maxiter
        if abs(z) > 2
            return n-1
        end
        z = z^2 + c
    end
    return maxiter
end

Crea una función y vemos ejemplos de uso de if y for así como la actualización de z donde usamos una operación de potencia (eleva z al cuadrado).

Otro ejemplo de estadísticas de matrices aleatorias:

function randmatstat(t)
    n = 5
    v = zeros(t)
    w = zeros(t)
    for i = 1:t
        a = randn(n,n)
        b = randn(n,n)
        c = randn(n,n)
        d = randn(n,n)
        P = [a b c d]
        Q = [a b; c d]
        v[i] = trace((P.'*P)^4)
        w[i] = trace((Q.'*Q)^4)
    end
    std(v)/mean(v), std(w)/mean(w)
end

No solo generamos de forma fácil dos matrices (P y Q) sino también podemos hacer la derivada y media de los valores obtenidos en un código compacto y sencillo (una vez aprendamos un poco más su sintaxis, por supuesto).

Además, puedes echarle un vistazo JuliaBox, una forma de ejecutar Julia en el navegador y obtener resultados. Ideal para aprender y probar código.

¿Quién usa Julia?

En el pasado JuliaCon 2017 sus autores presentaron el proyecto Celeste que consiguió dotar a Julia de la capacidad para computar 1 petaflop cuando se ejecuta en el supercomputador Cori uniéndose a C, C++ y Fortran como lenguajes de alto nivel en los cuales la computación de petaflop es posible.

Su potencia de cálculo ha atraído a grades como la aseguradora británica Aviva, la Reserva Federal del Banco de Nueva York o un administrador de inversiones como BlackRock.

Conclusiones

Después de hacer algunas pruebas con el lenguaje y leer su extensa documentación puedo asegurar que este lenguaje es una buena opción si necesitamos realizar acciones de cálculo intenso o con grandes volúmenes de datos. El nivel de optimización conseguido nos asegura el mayor rendimiento con el código más simple y siempre legible.

¿Conocías Julia? ¿Te has animado a emplear algún software de cálculo como R, Matlab, Numpy? ¿Te gustaría poder emplear Julia como microservicio o embebido en tu programa? ¡Déjanos un comentario!