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.9 / 30 May 2015|
|0.4.0-dev / Updated daily|
|Dynamic with type inference and type annotations|
|OS||Linux, OS X, FreeBSD, Windows|
|License||MIT / GPL v2 A make-file option drops the GPL libraries|
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, even server/web use or as a specification language. 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, uses eager evaluation, and includes efficient libraries for floating point, linear algebra, random number generation, fast Fourier transforms, and regular expression matching.
- 1 Language features
- 2 Interaction
- 3 Packages
- 4 For use in statistics/data analysis
- 5 Displaying assembly code
- 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>
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 C, Fortran, Python, or 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, using WinRPM.jl, machine code ("binaries")). 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
To use Julia with other languages
There are wrapper (or meta-wrapper) libraries to work with graphical user interfaces (GUIs), such as cross-platform (for, at least, Linux, Windows and OS X) GTK+ (uses PySide written in Python), Qt or Tk – or JGUI.jl that hides the differences of those and works with what is available. Also for "creating and working with browser windows" Blink.jl is available.
For use in statistics/data analysis
When Julia may not have some software library for statistics, a package RCall.jl and another Rif.jl is available for Julia for "calling R whenever it has a library that would be needed" (and vice versa, RJulia.jl to call Julia from R).
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."
Displaying assembly code
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 built-in 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 (JIT) generation of 64-bit or 32-bit optimized machine code (e.g. not for VM) depending on the platform Julia runs 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 typical HPC number-crunching, that choice is not a problem, but for real-time-sensitive such as audio work it can be, where an incremental implementation (marked as a milestone for 0.4) for Julia does much better. In 0.4-dev, a new generational GC has been merged (that can be two times faster than the one in stable 0.3.x).
Julia, the 0.3 line, is on a monthly release schedule where bugs are fixed and some new things from 0.4 are backported.
Current and future platforms
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" with alpha support for Raspberry Pi 1/2 but "[on ARMv7] Samsung Chromebook [..] Julia starts up just fine"), and PowerPC being worked on.
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.
Julia2C source-to-source compiler
A Julia2C source-to-source compiler from Intel Labs is available. This source-to-source compiler is a fork of Julia, that implements the same Julia language syntax, which emits C code (for compatibility with more CPUs) instead of native machine code, for functions or whole programs. The compiler is also meant to allow analyzing code at a higher level than C.
- "LICENSE.md". GitHub.
- "Contributors to JuliaLang/julia". GitHub.
- "Why We Created Julia". Julia website. February 2012. Retrieved 7 February 2013.
- Non-GPL Julia?
- "Introduce USE_GPL_LIBS Makefile flag to build Julia without GPL libraries".
Note that this commit does not remove GPL utilities such as git and busybox that are included in the Julia binary installers on Mac and Windows. It lets you build from source without any GPL library dependencies.
- "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.
- "Limitations". node-julia.
- Moss, Robert (26 June 2015). "Using Julia as a Specification Language for the Next-Generation Airborne Collision Avoidance System". Retrieved 29 June 2015.
- Shah, Viral (16 May 2015). "Julia will always be open source".
- "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.
- "Using Rust from Perl and Julia". Retrieved 15 May 2015.
Julia is even easier to use [than Perl, in the given example]
- Karpinski, Stefan (5 September 2013). "Julia and the Rust Language". Retrieved 15 May 2015.
Since Rust uses the C ABI, we can already call Rust libraries just as well as C. I have no idea what Erlang's ABI is like, but if it can expose a C ABI, then we can call it. Beyond that would take some work but is certainly possible.
- statistical graphics for Julia
- "Chris Lattner discusses the name LLVM". Retrieved 22 December 2011.
- "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
- "Support MCJIT". Retrieved 26 May 2015.
- "Using MCJIT with the Kaleidoscope Tutorial". 22 July 2013. Retrieved 26 May 2015.
- "Cross-compiling for ARMv6". Retrieved 16 May 2015.
I believe #10917 should fix this. The CPU used there arm1176jzf-s.
- "ARM build failing during bootstrap on Raspberry Pi 2". Retrieved 16 May 2015.
I can confirm (FINALLY) that it works on the Raspberry Pi 2 [..] I guess we can announce alpha support for arm in 0.4 as well.
- "Porting Julia to PowerPC". Retrieved 9 May 2015.
Wow, the latest git allows me to build to completion.
- "Unable to use 'libjulia.dll' in a C# application on Windows 8.1".
- "Julia2C initial release".
By translating Julia to C, we leverage the high-level abstractions (matrix, vector, ..), which are easier to analyze, and can potentially add the rich extensions of C (like openmp, tbb, ...).
The tool may also extend Julia to new architectures where the only available tool chain is for C [..]
Translation from C to Julia might be harder.