logo资料库

NASAL语言教程-完整版.pdf

第1页 / 共45页
第2页 / 共45页
第3页 / 共45页
第4页 / 共45页
第5页 / 共45页
第6页 / 共45页
第7页 / 共45页
第8页 / 共45页
资料共45页,剩余部分请下载后查看
NASAL编程指南ProgrammingwithNASALNASAL编程指南作者:DonaldYoung
NASAL编程指南目录第1章序言.....................................................................................................................................................31.1什么是NASAL.......................................................................................................................................31.2为什么用NASAL...................................................................................................................................31.3NASAL的应用.......................................................................................................................................41.4NASAL的特点.......................................................................................................................................41.5赠与C++程序员....................................................................................................................................51.6NASAL资源...........................................................................................................................................5第2章HelloNASALworld!......................................................................................................................62.1NASAL的运行环境...............................................................................................................................62.2第一个程序.............................................................................................................................................72.3print........................................................................................................................................................7第3章变量...................................................................................................................................................83.1变量的声明.............................................................................................................................................83.2数组.....................................................................................................................................................93.3哈希...................................................................................................................................................103.4变量的高级使用...................................................................................................................................113.5选择属性树还是变量...........................................................................................................................12第4章运算符................................................................................................................................................124.1算术运算符...........................................................................................................................................124.2关系运算符...........................................................................................................................................134.3逻辑运算符...........................................................................................................................................134.4连接运算符...........................................................................................................................................134.5优先级...................................................................................................................................................14第5章基本语法............................................................................................................................................145.1赋值...................................................................................................................................................145.2选择结构...............................................................................................................................................145.3循环结构...............................................................................................................................................15第6章函数................................................................................................................................................186.1基本概念...............................................................................................................................................186.2函数的声明...........................................................................................................................................186.3函数的参数...........................................................................................................................................196.4命名参数的函数调用...........................................................................................................................196.5函数的返回值.......................................................................................................................................206.6函数的嵌套...........................................................................................................................................206.7函数的重载...........................................................................................................................................206.8动态生成函数.......................................................................................................................................216.9代码简化技巧.......................................................................................................................................21第7章面向对象程序设计.........................................................................................................................227.1类...........................................................................................................................................................227.2类的自引用...........................................................................................................................................227.3类的构造...............................................................................................................................................237.4类的实例...............................................................................................................................................237.5类的析构...............................................................................................................................................25
NASAL编程指南7.6类的继承...............................................................................................................................................257.7类的虚变量...........................................................................................................................................267.8类的封装...............................................................................................................................................277.9成员函数的回调调用...........................................................................................................................27第8章名字空间............................................................................................................................................288.1可见范围...............................................................................................................................................298.2名字空间...............................................................................................................................................298.3模块空间...............................................................................................................................................30第9章异常处理............................................................................................................................................30第10章FlightGear应用..........................................................................................................................3210.1创建脚本............................................................................................................................................3210.2开发与调试........................................................................................................................................3310.3扩充函数............................................................................................................................................3610.4系统库函数........................................................................................................................................3810.4signal和listener............................................................................................................................3810.5例1:创建属性XML文件..............................................................................................................4010.6例2:地景取样.................................................................................................................................4210.7例3:I/O端口操作.........................................................................................................................43
NASAL编程指南第第11章章序序言言NASAL是FlightGear使用的一种非常强大的脚本语言系统,它与FlightGear关系十分密切,可以读取、修改FlightGear的属性树中的属性值,可以函数直接访问FlightGear的内部数据,可以创建GUI对话框,等等。要想深入的理解FlightGear,并对其进行开发,NASAL是一个强有力的工具。由于FlightGear在不断的更新,其中NASAL也有可能有部分升级变化,本文中内容如没有特殊注明,全部基于FlightGear2.10版。1.11.1什么是什么是NASALNASALNASAL的全称是NotAnotherScriptingLanguage。NASAL借鉴了如Javascript、Python、Perl等流行的脚本语言系统的设计理念,实现了一个简单且完整的OOP(面向对象程序设计)脚本语言系统,并且是不依赖于操作系统平台的。NASAL内置了一个垃圾回收器来管理内存,因此,您不必像C程序员那样,时刻注意小心溢出可能导致的程序崩溃。NASAL的语法规则有点类似于Javascript,因此,一个有经验的程序员,通常可以很快的上手。FlightGear提供了很多用于库函数,这些函数都可以被NASAL直接调用。和其他的脚本语言系统一样,NASAL是平台无关的,并且是纯文本格式的。所有的NASAL代码在NASAL虚拟机中编译并执行。这意味着您可以使用任意一款文本编辑器来编写NASAL代码,并且这些代码在Linux、Windows等系统上执行的效果是一样的。NASAL代码可以在FlightGear的aircraft配置文件中调用执行,也可以嵌入到XML文件里面执行。FlightGear中有各种XML文件用于描述对话框、指定物体动作、响应键盘游戏杆的操作、对应场景中的物体等等。这些XML文件中都可以嵌入NASAL代码并执行。1.21.2为什么用为什么用NASALNASAL作为一种脚本语言,NASAL具备多数脚本语言系统的基本特点。现在各种编程语言林立,有C++,Java,C#,VB等等,但脚本语言仍然有其自己的生存空间。脚本语言一般没有自己的编译器,相对复杂的C++之类的高级语言。脚本语言系统简单的多,只具备基本的变量、函数、程序流程控制和面向对象等功能,但脚本语言是高级语言的扩充。通常脚本语言不能独立运行,只能存在于宿主程序中,作为宿主程序的功能扩展。试想一下,一个游戏开发完成后,需要经过测试,发行,升级。在测试过程中如果发现了问题,需要对游戏中的一些属性值或是逻辑关系进行修改,重新修改再编译源代码无疑是个非常恐怖的工作。这时,脚本语言就可以发挥重要作用了,只需根据需要修改脚本代码,在源程序无需重新编译的情况下,原来的逻辑和属性就可以修改了。同时,脚本也为工作分工提供了便利。一个游戏只需少数的核心程序员完成游戏引擎的制作,游戏的关卡等制作完全可以由外围的程序员使用脚本来完成。一般来说,一个程序或游戏会用一种特定的脚本语言。比如,现在很多游戏,如《魔兽世界》、《锁定:现代空战》、《鹰击长空》等使用了LUA脚本语言。FlightGear使用了NASAL脚本语言,和其他流行的脚本不同的是,NASAL对FlightGear的支持非常的好,只用少量的代码,可以十分方便的访问FlightGear中的各种属性,调用FlightGear的功能函数。最重要的是,虽然FlightGear是完全开源的,我们仍然可以在不修改FlightGear的源码情况下,仅利用NASAL脚本就可以实现很多新的功能。
NASAL编程指南1.31.3NASALNASAL的应用的应用虽然NASAL是一个完备的脚本语言系统,但其应用的范围还是很窄,目前NASAL主要用于FlightGear。如果需要在FlightGear下面开发一个新的系统或是设计实现一个新的功能,NASAL是一个非常棒的工具。例如,有一个bombale的脚本就是在没对FlightGear的源码进行任何修改下,仅用NASAL就实现了空战功能。也就是说,这个bomable脚本用NASAL实现了一个全新的MOD版的FlightGear。无论地境、飞机、AI还是其他的内容,在FlightGear的设计之初,都是不支持的。现在,在FlightGear中有了如属性树,NASAL脚本语言等高度灵活的子系统,这些功能都非常容易的实现了。FlightGear经过了近10年的发展,不断完善,内容越来越丰富,功能越来越强大。这其中有C++程序员的不懈努力,但FlightGear提供的开放式的二次开发环境也作出了重要的贡献。到2009年3月,FlightGear中内置的NASAL代码达到了170,000行,相对2006年增长了6倍。到2011年10月,代码已经达到了326,000行。并且随着版本的更新,这个数字还在不断的增长。现在NASAL已经成了开发FlightGear的一个十分重要的工具。在FlightGear的系统中,除了十分影响运行效率的功能,大部分功能都使用NASAL来实现。如果有NASAL方面的疑问,可以参考NASALFAQ,或是到官方网站(http://wiki.flightgear.org/Nasal_Modules)去查询帮助。1.41.4NASALNASAL的特点的特点1.NASAL是一种可扩展的语言,非常适合嵌入到程序中运行。2.NASAL可以在返回前指定运行几次后中断,后面的调用可以继续以前的运行状态,这种功能类似某些游戏的存盘功能。3.NASAL有一个使用ANSIC编写的小巧的解释器,甚至比LUA还短小精悍。4.NASAL的虚拟机内部使用的是堆栈机模型。5.NASAL运行时不依赖于任何第三方库和工具。6.NASAL有一个简单易用的扩展API,并且和其他的代码兼容非常好。7.NASAL是线程安全的。8.NASAL通过名字空间对代码进行模块化管理,并且可以实现很多编程技巧。9.NASAL支持Unicode,这为FlightGear的国际化提供了支持。10.NASAL支持异常处置。11.NASAL支持标准OOP(面向对象)编程方法。1.51.5赠与赠与C++C++程序员程序员C++代码一直以严谨高效著称,这也是C++程序员得以自豪的一点。但NASAL作为脚本语言并不意味着低效。实际上NASAL是FlightGear中各个系统的熔接器,正是有了NASAL,各系统间的沟通变得非常简单。并且,我们可以非常容易的增加C++代码,然后在NASAL中调用,从而解决效率的问题。在FlightGear的开发中,NASAL非常方便且功能强大。我们无需安装庞大的VisualStudio或其他的C++编译器,何况还要配置复杂的第三方支持库。只要您的机器可以运行FlightGear,那么你就可以编写NASAL代码。实际上,C++属于中级语言,介于高级语言和低级语言之间。语法比较复杂,学习起来难度较大。而NASAL属于高级抽象语言,更加注重对问题的描述,使得程序员可以更多的去考虑需要实现的功能,而不是在语法正确与否的问题上绕弯子。即使没有编程基础的人员也会发现,NASAL是如此的简单,稍
NASAL编程指南微经过培训学习,就可以进行代码编写了。当然,基本的编程思想还是要通过不断的学习和工作进行积累,这一点没有任何捷径可走。1.插件有经验的C++程序员也许会找SDK来开发插件,但遗憾的是FlightGear没有SDK,当然,也不需要,因为FlightGear是开源的。任何人都可以获取FlightGear的源代码并根据自己的需要进行二次开发。但是修改源代码通常不是一个好的选择。现在FlightGear的很多功能和系统的实现都是用NASAL来实现的,如果想要修改或增加某些功能的话,不妨查看一下FlightGear中的NASAL代码。2.性能很显然,C++代码的运行效率要比NASAL高的多。但是,当NASAL如果不是特别的慢的话,那么对整体性能的影响就不大。早期的测试显示,NASAL的垃圾回收器的效率比perl的要高,数字处理能力比python的效率要高。因此,在考虑到程序的运行效率和易用性之间的平衡,NASAL还是很有使用价值。3.垃圾回收器NASAL有一个实时的垃圾回收器,相信这也是C++程序员羡慕的地方。我们再也不用直接和内存打交道,手动控制空间的分配与回收,不小心还会导致溢出。这些在NASAL中都不复存在,我们可以放心的使用变量,至于空间的分配,交给NASAL吧,它知道怎么做。4.线程安全和其他多数脚本语言不同,NASAL是线程安全的。不需要globallock之类的指定,解析器会自动进行线程安排,唯一的限制就是垃圾回收器会阻断所有线程的运行。5.异常处理和其他语言类似,NASAL支持异常处理。不需要用到“try”来进行异常处理,当用到call()来调用一个函数对象时,如果有异常,会自动调用die()函数来进行异常处理。1.61.6NASALNASAL资源资源由于NASAL的使用范围狭窄,因此,很难获取丰富的资料来完成本书。编写本书的素材主要来自wiki.flightgear.org。因此,如果对NASAL的使用有疑问,本书没有阐述清楚的,可以到网站上去获取相关的知识。第第22章章HelloHelloNASALNASALworld!world!和多数程序语言一样,我们还是从最经典的Helloworld!程序入手,来了解这个语言系统。NASAL语言设计的时候充分吸取了各种语言系统的成功经验。因此,如果您是一个经验丰富的程序员,您会高兴的发言,即使没有经过学习,您仍然可以轻松的阅读NASAL代码,甚至做一些修改。但是,如果需要编写自己的代码,那就要了解一下NASAL语言的基本内容,如语法规则,变量、函数的命名,程序流程的控制等等。各种编程语言的基本思想都是相通的,所以,具备基本的编程素质后,学习NASAL就会有事半功倍的效果。2.12.1NASALNASAL的运行环境的运行环境每种编程语言都有自己的运行环境,比如在VC中,VC提供了一个功能强大的IDE,编辑代码后,点击按钮就可以编译执行,看到运行结果。但脚本语言不一样,因为一般脚本语言都是依赖于宿主程序运行的,少数的脚本系统有自己的运行环境,甚至有调试器。
NASAL编程指南非常不幸的是,NASAL是一个冷门的语言,注定不会有大量的资源对其关注。因此,NASAL没有独立的运行环境,没有专用的编辑器,甚至,在主流的编辑器中都没有NASAL的高亮显示模板。但选择了FlightGear就必须选择NASAL,在现阶段没有其他选择的情况下,我们只能去适应它,学习他,然后灵活的使用它。Notepad++是一个非常不错的选择,它是一个开源的免费的编辑器,内置了很多种语言的高亮显示方案,可惜没有NASAL的。不过,我在对它的cpp模板文件做简单的修改后,就支持NAS文件了。并且可以实现注释、关键字、函数、字符串等的高亮显示,可以设置自动完成提示,可以折叠代码方便查看,还可以利用它本身强大的编辑功能,非常的方便。NASAL的宿主程序就是FlightGear,因此,想要编制自己的代码,就必须使用FlightGear这个环境,我们可以把FlightGear当成VC的IDE。NASAL代码的执行有两种方式,一是嵌入到XML中,FlightGear加载的时候会加载代码,然后根据我们的指令来执行相关的代码。还有一种方法就是在FlightGear的NASALConsole中输入代码并运行。两种方式各有优劣,第一种方式的优点是可以利用自己喜欢的编辑器,如Editplus或Notepad++等编辑代码。这些专业的编辑器在编辑XML文件时提供了很多方便的功能,但是缺点就是,NASAL代码必须预先编好,在FlightGear启动时加载到内存中,然后根据需要运行。修改代码后,虽然可以通过NASAL代码重新加载文件,但有些如初始化变量的代码不会执行,也就是说,我们修改了文件后,不一定能看到修改的结果。第二种方式的优点是,任何代码都可以立即执行,并马上看到结果,但缺点是FlightGear是一个运行环境,而不是编辑器。我们只能在窗口中一行一行的敲入自己的代码,代码的输入非常麻烦。在最新的2.10版的FlightGear中,NasalConsole增加了对剪贴板的支持,这样就可以方便的和外部编辑器之间通过剪贴板来交换数据。在实际中,我们一般结合两种方法进行使用,一个小功能我们先在窗口中输入运行,查看结果,满意以后,再把代码补充的文件中去。有些程序运行逻辑方面的功能,可以直接在文件中进行修改,修改结束后,用一个命令重新加载文件,就可以看到修改的结果。在FlightGear运行后,点击“Debug”菜单,然后选择“NasalConsole”,就可以打开NASAL窗口,如下图所示。窗口下部有10个按钮,相当于10个文件标签,我们可以在每个标签中编写自己的代码,不同标签中的代码不会互相影响。点击“?”按钮,可以查看帮助。这些标签都支持自动保存,编写的代码会自动保存在当前标签下。重启FlightGear后,对应的标签的代码会自动加载,对于我们调试来说,非常的方便。代码编写完成后,点击“Execute”按钮就会执行,执行结果在另外一个窗口中可以看到。启动FlightGear后会开启两个窗口,一个是程序运行窗口,也就是我们通常说的程序窗口。还有一个命令行窗口称为控制台,主要用于显示程序运行的信息、调试信息、还有根据需要显示的信息。其中NASAL的运行结果就这个控制台窗口中显示。
NASAL编程指南2.22.2第一个程序第一个程序现在,开始我们的第一个程序。在NasalConsole窗口中输入:print("HelloNASALworld!");点击“Execute”运行后,在命令行窗口中就可以看到运行结果:是不是十分简单?虽然这个Helloworld程序基本上不具备任何功能。但通过这个简单的程序我们可以发现:1.NASAL的程序运行非常简单,代码无需编译,点击直接就可以运行,马上就可以看到结果,没有C++语言复杂的编译、链接过程。2.语言风格和C++语言类似,每行代码以“;”结束。3.大小写是敏感的,如果输入“Print”就会出现错误提示。NASAL语言的注释使用“#”符号作为一行的开头。例如#ThisisHelloworldProgramprint("HelloNASALworld!");2.32.3printprint我们接触NASAL的第一个函数就是print,之所以把print单独拿出来,是因为我实在对它是情有独钟。在C++语言中,这个函数叫做printf。printf函数还有一个名字,称为穷人的调试器。在早期的C语言开发环境中,调试器不是很强大。因此,程序员在调试程序时,如果想要查看某一个变量的值,就会打印出来看看。这个习惯一直延续了下来,直至现在,仍然有很多程序员喜欢用printf函数查看程序运行过程中变量的值。甚至到了windows编程中,他们还是喜欢用MessageBox函数输出变量。由于NASAL没有专用的编辑器和调试器,因此print函数便显得尤为重要。灵活运用print会给NASAL代码的调试提供很好的帮助。NASAL中的print功能更强,使用更简单。print函数的使用很简单,就是括号里加个参数就可以了,这个参数可以是字符串、变量等,他都会正常输出,如果有多个参数需要同时输出,用“,”隔开就可以了。print("Hello","NASAL","world!");在这行代码中,使用print函数连续输出了3个字符串,中间用“,”隔开,在输出时,会自动把3个字符串连接到一起。运行的输出结果为:HelloNASALworld!如果参数中有变量,无需关心变量时数值型的还是字符串型的,直接输出即可。参考如下的代码varx=1;
分享到:
收藏