什么是引擎
前言
引擎这个词在编程中出现越来越多,比如游戏引擎,爬虫引擎,规则引擎。引擎这个最初在汽车里面代表发动机的词,到底是指什么意思,而引擎在不同编程的语境中具体又代表了什么,本文就是为了解释这些疑问而写的。
从词源说起
引擎,中文百度百科说的是汽车动力的来源。换句话说,就是驱动汽车发动、前进、加速的一种组件。当引擎用在游戏中时,游戏引擎指的是控制所有游戏功能的主程序。
游戏与状态
在游戏中,引擎被抽象为控制所有游戏功能的主程序。那么,游戏引擎如何控制游戏功能呢?想象我们再玩一个网络游戏,首先有一个游戏图,然后我们输入一些操作,控制人物的行为,人物在游戏中与游戏中的对象进行交互,从而产生一种新的状态。
如果把游戏中所有的对象看作状态机,游戏引擎就是改变状态的规则,它定义了对象(状态机)在什么情况下应该转变为另一种状态并且完成这个状态的转换。
汽车的状态
汽车,开始是静止状态。引擎,定义了当打火的时候汽车发动,当踩油门的时候,引擎会让汽车进行加速。引擎是改变状态的动力,它定义了状态如何改变并且将这种改变实现。在物理世界中,引擎通过复杂的物理过程实现状态的改变;在代码世界中,引擎通过代码的执行和调用实现程序状态的改变。
调度与规则
而引擎在调用的时候,如果资源很少直接进行调用,不会出什么问题(甚至不需要所谓引擎的概念,直接运行一个所有代码的在main函数里面的程序即可)。当需要调用的资源/函数很多的时候,引擎还承担起调度的功能,资源之间相互具有依赖性,先执行什么,再执行什么,这个由引擎来决定。拿汽车举例,发动汽车气缸内的物理过程顺序不能错,否则就会出现不同的结果。物理过程,可以理解为使引擎内部的自然规则,在实际代码中,我们可以自定义自己的规则。
代码库与接口
还有一种理解是,引擎就是为了实现某个功能已经封装好的库。有人也许会问,这和API有什么区别?API是提供调用封装好的库的接口,一个引擎为了完成某个功能,必然会调用已经实现的函数代码的接口,并且这种调用是基于引擎功能而制定的调用组合。引擎这个概念,其实也就是抽象,在更高一个层面看代码,将森林简化成一棵树。
总结
从状态的角度讲,引擎是为了实现状态的转换。而状态的转换,需要定义规则。即在什么情况下作出什么反应。
从功能的角度讲,引擎是封装了代码/函数库,通过调用代码/函数库的接口来实现特定的功能。
从抽象的角度讲,引擎简化了我们看问题的视角。使得我们通过引擎就可以对程序的功能状态进行改变,从而实现丰富的内容和功能。