Julia (programming language)

Julia
Paradigm Multi-paradigm: multiple dispatch ("object-oriented"), procedural, functional, meta
Designed by Jeff Bezanson, Stefan Karpinski, Viral B. Shah, Alan Edelman
Developer Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors[1][2]
First appeared 2012[3]
0.3.7 / 23 March 2015[4][5]
0.4.0-dev / Updated daily
Dynamic with type inference and optional type annotations
OS Linux, OS X, FreeBSD, Windows
License MIT License[1] for core language while "the environment, which consists of the language, user interfaces, and libraries, is under the GPL"[6][7] as some few libraries used by the standard library (that can be excluded) are copyleft.
.jl
Website julialang.org

Julia is a high-level dynamic programming language designed to address the requirements of high-performance[9] numerical and scientific computing while also being effective for general purpose programming.[10][11][12][13] Distinctive aspects of Julia's design include having a type system with parametric types in a fully dynamic programming language, and adopting multiple dispatch as its core programming paradigm. It allows for parallel and distributed computing, and direct calling of C and Fortran libraries without glue code. Julia is garbage collected by default,[14] uses eager evaluation, and includes efficient libraries for floating point, linear algebra, random number generation, fast Fourier transforms, and regular expression matching.

Optionally, in version 0.4,[15] a standalone "executable that doesn't require any julia source code" can be built with build_executable.jl[16] while by default the Julia runtime needs to be pre-installed.

Language features

According to the official web site, the main features of the language are:

Julia draws significant inspiration from various dialects of Lisp, including Scheme and Common Lisp, and it shares many features with Dylan (such as an ALGOL-like syntax rather than a Lisp-like prefix syntax) – also a multiple-dispatch-oriented dynamic language – and Fortress, another numerical programming language with multiple dispatch and a sophisticated parametric type system. While CLOS adds multiple dispatch to Common Lisp, the addition is opt-in: only user-defined functions explicitly declared to be generic can be extended with new multimethods.

In Julia, Dylan and Fortress, on the other hand, this extensibility is the default and the system's built-in functions are all generic and extensible. In Dylan, multiple dispatch is as fundamental as it is in Julia: all user-defined functions and even basic built-in operations like + are generic. Dylan's type system, however, does not fully support parametric types, which are more typical of the ML lineage of languages. By default, CLOS does not allow for dispatch on Common Lisp's parametric types; such extended dispatch semantics can only be added as an extension through the CLOS Metaobject Protocol. By convergent design, Fortress also features multiple dispatch on parametric types; unlike Julia, however, Fortress is statically rather than dynamically typed, with separate compilation and execution phases. This matrix of language features is summarized in the following table:

Language Type system Generic functions Parametric types
Julia dynamic default yes
Common Lisp dynamic opt-in yes (but no dispatch)
Dylan dynamic default partial (no dispatch)
Fortress static default yes

Interaction

The Julia official distribution includes an interactive session shell, called Julia's REPL, which can be used to experiment and test code quickly.[19] The following fragment represents a sample session on the REPL:

julia> p(x) = 2x^2 + 1; f(x, y) = 1 + 2p(x)y
julia> println("Hello world!", " I'm on cloud ", f(0, 4), 
               " as Julia supports recognizable syntax!")
Hello world! I'm on cloud 9 as Julia supports recognizable syntax![20]

The REPL gives user access to the system shell and to help mode, by pressing ; or ? after the prompt (preceding each command), respectively. The REPL also keeps the history of commands, even between sessions. For other examples, see the Julia documentation,[21] which gives code that can be tested inside the Julia's interactive section, or saved into a file with a .jl extension, and run from the command line by typing (for example):[22]

$ julia <filename>

Packages – for instance to work with other languages

In the Julia packaging system each package is a Git repository that can be stored in any publicly accessible location. A master package listing that includes package dependency information is maintained in METADATA.jl,[23] enabling installation from the Julia prompt using Pkg.add("PackageName")

