Welcome

首页 / 软件开发 / C++ / 手把手教你写脚本引擎(一)——挑选语言的特性

手把手教你写脚本引擎(一)——挑选语言的特性2010-06-24 C++博客 陈梓瀚脚本引擎的作用在于增强程序的可配置性。从游戏到管理系统都需要脚本,甚至连工业级产品的Office、3DS Max以及AutoCAD等都添加了属于自己的脚本语言。DHTML的出现让我们可以在网页代码中嵌入脚本语言,PHP和ASP等技术的出现让我们可以将一个应用程序的界面换成网页,而逻辑使用脚本语言编写。现在脚本语言的种类繁多,Python的发展让BOOST库拥有了对Python的支持,Rails框架的出现壮大了Ruby的实力,LUA更是被大量应用在游戏开发中。Windows甚至提供了wscript以便让我们能够调用javascript和vbscript的代码。

既然有了这么多可供选择的脚本引擎,为什么我们仍然要开发自己的脚本引擎呢?首先,我们并不能保证现有的脚本引擎能够满足我们做出来的系统。因为我们所需要的脚本可能很简单,用现有的脚本引擎比较浪费。或者我们的脚本复杂,但是功能比较“神奇”(譬如SQL)以至于没有能够满足我们需要的脚本引擎。因为脚本并不一定是通用语言,脚本仅仅是为了满足我们增强系统的可配置性而出现的。其次,脚本引擎足够复杂,可以训练我们的编程能力。在我们的业余时间里面开发出来的程序并不完全是为了满足某个应用的需要而产生的,有可能是我们为了自身的提高而进行的摸索。开发脚本引擎足以成为锻炼的方法之一。

计算机语言作为一个计算的定义,在我们开发脚本引擎之前需要先进行了解。对于目前流行的若干种语言,我们可以抽象出一组正交属性来描述他们。

一、命令式与描述式

一门语言是命令式或者描述式取决于这门语言是用来告诉计算机怎样做还是做什么的。举个例子,SQL和Prolog是描述式语言,而C++、C#等则是命令式语言。我们在使用SQL的时候告诉服务器的是我们需要满足什么条件的数据项,而不是告诉服务器我们需要通过什么计算来获得自己所需要的数据项。描述式的语言的优点在于其可读性好。C# 3.0为数据查询加入了LINQ让我们可以在C#中书写类似SQL的代码查询数据。

另一个比较模糊的例子则是Haskell。Haskell很难区分是命令式语言还是描述式语言。因为从形式上来说我们告诉编译器的是我们想做什么而不是我们想怎么做,但是Haskell给我们的工具的粒度太细以至于我们为了告诉编译器做什么的同时仍然需要考虑一个问题是如何被解决的。

二、按值计算与惰性计算

惰性计算的语言很少出现以至于可能很多人都不知道“原来语言可以是这个样子的”。惰性计算的精神是不去执行没用的代码。什么是没用的代码呢?只要是这段代码的值不对外界产生任何影响,譬如没有往屏幕、硬盘或者是其他什么地方写点什么数据,就是没有用的。当然,至于这段代码中间做了些什么事情那是不管的。

举一个比较简单的例子,假设现在有如下代码:

function PrintAndReturn(Message,Result)
{
Print(Message);
return Result;
}
function DoSomething(BoolA,BoolB)
{
If(BoolA || BoolB) Print(“!”);
}
DoSomething(PrintAndReturn(“Hello”,true),PrintAndReturn(“World”,false));