用户手册
简介
科学计算历来要求最高的性能,但在日常工作中,应用工程师往往依赖于速度较慢的动态语言。我们认为,选择动态语言是合理的,而且我们也不希望动态语言的使用会减少。幸运的是,现代语言和编译器的组织技术最大限度地减少了性能损失,并为性能密集型应用程序的原型设计和部署提供了足够高效的统一环境。Julia 编程语言就满足了这一目的:它是一种灵活的动态语言,适用于科学和数值计算,其性能可与传统的静态类型语言相媲美。
由于 Julia 编译器不同于 Python 或 R 等语言使用的解释器,因此您可能一开始难以理解 Julia 的性能。如果您的代码运行太慢,我们强烈建议您首先阅读性能提示。了解 Julia 的工作原理后,您就可以轻松编写运行速度几乎与 C 代码相同的代码。
Julia 的特性包括可选类型、多重分派和高性能,这些都是通过类型推断和使用 LLVM实现的 JIT编译来实现的。它是一种多范式编程语言,结合了命令式、函数式和面向对象编程的特点。Julia 可以像 R、MATLAB 或 Python 语言一样,对高级数值计算进行简单而富有表现力的编程,但也支持通用编程技术。为此,Julia 利用了数学编程语言的丰富遗产,同时大量借鉴了流行的动态语言,包括 Lisp, Perl, Python, Lua, 和 Ruby。
以下是 Julia 与典型动态语言的主要区别:
-
语言基础非常简洁;基础模块和标准库都是用 Julia 语言本身编写的,包括原始运算,如整数的算术运算;
-
用于创建和描述对象的多种类型,这些类型也可用于类型声明;
-
通过 多重调度,能够定义具有不同参数类型组合的函数的行为;
-
为不同参数类型自动创建高效的专用代码;
-
高性能,接近 C 语言等静态编译语言的性能。
虽然动态语言有时被称为无类型语言,但这肯定是不正确的:每个对象,无论是基元对象还是用户定义的对象,都有一个类型。然而,在大多数动态语言中缺乏类型声明意味着编译器无法得知值的类型,而且通常根本没有明确定义类型。另一方面,虽然在静态语言中,类型可以—而且通常要求—为编译器注释,但它们通常只存在于编译时,无法在运行时进行操作。在 Julia 中,类型本身就是运行时对象,但也可以用来向编译器提供信息。
虽然普通程序员并不需要明确使用类型或多重调度,但它们却是 Julia 语言的核心:函数是为参数类型的各种组合而定义的,并通过选择最具体的适当定义来应用。这种模式非常适合数学编程,因为在数学编程中,操作不必像传统的面向对象调度那样与第一个参数挂钩。操作符只是带有特殊符号的函数:要为新的自定义数据类型实现加法操作,只需为 +
函数定义新的方法即可。然后,您就可以安全地将现有代码应用于新的数据类型。
部分由于运行时的类型推断(通过可选的类型注解进行增强),部分由于从项目一开始就非常重视性能,Julia 的计算效率超过了其他动态语言,甚至可以与采用静态编译的语言相媲美。对于大型数值问题来说,速度一直是最重要的优先考虑因素,而且可能永远都是:在过去几十年中,处理的数据量一直在增长,完全遵循摩尔定律。
创建 Julia 语言的目标是提供前所未有的易用性、功能性和效率。除上述优点外,Julia 与其他同类语言相比还有许多其他优势:
-
免费开源语言(根据 MIT许可证发布);
-
自定义类型与内置类型一样简洁、快速;
-
无需通过矢量化代码来提高性能;非矢量化代码运行速度相当快;
-
支持并行和分布式计算;
-
轻量级 "绿色 "线程 coprograms
-
隐蔽但不断发展的类型系统;
-
优雅的可扩展转换和数字及其他类型的推广;
-
在 C 语言中直接调用函数(无需 shell 或特殊 API);
-
使用类 shell 设施控制其他进程的高效设施;
-
类似 Lisp 的宏和其他元编程设施。