本文共 3669 字,大约阅读时间需要 12 分钟。
本作品采用进行许可。
Julia 是一个新的适用于科学计算、数据可视化、教学及研究、机器学习等方面的语言。笔者推测绝大多数想要学习 Julia 的读者,除了少数极客是为了好玩儿这个目的之外,都是想要代替他们曾经用 MATLAB、R、C/C++、Python 甚至 Perl 和 Lisp 完成的那些工作。
Julia 正是一个集百家之长的语言,这听起来有点儿像 Rust。笔者曾长时间使用 Rust 代替过去在 MATLAB 和 C/C++ 中完成的工作,不过 Rust 语法更接近 C/C++ 甚至比它们的语法更严谨一些。这对于要从事科学计算、数学可视化及教学等工作的人来说可不太友好——因为你要驾驶的是飞机而不是自行车,你不能无时无刻关注那些琐碎细节——当然如果你拥有庞大的程序员团队,并且对 Julia 已经非常接近 C 的运行速度仍不满意,那么随你高兴。
在学习 Julia 之前你可能有这样的问题:“我的程序在 MATLAB/Python/R 或者别的什么语言中已经运转的很好了,为什么我还要学习 Julia?”这里只要你还记得斯图尔特·布兰特说过:“一旦一种新技术开始滚动碾压道路,如果你不能成为压路机的一部分,那么你就只能成为道路的一部分。”基于这种情况,让我们开始摇滚吧!
为了照顾绝大多数读者的手头情况,笔者在说明一些操作细节都假设您使用的是 Windows 系统。笔者推测大部分类 Unix 系统用户对这些操作都已经烂熟于心。当然这也基于笔者手头实在没有另一台多于的电脑来运行 Linux。同时笔者已经懒惰[1]到了不想点击虚拟机的图标。(笑)
[1]:懒惰被认为是程序员三大美德之一。得益于 Julia、Perl 和 Rust 三个语言,笔者懒散这个毛病不仅没有得到控制反而愈演愈烈,甚至可以说“登峰造极”。(笑)
俗话说巧妇难为无米之炊,您首先要下载好 Julia 并把它安装到您的计算机上。您可以通过官网下载到 Julia。网址是:
如果您在 Windows 上使用 Julia 并且想通过 cmd 进入,那么不要忘记设置环境变量。
此外还有一些笔者想要告诉您的额外资料
如果您已经安装好了 Julia 不妨试试交互式会话(REPL)只需要双击 Julia 图标就可以进入交互式会话,当然您也可以从 cmd 进入。输入 println("hello, world")
并键入回车查看结果。如果顺利的话 cmd 中会显示 hello, world
,不妨试试您的母语,譬如就笔者的情况而言:println("你好,世界")
。会在 cmd 中显示 你好,世界
,不过值得注意的是一些语言的括弧和引号和英语中的并不相同,那么这是不能被接受的。这里有一个须知,即您必须使用英文输入法输入括弧和引号的部分。当然对于大多数人来说这已不算什么新鲜事儿。
学习一个语言往往非常简单,特别是您有别的什么语言的基础的情况下——您只需要在新的语言中怎么写语句就可以了。绝大多数程序员会把结构控制当做程序的基础,事实也的确是这样。当然 Julia 里面还有一些关于命令式、面向对象及函数式的部分。我们现在先把 Julia 编程范式,特别是函数式编程晾在一边儿。(笑)毕竟如果没有例子学习范式不仅无趣而且有一点儿像单纯扯概念。那么我们先来学 Julia 中的结构控制——即怎么写分支、循环和一些别的东西。
很多有经验的程序员只需要看这一部分就可以掌握绝大多数语法,所以笔者把这一部分写在最前面。如果您不能理解以下的内容,请不要着急,我们以后会对这些细节逐一讲解。
尝试这样的程序
foo = 42 # 这是一个数show(foo)bar = "https://github.com/3442853561" # 这是一个字符串show(bar)
您可以直接在交互式会话中尝试,也可以把以上程序保存成以 .jl 为后缀名的文件。譬如 test.jl
。然后在保存路径打开 cmd 输入 julia test.jl
并键入回车。就会看到
42"https://github.com/3442853561"
这和交互式会话的显示方式有一些不同,如果您觉得这样不够好,可以尝试:
foo = 42 # 这是一个数println(foo)bar = "https://github.com/3442853561" # 这是一个字符串println(bar)
这会显示:
42https://github.com/3442853561
不过交互式会话的运行同样的内容看起来没有什么特别的不同。此外退出交互式会话的方式是调用结束函数 exit()
,如果觉得这很麻烦的话可以同时按下键盘上的 Ctrl
和 D
键。之后笔者为了偷一点儿懒儿会主要使用保存一个文件这种方式运行——这样我就不需要频繁地输入 exit()
了,而且更方便把结果复制到别处——特别是我正在写作的教程。推荐您也这样做——基于能够分享给别人代码这种目的。
所谓条件表达式也就是分支结构。譬如你不知道两个数谁大谁小这种情况。譬如一些理所当然的情况:
if 0 < 1 println("这是当然")end
当然写得复杂一点儿也是可以的:
if 0 < 1 println("这是当然")else println("这并不可能")end
这看起来没什么用——因为我们还没学循环。
这里只讲一种最简单的循环的写法——您可以让的循环指定的次数,至于迭代器我们以后再讲。譬如说
for i in 1:5 println(i)end
这是从1循环到5的意思。当然这里的循环变量是 i
。配合我们之前介绍过的条件表达式就可以写出来计算从1974年到2018年期间的所有闰年了。
for i ∈ 1974:2018 if i % 4 == 0 && i % 100 ≠ 0 println(i) elseif i % 400 == 0 println(i) endend
这里需要注意 Julia 接受 ≠
表示不等于,当然如果您不方便输入这个符号可以像其他语言那样使用 !=
代替。此外在循环中也可以用 ∈
这个符号,当然如果不方便输入可以写成 in
或 =
。
我们一般用关键字 function
来定义函数,譬如:
function 斐波那契(x) if x < 0 throw(DomainError(x, "参数不能小于0")) elseif x < 2 return 1 else return 斐波那契(x - 1) + 斐波那契(x - 2) endendfor i ∈ 0:10 println(斐波那契(i))end
这里有一些新内容。您可以使用汉字作为标识符——函数名、变量名一类东西。如果您的母语使用西里尔字母也是可以的,进一步说支持了绝大多数人的母语编程这其中还包括了日语、韩语等一些语言的符号。具体的命名规则我们后续会进一步说明。Julia 不仅仅支持用数学符号编程还支持了母语编程,这样使得讲解一些不以编程本身为核心内容的课程时更加容易。同时因为 Julia 可以免费获取并且有接近于 C 的运行速度,在笔者讲解数字图像处理内容时就逐步用 Julia 代替 MATLAB。
另一个新的内容则是异常,我们在以后会将如何处理异常。不过在这里我们先来讲解如何抛出异常,您可以通过 throw
函数来抛出一个异常,正如示例中那样。这里说一句题外话,也许对您编程有帮助——特别是如果您涉及混合语言工程的时候。一般来说异常处理有两种形式即像 Rust 那样返回值或者同 Julia 这样抛出异常。
在这一部分我们快速的讲解了一下 Julia 的主要语法并且介绍了一些令人叹为观止的特性。不过同 Julia 摇滚来说还相差甚远——现在看起来有一点儿像是满地打滚儿。(笑)那么不妨来思考一下这个问题:设计一个函数让函数返回一个年份是否为闰年,当然要验证年份的合理性,我们只认为1970年到2038年期间是合理的年份,当然这是32位系统内置时间的范围。然后输出您出生年份到今年之间的所有平年。当然如果您生于1970年之前,那么可以适当地把认为合理的年份时间往前调整到您出生的年份。
本文首发于刘祺的(微信)公众号
转载地址:http://xmizo.baihongyu.com/