Julia中文社区

关于Julia语言

Julia是一个为数值计算设计的高性能的高级动态语言。Julia提供了一个复杂精巧的编译器,分布式的并行计算环境,精确地数值计算以及一个可扩展的数学函数库。Julia的基础库大部分由纯Julia语言编写,但是也集成了在特定领域(如线性代数随机数生成信号处理字符串处理)很多成熟的库。此外,Julia开发者社区也不断地通过Julia自带的包管理器在贡献大量的包(package)。此外,由Jupyter和Julia社区共同努力的成果IJulia,使得你可以在笔记本(notebook)界面里使用Julia。

Julia程序使用一种基于多重派发的编程范式,通过对不同类型的组合(类型可以是用户自定义的)定义和重载函数来进行组织。对于在不同系统上使用Julia的好处的深度讨论可以在下面的部分或者是介绍在线指南中找到。

Julia语言的特性

高性能的JIT编译器

Julia基于LLVM的即时编译(JIT)编译器和语言本身的设计使得它可以达到和C语言接近或者一致的性能。为了感受到Julia和其它语言相比之下在数值/科学计算方面的性能,我们为很多语言写了一些小的微基准(micro-benchmark)测试:C, Fortran, Julia, Python, Matlab/Octave, R, JavaScript, Java, Lua, Mathematica.我们鼓励你查看这些链接后的具体源码来感受在不同语言里进行数值计算是多么地难易程度。

benchmark

图片: 相对于C语言的基准测试(越小越好,C的性能 = 1.0)。从这个笔记本程序使用GadflyIJulia绘制。更详细的信息请查看基准测试页面

快速感受一下Julia

为了快速感受一下Julia写起来是什么感觉,这里有一个用来产生Mandelbrot和随机矩阵统计的基准测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function mandel(z)
c = z
maxiter = 80
for n = 1:maxiter
if abs2(z) > 4
return n-1
end
z = z^2 + c
end
maxiter
end

function randmatstat(t)
n = 5
v = zeros(t)
w = zeros(t)
for i = 1:t
a = randn(n,n)
b = randn(n,n)
c = randn(n,n)
d = randn(n,n)
P = [a b c d]
Q = [a b; c d]
v[i] = trace((P.'*P)^4)
w[i] = trace((Q.'*Q)^4)
end
std(v)/mean(v), std(w)/mean(w)
end

以上的代码已经足够清楚了,并且应该对任何使用过其它数学语言的人都很舒旭。Julia对于randmatstat的实现比起C语言的实现要简单得多,却又没有造成太多的性能损失, 计划中的编译器优化将会去除这里的性能差距。设计上,Julia使得你可以使用简单的循环(low-level loops)亦或者是在牺牲非常有限的 性能的下使用高级编程范式(high-level programming style)来在用非常简单地方式实现复杂的算法。这种连续地编程层次上的变化正是 使用Julia来编程的特点,也是Julia语言本身所设计的特性。

为并行计算和云计算设计

Julia并不会强加给用户任何一种特别的并行范式,而是提供一系列的分布式计算的关键组件,使得其足够灵活去支持多种并行方案,并且允许用户增加更多。下面简单地例子展示了如何并行地抛硬币并且计数。

1
2
3
nheads = @parallel (+) for i = 1:100000000
rand(Bool)
end

着里的计算会被自动分布到所有可以使用的计算节点(作为进程),然后返回值会被求和(+),然后返回到发起进程的节点。

这里是一个基于web的交互式IJulia notebook的截图,这里使用了Gadfly。你也可以通过JuliaBox来通过一个按照需求预分配的Docker沙盒容器在你的浏览器中使用IJulia notebook。

Julia Box为云上的数据处理代码编辑,分享,执行,debug,合作开发,分析,数据浏览和可视化提供了一种可能性。最终,JuliaBox希望使得人们可以避免登陆和管理机器和数据,从而直接关心需要解决的实际问题。

Gadfly 可以在不同的渲染后端(SVG,PDF,PNG等等)上绘图。交互式的图片可以通过Interact.jl来实现。一些简单的Gadfly实例在下面展示:

开源免费并且对库友好

Julia的核心代码都是MIT许可协议。很多Julia模块所使用的库也都是开源协议GPL, LGPL, and BSD(因此包含语言,用户界面和库的环境是在GPL协议下的)。语言本身可以被编译成共享库,所以用户可以将Julia和自己的C/Fortran或者其它第三方库一起发行。你也可以通过Julia交互式界面来调用外部库,从而获得即刻的反馈。查看LICENSE以了解Julia的协议细则。