Packages are typically written in Julia but can also include source code written in other languages (using BinDeps.jl), given a compiler is installed, that is automatically compiled at package install time by the package manager. Alternatively packages can include binary code (using WinRPM.jl). To load the installed package into Julia, one can run using PackageName. As Julia is case sensitive, Using PackageName is not the same thing and produces an error. Updating Julia's installed packages can also be done using Pkg.update().

Many packages are available[24] e.g. to call other languages from within Julia. For example, a package, JavaCall.jl, is available to call Java from Julia;[25] Mathematica.jl, to call Mathematica.[26] See below, for native Julia packages for symbolic computation or for calling other languages for it.

By default, Julia has good Unicode support but also has optional packages ICU.jl (a wrapper for International Components for Unicode) and UnicodeExtras.jl.

For use in statistics/data analysis

Julia was created to be "as easy for statistics as R" as one of its goals.[3]

When Julia may not have some software library for statistics, a package Rif.jl (and RCall.jl[27]) is available for Julia for "calling R whenever it has a library that would be needed".[28]

Also at least one package Gadfly.jl is available for Julia for "statistical graphics" a "plotting and data visualization system written in Julia".[29] For working with distributions a package Distributions.jl is available.[30]

As for what comes with Julia itself (without installing R and using together): "Rmath is a library from R, which includes basic statistical functions. Julia uses a patched version of Rmath, which uses DSFMT as its underlying generator, and faster normal random number generators."[31][32]

One academic said: "Julia code looks very much like R code and/or Matlab/octave code. It is, of course, not identical but sufficiently similar to be readable."[33]

"There are now several packages that, taken as a whole, suggest that Julia may really live up to its potential and become the next generation language for data analysis."[34] See here for STATISTICS section (and OPERATIONS RESEARCH, Econometrics and Valuation - Finance) as an overview.

"In practical terms, multiple dispatch turns object-oriented programming on its head, instead of encapsulating functions or methods inside data structures or objects, functions are effectively overloaded on different data structures. The object oriented paradigm is not a natural way for data-scientists or algorithmists to work, one of the great things about R is to allow programs to be created quickly and simply by providing a nice and powerful programming interface. Julia takes this one step further and makes it explicit and clear, that we are writing functions for specific data structures - but with an option to write "catch-all" functions to deal with any data type [..] Sometimes people ask whether R or Python will be the most used "data science" programming language, we now have a dark horse, a late entrant to the race, a new kid on the block that could one day grab this particular crown."[35]

Seeing generated assembly just after typing code in

You can see the compiled assembly code for any just typed in function (for built-in, after it has been run at least once); including in-built functions such as the operator + that is just a function through syntactic sugar:

julia> code_native(+, (Float64, Float64))
Warning: Unable to find function pointer
ERROR: no method found for the specified argument types
 in code_native at reflection.jl:159
 
julia> 1.0 + 2.0
3.0
julia> code_native(+, (Float64, Float64))
	.text
Filename: float.jl
Source line: 120
	push	RBP
	mov	RBP, RSP
Source line: 120
	addsd	XMM0, XMM1
	pop	RBP
	ret

Implementation

Julia's core is implemented in C and C++, its parser in Scheme ("femtolisp"), and the LLVM compiler framework is used for just-in-time generation of 64-bit or 32-bit optimized machine code depending on platform or user override. Current support is for newer x86 or older i386 processors and in 0.4.0-dev, 32-bit ARMv7 ("Experimental and early support"[36] with "work in progress - several tests are known to fail, and backtraces are not available"[37] but "[on ARM7] Samsung Chromebook [..] Julia starts up just fine"[38]),[39][40][41][42][43][44] and PowerPC being worked on.[45] With some exceptions (e.g., libuv), the standard library is implemented in Julia itself. The most notable aspect of Julia's implementation is its speed, which is often within a factor of two relative to fully optimized C code (and thus often an order of magnitude faster than Python or R).[46] Development of Julia began in 2009 and an open-source version was publicized in February 2012.[3][47]

