Julia (programming language)
|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|
|0.3.7 / 23 March 2015|
|0.4.0-dev / Updated daily|
|Dynamic with type inference and optional type annotations|
|OS||Linux, OS X, FreeBSD, Windows|
|License||MIT License for core language while "the environment, which consists of the language, user interfaces, and libraries, is under the GPL" as some few libraries used by the standard library (that can be excluded) are copyleft.|
Julia is a high-level dynamic programming language designed to address the requirements of high-performance numerical and scientific computing while also being effective for general purpose programming. 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, 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, a standalone "executable that doesn't require any julia source code" can be built with build_executable.jl while by default the Julia runtime needs to be pre-installed.
- 1 Language features
- 2 Interaction
- 3 Packages – for instance to work with other languages
- 4 For use in statistics/data analysis
- 5 Seeing generated assembly just after typing code in
- 6 Implementation
- 7 References
- 8 External links
According to the official web site, the main features of the language are:
- Multiple dispatch: providing ability to define function behavior across many combinations of argument types
- Dynamic type system: types for documentation, optimization, and dispatch
- Good performance, approaching that of statically-typed languages like C
- Built-in package manager
- Lisp-like macros and other metaprogramming facilities
- Call Python functions: use the PyCall package (also works for newer Python 3)
- Call C functions directly: no wrappers or special APIs
- Powerful shell-like capabilities for managing other processes
- Designed for parallelism and distributed computation
- Coroutines: lightweight "green" threading
- User-defined types are as fast and compact as built-ins
- Automatic generation of efficient, specialized code for different argument types
- Elegant and extensible conversions and promotions for numeric and other types
- Efficient support for Unicode, including but not limited to UTF-8
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|
|Common Lisp||dynamic||opt-in||yes (but no dispatch)|
|Dylan||dynamic||default||partial (no dispatch)|
The Julia official distribution includes an interactive session shell, called Julia's REPL, which can be used to experiment and test code quickly. 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!
The REPL gives user access to the system shell and to help mode, by pressing
? 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, 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):
$ 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, enabling installation from the Julia prompt using
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
Many packages are available e.g. to call other languages from within Julia. For example, a package, JavaCall.jl, is available to call Java from Julia; Mathematica.jl, to call Mathematica. See below, for native Julia packages for symbolic computation or for calling other languages for it.
For use in statistics/data analysis
Also at least one package Gadfly.jl is available for Julia for "statistical graphics" a "plotting and data visualization system written in Julia". For working with distributions a package Distributions.jl is available.
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."
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."
"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." 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."
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
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" with "work in progress - several tests are known to fail, and backtraces are not available" but "[on ARM7] Samsung Chromebook [..] Julia starts up just fine"), and PowerPC being worked on. 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). Development of Julia began in 2009 and an open-source version was publicized in February 2012.
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. 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).
Julia, the 0.3 line, is on a monthly release schedule where bugs are fixed and some new things from 0.4 are backported.
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), or Python which currently is also supported for calling in the other direction (even recursively). 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.
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", 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".
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) to change the prompt 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. 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.
- "LICENSE.md". GitHub.
- "Contributors to JuliaLang/julia". GitHub.
- "Why We Created Julia". Julia website. February 2012. Retrieved 7 February 2013.
- Non-GPL Julia?
- beats Fortran in some cases and even C
- "The Julia Language" (official website).
- Bryant, Avi (15 October 2012). "Matlab, R, and Julia: Languages for data analysis". O'Reilly Strata.
- Krill, Paul (18 April 2012). "New Julia language seeks to be the C for scientists". InfoWorld.
- Finley, Klint (3 February 2014). "Out in the Open: Man Creates One Programming Language to Rule Them All". Wired.
- "Suspending Garbage Collection for Performance...good idea or bad idea?".
- Julia REPL documentation
- 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).
- "Julia Documentation". julialang.org. Retrieved 18 November 2014.
- Learn Julia in Y Minutes
- "METADATA.jl" (central package listing for Julia)
- "Julia Package Library". Julialang.org. Retrieved 18 November 2014.
- "calling Julia from Mathematica". Retrieved 9 April 2015.
- statistical graphics for Julia
- ARM test failures
- ARM nightlies
- Segfault using Pkg on ARM
- build changes for ARM #7662
- Port to ARM #3134
- "Julia: A Fast Dynamic Language for Technical Computing" (PDF). 2012.
- Gibbs, Mark (9 January 2013). "Pure and Julia are cool languages worth checking out". Network World (column). Retrieved 7 February 2013.
- https://github.com/JuliaLang/julia/pull/5227 WIP: Incremental GC
- https://github.com/JuliaLang/julia/pull/8699 Generational behavior for the garbage collector
- "Unable to use 'libjulia.dll' in a C# application on Windows 8.1".
- "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).