责编 | 胡巍巍
当前最炙手可热的领域非“人工智能”(Artificial Intelligence)莫属。实在,“人工智能”的火热并非一挥而就,早在1956年“人工智能”观点就已经被提出了。
那年,在美国东部的达特茅斯学院举办了历史上第一次人工智能研讨会,会上John McCarthy首次提出了“人工智能”术语,它指的是像人类那样思考的机器,这被认为是“人工智能”出身的标志。

经由60多年的发展和探索,“人工智能”已经迎来了第三次革命——机器学习。
在互联网、大数据等前沿技能的支持下,近几年无论是人脸识别、语音识别、机器翻译、视频监控,还是交通方案、无人驾驶、智能陪伴、舆情监控、聪慧农业等,“人工智能”正在不断取得打破性的进展。
未来是“人工智能”的时期,它会日益渗透到各行各业、各个领域的方方面面之中,如何将“人工智能”恰到好处地发挥浸染,紧张表示在软件程序的开拓上。
实质上,软件程序是由编程措辞开拓实现的,选择得当的编程措辞不仅可以提高软件的开拓效率,也可以提高软件的利用质量,它是软件开拓过程中的关键环节。
当前的编程措辞种类繁多,琳琅满目,我们须要对编程措辞有更全面的理解才能得心应手的选择最适宜的一种。那么,它们的核心差异是什么?
又是如何一步一步发展出来的?哪种编程措辞是“人工智能”领域的最佳选择?本文就以“人工智能”的编程措辞发展历史为轨迹,给出这些问题的答案。
初识编程措辞
如果说措辞是人与人之间通报信息的纽带, 那么编程措辞则是把人的思维通报给打算机的纽带。打算机实行的每一个步骤,都因此编程措辞所编写的程序来实行的。
目前的编程措辞有C、C++、C#、Python、Java、PHP、GO、JavaScript等,虽然每种编程措辞的语法不同,但是它们终极的目的是为了让打算机事情。
另一方面,CPU芯片只能识别机器指令,因此,只管不同的编程措辞在语法上差别很大,终极还是被转换为CPU芯片可以实行的机器指令。
比如C、C++这些编译型的编程措辞只有经由编译工具的处理后才能被CPU芯片所识别。
举个例子解释这个过程。我们在Linux平台上用C措辞编写完程序,接下来须要用编译工具处理这份程序文件,我们选择一款常用的编译工具GCC(GNU Compiler Collection),然后利用GCC的命令语法分别完成预处理、编译、汇编、链接这4个阶段,末了会天生一个可实行二进制文件,这个文件便是由机器指令所组成的。对付那些编译型措辞的集成开拓软件而言,它们为了提高开拓效率把编译过程封装成了控件操作,在编译事理上仍旧是相同的。
Python这类阐明型措辞与编译型措辞则有所不同。由Python措辞编写完成的程序文件无需编译为可实行二进制文件后再实行,而是可以调用Python阐明器逐一将程序语句阐明成可实行的机器指令。
利用者无需关心程序的预处理、编译、汇编、链接这些过程,这使得开拓事情变得更加轻松,不过在程序实行时所增加的阐明过程也使得它比编译性措辞在实行效率上有所劣势。
至于为什么Python能够用动态阐明的办法实行程序,关键点在于Python阐明器上。Python阐明器根据实现的措辞不同分为不同的版本,比如Java版的Jython,.Net版的IronPython等,源生的Python阐明器是基于C措辞实现的,称为CPython。
当我们从Python官网下载并安装好Python 后,我们会得到一个CPython阐明器。运行Python程序文件时会启动CPython阐明器,阐明器首先将程序文件(.py)编译为字节码(.pyc),然后再将字节码转换为可实行的机器码。
编程措辞的发展
市情上虽然有形形色色的编程措辞,但是从理论上来讲,每种编程措辞险些可以实现同样的功能,它们的产生是为了迎合不同运用处景的发展需求罢了。
总体来说,编程措辞的发展历史可分为三个阶段,第一阶段的机器措辞、第二阶段的汇编措辞、第三阶段的高等措辞,这是一个逐步进化的过程。
机器措辞是第一代编程措辞,它指的是用二进制的0/1指令集来表示的措辞,也是打算机唯一能够识别的措辞。
指令的基本格式由操作码和操作数两部分组成,操作码指明了指令的操作功能,操作数表示该指令的操为难刁难象。早在1946年,天下上出身了第一台打算机,当时的程序员只能通过机器措辞来编写程序。
他们采取的方法是,先在卡片上用穿孔办法表示0/1指令集,再用读卡机读取卡片上的程序并加载给打算机去实行。
机器措辞是直接面向打算机CPU操作的措辞,因此实行效率很高,但是大量繁杂噜苏的细节管束着程序员,编写难度高、可读性差、不便于移植等毛病,使得他们不得不把韶光和精力专注在如何确保程序的精确性上。机器措辞太过于晦涩难懂,于是推动出身了汇编措辞。
汇编措辞是第二代编程措辞,也称为符号措辞,它用助记符代替了操作码,用地址符号或标号代替地址码,比如MOV R0,#0x100表示的含义是把0x100赋值给R0,这样相对来说更加随意马虎理解和影象。
当然,汇编措辞的符号可以被人类接管,但并不能被打算机识别,对此还要通过一种软件将汇编措辞的符号转换为机器指令,这个软件便是编译器。
由于不同的CPU会有不同的指令集,因此每种CPU的厂家都会供应自己专属的汇编措辞语法规则和编译器,在编译器中记录着汇编措辞各种符号与机器指令之间的对应关系。
这样一来程序员可以用汇编措辞编写程序,然后通过编译器把汇编措辞编译成机器指令。
比较与机器措辞,汇编措辞在可用性上已经有很大的进步了,但是它仍旧是面向机器的一种低级措辞,虽然实行速率快、效率高、程序体积小,但是编写和调试上的繁芜性仍旧匆匆使着编程措辞向更高等的措辞去进化。
高等措辞是第三代编程措辞,当编程措辞发展到这个阶段时,已经从面向机器进入到面向人类的层面。
程序员可以不依赖于特定型号的打算机,利用靠近于自然措辞、数学公式这些更随意马虎理解的办法编写程序,并且编写的程序能移植到各种平台上正常运行。
高等措辞的发展也分为两个阶段,分别为前一阶段的构造化措辞或者称面向过程措辞,后一阶段的面向工具措辞。面向过程措辞的范例代表有C、 Fortran、COBOL、Pascal、Ada等等,面向工具措辞的范例代表有Java、C++、C#、Python等。
大略的说,面向过程和面向工具是两种编程的思想。面向过程是建立在“过程”观点上来辅导软件编程的思想,比如在学习和事情中,当我们去完成某项任务时,会罗列出完成这件事情的多少个步骤,如果个中某一步骤特殊繁芜时,又可以将它细化为多少个子步骤,以此类推,直到问题办理。
本色上这些步骤便是“过程”,按照步骤去办理问题的思想便是面向过程的思想。基于面向过程“自顶向下、逐步求精”的编程思想才有了“高内聚,低耦合”模块化编程的哀求。
面向工具是建立在“工具”观点上来辅导软件编程的思想,认为客不雅观天下由各种工具组成,任何事物都是工具。比如把“程序员利用电脑”这个事宜工具化,首先用抽象的办法建立“人”和“电脑”两个类,类等分别包括所有的属性和函数,再以继续“人”类的办法派生出一个“程序员”类,把“电脑”类以组合的办法作为“程序员”类的属性,在“程序员”类中添加“利用电脑”函数,末了实例化一个名为Tom的程序员和一台Dell电脑,Tom实例调用了“利用电脑”这个方法。
以上比拟可以看出,当程序大略、规模较小的场景下,面向过程编程使得程序流程更加清晰,但是当面对繁芜程序时,面向工具易掩护、易复用、易扩展的优点就表示了淋漓尽致了。
可见从面向过程措辞到面向工具措辞的发展可以看出,随着时期的发展,编程措辞须要办理的问题越来越繁芜,编写的程序规模也越来越弘大,软件的开拓、程序的掩护、功能的修正变得越来越频繁。
因此,面向工具措辞是当前打算机技能发展到一定阶段的产物,从面向过程过渡到面向工具的编程方法也是大势所趋。
目前面向过程措辞中Fortran、Basic 和 Pascal 这些措辞基本上已经很少有人利用了,而C措辞仍旧是打算机领域最主要的一门措辞,特殊是在系统编程、嵌入式编程领域霸占着统治地位。
C措辞的起源与UNIX的改进是密不可分的。在1969至1970 年期间,美国电话电报公司(AT&T)贝尔实验室的Ken Thompson和Dennis Ritchie等人利用汇编措辞编写了第一个版本的 UNIX 操作系统。
由于UNIX 操作系统良好的性能,在其发布初期,就迅速得到了推广和运用。不过汇编措辞依赖于打算机硬件,在可读性和可移植性方面都比较差。
1973 年,Ken Thompson和Dennis Ritchie在做系统内核移植开拓时,创造利用汇编措辞很难实现,他们须要一种集高等措辞和汇编措辞的优点于一身的编程措辞来编写UNIX内核。
于是在先后利用了BCPL措辞、B措辞之后,由Dennis Ritchie设计出了C 措辞,成功地重新编写了 UNIX内核。
不过C措辞并不是从0到1开拓出来的,它的原型可追溯到1960年涌现的ALGOL 60措辞,也称为A措辞。
由于ALGOL 60措辞离硬件层面比较远,不宜用来编写系统程序,1963年英国剑桥大学在ALGOL 60措辞的根本上推出了更靠近硬件编程的CPL(Combined Programming Language)措辞。
1967年英国剑桥大学的Martin Richards又对CPL措辞进行了简化,推出了BCPL(Basic Combined Programming Language)措辞。之后的发展历史则对接到了上文提到的贝尔实验室UNIX内核开拓。
1970年Ken Thompson以BCPL措辞为根本作出进一步简化,推出了B措辞用于编写UNIX内核。不过B措辞过于大略、功能有限,在1972年至1973年期间Dennis Ritchie在B措辞的根本上设计出了C措辞。后来C措辞的改进也紧张用于贝尔实验室内部,直到1975年UNIX第6版公布后,C措辞的突出优点才引起人们普遍关注。
在1977年为了使UNIX操作系统推广到其他机器上利用,Dennis Ritchie揭橥了C措辞编译文本《可移植的C措辞编译程序》,这使得C措辞在其它机器上的移植事情大大简化。可见C措辞和UNIX是相辅相成地发展着的,随着UNIX的日益广泛利用,C措辞也迅速得到推广。
1978年,Dennis Ritchie和Brian Kernighan出版了《The C Programming Language》(《C程序设计措辞》),这本书影响深远,被C措辞开拓者作为C措辞的非正式的标准解释,也称为“K&R”(作者名称首字母结合),这个版本的C措辞称为“K&R C”。
从此之后C措辞开始风靡全天下,它被广泛运用在大型主机到小型微机的各种场合,由于‘K&R’中并没有定义一个完全的标准C措辞,于是同期间衍生出了很多不同版本的C措辞。
为了统一这些C措辞版本,在1983年美国国家标准局(American National Standards Institute,简称ANSI)成立了一个制订C措辞标准的委员会,根据C措辞问世以来各种版本对C的发展和扩充制订了新的标准——ANSI C。1988年,Dennis Ritchie和Brian Kernighan修正了经典著作《The C Programming Language》,在第二版中涵盖了ANSI C措辞标准。
1989年ANSI C措辞标准被正式批准,称为ANSI X3.159-1989 programming languages - c,由于这个版本是 89 年完成制订的,因此常日被称为 C89。
之后ANSI 又把ANSI C标准提交到 ISO(国际化标准组织),1990年被 ISO 采纳为国际标准,称为 ISO C,又由于这个版本是1990年发布的,因此也被称为C90。
ANSI C(C89) 与 ISO C(C90)在内容上基本相同,虽然后来C措辞也有一些修正,但目前广泛利用的C措辞版本仍旧是 ANSI / ISO C。
C措辞的影响力不仅于此, C++、Java、C#、Python等编程措辞也因此C措辞为根本发展起来的。
这也是为什么大学里将C措辞作为打算机传授教化的入门措辞的缘故原由,由于节制了C措辞,再学其它编程措辞,能够举一反三,很快就能上手。
比如C++编程措辞是1979年Bjarne Stroustrup从C措辞的根本上扩充而产生的,最开始引入了类的观点,称为“C with class” 措辞。在1983年,“C with Classes”措辞才更名为C++,“++”符号也表明了是对C措辞功能的递增。
C++从正式更名一贯到1985年商业版本正式问世,这个期间又加入了虚函数、函数重载、引用机制等许多主要的特性。
1989年,C++再次版本更新,这次更新引入了多重继续、保护成员以及静态成员等措辞特性。之后每隔几年C++都会从易用性、安全性等方面进行版本的升级。
以是说万物的发展都离不开接管和借鉴,同样Java也不例外。在1991年,SUN公司的开拓小组在利用C++措辞时创造它十分繁琐,于是应运而生了Java措辞。
Java在发展的过程中接管了C++很多优点,同时也摒弃了C++里面多继续和指针等繁芜的语法,增加了垃圾回收器等功能。
经由这些年的发展, Java的功能也变得越来越强大。C# 则是微软公司看到 Java 很盛行,在2003年所发布的一个与 Java 语法相似的措辞。
从以上编程措辞的发展进程可知,不同编程措辞它们都拥有各自的运用处景,它们的产生实质上便是为了帮助程序员能够更好地办理问题。
最适宜AI的措辞
对付“人工智能”来说,选择不同的编程措辞本色了决定了“人工智能”的期望程度,因此这也是目前辩论的焦点——哪种编程措辞是“人工智能”领域的最佳选择?
最近几年,随着人工智能观点的火爆,Python措辞迅速升温,成为浩瀚AI开拓者的首选措辞。
Python的出身在1989年,最初并不是为了契合AI的发展,而是荷兰人Guido van Rossum为了丁宁圣诞节假期开拓了Python措辞的阐明器。
Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flying Circus。
他希望Python措辞,能符合他的空想:创造一种C和shell之间,功能全面,易学易用,可拓展的措辞。
Python措辞适宜于AI的优点,除了语法大略、利用方便、快速上手之外,更主要的是拥有强大的第三方库的扩展,个中就包括了许多数据剖析、机器学习方面的第三方库。
比如Python数值打算最主要的根本库——NumPy,大多数供应科学打算的库都是用NumPy数组作为构建根本,如Pandas库、SciPy库等。
NumPy中紧张以N维数组工具ndarray存储数据的,ndarray作为NumPy的核心,不仅具有矢量算术运算的能力,并且在处理多维的大规模数组时快速且节省空间。
在处理矩阵的转置、求逆、求和、叉乘、点乘等运算时,只需用一行大略的表达式代码就能代替for循环。
在运行效率上,得益于底层C措辞编写的算法机制,NumPy会比纯Python快几个数量级,险些靠近与编译过的等效C措辞程序的处理速率。
Pandas则是Python环境下最有名、最专业的数据剖析库,虽然NumPy供应了通用的数据处理的打算根本,但在处理表格数据时大多数利用者仍旧将Pandas作为统计和剖析事情的紧张工具,Pandas使得Python中的处理数据变得非常方便、快速和大略。
在机器学习的可视化方面有高质量的绘图库——Matplotlib库,它具有很高的灵巧性和集成能力。再比如SciPy库可以轻松处理包括线性代数、微积分、旗子暗记处理等各种数学运算。
Scikit-learn库是建立在SciPy,NumPy和Matplotlib之上的机器学习框架库,供应了机器学习中回归、分类、聚类、数据降维等各种成熟、通用的剖析方法。
还有由Google Brain团队开拓的TensorFlow库可用于神经网络等深度学习模型的研究……这些库使得Python在AI领域的具有很强的竞争力。
Python也并不是没有缺点,作为一门阐明性措辞,最明显的缺陷便是实行速率的局限性,这会导致在处理某些高频任务时存在瓶颈。
幸好Python本身由C措辞实现的,在设计之初考虑到了通过足够抽象的机制让C/C++之类的编译型的措辞能够导入到Python脚本程序中。
这样的话,在开拓性能哀求较高的程序模块可以通过扩展运行效率更高的C/C++措辞来填补自身的弱点。
其余有些算法已经有开源的C/C++库,那么也没必要用Python重写一份,只须要用Python 的ctypes 库或者Python源生代码扩展办法调用这些库即可。
当然,除了Python之外,C ++、Java、R、Prolog、Lisp这些措辞也是不错的选择之一。c++供应更快的实行和相应韶光,普遍运用在搜索引擎、游戏等领域的开拓。
Java不仅能够适用于机器学习干系搜索算法、自然措辞处理算法、神经网络算法,更大的上风是易于利用、调试,简化了大型项目的事情。
R措辞和Python一样拥有强大的第三方库,有靠近10,000个数据科学和剖析干系的第三方库的支持,在统计剖析和机器学习算法的实现上非常有上风。
Lisp和Prolog都属于非常古老的编程措辞,不过随着韶光的推移,它们已经是AI项目开拓的常用措辞。
Prolog拥有强大而灵巧的编程框架,Lisp则为开拓职员供应了足够的自由,它的灵巧性可以快速进行原型设计和实验。
总结
人工智能是一个非常广阔的领域,不同的领域的运用处景对编程措辞的特性哀求也不尽相同,因此选择得当的编程措辞非常主要,不仅能够为开拓职员节省韶光及精力,也能增加系统的稳定性。对付开拓职员来说更是要站在全局的视角去核阅编程措辞的选择。
作者先容:元宵大师,Python高等工程师,致力于推动人工智能、大数据剖析在金融量化交易领域中的运用。欢迎大家关注我的个人公众号《元宵大师带你用Python量化交易》。
【End】