Julia uses a mark and sweep garbage collection (GC) algorithm. For high-performance computing that choice is not a problem, but for real-time-sensitive such as audio work it can be, where an incremental implementation for Julia does much better.[48] It was marked as a milestone for version 0.4, but only generational GC behavior had been merged into that version (but it can be two times faster).[49]

Julia, the 0.3 line, is on a monthly release schedule where bugs are fixed and some new things from 0.4 are backported.[50]

Embedding in other languages

The Julia C API allows using Julia (the whole runtime/libraries); calling Julia functions from C without needing to copy data. As most languages can call C, those other languages can also be supported (unless the target CPU is not supported by all three), such as C++, potentially C# (for C#, 0.4 is required for Windows 8.1 but older Windows may work in stable release[51]), or Python[52] which currently is also supported for calling in the other direction (even recursively).[53] In languages that support exceptions, Julia's exceptions can be caught and rethrown natively as in the languages mentioned here (except for C that does not have exceptions; in those languages Julia's exceptions should be caught and handled).

A library to call C++ (without using C to avoid name-mangling issues) is available that relies on "staged functions", a feature only available in 0.4.0-dev.

Compilation of Julia to JavaScript for execution in a browser is in progress.[54]

Forks of main Julia implementation

There are no alternative implementations or dialects of the Julia language (as not needed since the implementation is Open-source software), written from scratch.

The following forks are not incompatible forks of the core language (or libraries). They, of course, only provide functionality of the language at the time of the fork, but may synchronize with main julia (and might merge with it). In fact, probably neither needs to be maintained as a separate fork as the "REPL code was designed to have new modes added externally",[55] at least SJulia that started as a fork was changed to work as a package, usable with all the functionality described below, with the unchanged Julia implementation.

SJulia for symbolic computation (now a package, no longer a fork)

While there are libraries for symbolic computation, available for Julia, such as SymPy (a wrapper for a Python symbolic computation library), there is also a minor fork SJulia (that uses SymPy as a backend) that is a "partial, experimental, implementation of a language for symbolic computation. It is largely based on pattern matching and an evaluation sequence modeled on Mathematica" and for some things "SJulia is about 700 times faster [than SymPy, while] Mathematica 3 is about two times faster than SJulia".[56]

The fork had (at the time – a fork is not needed) a small set of changes to one file (the source code for the REPL)[57] to change the prompt[58] to sjulia> and allow toggling between symbolic mode and standard julia language mode. Note, this REPL change doesn't, per se, add a new language, as everything in symbolic mode can be done in standard mode by using the macro @ex that the symbolic mode just adds for you. In other words, the fork is just to reduce typing in an interactive environment and to provide a separate binary for that mode.

Julia2C source-to-source compiler

A Julia2C source-to-source compiler from Intel Labs is available.[59] This source-to-source compiler is implemented by a fork of Julia that emits C code instead of native machine code, for functions or whole programs. It is not meant to add or take anything from the julia language.[60]

