前言
几十年前,科学家为了避免处理重复、单调的事情,比如反复地按一套公式计算结果等,发明了计算机。计算机其实是工业自动化的一个产物,可以说是工业化时代的巅峰代表。当时人们怎么也不会想到,计算机的发展带来了互联网,而互联网导致了信息化时代的到来。如今,在数据蔓延、不断渗透的过程中,智能化代表了未来的发展方向。
与此同时,数据的不断累积、膨胀、延伸引发了计算领域的深刻变化,而且数据的密集性和分布性也提出了大量的计算密集性和分布式要求。很多工业级的生产场景中,在要求开发高效率、维护低成本、运行高可靠的同时,还需要具备高性能的特点。Julia语言应运而生了。
为何撰写本书
Julia借助于JIT动态解析器及其优秀的设计机制,在一些计算特性上能达到静态语言的性能,这是非常令人惊讶的,也是吸引笔者的地方。笔者在大数据挖掘与机器学习领域浸淫十几年,面对种类繁多、数量巨大、计算逻辑复杂的各种问题,深感性能与开发效率极为重要。本想浅尝,但却再无法舍弃,Julia语言的各种特性令笔者兴奋不已。
几年前我开始接触Julia,其自然快捷的编写感受,顺畅舒适的体验,与现在广为使用的Python颇为相近。但Julia更多的是以科学与数值计算为目的,原生的并发机制与分布式、云计算特性,简洁人性化的语法,以及媲美于静态语言的性能,所有这些表现都是笔者期待已久的。而今,在日常的数据分析和前期数据处理中,笔者都会首选Julia语言。
为了让喜爱的Julia语言能够更快普及,进入首选的工业级技术架构,笔者不揣浅陋,捉笔从文,写就此书,以求与各位爱好者共同进步。也期冀Julia能成为一个写着简单、读着愉悦、迁移方便、应用广泛、性能强劲的通用编程语言,让我们在开发工作中不再纠结语言的选择。
Julia的官方文档还算详细,但组织结构并不清晰,概念散乱各处,对初学者并不友好。为此,笔者愿意以此书为契机,将这几年的经验分享给大家,希望能更条理清晰地展现Julia的特色,帮助大家更快、更好地熟悉并掌握Julia,并在实际开发中获益。
本书的结构
Julia语言不仅提供了灵活、多样、简洁的语法,更有很多符合实际开发需求的强大特性,也充满了人性化的设计。它不仅支持各种类型的声明定义、贴近于数学概念的计算规则,还在常见的高维数组、字符串处理、国际化支持、元编程等方面提供了强大的支持。尤其是在并行计算、混合编程等方面更是独具特色,原生地提供了良好的机制,使得这方面的编程工作变得极为快捷便利。
为了能够让读者通过本书了解、认识、掌握Julia语言的基本概念并能付诸实践,笔者反复对掌握的资料进行了梳理、调整,并且基于真实的运行环境,尽可能地为每个功能点提供相应的示例代码,以求准确、明晰地阐明各个要点。本书主要内容如下:
第1章介绍Julia语言的基本情况,同时重点介绍Julia运行环境的使用方法。
第2章对编程语言的基础概念进行了简单的介绍,能够帮助读者在后续的学习中理解Julia语言的特点,对于有经验的读者可做选读内容。
第3章从包括有理数、复数在内的基本数值系统开始,详细地介绍Julia语言的基本语法。
第4章基于前一章介绍的各种数值类型介绍Julia的各种运算符使用规则。
第5章主要介绍经典的判断、循环逻辑,还有Julia中较为特别的复合表达式。
第6章介绍类型系统,这是Julia语言的精髓,包括抽象类型、元类型及复合类型等,都有着Julia自己的特点。另外,该章还会重点介绍类型参数化的内容,这也是Julia灵活适应各种应用场景的基础。该章介绍的元组、字典、集合等结构也是开发Julia程序时常会用到的数集。
第7章介绍函数与方法,这不但是Julia多态分发机制的基础,也是Julia博采众长的精华。
第8章介绍Julia被称为数值计算语言的核心优势特性——多维数组。数组是科学计算中最为常见的数据结构,但能够以统一的结构表达向量、矩阵、张量甚至高维空间的机制,却是Julia的特色。
第9章介绍开发中经常遇到的字符串处理方法,包括常见的正则表达式等。
第10章使我们能够更深刻地认识Julia中“一切皆对象”的理念,因为通过Symbol与Expr类型的封装,Julia代码也是对象的一部分。这章介绍的宏,也是在Julia开发中极为强大的特性。
第11章介绍时间和日期的处理方法。
第12章介绍与IO相关的内容,包括流、文件操作、网络通信及序列化等。通过该章的学习,我们会再一次为Julia的简洁、高效所折服。
第13章介绍Julia代码的组织方式,包括模块、文件以及包,尤其是对包的管理进行了较为详尽的阐述。
第14章介绍Julia原生提供的并行计算特性,这也是Julia最具魅力的内容之一。在该章中,我们会详尽地阐述协程任务、远程调用及引用,还有数据通道等方面的内容。
第15章可以作为选读内容,介绍Julia与C/C++、Python进行混合编程的基本方法。不过由于运行环境等方面的约束,在学习该章时,如果要通过实例进行实践,建议在Linux或MacOS下进行。
第16章给出了对Julia编程方面的经验总结或优化建议。该章也可作为选读内容,不过笔者仍建议所有的读者能认真学习该章内容,并通过实例进行体验,这样才能对Julia语言有更为深刻的认识。
第17章以机器学习领域中经典的决策树算法为例,展示如何用Julia实现该算法的主要过程。在这个实践中,我们对Julia各种语法技巧的使用会有更切实的认知。
在本书的结尾,以附录的方式列举了Julia中常见的异常类型、系统常量以及字符串操作函数,而且对可能有用的第三方包进行了简单的介绍,希望读者能够通过这方面的内容,了解Julia社区的强大力量,习惯性地从社区中获得各种支持。
另外,在本书撰写时,为了简明扼要地将概念阐述清楚,在确保不会影响读者了解语言的核心应用要点的情况下,在内容上进行了适当缩减。如果读者想了解更深入的内容,可以通过官网查阅更多的资料进行学习。
本书适合的读者
本书尽量从基础知识入手,逐步深入地介绍Julia语言。但因为Julia语言的设计与实现借鉴了众多先进的理念,所以本书难以进行大而全的阐述,省略了不少内容。所以本书不适合没有任何编程经验的读者,读者至少要了解面向对象、泛型编程与函数式等编程概念。
由于本书几乎涉及了Julia语言的方方面面,要点颇多,所以建议读者在通过本书学习Julia语言时,能够按照其中的实例,多多动手实践,并能在实际的编程工作中选用Julia语言,进行一些开发实践。无论哪一种语言,动手实践是掌握这门语言的唯一捷径。
致谢
首先感谢设计与实现Julia语言的近700位贡献者,为计算机与科学领域提供了一门简洁易用的语言;也感谢近2000个第三方库的社区贡献者,让Julia语言能够快速普及,焕发出了蓬勃的生机。
此外,感谢上海交通大学副教授潘汉博士在本书校对期间给予的大力支持。
在本书数月的撰写过程中,妻子冯莹霞和家人的支持与照顾让笔者感动不已,有了她们本书才能够有机会顺利完成,与读者们相见。感谢她们给予我的一切!