- 威望
- 30 点
- 义气
- 12 点
|
不得不说,haXe从最初的一个小众语言,到今天,已经不得不称之为一个牛B项目了。下面,我们来看一下Motion-Twin和haXe社区的这帮人究竟干了什么?
1. haXe语言,这个是几乎所有项目的核心。很多人对它的理解还停留在对AS 3的另一个实现的程度上,但事实上远非如此。
编译成swf文件是haXe的一个重头戏。它提供了直到Flashplayer 10.0的全部API和功能。并通过一个AIR库,提供了结合Flex SDK开发AIR应用的方式。除此之外,早在AIR还是一个构想,项目名字还是Apollo的时候,haXe就已经可以通过swhx库开发非常完善的基于swf的桌面应用程序了。
在我们比较早的印象中,haxe写js比较鸡肋,但现在已经完全不是这样了,haxe为js输出提供了十分强大规范的库,只是由于我们目前并不需要这么强大的js功能,或者说js的效率仍然达不到要求,所以这个功能暂时看来用处并不大,但相信随着各个浏览器对JS执行性能的进一步提升,它早晚会绽放出璀璨的光芒(事实上,它并不比Google的GWT差,某种程度上来说,甚至还有说超出)。
nekoVM字节码编译输出。neko在国内应用极少,在国外应用也不多,这东西某种程度上来说相对于java和python这些语言,并没有任何亮点,然而,我们可以学一种haxe语言,就可以获得实现java、python完全相同的功能,甚至通过ndll的调用,还可以远远超出它们,这应该就是最大的亮点了吧。
php输出,也许会有很多人纳闷,我们真的需要一个输出php的东西吗?也许你很熟悉php,那么这东西就没有必要了。但如果你不熟悉php,还想写服务器端应用呢?当然,你可以列举出一千条理由说没有必要,但我只有一个理由:它避开或者说解决了PHP那混乱的命名空间。可以让你有更多的时间集中在对业务逻辑的处理上,并且输出的代码执行效率也并不差(附带说一点,其实它的安全性处理的也不错,haxe输出的php源码,某种程度上来说就是一个超轻量级的非MVC模式框架,应该算是代理模式的框架了)。
cpp输出,这玩意最初是为了可以开发iphone应用出现的,出现的时间比Adobe 在CS5中增加Iphone输出之前。在2008年末,其开发者就已经实现了在iphone上运行一个haxe的基于flash的二维物理引擎,其基本原理是把haxe的flash API映射为实现相同功能的CPP库,然后生成CPP源码,最后通过不同平台的编译器,即可编译为目标平台的应用程序。只是由于苹果的新的条款的显示,这东西也和Adobe的Iphone输出一样,成了彻底的鸡肋。不知道他们后面会有什么动作,这个部分是就此停滞,还是会转做他用。
AS 3输出,这个应该是对我们来说最有用的一个功能了吧?看下面的源码和输出结果,haxe对它们进行了一些简单的优化,并且局部变量在输出的时候也有一些简单的混淆,是不是很方便?- ==== AS 3输出结果 ====
- package {
- import flash.display.Graphics;
- public class Geometric {
- public function Geometric() : void {
- null;
- }
-
- static public function drawRing(object : flash.display.Graphics,x : Number,y : Number,radio1 : uint,radio2 : uint,angle1 : int = 0,angle2 : int = 360) : void {
- object.moveTo(Math.sin(angle1 * Math.PI / 180) * radio1 + x,-Math.cos(angle1 * Math.PI / 180) * radio1 + y);
- {
- var _g1 : int = angle1, _g : int = (angle2 + 1);
- while(_g1 < _g) {
- var i : int = _g1++;
- object.lineTo(Math.sin(i * Math.PI / 180) * radio1 + x,-Math.cos(i * Math.PI / 180) * radio1 + y);
- }
- }
- {
- var _g12 : int = 0, _g2 : int = (angle2 - angle1 + 1);
- while(_g12 < _g2) {
- var i2 : int = _g12++;
- object.lineTo(Math.sin((angle2 - i2) * Math.PI / 180) * radio2 + x,-Math.cos((angle2 - i2) * Math.PI / 180) * radio2 + y);
- }
- }
- object.lineTo(Math.sin(angle1 * Math.PI / 180) * radio1 + x,-Math.cos(angle1 * Math.PI / 180) * radio1 + y);
- }
-
- static public function drawCircular(object : flash.display.Graphics,x : Number,y : Number,radio1 : uint,angle1 : int = 0,angle2 : int = 360) : void {
- object.moveTo(x,y);
- {
- var _g1 : int = angle1, _g : int = (angle2 + 1);
- while(_g1 < _g) {
- var i : int = _g1++;
- object.lineTo(Math.sin(i * Math.PI / 180) * radio1 + x,-Math.cos(i * Math.PI / 180) * radio1 + y);
- }
- }
- object.lineTo(x,y);
- }
-
- }
- }
- ==== haXe源码 ====
- package;
- import flash.display.Graphics;
- /**
- The Ring class.<br />
- 作者 Icebird<br />
- 说明: <br />
- 事件:无。
- **/
- class Geometric
- {
- /**
- 构造函数
- **/
- function new()
- {
-
- }
- /**
- 绘制圆环
- **/
- public static function drawRing(object:Graphics, x:Float, y:Float, radio1:UInt, radio2:UInt, ?angle1:Int = 0, ?angle2:Int = 360):Void
- {
- object.moveTo(Math.sin(angle1 * Math.PI/180)*radio1 + x, -Math.cos(angle1 * Math.PI/180)*radio1 + y);
- for(i in angle1...(angle2 + 1))
- {
- object.lineTo(Math.sin(i* Math.PI/180)*radio1 + x, -Math.cos(i* Math.PI/180)*radio1 + y);
- }
- for(i in 0...(angle2 - angle1 + 1))
- {
- object.lineTo(Math.sin((angle2-i)* Math.PI/180)*radio2 + x, -Math.cos((angle2-i)* Math.PI/180)*radio2 + y);
- }
- object.lineTo(Math.sin(angle1 * Math.PI/180)*radio1 + x, -Math.cos(angle1 * Math.PI/180)*radio1 + y);
- }
- /**
- 绘制扇形
- **/
- public static function drawCircular(object:Graphics, x:Float, y:Float, radio1:UInt, ?angle1:Int = 0, ?angle2:Int = 360):Void
- {
- object.moveTo(x, y);
- for(i in angle1...(angle2 + 1))
- {
- object.lineTo(Math.sin(i* Math.PI/180)*radio1 + x, -Math.cos(i* Math.PI/180)*radio1 + y);
- }
- object.lineTo(x, y);
- }
- }
复制代码 总之,haXe也许在各个方面的表现并不十分出色,但其思路很独特,Java的思路是为每个平台提供一个虚拟机,实现“一次编译,到处运行”,但由于各个平台的差异过大,这个想法真正实施起来,十分困难。但haXe最初的思路却是“一次编写,到处编译”,或者说,haXe就是一个原型语言。做为原型语言,haXe可以在大多数情况下,编译的代码直接运行即可,特别是编译swf文件,其编译后的文件效率很多情况下甚至比官方的AS 3编译后还要高一些,而其他的各种编译目标,事实上编译后的结果也可以满足绝大多数情况下的功能需要,即使有一些比较极端的需求,像php和js这些编译目标仍然可以在生成后对生成的代码进行优化。
2.HSS
HSS是什么东西?简单来说,就是用来辅助写css的一个工具。这是一个很有趣,也很有用的小工具,介绍页面和下载地址如下:
http:///projects/hss
使用方法:- hss myfile.hss -output dir
复制代码 它使用一种和css十分相似的hss语法文件做为源文件。并且在最后把它编译(或者说转换)成css。并且语法可以接受css的全部语法,也就是说css文件也可以改名为hss做为它的源文件,只是编译输出不会有任何变化而已。
hss有较严格的语法检查,比如编译时会出现如下编译错误:
myfile.hss:3: Unexpected '}' maybe missing ;
它告诉你遇到了错误的花括号,可能是遗漏了结尾的分号,这很有用的。
hss支持变量定义,如- var mycolor = #1111AA;
- var myfont = "Trebuchet MS", Arial, sans-serif;
- body {
- color : $mycolor;
- font : $myfont;
- }
复制代码 支持块变量定义,如- var nomargin = { margin : 0px; padding : 0px; }
- pre {
- $nomargin;
- color : #FF0000;
- }
复制代码 注意,下面一个特性是最重要的。- .faq {
- color : #BC683C;
- .form {
- width : 100px;
- textarea {
- width : 100%;
- height : 80px;
- }
- .name {
- font-weight : bold;
- }
- }
- ul {
- margin-left : 20px;
- margin-bottom : 20px;
- }
- }
复制代码 编译解释后的形式为:- .faq {
- color : #BC683C;
- }
- .faq .form {
- width : 100px;
- }
- .faq .form textarea {
- width : 100%;
- height : 80px;
- }
- .faq .form .name {
- font-weight : bold;
- }
- .faq ul {
- margin-left : 20px;
- margin-bottom : 20px;
- }
复制代码 这样是不是很方便?
hss还有一些其他特性如对选择器的支持等,详情见官方主页。 |
|