References

  1. 1.0 1.1 "LICENSE.md". GitHub.
  2. "Contributors to JuliaLang/julia". GitHub.
  3. 3.0 3.1 3.2 "Why We Created Julia". Julia website. February 2012. Retrieved 7 February 2013.
  4. https://github.com/JuliaLang/julia/releases/tag/v0.3.7
  5. https://github.com/JuliaLang/julia/tree/v0.3.7
  6. https://julialang.org
  7. Non-GPL Julia?
  8. http://julia.readthedocs.org/en/latest/manual/introduction/
  9. beats Fortran in some cases and even C
  10. "The Julia Language" (official website).
  11. Bryant, Avi (15 October 2012). "Matlab, R, and Julia: Languages for data analysis". O'Reilly Strata.
  12. Krill, Paul (18 April 2012). "New Julia language seeks to be the C for scientists". InfoWorld.
  13. Finley, Klint (3 February 2014). "Out in the Open: Man Creates One Programming Language to Rule Them All". Wired.
  14. "Suspending Garbage Collection for Performance...good idea or bad idea?".
  15. https://groups.google.com/forum/#!topic/julia-users/MtF4wHc77sw
  16. build_executable.jl
  17. https://groups.google.com/forum/#!topic/julia-users/lDM7-YXT2LU
  18. https://github.com/stevengj/PyCall.jl/blob/master/src/PyCall.jl#L419
  19. Julia REPL documentation
  20. See also: http://julia.readthedocs.org/en/latest/manual/strings/ for string interpolation and the string(greet, ", ", whom, ".\n") example for preferred ways to concatenate strings. While the + operator is not used for string concatenation, it could easily be defined to do so. Julia has the println and print functions, but also a @printf macro, while not in a function form, to eliminate run-time overhead of formatting (unlike the same function in C).
  21. "Julia Documentation". julialang.org. Retrieved 18 November 2014.
  22. Learn Julia in Y Minutes
  23. "METADATA.jl" (central package listing for Julia)
  24. "Julia Package Library". Julialang.org. Retrieved 18 November 2014.
  25. http://aviks.github.io/JavaCall.jl/
  26. "calling Julia from Mathematica". Retrieved 9 April 2015.
  27. http://rtalks.net/RCall.jl/
  28. https://github.com/lgautier/Rif.jl
  29. statistical graphics for Julia
  30. http://distributionsjl.readthedocs.org/en/latest/
  31. http://dmbates.blogspot.com/2012/03/julia-functions-for-rmath-library.html
  32. https://github.com/JuliaLang/julia/blob/master/DISTRIBUTING.md
  33. http://www.stat.wisc.edu/~bates/JuliaForRProgrammers.pdf
  34. http://www.johnmyleswhite.com/notebook/2012/12/02/the-state-of-statistics-in-julia/
  35. http://active-analytics.com/blog/chainladder-julia-r-rcpp/
  36. https://github.com/JuliaLang/julia/
  37. https://github.com/JuliaLang/julia/blob/master/README.arm.md
  38. https://github.com/JuliaLang/julia/issues/10488
  39. https://github.com/JuliaLang/julia/labels/arm
  40. ARM test failures
  41. ARM nightlies
  42. Segfault using Pkg on ARM
  43. build changes for ARM #7662
  44. Port to ARM #3134
  45. https://github.com/JuliaLang/julia/blob/master/Make.powerpc
  46. "Julia: A Fast Dynamic Language for Technical Computing" (PDF). 2012.
  47. Gibbs, Mark (9 January 2013). "Pure and Julia are cool languages worth checking out". Network World (column). Retrieved 7 February 2013.
  48. https://github.com/JuliaLang/julia/pull/5227 WIP: Incremental GC
  49. https://github.com/JuliaLang/julia/pull/8699 Generational behavior for the garbage collector
  50. https://github.com/JuliaLang/julia/issues/9045
  51. "Unable to use 'libjulia.dll' in a C# application on Windows 8.1".
  52. https://github.com/JuliaLang/pyjulia
  53. http://julia.readthedocs.org/en/latest/manual/embedding/
  54. "Support compiling to JavaScript with Emscripten". Retrieved 28 January 2015.
  55. "Symbolic relations package". Retrieved 22 April 2015. SJulia already works as a package (Jim Garrison made the changes). I just learned that it should be possible to add a mode to the REPL in the package code, so that the fork/PR-to-Julia is no longer necessary. [..] The SJulia command line mode is now built into the module, you no longer need to build the fork of Julia (thanks Keno).
  56. https://github.com/jlapeyre/SJulia
  57. https://github.com/jlapeyre/julia/compare/jl/symrepl
  58. https://github.com/jlapeyre/julia/commit/d09e635fc65aff61211ce7ff01bd10a2c8c1760a
  59. https://github.com/IntelLabs/julia/tree/j2c/j2c
  60. http://julia-programming-language.2336112.n4.nabble.com/Julia2C-initial-release-td7595.html

External links