首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  推广

“全新” 编程语言 Julia 了解一下

  •  2
     
  •   hansonwang99 · 2018-08-14 20:02:16 +08:00 · 5786 次点击
    这是一个创建于 479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Julia Lang


    本文共 851 字,阅读大约需要 3 分钟 !


    概 述

    Julia 是一个 “全新”的高性能动态编程语言,前两天迎来了其 1.0 正式版的重大更新。Julia 集 Python、C、R、Ruby 之所长,感觉就像一种脚本语言,并且对交互式使用有很好的支持。而且其天生的高性能、通用性与专业性使得其非常适用于科学数值计算、机器学习项目等前沿场景。我看完这个消息以后也迫不及待想尝试一下。

    注: 本文原载于 My Personal Blog:CodeSheep · 程序羊

    本文内容脑图如下:

    本文内容脑图


    Julia 的特性

    • 高性能:Julia 通过 LLVM 为多个平台编译高效本地代码,性能很高
    • 动态性:编程范式灵活,代码信噪比极高
    • 通用性:易于表达 OOP 和函数式编程范式,并且其标准库提供异步 I / O,进程控制,日志记录,概要分析,包管理器等。
    • 专业性:擅长数值计算,支持许多数值数据类型,并且提供开箱即用的并行性。
    • 可组合性:Julia 的包之间可以很好地协同工作。

    正是由于这些特性,才使其应用场景宽泛,而且都是当下前沿热门应用场景:

    Julia 应用场景


    编程环境支持

    Julia 通过提供了一系列插件支持,从而可以在大多数常见的编辑器中进行编程,具体包括

    • Atom
    • VS Code
    • Jupyter
    • Vim
    • Emacs
    • SublimeText

    Julia 安装和部署

    Julia 提供了各种平台和环境的安装包,具体可以去其官网进行下载:

    安装平台

    安装非常简单,像 Windows 平台,基本上只需要点按下一步即可安装到位,而 MacOS 平台使用 brew 包管理器也仅需 一行命令 即可完成安装。

    下面我以 Linux CentOS 7.4 平台为例,介绍一些其安装过程:

    CentOS7 上 Julia 安装也无需复杂的过程,只需要下载对应的可执行版本,并置于系统的命令路径中即可愉快的使用:

    wget https://julialang-s3.julialang.org/bin/linux/x64/1.0/julia-1.0.0-linux-x86_64.tar.gz
    tar zxvf julia-1.0.0-linux-x86_64.tar.gz
    cd /usr/bin
    ln -s /root/julia-1.0.0/bin/julia
    

    此时执行 julia 命令即可启动 Julia 控制台,顺便来向世界问一下好吧:

    Hello Julia !

    下面做一些上手实验,大致来感受一下该语言精炼、灵活的风格。即使不使用任何文字说明,也能很容易地理解各个命令的含义,这也说明该语言很好上手。


    Julia 上手体验

    • 变量操作
    julia> x=10
    10
    
    julia> x+1
    11
    
    julia> x^2
    100
    
    julia> pi
    π = 3.1415926535897...
    
    julia> sqrt(100)
    10.0
    
    julia> ~123
    -124
    
    julia> 123 & 234
    106
    
    julia> ~UInt32(123)
    0xffffff84
    
    julia> [1,2,3] .^ 3
    3-element Array{Int64,1}:
      1
      8
     27
    
    julia> 1 == 1
    true
    
    julia> NaN == NaN
    false
    
    julia> NaN != NaN
    true
    
    julia>
    
    julia> 'x'
    'x': ASCII/Unicode U+0078 (category Ll: Letter, lowercase)
    
    julia> Int('x')
    120
    
    julia> str = "Hello, world.\n"
    "Hello, world.\n"
    
    julia> str[1]
    'H': ASCII/Unicode U+0048 (category Lu: Letter, uppercase)
    
    julia> str[end]
    '\n': ASCII/Unicode U+000a (category Cc: Other, control)
    
    julia> str[4:9]
    "lo, wo"
    
    julia> greet = "Hello"
    "Hello"
    julia> whom = "world"
    "world"
    julia> "$greet, $whom.\n"
    "Hello, world.\n"
    
    julia> findfirst(isequal('x'), "xylophone")
    1
    julia> findnext(isequal('o'), "xylophone", 1)
    4
    julia> findnext(isequal('o'), "xylophone", 5)
    7
    julia> findnext(isequal('o'), "xylophone", 8)
    
    julia> occursin("world", "Hello, world.")
    true
    julia> repeat(".:Z:.", 10)
    ".:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:..:Z:."
    
    julia> occursin(r"^\s*(?:#|$)", "not a comment")
    false
    julia> occursin(r"^\s*(?:#|$)", "# a comment")
    true
    julia> match(r"^\s*(?:#|$)", "# a comment")
    RegexMatch("#")
    
    • 类型转换和提升
    julia> x = 12
    12
    
    julia> typeof(x)
    Int64
    
    julia> convert(UInt8, x)
    0x0c
    
    julia> convert(AbstractFloat, x)
    12.0
    
    julia> a = Any[1 2 3; 4 5 6]
    2×3 Array{Any,2}:
     1  2  3
     4  5  6
    
    julia> convert(Array{Float64}, a)
    2×3 Array{Float64,2}:
     1.0  2.0  3.0
     4.0  5.0  6.0
    
    julia> promote(1, 2.5)
    (1.0, 2.5)
    
    julia> promote(2, 3//4)
    (2//1, 3//4)
    
    julia> promote(1.5, im)
    (1.5 + 0.0im, 0.0 + 1.0im)
    
    julia> promote(1 + 2im, 3//4)
    (1//1 + 2//1*im, 3//4 + 0//1*im)
    
    • 函数
    julia> f(x,y) = x + y
    f (generic function with 1 method)
    
    julia> f(2,3)
    5
    
    julia> g = f
    f (generic function with 1 method)
    
    julia> g(2,3)
    5
    
    julia> ∑(x,y) = x + y
    ∑ (generic function with 1 method)
    
    julia> ∑(2, 3)
    5
    
    julia> +(1,2,3)
    6
    
    julia> x -> x^2 + 2x - 1
    #3 (generic function with 1 method)
    
    julia> map(x -> x^2 + 2x - 1, [1,3,-1])
    3-element Array{Int64,1}:
      2
     14
     -2
    
    julia> function foo(a,b)
                    a+b, a*b
              end;
    
    julia> foo(2,3)
    (5, 6)
    
    julia> x, y = foo(2,3);
    
    julia> x
    5
    
    julia> y
    6
    
    
    • 控制流
    julia> z = begin
             x = 1
             y = 2
             x + y
           end
    3
    
    julia> function test(x, y)
             if x < y
               println("x is less than y")
             elseif x > y
               println("x is greater than y")
             else
               println("x is equal to y")
             end
           end
    test (generic function with 1 method)
    
    julia> test(1, 2)
    x is less than y
    
    julia> test(2, 1)
    x is greater than y
    
    julia> test(1, 1)
    x is equal to y
    
    julia> println(x < y ? "less than" : "not less than")
    less than
    
    julia> while i <= 5
             println(i)
             i += 1
           end
    1
    2
    3
    4
    5
    
    julia> for i = 1:5
             println(i)
           end
    1
    2
    3
    4
    5
    
    • 对象构造

    外部构造方式:

    julia> struct Foo
               bar
               baz
           end
    
    julia> 
    
    julia> fun=Foo(1,2)
    Foo(1, 2)
    
    julia> fun.bar
    1
    
    julia> fun.baz
    2
    
    julia> Foo(x) = Foo(x,x)
    Foo
    
    julia> Foo(1)
    Foo(1, 1)
    
    julia> Foo() = Foo(0)
    Foo
    
    julia> Foo()
    Foo(0, 0)
    

    内部构造方式:

    julia> struct OrderedPair
               x::Real
               y::Real
               OrderedPair(x,y) = x > y ? error("out of order") : new(x,y)
           end
    
    julia> 
    
    julia> OrderedPair(1, 2)
    OrderedPair(1, 2)
    
    julia> OrderedPair(2,1)
    ERROR: out of order
    Stacktrace:
     [1] error(::String) at ./error.jl:33
     [2] OrderedPair(::Int64, ::Int64) at ./REPL[45]:4
     [3] top-level scope at none:0
    
    • 迭代与索引

    迭代操作:

    julia>  struct Squares
                   count::Int
           end
    
    julia> Base.iterate(S::Squares, state=1) = state > S.count ? nothing : (state*state, state+1)
    
    julia> for i in Squares(7)
                      println(i)
           end
    1
    4
    9
    16
    25
    36
    49
    
    julia> 25 in Squares(10)
    true
    
    julia> using Statistics
    
    julia> mean(Squares(100))
    3383.5
    
    julia> std(Squares(100))
    3024.355854282583
    
    julia> Base.eltype(::Type{Squares}) = Int
    
    julia> Base.length(S::Squares) = S.count
    
    julia> collect(Squares(4))
    4-element Array{Int64,1}:
      1
      4
      9
     16
    

    索引操作:

    julia> function Base.getindex(S::Squares, i::Int)
                   1 <= i <= S.count || throw(BoundsError(S, i))
                   return i*i
           end
    
    julia> Squares(100)[23]
    529
    
    julia> Base.firstindex(S::Squares) = 1
    
    julia> Base.lastindex(S::Squares) = length(S)
    
    julia> Squares(23)[end]
    529
    
    julia> Base.getindex(S::Squares, i::Number) = S[convert(Int, i)]
    
    julia> Base.getindex(S::Squares, I) = [S[i] for i in I]
    
    julia> Squares(10)[[3,4.,5]]
    3-element Array{Int64,1}:
      9
     16
     25
    

    基本的语言特性就体验到这,剩余的还有一些高级特性,包括:

    • 模块
    • 元编程
    • 并行计算
    • 网络和流
    • 交互
    • ......

    不在此文一一赘述,详细了解就去参考官方文档吧。


    后 记

    由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!



    44 回复  |  直到 2019-11-16 23:28:39 +08:00
        1
    des   2018-08-14 20:19:54 +08:00 via Android
    打扰了
        2
    zetary   2018-08-14 20:22:18 +08:00 via iPhone
    做科学计算的话用这个比较靠谱,比 matlab 好,不适合 v 站上绝大部分人吧
        3
    hansonwang99   2018-08-14 20:23:08 +08:00
    也适合机器学习
        4
    luozic   2018-08-14 20:24:57 +08:00 via iPhone
    科学计算可以,别的为啥不用 C++或者 python ?
        5
    hansonwang99   2018-08-14 20:25:27 +08:00 via iPhone
    效率高于 Py
        6
    lihongjie0209   2018-08-14 20:28:55 +08:00
    请问 Python 吹怎么看
        7
    d5   2018-08-14 20:30:48 +08:00 via iPhone
    python 吹表示健身先健脑,多半不是因为性能瓶颈
        8
    dacapoday   2018-08-14 20:41:01 +08:00   ♥ 1
    这个语言的后台是哪个公司?现在谁在推广?准备在哪个领域“搞革命”?
        9
    hansonwang99   2018-08-14 20:59:34 +08:00 via iPhone
    其实这语言一直在国外用,由于中文生态圈不好估计,所以国内没怎么听说
        10
    SimbaPeng   2018-08-14 21:01:59 +08:00 via Android
    库上了 Python 的量级再说吧
        11
    SimbaPeng   2018-08-14 21:04:36 +08:00 via Android
    我只知道这个语言的 seo 怕是上不去了
        12
    gettext   2018-08-14 21:10:50 +08:00
    My Personal Blog:,CodeSheep · 程序羊 !


    来推广博客不是语言的,最近推广很勤,大家别当真
        13
    agagega   2018-08-14 21:22:08 +08:00 via iPhone
    定义 struct 不带类型标注就是泛型么?听说 Julia 的类型系统很强大
        14
    ghhardy   2018-08-14 21:47:07 +08:00 via Android   ♥ 1
    序列的索引从 1 开始...可以开一场圣战了
        15
    Or2   2018-08-14 21:47:28 +08:00 via Android
    @dacapoday MIT 的 Julia 实验室
        16
    glasslion   2018-08-14 22:11:54 +08:00
    全新? 这货比 rust 都老
        17
    glasslion   2018-08-14 22:12:57 +08:00
    @hansonwang99 适合科学(数值)计算没错, 哪里看出适合科学计算了
        18
    glasslion   2018-08-14 22:13:59 +08:00
    @hansonwang99 前一条 typo, 适合科学(数值)计算没错, 哪里看出适合深度学习了
        19
    iRiven   2018-08-14 22:36:30 +08:00
    感觉没啥特殊的地方
        20
    dsp2138   2018-08-14 22:40:16 +08:00
    能编写 windows 程序吗
        21
    marcushbs   2018-08-14 22:40:55 +08:00   ♥ 3
    攞你命三千
        22
    depress   2018-08-14 22:43:01 +08:00
    三年前接触过这个,当时国内研究这个的大牛说计算领域会代替 R 和 Python,这才发正式版...
        23
    ynyounuo   2018-08-14 22:43:07 +08:00 via iPhone
    所以这个语言里那么多数学字符符号都必须是手动输入么?还是说有等同的 alphanumeric 名称可用?
        24
    102errors   2018-08-14 23:01:57 +08:00
    打扰了 以为是京香 julia
        25
    siyiye   2018-08-14 23:08:55 +08:00
    打扰了 以为是京香 julia x2
        26
    kirafreedom   2018-08-14 23:10:55 +08:00 via iPhone
    打扰了 以为是京香 julia x3
        27
    PythonAnswer   2018-08-15 02:06:00 +08:00
    这玩意出来好久了.
        28
    ynyounuo   2018-08-15 03:21:37 +08:00 via iPhone   ♥ 6
    @Livid
    上一个宣传 Julia 的主题也是一样。

    一群「打扰了以为是京香 Julia 」回复,对于主题内容毫无关系并且干扰其他人的正常讨论。生怕别人不知道自己看过点儿 JAV。
        29
    ynyounuo   2018-08-15 03:23:28 +08:00 via iPhone   ♥ 2
    @Livid
    当然上个主题的回复更惨。
    /t/478627
        30
    yegle   2018-08-15 04:19:38 +08:00
    1-based index 那就算了…
        31
    XiaolinLeo   2018-08-15 07:20:09 +08:00 via iPhone
    请大家百度一下 Julia
        32
    w88975   2018-08-15 07:32:05 +08:00 via iPhone   ♥ 5
    @ynyounuo 你这种人就像读书的时候 天天告老师的人那么讨厌
    不可否认 这种回复的确毫无意义 但是在某些情况下也让严肃的话题多了一点趣味
    如果你是个刻板的人 你 @上面几位 然后说出你的诉求 而不是吃相这么难看的直接 at 班主任 在你的心目中 你肯定是个英雄吧 (我又维护了社区风气,班主任肯定要夸我)
        33
    herozhang   2018-08-15 07:36:12 +08:00
    @w88975 好有画面感。

    现在貌似挺多常用的 pkg 也还不兼容 1.0,尝试 add GR Plots Interact,各种报错
        34
    zhou00   2018-08-15 08:04:18 +08:00 via Android
    话说这个单词该怎么读?
        35
    Stevenv   2018-08-15 08:59:04 +08:00 via Android
    为何不直接说这个可以干什么,比别的语言有优势在哪里。。。这么长篇
        36
    Moming   2018-08-15 09:03:31 +08:00
    之前看 MXNet 的时候就看到这个了,问题是这种 MATLAB 式的语法真的不怎么友好,Python 那么多好用的科学计算包,为什么要去踩这个坑?

    我暂时没看到关于这方面的测评,如果真的能比各种 C++ 写的 Python 包快很多的话,那真是黑魔法了。
        37
    ynyounuo   2018-08-15 09:33:04 +08:00   ♥ 1
    @w88975

    /t/478627

    你可以看看上面这个主题,一个讨论语言的主题 90% 的回复都是那些东西。这已经不是增加趣味了,根本性的就导致主题失去了讨论的意义。如果只有一个人说的话,我根本不会觉得有什么,而有人带起了节奏我肯定是要做一些事情的,否则很有可能就像是 /t/478627 一样。

    我个人也不是不会进行类似趣味的回复,比如说最近的:
    https://www.v2ex.com/t/479842#r_6031664

    我也没那么低级的趣味想让 Livid 夸我,翻我的主题历史就能找到我 Mock 站长的主题以及和站长产生争论的主题。

    ▋我维护的是一个良好的讨论氛围。我希望楼主花了时间和精力总结的内容可以得到良好有效的反馈和讨论而不是一些无关的信息的堆叠。▋

    「你这种人就像读书的时候,天天告老师的人那么讨厌。」

    我小时候也讨厌那种我抄个作业,考试打个小抄就去告老师的人。但是现在我不这样想,我觉得这在「学校」这个情景下就是最合理的争取公平公正以及个人合理权利的方式。而不是对着那些违反规定或者欺负自己的人臭骂一顿然后自找没趣。

    正是因为某类人给这些人扣上「讨厌鬼」之类的帽子,才导致了那么多老实的孩子被欺负被霸凌也不敢有任何作为。既然是别的小孩子做了客观上不正确,不合理,对于其他人不公平的事情,为什么不能告诉在「班级」这个群体里具有决定性作用的「班主任」呢?

    你是个成年人了,我想你应该清楚从客观的角度去看待孩子对于维护个人正当权益以及班级整体的公平而告老师的行为并不是值得被反对被压制的。反而是值得推崇的做法。而不值得推崇和鼓励的是那些违反规定,破坏班级公平,组织小团体并且违反学习的诚信的孩子的作为。

    在 V2EX 这个社群里,遇到了不符合规定的内容自然最佳的做法就是 @mod 然后说明自己的理由,而不是花费时间去浪费在跟那些人的争论上。

    V2EX 已经越来越少有高质量的,高信息素的讨论串了。所以对于这类潜在能有高质量讨论的主题我是有偏向想要维护的。否则 V2EX 就会流失那些真正想分享高质量信息和洞见的人。
        38
    Heavytiger   2018-08-15 10:03:13 +08:00
    用不上
        39
    lyh404   2018-08-15 10:14:35 +08:00
    一直在用 matlab。python 这个坑都还只踩了一点点,Julia 这种刚起来的就算了,等国内普及后再说。
        40
    bigtan   2018-08-15 10:22:18 +08:00
    @glasslion 他有一个 CUDANative 包,可以直接生成 GPU 代码 不需要 CUDA
        41
    MaxTan   2018-08-15 10:31:57 +08:00
    大家京东一下 julia
        42
    houzhimeng   2018-08-15 10:54:16 +08:00
    上面那个卫道士好可怕。哈哈哈哈 ,确实很有代入感。
        43
    androidlive   2018-08-18 14:27:07 +08:00
    ![]( )
        44
    pythonee   20 天前
    持续关注下
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2195 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 04:25 · PVG 12:25 · LAX 20:25 · JFK 23:25
    ♥ Do have faith in what you're doing.