Julia 1.0 中文文档
欢迎来到julia 1.0的文档。
请阅读,了解该语言的一般概述以及自julia v0.6以来的许多更改。请注意,0.7版本与1.0一起发布,以提供1.0版本之前的软件包和代码的升级路径。0.7和1.0之间的唯一区别是删除了弃用警告。有关自0.6以来的所有更改的完整列表,请参阅
介绍
传统上,科学计算需要最高的性能,然而领域专家却在日常工作中使用了较慢的动态语言,我们相信有很多很好的理由来支持这些应用程序的动态语言,而且我们并不期望它们的使用会减少。幸运的是,现代语言设计和编译技术使我们能够最大限度地消除性能上的平衡,并提供一个足够的环境,使其能够有效地部署性能密集型应用程序。
因为julia的编译器不同于python或r等语言的解释器,你可能会发现julia的表现在一开始并不直观,如果你发现有些东西很慢,我们强烈建议你在尝试其他任何东西之前阅读[性能技巧]( man-performance-tips),一旦你理解了julia的工作原理,你就很容易写出几乎和c一样快的代码。
julia具有可选类型标注、多重派单和良好的性能, 使用 llvm实现了类型推断和即时编译(jit)。它是多范式的, 结合了命令、功能和面向对象编程的特点。julia为高级数值计算提供了易用性和表现力, 其方式与 r、matlab 和 python 等语言相同, 但也支持一般编程。为了实现这一点, julia建立在数学编程语言的谱系上, 但也借用了许多流行的动态语言, 包括 lisp、perl、python、lua和ruby。
julia与典型动态语言最重要的不同之处是:
- 核心语言的作用非常小,julia base和标准库都是用julia己编写的,包括像整数运算这样的原始运算。
- 一种用于构造和描述对象的丰富的类型语言,它也可以被用来进行类型声明
- 通过多重分派定义各种参数类型的函数行为的能力。
- 为不同的参数类型自动生成高效、专门的代码
- 良好的性能,接近静态编译语言,如c语言
尽管有时人们会说动态语言是“没有类型的”,但它们绝对不是:每个对象,无论是原始的还是用户定义的,都有一个类型。然而,在大多数动态语言中,没有类型声明,这意味着不能对编译器进行指令,而且通常不能明确地讨论类型。在静态语言中,虽然可以(通常必须)为编译器提供注释类型,但类型只在编译时存在,并且不能在运行时被操纵或表达。
虽然休闲程序员(the casual programmer)不需要显式地使用类型或多重派发,但它们是julia的核心统一特性:函数是在不同的参数类型组合上定义的,并通过分派到最特定的匹配定义来应用。这种模型非常适合于数学编程,在这种情况下,第一个参数“own”一个操作就像传统的面向对象的分派器一样。运算符只是具有特殊表示法的函数-若要扩展对新用户定义数据类型的添加, 请为+
函数定义新方法。然后, 现有代码无缝地应用于新的数据类型。
部分由于运行时类型推断(由可选类型注解增强),部分由于项目开始时对性能的强烈关注,julia的计算效率超过了其他动态语言,甚至是静态编译语言的竞争对手语言。对于大规模的数字问题,是始终持续的,并且可能永远都是至关重要的:在过去的几十年里,处理的数据量很容易跟上摩尔定律(moore's law)的步伐。
julia的目标是在一种语言中创造出一种前所未有的易用、强大和效率的组合。除此之外,julia在类似系统上的一些优势包括:
- 免费和开源(mit许可)
- 用户定义的类型和内建类型一样快和兼容
- 无需特意编写向量化的代码;非向量化的代码就很快
- 为并行计算和分布式计算设计
- 轻量级的“绿色”线程 (coroutines)
- 低调但强大的类型系统
- 优雅和可扩展的数字和其他类型的转换和升级
- 对unicode的有效支持,包括但不限于utf-8
- 直接调用c函数(不需要包装器或特殊api)
- powerful shell-like capabilities for managing other processes
- 拥有shell一样强大的功能来管理其他流程
- 类似于lisp的宏(lisp-like)和其他元编程工具