The Julia Language 中文文档

407 阅读4分钟

Julia 1.2 Documentation

欢迎阅读Julia 1.2的文档.

请阅读发行说明 ,了解自上次发布以来发生的变化.

Note该文档还提供PDF格式: julia-1.2.0.pdf .

Introduction

传统上,科学计算需要最高的性能,但领域专家在很大程度上转向使用较慢的动态语言进行日常工作. 我们认为有很多很好的理由喜欢这些应用程序的动态语言,我们不希望它们的使用减少. 幸运的是,现代语言设计和编译器技术可以大大消除性能折衷,并提供足够的单一环境来进行原型设计,并且足够高效地部署性能密集型应用程序. Julia编程语言充当了这个角色:它是一种灵活的动态语言,适用于科学和数值计算,其性能可与传统的静态类型语言相媲美.

因为Julia的编译器与用于Python或R等语言的解释器不同,您可能会发现Julia的性能起初并不直观. 如果您发现某些内容很慢,我们强烈建议您在尝试其他任何内容之前先阅读"效果提示"部分. 一旦了解了Julia的工作原理,就可以轻松编写几乎与C一样快的代码.

Julia具有可选的输入,多个调度和良好的性能,使用类型推断和即时(JIT)编译实现,使用LLVM实现. 它是多范式的,结合了命令式,功能性和面向对象编程的特性. Julia为高级数值计算提供了易用性和表现力,与R,MATLAB和Python等语言一样,但也支持通用编程. 为了实现这一目标,Julia建立在数学编程语言的基础之上,但也从流行的动态语言中借鉴了很多,包括LispPerlPythonLuaRuby .

Julia与典型动态语言最重要的不同之处在于:

  • 核心语言很少; Julia Base和标准库是用Julia编写的,包括整数运算等基本操作
  • 用于构造和描述对象的丰富语言类型,也可以选择用于进行类型声明
  • 通过多次调度在多种参数类型组合中定义函数行为的能力
  • 为不同的参数类型自动生成高效的专用代码
  • 良好的性能,接近像C这样的静态编译语言

虽然人们有时会说动态语言是"无类型的 ",但它们绝对不是:每个对象,无论是原始的还是用户定义的,都有一个类型. 但是,大多数动态语言中缺少类型声明意味着无法向编译器指示值的类型,并且通常根本无法明确地讨论类型. 另一方面,在静态语言中,虽然可以 - 通常必须 - 为编译器注释类型,但类型仅在编译时存在,并且不能在运行时进行操作或表达. 在Julia中,类型本身就是运行时对象,也可以用于将信息传递给编译器.

While the casual programmer need not explicitly use types or multiple dispatch, they are the core unifying features of Julia: functions are defined on different combinations of argument types, and applied by dispatching to the most specific matching definition. This model is a good fit for mathematical programming, where it is unnatural for the first argument to "own " an operation as in traditional object-oriented dispatch. Operators are just functions with special notation – to extend addition to new user-defined data types, you define new methods for the + function. Existing code then seamlessly applies to the new data types.

部分原因是运行时类型推断(由可选类型注释增强),部分原因是由于项目开始时对性能的强烈关注,Julia的计算效率超过了其他动态语言,甚至是静态编译的竞争对手语言. 对于大规模的数值问题,速度始终如一,并且可能始终是至关重要的:在过去几十年中,正在处理的数据量很容易与摩尔定律保持同步.

Julia旨在以单一语言创建前所未有的易用性,功能和效率组合. 除此之外,Julia相比系统的一些优势包括:

  • 免费和开源( MIT许可
  • 用户定义的类型与内置函数一样快速和紧凑
  • 无需对代码进行矢量化以提高性能; devectorized代码很快
  • 专为并行和分布式计算而设计
  • 轻量级"绿色 "线程( 协同程序
  • 不引人注目但功能强大的类型系统
  • 针对数字和其他类型的优雅且可扩展的转换和促销
  • Unicode的有效支持,包括但不限于UTF-8
  • 直接调用C函数(不需要包装器或特殊API)
  • 强大的shell类功能,用于管理其他进程
  • 类似Lisp的宏和其他元编程工具