julia-logo

Why Julia?

  • Fast

  • Dynamic, but… optionally typed

  • Composable (mulitple dispatch)

  • General Purpose

  • Open Source

  • Amazing Packages (e.g. DifferentialEquations.jl, Flux.jl)

  • Growing community (Slack Workspace)

How fast?

benchmarks

Multiple Dispatch

my_add(x::Int, y::Int) = x + y
my_add(x::Float64, y::Float64) = x + y
my_add (generic function with 2 methods)
my_add(1, 2)
3
my_add(1.0, 2)
MethodError: no method matching my_add(::Float64, ::Int64)
Closest candidates are:
  my_add(::Int64, ::Int64) at In[1]:1
  my_add(::Float64, ::Float64) at In[1]:2

Stacktrace:
 [1] top-level scope
   @ In[3]:1
 [2] eval
   @ ./boot.jl:373 [inlined]
 [3] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base ./loading.jl:1196

my_add(x::String, y::String) = "$(x) $(y)"
my_add (generic function with 3 methods)
my_add("Hello", "World!")
"Hello World!"
import Base.+
+(x::String, y::String) = my_add(x, y)
+ (generic function with 209 methods)
"Hello" + "World!"
"Hello World!"

struct Point
    x::Float64
    y::Float64
end

my_add(A::Point, B::Point) = Point(A.x + B.x, A.y + B.y)
my_add (generic function with 4 methods)
A = Point(1.0, 2.0)
B = Point(1.0, 2.0)
my_add(A,B)
Point(2.0, 4.0)

Generic programming

using Measurements

x = 5.23 ± 0.14
y = 45.77 ± 0.1

x + y
\[51.0 \pm 0.17\]

Simple pendulum

\[ \ddot{\theta} = \frac{g}{L} \theta \]

Example Source

using DifferentialEquations, Measurements, Plots

g = 9.79 ± 0.02; # Gravitational constants
L = 1.00 ± 0.01; # Length of the pendulum

#Initial Conditions
u₀ = [0 ± 0, π / 60 ± 0.01] # Initial speed and initial angle
tspan = (0.0, 6.3)

#Define the problem
function simplependulum(du,u,p,t)
    θ  = u[1]
     = u[2]
    du[1] = 
    du[2] = -(g/L)*θ
end

#Pass to solvers
prob = ODEProblem(simplependulum, u₀, tspan)
sol = solve(prob, Tsit5(), reltol = 1e-6)

# Analytic solution
u = u₀[2] .* cos.(sqrt(g / L) .* sol.t)

plot(sol.t, getindex.(sol.u, 2), label = "Numerical")
plot!(sol.t, u, label = "Analytic")
InterruptException:

Stacktrace:
  [1] optimal_ticks_and_labels(ticks::Nothing, alims::Tuple{Float64, Float64}, scale::Symbol, formatter::Symbol)
    @ Plots ~/.julia/packages/Plots/cPJQu/src/axes.jl:197
  [2] get_ticks(::Symbol, ::Vector{Float64}, ::Vector{Any}, ::Tuple{Float64, Float64}, ::Vararg{Any})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/axes.jl:320
  [3] get_ticks(sp::Plots.Subplot{Plots.GRBackend}, axis::Plots.Axis; update::Bool)
    @ Plots ~/.julia/packages/Plots/cPJQu/src/axes.jl:241
  [4] get_ticks
    @ ~/.julia/packages/Plots/cPJQu/src/axes.jl:224 [inlined]
  [5] _update_min_padding!(sp::Plots.Subplot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/backends/gr.jl:888
  [6] iterate
    @ ./generator.jl:47 [inlined]
  [7] _collect(c::Matrix{AbstractLayout}, itr::Base.Generator{Matrix{AbstractLayout}, typeof(Plots._update_min_padding!)}, #unused#::Base.EltypeUnknown, isz::Base.HasShape{2})
    @ Base ./array.jl:744
  [8] collect_similar
    @ ./array.jl:653 [inlined]
  [9] map
    @ ./abstractarray.jl:2849 [inlined]
 [10] _update_min_padding!(layout::Plots.GridLayout)
    @ Plots ~/.julia/packages/Plots/cPJQu/src/layouts.jl:290
 [11] prepare_output(plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/plot.jl:224
 [12] show(io::IOBuffer, m::MIME{Symbol("image/svg+xml")}, plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/output.jl:204
 [13] sprint(::Function, ::MIME{Symbol("image/svg+xml")}, ::Vararg{Any}; context::Nothing, sizehint::Int64)
    @ Base ./strings/io.jl:114
 [14] sprint
    @ ./strings/io.jl:108 [inlined]
 [15] _ijulia_display_dict(plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/ijulia.jl:47
 [16] display_dict(plt::Plots.Plot{Plots.GRBackend})
    @ Plots ~/.julia/packages/Plots/cPJQu/src/init.jl:92
 [17] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [18] invokelatest
    @ ./essentials.jl:714 [inlined]
 [19] execute_request(socket::ZMQ.Socket, msg::IJulia.Msg)
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/execute_request.jl:112
 [20] #invokelatest#2
    @ ./essentials.jl:716 [inlined]
 [21] invokelatest
    @ ./essentials.jl:714 [inlined]
 [22] eventloop(socket::ZMQ.Socket)
    @ IJulia ~/.julia/packages/IJulia/e8kqU/src/eventloop.jl:8
 [23] (::IJulia.var"#15#18")()
    @ IJulia ./task.jl:423