内容来源:2017 年 11 月 19 日,上线了联合创始人郭达峰在“2017 谷歌开发者节北京站”上进行的《Kotlin as Your Next Language》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
阅读字数:1700 | 4分钟阅读
摘要
本次将和大家分享我们公司对目前多门主流语言进行分析,从编程风格、社区生态圈、工具链、类型检查几个维度深入分析和探讨,最终确定纳入 Kotlin 作为公司新的一门服务端语言技术栈。本次分享将会带领大家纵览主流语言的几个特性和风格,相信对于编程语言有兴趣但还在徘徊犹豫的开发者会有一些启发。
获取嘉宾演讲视频及PPT,扫一扫下方二维码即可。
语言选择
2017年由于公司的快速发展,使得我们的技术储备无法跟上业务的要求,因此不得不考虑人员招聘的问题。并为了更迅速的招揽到合适的人才,进行了各种技术栈的调研。
目前我们前端采用的是JavaScript& TypeScript,后端80%使用Ruby以及少量的Node.js,运维方面则是Golang。
其中后端是招聘方面的主要瓶颈,而恰巧当时我们后端正在做微服务化,于是就想着在后端新增一个技术栈,以方便招聘。
而为了找出合适的语言,我们参考了IEEE 和 StackOverflow关于2017年的流行语言排行榜,将其中的各种语言划分成不同维度进行分析。
需要注意的是下面对这些语言的分析,30%是客观的事实,70%则是出于我们自身对这些技术的看法,其观点是基于Web应用层面以及个人对编程风格的喜好。
Microsoftor Non-Microsoft
是不是所属微软意味着是否要用到.net体系,使用.net体系就必须要用到windows服务器,每年要交给微软一笔费用。虽然目前.net也可以跑在Linux上了,但是绝大多数还是会在windows服务器上运行,对于我们这样的创业公司是不会轻易使用.net体系的。
在上面所提到的两个榜单中,只有C# 和 TypeScript 是属于微软的。不同于C#,由于TypeScript 是会编译到JavaScript 的,并不依赖微软的环境,所以TypeScript 我们还是会考虑。
StaticTyping or Dynamic Typing
第二个维度是静态类型和动态类型。我们首先看下这两类语言各自有哪些优势。
静态类型语言在IDE上会有很好的支持,比如自动补全;性能上也更优秀,编译器能在底层做一些优化;对新手也比较友好,例如不用去猜测函数或方法的参数类型;并且还能通过分析工具在编译时就解决一些问题。
而动态语言编写的效率比较快,更加简易,没有编译的过程,能更快的迭代。
综合来看对于大型项目静态语言会更加合适。
以上是进行分类后的情况,有意思的是Typescript 和Elixir被独立开来了,其实这是因为它们都归属于Opt-in Typing。
这一类型具有动态和静态语言各自的优点,开发者可以根据实际情况决定何时添加类型限制。
虽然有这种优势,但是在实际的程序开发中需要用到众多的第三方库,而有些第三方库是没有Opt-in Typing的一些特性的,由此造成了割裂。微软在这方面算是处理的比较好的了,它花费了大量的人力财力去和第三方库的开发者合作,为这些库添加它们原本缺失的typescript特性。
TypeInference
我们都知道静态语言编写起来是比较麻烦的,典型的就是变量的类型需要提前声明。但如果深入了解的话,就会发现有些静态语言的某个特性能够很好的解决这类问题,这就是Type Inference — 类型推导。
我们先来看一个例子,上图分别是java 和 Kotlin的代码,可以看到其中java的变量需要提前声明String 类型,而Kotlin却省去了这个过程,它通过 s 的值就能在判断S 是什么类型。
有类型推导的语言分为两种,一种是Global,另一种是Local。Global的语言有Rust、OCaml、Haskell,而Local的语言有Scala、Typescript、Golang、Kotlin。
ProgrammingParadigm
目前的编程风格主要有三种,一种是Imperative,典型的代表是C语言,是直接告诉程序如何运行。还有一种Object OrientedProgramming(OOP)也就是大多数人比较熟悉的面向对象,它是基于对现实事物的抽象,Java就是面向对象类型的语言。
另外一种是Functional Programming(FP)函数式编程,它和Imperative 的不同点在于,更注重程序间的逻辑关系。这类语言一般都会有first class和高阶函数,这类语言有Lisp、Haskell等。
上图是对所选语言做的一个分析,图中的语言越靠近某个方向就代表这方面的特性越强,需要注意的是某方面的特性更强并不代表没有其他的两个特性。一般来说越偏向于Object-orientend(OOP)或者Imperative,就代表相对更容易学习,这是因为这两种模式更类似于人类的正常思维,而Functional(FP)则更像是数学家的思考方式。
不过从我们自身出发的话,还是需要具备一些FP特性的语言,也就是下图中右半部分。
Ecosystem
基于我们最初的考虑,Ecosystem(生态圈)可以说是非常重要的。其中有各方面的考虑,比如开发人员的数量,工具链是否易用丰富、IDE支持如何、第三方库是否足够等等。
现阶段比较大的生态圈有JavaScript、JVM、GO。规模最大的当然就是JVM了。
总结
通过上面这一层层的分析,我们最后选择了Kotlin。首先它并非是微软系的语言,并且还是静态语言,能够进行类型推导,有着OOP的特性的同时兼顾Functional(FP),依托的是目前来说最大的JVM生态圈。
当然这只是现阶段的考虑,相信随着时间的发展还会有更好的选择。
今天的分享就到这里,谢谢大家!