文档章节

“全新” 编程语言 Julia开箱体验

CodeSheep
 CodeSheep
发布于 08/15 06:29
字数 1632
阅读 4826
收藏 37

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

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

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

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


后 记

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



© 著作权归作者所有

共有 人打赏支持
CodeSheep

CodeSheep

粉丝 164
博文 54
码字总数 77012
作品 0
南京
程序员
私信 提问
加载中

评论(17)

J
Jason909

引用来自“飞翔的土拨鼠”的评论

引用来自“zhjphp”的评论

引用来自“itfanr”的评论

引用来自“zhjphp”的评论

为什么这么多语言都用llvm……就不能学学go…

go用的啥

go没有虚拟机
LLVM提供了一套从前端到后端的实施方案,在成本、效率、优化维护上要比自己写好很多...

楼上说go的究竟知不知道LLVM是用来干嘛的?LLVM是用来做编译器的,楼上说的前端后端指的是编译器的前端后端,前端根据源码生成Intermediate representation,后端根据IR生成机器码,类似javac根据源码生成字节码,JVM根据字节码生成机器码。跟LLVM一起发布的前端clang支持c,c++,objective-c等多种语言。如果不使用LLVM,要么自己实现完整的编译器,要么生成c语言之类的作为中间代码,再复用其编译器。go也有LLVM前端https://llvm.org/svn/llvm-project/llgo/trunk/README.TXT
♂茶舞
♂茶舞
类型隐式转换,就是 坑的开始
itfanr
itfanr

引用来自“zhjphp”的评论

引用来自“itfanr”的评论

引用来自“zhjphp”的评论

为什么这么多语言都用llvm……就不能学学go…

go用的啥

go没有虚拟机
哦哦 学习了
飞翔的土拨鼠
飞翔的土拨鼠

引用来自“zhjphp”的评论

引用来自“itfanr”的评论

引用来自“zhjphp”的评论

为什么这么多语言都用llvm……就不能学学go…

go用的啥

go没有虚拟机
LLVM提供了一套从前端到后端的实施方案,在成本、效率、优化维护上要比自己写好很多...
zhjphp
zhjphp

引用来自“itfanr”的评论

引用来自“zhjphp”的评论

为什么这么多语言都用llvm……就不能学学go…

go用的啥

go没有虚拟机
shikeaiDev
shikeaiDev
没大公司力挺,没希望的。
就好像 obj-c,没水果,谁会去用?
一个道理。
bestpray
bestpray
语言真的只是工具
haitaosoft
haitaosoft

引用来自“haitaosoft”的评论

新语言的自我介绍,应该先说一下:
是解释型还是编译型,
是不是跨平台(os、cpu),
有没有支持GUI实现,
编译出来的是本地程序,
还是web后台(用户需要浏览器来访问)
然后是 运行性能 和 开发效率 的比较
haitaosoft
haitaosoft
新语言的自我介绍,应该先说一下:
是解释型还是编译型,
是不是跨平台(os、cpu),
有没有支持GUI实现,
编译出来的是本地程序,
还是web后台(用户需要浏览器来访问)
东东-
东东-
希望有大型组织能参与 Julia 生态建设. 语言很棒, 但生态和 Python 差太多了.
用于科学计算的Julia语言发布了1.0版本

用于科学计算的Julia语言发布了1.0版本 Ronny 2018年9月3日暂无评论 阅读 5 次 导读 面向科学计算的动态高级编程语言 Julia 释出了 1.0 稳定版本。开发者建议使用 0.6 或更早版本的用户先升级...

Ronny
09/03
0
0
集Python、C++、R为一体!编程语言 Julia 1.0 正式发布

近年来,Julia 语言已然成为编程界的新宠,今年 TOIBE8 月份编程语言排行榜上,Julia 已迅速攀升至第 50 名。短短几年,这门由 MIT CSAIL 实验室开发的编程语言就变得炙手可热,很大部分是因...

程序师
08/17
0
0
集 Python、C、R、Ruby 之所长,Julia 1.0 正式发布

动态编程语言 Julia 迎来了 1.0 正式版本,你可以通过这里下载 Julia 1.0 正式版。 Julia 可以看作是一门集众家之所长的编程语言,在首次公开时开发团队就已明确其需求: 我们想要一种拥有自...

王练
08/11
0
26
集 Python、C、R、Ruby 之所长,动态编程语言 Julia 1.0 正式发布

动态编程语言 Julia 迎来了 1.0 正式版本,下载地址:• https://julialang.org/downloads/ Julia 可以看作是一门集众家之所长的编程语言,在首次公开时开发团队就已明确其需求: 我们想要一...

技术小能手
08/16
0
0
Julia 小白 Day 5 :Julia是个啥?能吃吗?

笔者学习Julia有几天了,有人开始问了: Julia是什么?有啥用? 身为Julia小白,决定学习前了解的情况是: “Julia是一门牛B、‘无耻’的语言。” 为什么这么说呢?一起来了解一下。 (前方不...

KevingZhang
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在ubuntu下选择crontab计划任务的编辑器

在ubuntu下,首次编辑crontab计划任务的时候,会提示让选择编辑器。由于对nano编辑器不是很熟悉,若是选择nova编辑的话,会有些麻烦。 可以重置编辑器,方法如下: [root@wang ~]# select-...

季书歌
34分钟前
4
0
在线BASE64加密解密、UrlEncode编码/解码、native/ascii在线转换工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
35分钟前
1
0
laravel命令

https://blog.csdn.net/aaroun/article/details/79140618

vio小黑
36分钟前
3
0
记录一个vue directive实现点击指令外部区域调用函数的方案

根据directive提供的API来写一个点击外部区域可以让其下拉列表消失的菜单 <div id="app" v-clock> <div class="main" v-clickoutside="handleClose"> <button @click="show = !show">点......

呵呵闯
39分钟前
3
0
Oracle一列的多行数据拼成一行显示字符

Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。 先介绍:WMSYS.WM_CONCAT 例: id name 1 aa 2 bb 3 cc 要的结果是"aa,bb,cc" select WMSYS...

voole
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部