1.1 Julia为什么与众不同
科学计算程序是所有程序中对计算性能要求最高的。多年来,科学界一直使用动态语言来构建应用程序,但是动态语言有一个致命的缺点,就是相对于静态语言要慢得多。但是为什么在对速度要求如此高的科学计算领域,人们还是首选动态语言来进行编程呢?这样做的一个主要原因是,这些应用程序通常是由物理学家、生物学家、金融专家和其他领域专家开发的,尽管他们具有一定的编程经验,但毕竟不是经验丰富的开发人员,静态语言复杂的结构和语法对他们来说难以快速上手。
所以,相较于难以上手的静态语言,他们更偏爱动态语言;相较于更好的性能,他们更看重功能的实现难度和代码的可读性。而且,现在有一些特殊的软件包可以改善代码的性能,比如Numpy for Python。随着编译器技术和动态语言设计的进步,如今动态语言已经可以兼顾性能和可读性。比如Python,它是一种动态语言,并且可以提供C语言的性能(C是一种静态类型语言)。2012年,Julia问世。根据JuliaLang主页上提供的不同基准测试数据,Julia的性能表现可以与C/C++媲美。同时Julia与C/C++相比,它可以提供一个可以有效用于原型设计的环境,其交互友好性可以与Python媲美。Julia能做到如此水平,归功于Julia的设计和基于JIT编译器的LLVM。
下面的一段话来自Julia开发团队对Julia为什么被创造出来的一些看法。
“我们很贪心:我们想要更多,我们想要一种开源的语言,拥有自由许可。我们希望它兼具C的速度与Ruby的活力;有像Lisp这样的真正的宏,同时有一些明显的、熟悉的数学符号,就像MATLAB一样。我们还想要它像Python一样有可用于通用编程的特性,并且像R一样容易进行统计分析,像Perl一样自然地用于字符串处理,像MATLAB一样强大的线性代数计算能力,像Shell一样擅长将程序黏合在一起。它简单易学,但又让最专业的黑客感到高兴。我们希望它是交互式的,可以被编译。”
Julia受到了很多其他语言的影响。比如受Python的影响,具有高可读性和快速原型设计能力;受MATLAB的影响,可以很容易地操作矢量化数值函数,特别是矩阵;受R的影响,对数学和统计操作有良好的支持。Julia从这些语言中学到了很多,并试图将所有这些世界中最好的东西融合在一起,成为一个最让人喜爱的语言。
Julia非常擅长科学计算,但又并不局限于此。因此,它也可以用于网络和通用编程。Julia的开发团队想用一种语言在兼顾功能和效率的同时,不影响其易用性。Julia的核心大部分都在Julia中实现,其解析器用Scheme编写,Julia的高效和跨平台I/O由Node.js的libuv提供。
下面列举Julia的一些特色功能。
• Julia专门为分布式和并行计算而设计。
• Julia提供了大量的数学函数包,且具有很高的数值精度。
• Julia提供了多重分派的功能。多重分派是指通过使用不同参数类型的组合来选择相应函数的行为(类似于C++中的函数重载的概念)。
• PyCall包让Julia可以在代码中调用Python函数,MATLAB.jl让Julia可以使用MATLAB的包。另外,使用C编写的函数和包也可以被直接调用,无须API或包装器。
• Julia为管理系统中的其他进程提供类似于Shell的功能。
• 与其他语言不同,Julia中的用户自定义类型与内置类型一样紧密高效。
• Julia对Unicode有良好的支持。
• Julia具有元编程和类似于Lisp的宏功能,并且有一个内置的包管理器(Pkg)。
• Julia有免费开源的MIT许可证。
• 科学计算充分利用矢量化代码获得性能优势。Julia消除了代码对矢量化的依赖,使用Julia编写的去矢量化代码可以和矢量化代码运行一样快。