科学计算从来就要求最高的性能,然而该领域的专家大规模迁移到较慢的动态语言应付日常工作。
猪吏相信群众有足够理由亲近动态语言做各种应用,猪吏并不期望群众减少使用动态语言。
幸运的是,摩登语言设计和编译器技术使得最大限度地消除性能权衡成为可能,并且提供一个足够产能的、足够高效的单独环境来做性能密集应用的原型设计和部署。
猪吏充当这个角色:是门灵活的动态语言,适合科学(数值)计算,有着可与传统静态类型语言媲美的性能。
因为猪吏编译器和Python/R等语言采用解释器不同,群众会发现猪吏的性能一上来并不明显(unintuitive)。如果群众发现任何蜗牛,猪吏强烈建议群众在尝试任何姿势之前通读【性能窍门】章节。群众一旦明白猪吏咋做,撸出快如C的代码易如反掌。
可选类型、重载、杰出性能是猪吏的特征,有赖类型推断(inference)和【JIT(Just-In-Time)】编译、【LLVM】。
多范式、命令式(combining features of imperative),函数式、面向对象,猪吏样样在行。
猪吏提供简单且善于表现的高级数值运算,像R/MATLAB/Python一样,且支持传统编程。
为此,猪吏继承数学编程语言的血统,同时混杂包括Lisp/Perl/Python/Lua/Ruby在内的流行动态语言精华(想来是个杂种)。
以下是猪吏与典型动态语言最显著的区别:
- 语言核心强扭甚少,基础和标准库用Julia编写,包括整型算术等原始操作。
- 一大堆类型用于构造描述对象,还可选地用来声明类型。
- 通过重载,能够定义多种参数类型交叉组合的函数行为。
- 为不同参数类型自动生成高效的,专业的代码。
- 极高性能,接近静态的、编译的,如C的编程语言。
尽管有人偶尔声称“动态语言是无类型的”,然而并非如此:每个对象,基本的或用户自定义的,都有类型。
大多动态缺失类型声明,可是,这意味着程序员不能告知编译器值的类型,通常完全不能明确告知类型信息。
在静态语言中,另外一方面,程序员通常则(必须)可以为编译器注解类型,类型仅存在于编译中,在运行时不能操作或表达。
猪吏中的类型则是运行时对象,也可以传达信息给编译器。
当临时码农(嚓)不需要显式使用类型或重载,这些是Julia的关键统一特性,函数定义在不同参数类型组合,通过重载运行最匹配的定义。这个模型很适合数学编程,该场合像传统面向对象重载中第一个参数持有操作会显得别扭。
操作符就是有着特殊符号的函数,对扩展额外的用于自定义数据类型,需要定义新的“+”函数。
已有的代码则将无缝应用到新的数据类型。
一部分受运行时类型推断(通过可选的类型注解扩展)的影响、一部分受Julia项目起初强烈聚焦性能的影响,Julia运算效率超越别的动态语言,甚至可与静态的、编译的语言一较高下。
对大规模数值问题,速度经常是、持续是、可能是决定性的:在过去的几十年,要处理的数据量亦符合(has easily kept pace with)摩尔定律(Moore's Law)。
猪吏旨在创造空前的、集好用(ease-of-use)、强大、高效于一身的独门语言。
出上述牛逼之外,Julia的一些可吹的体制包括:
- 自由且开源(MIT)。
- 用户自定义数据类型很快且紧凑如内建。
- 无需为追求性能而矢量化代码,裸码(devectorized: 居然造词)就很快。
- 为并行和分布式计算而设计。
- 轻量级绿色线程(协程(coroutines))。
- 低调(Unobtrusive)却强大的类型系统。
- 数值和别的类型优雅且可扩展的转换和提升。
- 有效地支持Unicode,包括但不限于UTF-8。
- 直接调用C函数,不需要特殊地API包装。
- 强大的类SHELL能力管理过程。
- 类Lisp宏和别的元编程设施。
- 江胡规矩,来一波自吹自擂。