Julia: modèle de programmation et cas d'usage

Alternative title: the sound, the hacky, the mathy
Mathieu Besançon

20-09-2018 - LilleFP meetup

  1. Julia, types et modèle de programmation
  2. Compilation à la volée
  3. Exemple d'interface idiomatique: tableaux
  4. Bonus: build, macros

Bio

Doctorant @ INRIA Lille & Polytechnique Montréal
Optimisation mathématique (programmation mathématique) pour les smart grids
Code au quotidien: créer des modèles, manipuler des données, lancer des calculs, connecter des solveurs

Ex-Equisense @ Euratech --> data science, traitement de signal, back-end
Autres langages utilisés: Rust, Python, R, Go

Twitter/Github @matbesancon

Julia est...

  • Compilé + REPL rapide
  • Dynamique, typé (avec une partie statiquement garantie)
  • Inspiré par Ruby, Matlab, Python, Lisp/Scheme, Fortran (entre autres)
  • Haut-niveau avec accès et manipulation bas-niveau
  • Backend LLVM

Typage optionnel

(Demo live)

Compilation à la volée

Un compilateur c'est bien...
Mais avec des cas d'usage dynamiques, feedback rapide essentiel

In [1]:
function line(x; a = 3.0, b = π)
    return a*x + b
end
Out[1]:
line (generic function with 1 method)
In [2]:
@time line(42)
  0.009094 seconds (22.09 k allocations: 1.216 MiB)
Out[2]:
129.14159265358978
In [3]:
@time line(42)
  0.000003 seconds (5 allocations: 176 bytes)
Out[3]:
129.14159265358978
In [4]:
@time line(4//3)
  0.054816 seconds (79.88 k allocations: 4.005 MiB)
Out[4]:
7.141592653589793
In [5]:
@time line(4//3)
  0.000004 seconds (6 allocations: 208 bytes)
Out[5]:
7.141592653589793

Les types de Julia

  • Hiérarchie des type en arborescence
  • Tout type s'attache à un seul type abstrait
In [6]:
abstract type ValueWrapper{T} end

struct FloatWrapper <: ValueWrapper{Float64}
    v::Float64
end

struct NumWrapper{T<:Number} <: ValueWrapper{T}
    v::T
end
  • Types abstraits: permettent de définir la "nature" d'un type
  • Aucun type abstrait implémentable
  • Tous les types concrets sont finaux
In [7]:
const 😱 = "one inheritence == one bullet";

Type abstrait nécéssaire pour peu de cas.
SimpleTraits.jl permet la création de traits hors de la hiérarchie des types.

In [8]:
import Plots: plot

struct Line
    a::Float64
    b::Float64
end

function plot(l::Line)
    xs = 0.0:0.01:10.0
    ys = map(xs) do x
        l.a * x + l.b
    end
    plot(xs,ys)
end