以前听说过Julia,不过那时候官网还处于时不时宕机状态,最近Julia发布了1.0 released版本到处都是它的资讯,官网良心自带简体中文,趁着热度我也来试试,顺便聊记一二。
关于JuliaJulia源于用户需求。用户希望有一门开源的脚本编程语言,有C的高性能,Ruby的灵活,Lisp的宏,Matlab那样亲切的数学表达式符号。它既可以像Python一样作为通用编程语言,也可以像R一样用于统计分析,像Perl一样自然的处理字符串,像Matlab一样强大的线性代数,像Shell一样的胶着其他程序。
简而言之,它什么都想,什么都像...
官方给出的Julia有以下特性(省略了一些):
快速:Julia可以通过LLVM而跨平台被编译成高效的本地代码。
通用:Julia使用多分派作为编程范式,使其很容易表达面向对象和函数式编程范式。
动态:Julia是动态类型的,与脚本语言类似
数值计算:Julia擅长于数值计算,它的语法适用于数学计算,支持多种数值类型,并且支持并行计算。
可选的类型标注:Julia拥有丰富的数据类型描述
可组合:Julia的包可以很自然的组合运行。单位数量的矩阵或数据表一列中的货币和颜色可以一起组合使用并且拥有良好的性能。
变量和字符串Julia内建支持大数运算,不需要调用函数。同时也支持unicode
julia> 83275689127389671289376897238976*895623897689127389068912376897289/3487689234768972893+28358923785-23895728937 -3.4911515696355016e18 julia> unicode_var = "你好,中国" "你好,中国" julia> 'g' 'g': ASCII/Unicode U+0067 (category Ll: Letter, lowercase) julia> λ = "special_variable_name" "special_variable_name" julia> λ = "redefine its value since it's a variable" "redefine its value since it's a variable"字符串会处理转义字符,如果想保留它们需要在前面加上raw
julia> println("hello\nworld") hello world julia> println(raw"hello\nworld") hello\nworld还可以通过下标运算取到对应字符,最后一个字符用end指代,这但是下标居然不是从0开始的!
julia> welcome[0] ERROR: BoundsError: attempt to access "hello world" at index [0] julia> welcome[1] 'h': ASCII/Unicode U+0068 (category Ll: Letter, lowercase) julia> welcome[end] 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)还可以使用切片操作welcome[2:4]获取子字符串ello。
拼接字符串需要用string(str1,str2.,..)或者*,不能使用+。
如果要对字符串进行内部求值(官方术语interpolation),需要使用$(xx)的语法:
julia> "3+2-5=$(3+2-5)" "3+2-5=0" julia> name = "yang" "yang" julia> "hello, $name" "hello, yang"Julia目标称希望有Perl一样强大的字符串处理能力,那么内建正则表达式算是言出必行的表现。它的正则表达式是Perl兼容的,由PCRE提供,下面示例来自官方文档:
julia> r"^\s*(?:#|$)" r"^\s*(?:#|$)" julia> typeof(ans) Regex julia> m = match(r"(a|b)(c)?(d)", "acd") RegexMatch("acd", 1="a", 2="c", 3="d") julia> m.match "acd" julia> m.captures 3-element Array{Union{Nothing, SubString{String}},1}: "a" "c" "d" 常量常量通过const关键字指定,不过常量还能重定义,REPL只显示warning并不阻止这样的做法,只有当重定义不同类型值的时候才会提示Error。文档强烈不建议重定义常量值。
julia> const a,b = 2,3 (2, 3) julia> const a,b = 3,2 WARNING: redefining constant a WARNING: redefining constant b (3, 2) julia> a,b (3, 2) julia> const a,b = 3.0,2 ERROR: invalid redefinition of constant a 类型整型和浮点类型值不依赖于平台,有明确的范围:
Type Signed? Number of bits Smallest value Largest valueInt8 ✓ 8 -2^7 2^7 - 1
UInt8 8 0 2^8 - 1
Int16 ✓ 16 -2^15 2^15 - 1
UInt16 16 0 2^16 - 1
Int32 ✓ 32 -2^31 2^31 - 1
UInt32 32 0 2^32 - 1
Int64 ✓ 64 -2^63 2^63 - 1
UInt64 64 0 2^64 - 1
Int128 ✓ 128 -2^127 2^127 - 1
UInt128 128 0 2^128 - 1
Bool N/A 8 false (0) true (1)
Type Precision Number of bits
Float16 half 16
Float32 single 32
Float64 double 64