Julia语言
按:本文译自Julia首页:http://julialang.org/。
什么是Julia?维基是这么说的:一群拥有各种语言丰富编程经验的Matlab高级用户,对现有的科学计算编程工具感到不满——这些软件对自己专长的领域表现得非常棒,但在其它领域却非常糟糕。他们想要的是一个开源的软件,它要像C语言一般快速而有拥有如同Ruby的动态性;要具有Lisp般真正的同像性(Homoiconicity)而又有Matlab般熟悉的数学记号;要像Python般通用、像R般在统计分析上得心应手、像Perl般自然地处理字符串、像Matlab般具有强大的线性代数运算能力、像shell般胶水语言的能力,易于学习而又不让真正的黑客感到无聊;还有,它应该是交互式的,同时又是编译型的……。真是神器啊。
Julia是一种运用于技术计算的高水平高性能的编程语言,它的语法对于其他技术计算环境的用户也会是很熟悉的。它提供了精致的编译器,分布式并行执行,数值精度和大量的数学函数库。这些库,大部分是由Julia自己编写的,同时结合了成熟的最佳组合的C和Fortran库用来处理线性代数,随机数生成,快速傅里叶变换和字符串过程。更多的库会随时间而增加。Julia程序按下列方式进行组织:定义函数,然后按不同的参数类型组合重载它们(这也可以是用户定义的)。关于原理更深的讨论和Julia相对于其它系统的优点,可以阅读在线手册的introduce部分。
1 高性能JIT编译器
Julia的基于LLVM的即时编译器结合了语言的设计,能够接近或达到C/C++的性能,
为了能比较Julia和其它用于数值和科学计算的语言的表现,我们用一系列语言编写了一个微型基准集。源代码可以用多种语言执行:C++, Fortran, Julia, Python, Matlab/Octave, R, an和JavaScript。我们希望你忽略代码而去获得关于每一种语言在数值编程方面或难或易的感觉。下列微型基准的运行结果来自于一台 有 a2.53GHz Intel Core 2 Duo CPU 和8GB of 1066MHz DDR3 RAM的 MacBook Pro。
这些基准虽不全面,但是可以对各种常见的代码模式测试编译器性能,如函数调用,字符串解析,数值排序,循环,随机数生成,和数组运算。值得注意的是,这些性能的实现并非按照绝对最大性能来写的(最快的计算fib(20)的代码是常数值6765)。所有这些基准写出来检验特殊算法的性能,用每种语言的有效方式来表达。特别的,所有的语言使用相同的算法:
Fibonacci基准都是循环的而pi求和(pi summation)基准都是递归的;随机矩阵乘法所用的算法叫做LAPACK,除非象JavaScript,不能使用这样的应用。这些基准的目的是通过特殊算法的语言运行来比较性能,而不是比较最快计算结果的方式,那在大多数高水平语言中依赖调用C代码。
Julia在所有的微基准上击败了除C++和Fortran之外的所有高水平系统。CSV格式的原始数据基准可以在网页上下载。特别的,在一个高水平语言的传统弱项上,Julia表现优异:标量算术循环(scalar arithmetic loops),这特别体现在pi总和基准上。Matlab的浮点运算JIT和V8 JavaScript engine在这表现的也很好(一般而言,V8在一个非常动态的语言中提供类似C的表现是非常令人印象深刻的,然而,JS不能利用诸如LAPACK这样的科学计算包,那么在象矩阵乘法这样的基准上会有比较差的表现)。与Matlab和JS比起来,Julia拥有更广泛的方法来消除负载(overhead),从而可以优化各种用户定义的任意的数据类型,而不仅仅是一些特殊情况。
来看看使用Julia的感觉吧,下面是用在Mandelbrot集和随机矩阵统计基准上的代码:
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的代码要简洁的多。我们有很多编译器优化的计划希望在未来缩短这个差距。通过设计,Julia允许你从低水平的循环和向量代码到高水平的编程风格,牺牲一些性能,换来简单表达复杂算法的能力。连续谱的编程水平是Julia的一个标志性编程方法和这种语言的一种明显特征。
2 为并行和云计算的设计
Julia没有对用户强加任何并行的风格,而是为分布式计算提供了很多关键性的模块,使得它能轻松的进行许多并行的处理,并允许用户添加更多。下面这个简单的例子演示了如何在并行当中计算大量投掷硬币时正面出现的数量。
nheads = @parallel (+) for i=1:100000000
randbit()
end
这个计算是通过所有可提供的计算节点自动分布的,计算结果,由+号简化,返回到调用的节点。
尽管还处于早期阶段,Julia已经可以支持完全的远程云计算方式。下面是一张基于网络的Julia会话的截图,画出了震荡函数和高斯随机漫步。
最终Julia会拥有完整的基于云的操作,如数据管理,代码编辑和分享,执行,测试,协同,分析,数据探索和可视化。目标是使得处理大数据的人们不再烦心于机器的维护和数据的管理,从而直面真实的问题。
3 免费,开源和友好的库
Julia的核心代码的实现基于MIT协议(MIT license),许多使用Julia环境的库也有它们自己的协议,如GPL, LGPL, 和 BSD。Julia也可以被用户作为一个共享库和他们的C,Fortran代码或专有的第三方库结合使用。更进一步的,Julia可以很容易的调用C和Fortran共享库中的外部函数,而不用书写任何的包装器代码甚至不用重新编译现有代码。你可以尝试在Julia交互提示符中直接引用外部库函数,可以直接得到反馈结果。
什么是Julia?维基是这么说的:一群拥有各种语言丰富编程经验的Matlab高级用户,对现有的科学计算编程工具感到不满——这些软件对自己专长的领域表现得非常棒,但在其它领域却非常糟糕。他们想要的是一个开源的软件,它要像C语言一般快速而有拥有如同Ruby的动态性;要具有Lisp般真正的同像性(Homoiconicity)而又有Matlab般熟悉的数学记号;要像Python般通用、像R般在统计分析上得心应手、像Perl般自然地处理字符串、像Matlab般具有强大的线性代数运算能力、像shell般胶水语言的能力,易于学习而又不让真正的黑客感到无聊;还有,它应该是交互式的,同时又是编译型的……。真是神器啊。
Julia是一种运用于技术计算的高水平高性能的编程语言,它的语法对于其他技术计算环境的用户也会是很熟悉的。它提供了精致的编译器,分布式并行执行,数值精度和大量的数学函数库。这些库,大部分是由Julia自己编写的,同时结合了成熟的最佳组合的C和Fortran库用来处理线性代数,随机数生成,快速傅里叶变换和字符串过程。更多的库会随时间而增加。Julia程序按下列方式进行组织:定义函数,然后按不同的参数类型组合重载它们(这也可以是用户定义的)。关于原理更深的讨论和Julia相对于其它系统的优点,可以阅读在线手册的introduce部分。
1 高性能JIT编译器
Julia的基于LLVM的即时编译器结合了语言的设计,能够接近或达到C/C++的性能,
为了能比较Julia和其它用于数值和科学计算的语言的表现,我们用一系列语言编写了一个微型基准集。源代码可以用多种语言执行:C++, Fortran, Julia, Python, Matlab/Octave, R, an和JavaScript。我们希望你忽略代码而去获得关于每一种语言在数值编程方面或难或易的感觉。下列微型基准的运行结果来自于一台 有 a2.53GHz Intel Core 2 Duo CPU 和8GB of 1066MHz DDR3 RAM的 MacBook Pro。
性能比较。以c++的用时(为1)为基准,越小越好。 |
这些基准虽不全面,但是可以对各种常见的代码模式测试编译器性能,如函数调用,字符串解析,数值排序,循环,随机数生成,和数组运算。值得注意的是,这些性能的实现并非按照绝对最大性能来写的(最快的计算fib(20)的代码是常数值6765)。所有这些基准写出来检验特殊算法的性能,用每种语言的有效方式来表达。特别的,所有的语言使用相同的算法:
Fibonacci基准都是循环的而pi求和(pi summation)基准都是递归的;随机矩阵乘法所用的算法叫做LAPACK,除非象JavaScript,不能使用这样的应用。这些基准的目的是通过特殊算法的语言运行来比较性能,而不是比较最快计算结果的方式,那在大多数高水平语言中依赖调用C代码。
Julia在所有的微基准上击败了除C++和Fortran之外的所有高水平系统。CSV格式的原始数据基准可以在网页上下载。特别的,在一个高水平语言的传统弱项上,Julia表现优异:标量算术循环(scalar arithmetic loops),这特别体现在pi总和基准上。Matlab的浮点运算JIT和V8 JavaScript engine在这表现的也很好(一般而言,V8在一个非常动态的语言中提供类似C的表现是非常令人印象深刻的,然而,JS不能利用诸如LAPACK这样的科学计算包,那么在象矩阵乘法这样的基准上会有比较差的表现)。与Matlab和JS比起来,Julia拥有更广泛的方法来消除负载(overhead),从而可以优化各种用户定义的任意的数据类型,而不仅仅是一些特殊情况。
来看看使用Julia的感觉吧,下面是用在Mandelbrot集和随机矩阵统计基准上的代码:
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的代码要简洁的多。我们有很多编译器优化的计划希望在未来缩短这个差距。通过设计,Julia允许你从低水平的循环和向量代码到高水平的编程风格,牺牲一些性能,换来简单表达复杂算法的能力。连续谱的编程水平是Julia的一个标志性编程方法和这种语言的一种明显特征。
2 为并行和云计算的设计
Julia没有对用户强加任何并行的风格,而是为分布式计算提供了很多关键性的模块,使得它能轻松的进行许多并行的处理,并允许用户添加更多。下面这个简单的例子演示了如何在并行当中计算大量投掷硬币时正面出现的数量。
nheads = @parallel (+) for i=1:100000000
randbit()
end
这个计算是通过所有可提供的计算节点自动分布的,计算结果,由+号简化,返回到调用的节点。
尽管还处于早期阶段,Julia已经可以支持完全的远程云计算方式。下面是一张基于网络的Julia会话的截图,画出了震荡函数和高斯随机漫步。
最终Julia会拥有完整的基于云的操作,如数据管理,代码编辑和分享,执行,测试,协同,分析,数据探索和可视化。目标是使得处理大数据的人们不再烦心于机器的维护和数据的管理,从而直面真实的问题。
3 免费,开源和友好的库
Julia的核心代码的实现基于MIT协议(MIT license),许多使用Julia环境的库也有它们自己的协议,如GPL, LGPL, 和 BSD。Julia也可以被用户作为一个共享库和他们的C,Fortran代码或专有的第三方库结合使用。更进一步的,Julia可以很容易的调用C和Fortran共享库中的外部函数,而不用书写任何的包装器代码甚至不用重新编译现有代码。你可以尝试在Julia交互提示符中直接引用外部库函数,可以直接得到反馈结果。
热门话题 · · · · · · ( 去话题广场 )
- 我的童年阅读记忆 126.9万次浏览
- 童年涂鸦拾遗 144.3万次浏览
- 给童年时期的自己推荐一本书 112.1万次浏览
- 看展记 1.3亿次浏览
- 身边的科普现场 新话题
- 一人一杯一口入魂的夏日特饮 新话题 · 8630次浏览