Julia (programming language)

From Wikipedia, the free encyclopedia
Jump to: navigation, search
Julia
Official Julia logo
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]
Appeared in 2012; 3 years ago (2012)[3]
0.3.6 / 18 February 2015; 14 days ago (2015-02-18)[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]
.jl
Website julialang.org

Julia is a high-level dynamic programming language designed to address the requirements of high-performance[7] numerical and scientific computing while also being effective for general purpose programming.[8][9][10][11] 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,[12] uses eager evaluation, and includes efficient libraries for floating point, linear algebra, random number generation, fast Fourier transforms, and regular expression matching.

Language features[edit]

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[13][14])
  • 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 Scheme-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[edit]

The Julia official distribution include an interactive session shell, called Julia's REPL, which can be used to experiment and test code quickly.[15] 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 ; 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,[16] 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):[17]

$ julia <filename>

Packages[edit]

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,[18] enabling installation from the Julia prompt using Pkg.add("PackageName")

Packages are typically written in Julia but can include both binaries and code written in other languages, which can be automatically compiled at package install time by the package manager. 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[19] to call other languages from within Julia. For example, a package, JavaCall.jl/, is available to call Java from Julia.[20]

For use in statistics/data analysis[edit]

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[21]) is available for Julia for "calling R whenever it has a library that would be needed".[22]

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

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."[25][26]

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."[27]

"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."[28] See here for STATISTICS section (and OPERATIONS RESEARCH, Econometrics and Valuation - Finance) as an overview.

"In practical terms, multiple dispatch turns object orientated 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."[29]

Seeing generated assembly just after typing code in[edit]

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[edit]

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"[30] with "work in progress - several tests are known to fail, and backtraces are not available"[31]).[32][33][34][35][36][37] 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).[38] Development of Julia began in 2009 and an open-source version was publicized in February 2012.[3][39]

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 implementations for Julia does much better.[40] 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).[41]

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

Embedding in other languages[edit]

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# or Python which currently is also supported for calling in the other direction (even recursively).[43] 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" feature only available in 0.4.0-dev.

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

Forks of main Julia implementation[edit]

There are no alternative implementations (or dialects), written from scratch, of the Julia language (as not needed as it is open source).

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).

SJulia for symbolic computation[edit]

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 [than SymPy, while] Mathematica 3 is about two times faster than SJulia".[1]

The fork has a small set of changes to one file (the source code for the REPL)[45] to change the prompt[46] 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[edit]

A Julia2C source-to-source compiler from Intel Labs is available.[47] 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.[48]

References[edit]

  1. ^ a b "LICENSE.md". GitHub. 
  2. ^ "Contributors to JuliaLang/julia". GitHub. 
  3. ^ a b c "Why We Created Julia". Julia website. February 2012. Retrieved 7 February 2013. 
  4. ^ https://zenodo.org/record/15484/export/hx#.VO29v5-uPCJ
  5. ^ https://github.com/JuliaLang/julia/releases/tag/v0.3.6
  6. ^ http://julia.readthedocs.org/en/latest/manual/introduction/
  7. ^ beats Fortran in some cases and even C
  8. ^ "The Julia Language" (official website). 
  9. ^ Bryant, Avi (15 October 2012). "Matlab, R, and Julia: Languages for data analysis". O'Reilly Strata. 
  10. ^ Krill, Paul (18 April 2012). "New Julia language seeks to be the C for scientists". InfoWorld. 
  11. ^ Finley, Klint (3 February 2014). "Out in the Open: Man Creates One Programming Language to Rule Them All". Wired. 
  12. ^ "Suspending Garbage Collection for Performance...good idea or bad idea?". 
  13. ^ https://groups.google.com/forum/#!topic/julia-users/lDM7-YXT2LU
  14. ^ https://github.com/stevengj/PyCall.jl/blob/master/src/PyCall.jl#L419
  15. ^ Julia REPL documentation
  16. ^ "Julia Documentation". julialang.org. Retrieved 18 November 2014. 
  17. ^ Learn Julia in Y Minutes
  18. ^ "METADATA.jl" (central package listing for Julia)
  19. ^ "Julia Package Library". Julialang.org. Retrieved 18 November 2014. 
  20. ^ http://aviks.github.io/JavaCall.jl/
  21. ^ http://rtalks.net/RCall.jl/
  22. ^ https://github.com/lgautier/Rif.jl
  23. ^ statistical graphics for Julia
  24. ^ http://distributionsjl.readthedocs.org/en/latest/
  25. ^ http://dmbates.blogspot.com/2012/03/julia-functions-for-rmath-library.html
  26. ^ https://github.com/JuliaLang/julia/blob/master/DISTRIBUTING.md
  27. ^ http://www.stat.wisc.edu/~bates/JuliaForRProgrammers.pdf
  28. ^ http://www.johnmyleswhite.com/notebook/2012/12/02/the-state-of-statistics-in-julia/
  29. ^ http://active-analytics.com/blog/chainladder-julia-r-rcpp/
  30. ^ https://github.com/JuliaLang/julia/
  31. ^ https://github.com/JuliaLang/julia/blob/master/README.arm.md
  32. ^ https://github.com/JuliaLang/julia/labels/arm
  33. ^ ARM test failures
  34. ^ ARM nightlies
  35. ^ Segfault using Pkg on ARM
  36. ^ build changes for ARM #7662
  37. ^ Port to ARM #3134
  38. ^ "Julia: A Fast Dynamic Language for Technical Computing" (PDF). 2012. 
  39. ^ Gibbs, Mark (9 January 2013). "Pure and Julia are cool languages worth checking out". Network World (column). Retrieved 7 February 2013. 
  40. ^ https://github.com/JuliaLang/julia/pull/5227 WIP: Incremental GC
  41. ^ https://github.com/JuliaLang/julia/pull/8699 Generational behavior for the garbage collector
  42. ^ https://github.com/JuliaLang/julia/issues/9045
  43. ^ http://julia.readthedocs.org/en/latest/manual/embedding/
  44. ^ "Support compiling to JavaScript with Emscripten". Retrieved 28 January 2015. 
  45. ^ https://github.com/jlapeyre/julia/compare/jl/symrepl
  46. ^ https://github.com/jlapeyre/julia/commit/d09e635fc65aff61211ce7ff01bd10a2c8c1760a
  47. ^ https://github.com/IntelLabs/julia/tree/j2c/j2c
  48. ^ http://julia-programming-language.2336112.n4.nabble.com/Julia2C-initial-release-td7595.html

External links[edit]