选Python还是选Java?2020年,顶尖程序员最应该掌握的7种编程语言
选自Medium
作者:Claire D
机器之心编译
参与:李诗萌、蛋酱
哪种编程语言最好?这个问题可能永远不会有答案。萝卜白菜,各有所爱,AI 工程师和科学家可以根据项目需要,从众多编程语言中选择最适合自己的。
有人曾经将编程比作做菜,那编程语言就是首先要准备的食材或厨具。
C:一把菜刀一口炒锅,一个很好用的灶,隔壁有个菜市场。Java:碎菜器,切菜机,绞肉机,和面机,烤箱,微波炉……Python:大超市的速冻柜台,要成品有成品,要半成品有半成品,什么都有。它能让你快速获得一桌还能吃的饭,但是深究口味火候什么的不那么容易。C++:一套顶级厨具,光刀就十几把,切肉的切片的雕花的;锅有爆炒的闷烧的平底煎肉的煎蛋的炖汤的……有人试图用二十一天掌握这套工具的用法,结果往往是玩刀伤了自己,或者是炸了厨房。
选自知乎用户:https://www.zhihu.com/question/284549387/answer/451018336
尽管在刚开始开发 AI 时,有很多编程语言都可以满足你的需求,但没有一种编程语言是可以一站式解决 AI 编程的问题,因为在每一个项目中,不同的目标需要特定的方法。和做菜时的精挑细选一样,在成为一个「高手」的过程中,我们要学会的是找到最适合自己的编程语言。Python
Python 是可读的最强大的语言。—Pau Dubois
Python 编程。图源:Unsplash。Python 开发于 1991 年,一项民意调查表明,在开发 AI 时,超过 57% 的开发者将 Python 作为首选编程语言,而不是 C++。因为易于学习,Python 让程序员和数据科学家可以更轻松地进入开发 AI 的世界。
Python 是一个程序员需要多少自由度的「实验」。太自由,没人可以读懂别人的代码;太不自由,就会没那么强的表现力。—Guido van Rossum
使用 Python,你不仅可以获得优秀的社区支持和广泛的库集,还能享受到其灵活性。你从 Python 中得到的最大的好处可能是平立性和针对深度学习和机器学习的广泛框架。
用 Python 编码的乐趣在于可以看到短小精悍、可读性高的类,这些类可以用少量清晰的代码表达大量行为(而不是用大量代码烦死读者)。——Guido van Rossum
Python 代码片段示例:
Python 代码段落示例。常用的库
- TensorFlow——用于机器学习工作负载和用数据集处理;
- scikit-learn——训练机器学习模型;
- PyTorch——计算机视觉和自然语言处理;
- Keras——高度复杂性的数学计算和操作的代码接口;
- SparkMLib——类似 Apache Spark 的机器学习库,通过算法和实用程序等工具,让每一个人都能轻松地进行机器学习;
- MXNet——Apache 的另一个库,可以简化深度学习流程;
- Theano——定义、优化和评价数学表达式的库;
- Pybrain——用于强大的机器学习算法。
另外,根据 GitHub 库的贡献度,Python 已经超越了 Java,成为世界第二受欢迎的语言。Stack Overflow 将 Python 称为「成长最快」的主流编程语言。
Python 入门课程
- 《三门免费的 Python 入门课程:2020 版》
课程链接:https://hackernoon.com/3-free-python-courses-for-beginners-2020-edition-j7c23y3u
- 《完整 Python 训练营:用 Python 3 从小白到大师》
课程链接:https://www.udemy.com/course/complete-python-bootcamp/?LSNPUBID=JVFxdTr9V80&ranEAID=JVFxdTr9V80&ranMID=39197&ranSiteID=JVFxdTr9V80-lB6TwxSdouentAk36.qjmwJava
编写一次,随时运行。
Java 被公认为世界上最好的编程语言之一,它在过去 20 年间的使用情况就是最好的证明。凭借其用户友好度、灵活的特性以及平立性,Java 以各种方式参与到了 AI 的开发中,比如:
- TensorFlow——TensorFlow 支持的编程语言中也列出了带有 API 的 Java。虽然不像其他完全支持的语言那样功能丰富,但确实支持 Java,并且在迅速地改进。
- Deep Java Library(深度 Java 库)——亚马逊开发的、用 Java 来创建并部署深度学习能力的库。
- Kubeflow——Kubeflow 使在 Kubernetes 上部署和管理机器学习堆栈更容易,还提供了现成的 ML 解决方案。
- OpenNLP——Apache 的 OpenNLP 是用于自然语言处理的机器学习工具。
- Java Machine Learning Library(Java 机器学习库)——Java-ML 为开发者提供了多种机器学习算法。
- Neuroph——Neuroph 借助 Neuroph GUI,利用 Java 开源框架设计了神经网络。
如果 Java 可以垃圾回收,大多数程序都会在执行时删除自己。——Robert Sewell
Java 代码片段示例:
Java 代码段示例。Java 入门课程
- 《五大在线 Java 编程入门课程——最好的》
课程链接:https://javarevisited.blogspot.com/2018/05/top-5-java-courses-for-beginners-to-learn-online.htmlRRoss Ihaka 和 Robert Gentleman 在 1995 年发布了第一版 R 语言。现在由 R 开发核心队伍维护,R 是 S 编程语言的实现,用于统计软件的开发和数据的分析。R 的基础特征是善于处理大量数据,相比 Python 中不够完善的 NumPy 包,R 是更好的选择;你可以用 R 处理各种不同的编程范式,比如函数式编程、矢量计算和面向对象编程等。R 适用的 AI 编程包:
- Gmodels——提供了一系列拟合模型用的工具;
- Tm——文本挖掘应用的框架;
- RODBC——R 的 ODBC 接口;
- OneR——用来实现单规则机器学习分类算法,适用于机器学习模型。
在数据挖掘者和统计学家中,广泛使用的 R 的功能有:
- 多种用于扩展功能的库和包;
- 活跃的支持社区;
- 能和 C、C++ 和 Fortran 协同工作;
- 多个有助于扩展功能的包;
- 支持生成高质量的图形。
Prolog逻辑编程(Logic Programming)的简称。Prolog 最早出现在 1972 年,适用于开发人工智能,尤其是自然语言处理。Prolog 最适合创建聊天机器人,ELIZA 是有史以来第一个用 Prolog 创建的聊天机器人。
第一个成功的聊天机器人。为了理解 Prolog,你必须熟悉一些指导 Prolog 工作的基本术语:
- 事实(Fact)定义了正确的陈述;
- 规则(Rule)定义了有附加条件的陈述;
- 目标(Goal)根据知识库定义了提交陈述的位置;
- 查询(Query)定义了如何使你的陈述正确,以及对事实和规则的最终分析。
Prolog 提供了两种实现 AI 的方法,这两种方法已经实现很久了,并且在数据科学家和研究人员中广为人知:
- 符号方法包括基于规则的专家系统、定理证明和基于约束的方法;
- 统计方法包括神经网络、数据挖掘、机器学习以及其他方法。
Lisp
用 Lisp 编码创建有 n 个输入 m 个单元的一层感知机。列表处理(List Processing)的简称。这是继 Fortran 后第二古老的编程语言。也被称作 AI 的奠基语言之一,由 John McCarthy 与 1958 年创建。
Lisp 是用来实现不可能的语言。——Kent Pitman
Lisp 是可以编程的实用数学符号,很快就成为了开发人员首选的 AI 编程语言。Lisp 因为其特有的功能,成为机器学习 AI 项目的最佳选择之一:
- 快速创建原型;
- 创建动态对象;
- 垃圾回收;
- 灵活性。
随着其他竞争的编程语言的重大改进,其他语言集成了 Lisp 特有的一些功能。涉及到 Lisp 的著名项目有 Reddit 和 HackerNews。
说到 Lisp,这是世界上最美的语言——至少在 Haskell 出现之前是这样。——Larry Wall
HaskellHaskell 创建于 1990 年,以著名数学家 Haskell Brooks Curry 的名字命名。Haskell 是纯粹的函数式和静态类型的编程语言,与惰性计算和短代码配合使用。Haskell 是一种非常安全的编程语言,因为和其他编程语言相比,Haskell 很少出现错误,所以在处理错误方面提供了更大的灵活性。即便发生了错误,也可以在编译(而非运行)时捕获大多数非语法错误。Haskell 提供的功能包括:
- 强大的抽象能力;
- 内置的内存管理;
- 代码的可重用性;
- 易于理解。
SQL、Lisp 和 Haskell 是我所见过的唯一可以把时间花在思考而不是打字上的编程语言。——Philip GreenspunHaskell 的功能有助于提高程序员的生产率。Haskell 与其他编程语言非常相似,但只有一小部分开发人员使用。撇开挑战不谈,随着开发者社区使用率的增加,可以证明 Haskell 和其他用于 AI 的竞争语言一样出色。
JuliaJulia 是一种高性能的通用动态编程语言,可以创建几乎任何应用,但最适合进行数值分析和计算科学。和 Julia 一起使用的工具还包括:
- 像 Vim 和 Emacs 这样流行的编辑器;
- 像 Juno 和 Visual Studio 这样的 IDE。
Julia 源代码组织。Julia 中有一些功能使其成为 AI 编程、机器学习、统计和数据建模的重要选择,这些功能有:
- 动态类型系统;
- 内置的包管理器;
- 能够进行并行和分布式计算;
- 宏和元编程能力;
- 支持多分派;
- 直接支持 C 函数。
Julia 是为了消除其他编程语言的弱点而构建的,和其他工具(如 TensorFlow.jl、MLBase.jl 和 MXNet.jl)集成后还可以用于机器学习,利用 Julia 的可伸缩性还可以做更多事。
谷歌趋势——Julia 的使用趋势。总结AI 工程师和科学家可以根据项目的需求,从多种编程语言中进行选择。每一种 AI 编程语言都有优缺点。随着这些语言的不断改进,AI 开发很快就可以有更舒适的体验,这样就会有更多人加入这一创新浪潮。出色的社区支持使新人们可以更好地工作,社区对包和扩展的贡献让每个人的工作都变得更加轻松。参考链接:https://towardsdatascience.com/top-programming-languages-for-ai-engineers-in-2020-33a9f16a80b0
一文了解 Yacc、Lex、JavaCC、ANTLR 等编译器相关概念
Compiler
定义一种“上下文无关文法”(context-free grammar,CFG),然后写一个 C 程序来解释这种 CFG,那么这个 C 程序就叫做“编译器”(compiler)。只不过这个编译器只能编译特定的 CFG,就像 g++ 只能编译 C++,javac 只能编译 Java 代码,这些都是编译器。
CC
CC 即 compiler-compiler,意思是“编译器的编译器”,另外还可以叫做 compiler generator。
对于任意给定的 CFG,如果可以写出一个 C 程序,生成另一段 C 程序代码,这段 C 程序代码是给定 CFG 的编译器。那么,这个 C 程序就叫做 CC。
Yacc、Bison
Yacc 即 Yet Another Compiler-Compiler,是经典的生成语法分析器的工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语法解析器。
Yacc 采用自下而上(LALR)语法分析方法,输入是巴科斯范式(Backus-Naur Form,BNF)表达的语法规则以及语法规约的处理代码,输出的是基于表驱动的编译器,包括输入的语法规约的处理代码部分。
Yacc 最初由 AT&T 的 Steven C. Johnson 为 Unix 操作系统开发,后来一些兼容程序如 Berkeley Yacc(byacc)、GNU Bison 相续出现。它们在原先基础上做了一些改进或者扩展,但基本概念是相通的。
GNU Bison 是 Yacc 的 GNU 自由软件版本,基本兼容 Yacc,并做了一些改进。在新近版本中,除了与 Yacc 相同的 LALR 语法分析,Bison 还增加了对 GLR(Generalized LR) 语法分析的支持。
Lex、Flex
Lex 是 LEXical compiler 的缩写,是一个词法分析器(scanner)的生成工具,它使用正则表达式(regular expression)来描述各个词法单元的模式,由此给出一个词法分析器的规约,并生成相应的实现代码。 Lex 程序的输入方法称为 Lex 语言,而 Lex 程序本身被称为 Lex 编译器。
Yacc 生成的编译器主要是用 C 语言写成的语法解析器(Parser),需要与词法分析器一起使用(一般为 Lex),再把两部分产生的 C 程序代码一起编译。描述词法分析器的文件 *.l,经过 Lex 编译后,生成一个 lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。词法分析器,简单来说,其任务就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容易被后续阶段处理。
Flex 是 Lex 的开源版本,是 Lex 编译器的一种替代实现。
JavaCC
JavaCC 即 Java Compiler Compiler,是开源、轻量的语法分析器生成器和词法分析器生成器,采用纯 Java 编写,可生成 Java、C++ 和 C# 代码。ANTLR 根据输入的文法生成由 Java 语言编写的分析器,相当于 Java 界的 Yacc + Lex 或 Bison + Flex。
和 YACC 类似,JavaCC 由(Extended Backus-Naur Form,EBNF) 格式的形式文法生成语法分析器。不同的是,JavaCC 生成的是自顶向下 LL 语法分析器对 CFG 进行解析。同时,JavaCC 生成词法分析器的方式也和 Lex 很像。JavaCC 还提供 JJTree 帮助使用者构建语法树,JJDoc 工具为源文件生成 BNF 范式文档。
JavaCC 源自著名的 Sun 公司。1996 年,Sun 推出了一个名为 Jack 的语法解析器生成器。后来,负责“Jack”的开发者创办了自己的公司 Metamata,并将 Jack 改名为 JavaCC。Metamata 最后成为了WebGain 的一部分,后 WebGain 关闭。目前 JavaCC 代码以 BSD 许可证托管在 GitHub。
很多著名开源项目用到了 JavaCC,包括:
- Apache ActiveMQ
- Apache Zookeeper
- Apache Lucene
- Apache Tomcat
- Apache Avro
- Apache Camel
- Apache Calcite
ANTLR
ANTLR 即 ANother Tool for Language Recognition,是基于自顶向下的递归下降 LL 算法实现的语法解析器生成器(parser generator),采用纯 Java 语言编写。ANTLR 能够自动生成解析器,并将用户编写的 ANTLR 语法规则直接生成目标语言的解析器。所生成的解析器客户端将输入的文本生成抽象语法树,并提供遍历树的接口,以访问文本的各个部分。
ANTLR 是 Terence Parr 在普渡大学攻读硕士学位时的创作,在著名编译器领域大师 Hank Dietz 教授的指导下,开始研究构造自动化的分析器。1993年,Parr 取得博士学位,并于同年发布 ANTLR 1.10 版。最早的 ANTLR 只支持 Java, 直到 ANTLR 3 以后开始支持 Ada95、C、C#、JavaScript、Objective-C、Perl、Python、Ruby、C++ 和 Standard ML。
ANTLR 生成的代码与使用递归下降法(构造手工分析器的主要方法)产生的代码非常相似,便于程序员阅读和理解,与 Yacc 产生的晦涩代码相比进步了很多。与 JavaCC 相比,ANTLR 功能更加全面,开箱即用,另外支持语言更丰富,不止局限于 Java 语言。
使用 ANTLR 的著名项目包括:
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。