haXe是什么?
haXe是一种编程语言,官方网站在:http://haxe.org
下面是官网对haXe的描述:
IF YOU COULD ONLY LEARN ONE PROGRAMMING LANGUAGE, HAXE WOULD BE IT.
IT'S UNIVERSAL. IT'S POWERFUL. IT'S EASY-TO-USE.
那么haXe语言是怎么个通用、强大和易用呢?
从语法来说,haXe的基本语法一定令你很熟悉,会Java/C++/PHP/JavaScript/ActionScript的都不会感到陌生,内置的垃圾回收机制让你不必为内存管理而挠头。
从目标平台上来说,haXe在周边库的支持下,可以直接生成多达9种主流平台的原生应用,注意:是Native应用而不是基于虚拟机的应用哦!
从任务类型上来说,haXe可以用来写基于C++或C#的原生桌面应用,可以写面向iOS/Android/Air/BlackBerry/WebOS/WindowsPhone等平台的移动应用,可以写基于Flash或HTML5的浏览器内应用,还可以写基于PHP或Java或Node.js的服务器端应用。
你看到这里一定觉得我疯了,这怎么可能?
haXe为什么?
其实说穿了也不神秘:正像我博客副标题中说的,One Language to Rule Them All,haXe是居于其它各种高级语言之上的高高级语言。简单而言,haXe的构建目标不是某种平台(包括JVM其实也是一种平台)的二进制可执行文件,而是另外一种语言的源代码!它的编译器严格来说,是一种语言转换器!
这样一来,其实haXe跨平台的能力来源于它的目标编程语言,目前haXe 2.10支持输出成以下几种语言源码或虚拟机字节码:
C++
Flash虚拟机(AVM)
字节码
PHP
JavaScript
Neko虚拟机字节码
马上要发布的haXe 3则将增加另两个主要语言的支持:
Java
C#
注:Neko是haXe支持的另外一种比较小众的脚本语言,它通过Neko虚拟机可运行于各种桌面OS,很适合写跨平台脚本。虽然Neko并不常见,但haXe内部大量工具都是基于Neko目标的。
而C++无疑是haXe之所以可以跨移动平台的最重要武器,因为除了WindowsPhone之外的几乎所有移动平台都支持C++(iOS支持C++,Android也有NDK),而haXe 3.0新增的C#输出支持则弥补了这个缺憾。
另外值得重点指出的是,因为输出的是C++源代码而未引入任何中间层如虚拟机,因此:
1. haXe应用的性能几乎可以与手写C++代码的原生应用比肩
2. haXe生成的iOS应用完全遵守苹果的开发者协议(协议要求只能用Objective-c或C++写iOS应用)
其实如果仅仅是语言转换器,那么显然,一份代码直接构建9种平台的目标码仍然只是个玩笑,因为各种平台即使都支持C++语言,但其运行库却各不相同,系统架构、API设计也完全不一样。其实在NME出现以前,haXe也不过让你少学一些不同语言的语法而已,各个平台的API还得开发者自己啃。
但现在有了NME这个逆天的东东,情况就完全不一样了!
NME是haXe语言的一个第三方库 -- 当然现在几乎已经半官方了。NME官方网站:http://www.haxenme.org
NME其实就是一整套Flash运行库的C++版实现。这样,你只要编写一套基于Flash API的代码,那么除了Flash/AIR的版本,还可以直接发布到所有支持C++的平台上去!另外,NME还内嵌了另一个叫Jeash的库,这个库则是Flash运行库的JavaScript实现,也就说HTML5也OK!
当然,目前NME还没有C#版本,因此如果WindowsPhone仍然不开放C++支持的话,那么还得调用系统自己的API,不过我觉得完全可以期待不远的将来出现C#版,因为haXe的开发者社区非常活跃,几乎每天都有新的代码提交!
haXe可以做什么?
运行于浏览器内的Flash应用和游戏
基于Adobo AIR/Flash,运行在AVM虚拟机上的Windows/Linux/Mac桌面和移动应用
基于NME-hxcpp,运行于Windows/Linux/Mac/iOS/Android/BlackBerry/WebOS桌面和移动平台的原生(Native)应用
基于NME-Jeash,运行于浏览器中的的HTML5应用和游戏
基于haXe-PHP的服务器端应用
基于haXe-JavaScript和Node.js的服务器端应用,此项目的官网是: http://haxenode.org/
基于haXe-neko的桌面脚本,在这里haXe扮演的是类似批处理或Shell的角色,但是强大许多
更多,仅仅决定于你的需求
haXe名词术语扫盲
neko: 一种开发语言,这种语言被编译器编译成neko字节码(.n文件),然后运行在nekoVM,即neko虚拟机上。neko是haXe的目标之一,即haXe语言可以被直接编译成为neko字节码文件从而运行在nekoVM上。
haxelib: haXe自带的库管理工具,可以用来对haXe的扩展库进行查找、在线安装、删除、升级等操作,也可以用来执行扩展库的自定义命令。
hxcpp: 一个haXe的扩展库,用来把haXe语言源码编译(翻译?)成C++源码。因为iOS的开发者协议限制,编译成C++源码而不是动态链接库很重要。
nme: haXe的扩展库,依赖于hxcpp库,是Flash图形API的C++版实现。
neash: haXe的扩展库,是Flash图形API的neko版实现,但绝大部分都是纯haXe语言编写而具备很好的跨平台性,因此NME大量重用此库的代码。目前已经与NME集成在一起。
jeash: 一个haXe的扩展库,是Flash图形API的JavaScript版实现,目前已经与NME集成在一起。
haxenode: 一个haXe扩展库,使得开发者可以使用haXe编写node.js服务器端应用。
CFFI: 即C Foreign Function Interface, 是hxcpp和原生CPP代码交互的标准方案,就像JNI之于java。如果希望自己创建haXe的原生扩展,或重用C++开源项目,那么理解CFFI很有必要。
Android NDK: Android的C++开发包。
SDL: 一个基于C++的开源游戏开发库,nme的图形渲染部分依赖于SDL。SDL基于OpenGL,是可以利用到硬件加速的,这也给nme开发的图形应用带来了很高的性能。
tween: 补间动画,搞Flash开发的应该都知道是怎么回事,大概和关键帧动画是类似的意思,你指定一些时间线上的关键帧的参数,其它帧的相应参数值可以由tween系统自动帮你运算出来。
actuate: haXe的扩展库,一个非常易于使用,且和用户代码低耦合的tween引擎。
box2d: 一个二维物理引擎,看看愤怒的小鸟就能理解物理引擎是干嘛用的了。box2d原项目是C++的,有人把它移植到了ActionScript,然后再有人把AS版移植到了haXe。