本文为作者Julia官网翻译,水平有限,还望指教。
Julia语言的介绍
Julia是高性能的动态高级科学计算语言,提供了精致的编译器(
sophisticated compiler),分布式并行计算(
distributed parallel execution),数值精度(
numerical accuracy),和一个可扩展的科学函数库。Julia的基础库是用Julia自身编写的,成熟的合并了(
integrates mature),最佳版本的C和Fortran的线性代数,随机数字生成,单线程,字符处理的库。另外,Julia开发者社区也提供了一系列的可扩展包,使用的是Julia内置的快速空间(
rapid pace)的包管理工具。IJulia结合了Jupyter和Julia社区,提供了一个强大的基于浏览器的图形笔记界面。
Julia程序是被组织成多样的数据类型(multiple dispatch),定义函数方法和过载的时候,不同的内容类型组合,可以被用户定义。
特点介绍(A Summary of Features)
1.多样的数据类型(multiple dispatch),提供在一个函数中交叉组合不同数据类型的能力。
2.动态类型系统,文件类型,最优化,分派(dispatch)。
3.高性能,接近静态编译语言,C。
4.内置包管理器。
5.类似LISP的宏指令(macros),和其他的元编程组件。
6.调用Python函数,用PyCall包。
7.可以直接调用C函数,不用封装器或者特殊的API。
8.强大的类shell进程管理能力。
9.平行分布式计算设计。
10.协同协议为轻量级“绿色"线程。
11.快速的用户自定义类型,内置,紧凑。
12.自动高效的生成特殊代码,对用不同的内容(argument )类型。
13.优雅可扩展的数据和其他类型的转化和建立。
14.高效支持Unicode,包括但不仅限于UTF-8。
15.MIT许可证,免费开源自由。
高性能JIT编译器(High-Performance JIT Compiler)
Julia是基于LLVM的实时编译器,性能对比如下图所示。
Fortran | Julia | Python | R | Matlab | Octave | Mathe-matica | JavaScript | Go | LuaJIT | Java | |
gcc 5.1.1 | 0.4.0 | 3.4.3 | 3.2.2 | R2015b | 4.0.0 | 10.2.0 | V8 3.28.71.19 | go1.5 | gsl-shell 2.3.1 | 1.8.0_45 | |
fib | 0.70 | 2.11 | 77.76 | 533.52 | 26.89 | 9324.35 | 118.53 | 3.36 | 1.86 | 1.71 | 1.21 |
parse_int | 5.05 | 1.45 | 17.02 | 45.73 | 802.52 | 9581.44 | 15.02 | 6.06 | 1.20 | 5.77 | 3.35 |
quicksort | 1.31 | 1.15 | 32.89 | 264.54 | 4.92 | 1866.01 | 43.23 | 2.70 | 1.29 | 2.03 | 2.60 |
mandel | 0.81 | 0.79 | 15.32 | 53.16 | 7.58 | 451.81 | 5.13 | 0.66 | 1.11 | 0.67 | 1.35 |
pi_sum | 1.00 | 1.00 | 21.99 | 9.56 | 1.00 | 299.31 | 1.69 | 1.01 | 1.00 | 1.00 | 1.00 |
rand_mat_stat | 1.45 | 1.66 | 17.93 | 14.56 | 14.52 | 30.93 | 5.95 | 2.30 | 2.96 | 3.27 | 3.92 |
rand_mat_mul | 3.48 | 1.02 | 1.14 | 1.57 | 1.12 | 1.12 | 1.30 | 15.07 | 1.42 | 1.16 | 2.36 |
function mandel(z)
c = z
maxiter = 80
for n = 1:maxiter
if abs(z) > 2
return n-1
end
z = z^2 + c
end
return 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
以上的代码十分的清晰,任何一个有过科学计算语言编程经验的人都会看懂。在不放弃性能的情况下比C++更加的简单。根据设计,Julia允许用户从低级的循环,到高级的编程风格,在牺牲部分性能的情况下,是的复杂的算法可以快速的处理。这个可持续的设计级现象是Julia接近编码的特点,也是这个语言的最重要的设计风格。
为平行和云计算而设计(Designed for Parallelism and Cloud Computing)
Julia在用户不强制任何特殊的平行类型,反而,一共了一系列的关键创建分布式空间(key building blocks for distributed computation),使得足够灵活去支持不同的数据类型,允许用户添加更多。下面的代码显示了如何在平行状态下投硬币的计算。
nheads = @parallel (+) for i=1:100000000 rand(Bool)end
IJulia和Gadfly分别是类似于Jupyter的网页编译环境和多样的数值计算图像显示包。
参考文献