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

2018-08-14 20:02:16 +08:00
 hansonwang99


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


概 述

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

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

本文内容脑图如下:


Julia 的特性

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


编程环境支持

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


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 控制台,顺便来向世界问一下好吧:

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


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

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

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


后 记

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



7994 次点击
所在节点    推广
44 条回复
marcushbs
2018-08-14 22:40:55 +08:00
攞你命三千
depress
2018-08-14 22:43:01 +08:00
三年前接触过这个,当时国内研究这个的大牛说计算领域会代替 R 和 Python,这才发正式版...
ynyounuo
2018-08-14 22:43:07 +08:00
所以这个语言里那么多数学字符符号都必须是手动输入么?还是说有等同的 alphanumeric 名称可用?
102errors
2018-08-14 23:01:57 +08:00
打扰了 以为是京香 julia
siyiye
2018-08-14 23:08:55 +08:00
打扰了 以为是京香 julia x2
kirafreedom
2018-08-14 23:10:55 +08:00
打扰了 以为是京香 julia x3
PythonAnswer
2018-08-15 02:06:00 +08:00
这玩意出来好久了.
ynyounuo
2018-08-15 03:21:37 +08:00
@Livid
上一个宣传 Julia 的主题也是一样。

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

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

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

/t/478627

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

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

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

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

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

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

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

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

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

V2EX 已经越来越少有高质量的,高信息素的讨论串了。所以对于这类潜在能有高质量讨论的主题我是有偏向想要维护的。否则 V2EX 就会流失那些真正想分享高质量信息和洞见的人。
Heavytiger
2018-08-15 10:03:13 +08:00
用不上
lyh404
2018-08-15 10:14:35 +08:00
一直在用 matlab。python 这个坑都还只踩了一点点,Julia 这种刚起来的就算了,等国内普及后再说。
bigtan
2018-08-15 10:22:18 +08:00
@glasslion 他有一个 CUDANative 包,可以直接生成 GPU 代码 不需要 CUDA

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/479801

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX