Haxe学习笔记(一) Haxe:一次编码全平台编译的神话

一 Haxe是什么?

Haxe是开源的,它作为一门语言,基础语法和ActionScript3基本一致。所以任何做过Flash开发的人都可以很快的上手。Haxe最独特的地方在于他的编译器,Haxe的编译器能自动将Haxe代码编译成任何支持的目标语言,并自动输出最终结果。这个过程非常方便,仅需一行参数不多的命令行。

Haxe这个支持列表非常丰富,C++,JavaScript,Falsh,PHP,C#,Java。加上NME模块的支持的话,还支持iOS,Android,WindowsMobile,WebOS。编译到不同的平台上统统都只需要一句命令行,非常方便。

我的重点不在介绍,需要了解更多的按顺序阅读以下文章:

如果以上文章不能满足你,请看官网:http://haxe.org

二 缺点

Haxe真要用到开发中,我接触的不多没有经验,可以看下wyyayy兄的文章:

三 环境搭建

Haxe的环境搭建非常简单,仅需一步就可以搭建好Haxe的环境。

1 下载安装程序

PS:在Linux下可以直接apt-get安装

2 选择代码编辑工具

官方强烈推荐FlashDevlop,这个IDE也是和Haxe结合的最好的,原生支持Haxe,但是只有Window版本。所以我选了一个自己喜欢的文本编辑器。

3 测试

打开命令行/终端,打入haxe测试一下。

到这里为止,Haxe就原生支持的这些目标语言了。

四 使用下Haxe

官网上有非常多的入门指引,我这里只拿C++,Flash,Java做测试。文字也会更简单一些,需要详细的介绍可以点下面的连接去看官网教程(英文):

0 测试代码

我照着官网的例子制作了一个HelloWorld,并保存做了Test.hx。(注意文件名需要和类名相同)

class Test {

static function main() {

trace("Hello World !");

}

}

1 C++

编译C++需要用到一个叫做hxcpp的模块,如何安装模块呢?非常方便的有haxelib这个指令,在命令行下执行:

haxelib install hxcpp

haxelib命令会自动去haxe的仓库中将hxcpp下载到本机的haxe模块的仓库内,非常方便。

PS:某些平台上(比如mac),在安装模块之前需要先设置haxe模块的仓库路径:

haxelib setup

安装好hxcpp后就可以编译成C++的程序了

haxe -cpp cpp -debug -mian Test解释一下:

-cpp cpp指定输出类型为C++,输出到一个叫做cpp的目录下

-debug可以让我们看到trace的输出

-main Test指定程序的入口,是类名

执行后可以在cpp目录下找到Test-debug这个输出的二进制文件,执行它:

第一个平台大功告成了,其他的平台编译过程也是类似的过程。

2 Flash

输出为swf是haxe最早支持的功能,它不需要任何其他模块。

haxe -swf test.swf -main Test

解释一下:

-swf test.swf指定输出类型为flash,输出成一个test.swf文件

-main Test指定程序的入口

找到test.swf用FlashPlayer或者浏览器打开,当然写一个html的模板(官网教程中有),再用浏览器打开。下面是效果:

需要说明的是Haxe可以支持输出成多个Flash的版本,需要在编译命令中加其他参数。请参考官网教程。

3 Java

Java平台没啥特别的,和C++差不多,不过你得自己先安装好JDK。

haxe -java java -main Test

-java java指定输出类型为java,输出到一个叫做java的目录下

-main Test指定程序的入口

编译输出结果为java目录下的java.jar,执行指令为:

java -jar java.jar结果:

看完了3个例子,是不是觉得Haxe非常的方便易用?

四 NME介绍

NME是Haxe在互联网进入移动互联网之后的产物,它本身是Haxe的一个模块。随着移动互联网兴起,它的发展速度很快,已经成为了Haxe的重头戏。以至于Haxe也给他创建了一个独立的页面:http://www.haxenme.org

NME虽然是一个模块,但是它的作用非常之大。NME将Haxe的代码先编译为C++代码,然后将C++代码编译成为目标平台的二进制文件。

NME另外一个伟大之处在于它给Haxe语言中添加了名叫nme的包(Package),这个包内部包含了非常多的Flash中的同名库。换句话说,熟悉Flash开发的朋友们几乎可以马上开始开发工作。到底NME的库和Flash有多少的相似度?我没有具体使用过,但是这里有API手册(http://www.haxenme.org/api/),真的非常相像。

五 NME安装

NME模块有独立的安装包,可以直接下载安装;当然你也可以手动在之前安装的Haxe中安装NME模块。在这篇文章里面我将同时介绍两种方式。另外,windows版本的NME独立安装包内包含了Haxe,为保持系统简洁,可以先把之前的Haxe环境删除。Mac的版本没这个问题。

1 安装NME

A 独立安装包(推荐)

下载适合自己系统的安装包,然后运行安装,过程非常简单。

B 在之前的Haxe环境下安装

命令行:

haxelib install nme

因为NME的系统还依赖其他一些haxe包,所以也在这里安装以下的包:haxelib install hxcpp

haxelib install actuate

haxelib install swf

haxelib install svg

2 安装配置目标平台

NME自己并不是全能的编译器,所以它依靠各个不同开发平台下的C++编译器,将自动生成的C++代码编译为目标平台上的执行文件。我们只需要告诉NME我们要将代码编译到哪里去,NME就会自动设置好一切。

依旧是命令行,编译成Windows程序:

nme setup window编译成Android程序:

nme setup android

编译成ios程序:

nme setup iOS

等等......

各位感觉到Haxe的强大和方便了吧?

不过还是有一些细节需要注意:

如果目标平台为Windows,那么会自动找到Visual Studio的编译器。如果你没有安装任何的Visual Studio,那么NME会自动为你下载一个免费的Visual Studio C++ Express。它足够你用了。

如果目标平台是ios或者mac,那么会跳到XCode的下载页面(即使你已经安装了XCode)。你很幸运,你可以跳过到下一步了。

如果目标平台是android,这就有点麻烦了,你需要安装AndroidSDK,AndroidNDK,Ant,JDK,(Mac系统自带Ant和JDK)。运行nme setup android后,会自动开始下载AndroidSDK,下载完成后自动打开Android SDK Manager工具。这个时候需要手动选择:平台工具,Android2.2(API 8),Extras。

下载完Android SDK后,会自动下载Android NDK。因为我是Mac系统,跳过了Ant和JDK。如果你已经安装了Android的环境,你可以选择跳过下载后手工输入你的Android SDK和NDK的目录。

到这里为止,所有的安装和配置都已经完成了。

六  编译测试

还是那我们的Test.hx来做编译测试吧,我们现在需要一个.NMML文件来配置我们的编译参数。

因为我没有icon文件,所以只能先注释掉相关的两行,然后就可以编译了:

iOS模拟器:

nme test sample.nmml ios -simulator

经过了漫长的编译等待(仅第一次),如果你成功了,你可以看到iOS模拟器自动打开并运行了输出的程序。(我看到了白屏,当我退出iOS模拟器的时候看到了熟悉的“Test.hx:3: Hello World !”)

Android:

nme test sample.nmml android经过了漫长的编译等待(仅第一次,比iOS要慢很多),如果你成功了,并且你的手机连接到电脑上,你可以看到你的手机自动打开并运行了输出的程序。(我看到了白屏,同时在终端中看到了熟悉的“Test.hx:3: Hello World !”)

七 结束语

在我学习Haxe的过程中,一直为开发者感到惊讶,从头到尾我只用了不到10个haxe的指令就完成了搭建环境到可以开发的过程。它的引导功能,自动查找外部工具的功能,都帮助学习者大大缩短学习的过程。它的官网简洁,文字精简突出重点,指引资料很完整。

这是一个伟大的开源程序!向Haxe的作者们和社区致敬,

haxe php,Haxe学习笔记(一) Haxe:一次编码全平台编译的神话相关推荐

  1. Haxe是一门新兴的开源编程语言--Haxe学习笔记(一) Haxe:一次编码全平台编译的神话

    全功能API!开源2D游戏引擎Firmament-haxe 简介编辑 Haxe是一门新兴的开源编程语言,开发者称:"相比其他语言(Java的平台是 JVM,C#的平台是.Net,Action ...

  2. 【学习笔记】一个关于utf8编码转换的问题

    [学习笔记]一个关于utf8编码转换的问题 在验证某些东西时,需要使用到中文对应的utf8编码,就到网上搜索了utf8编码转换的一些在线工具,发现了些问题. 百度第一页所有的utf8编码在线转换转换出 ...

  3. FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  4. HaXe学习笔记:HaXe语言和其它编程语言的区别

    以前发在百度空间里的,目前看来可能不够精确,仅供大家参考. ================================================================ 老实说,h ...

  5. 方舟编译器只能编译Java_方舟编译器学习笔记8 工具链可运行(helloworld编译成功)...

    前面的文章 方舟可执行文件简介和 对java2jar及方舟工具链的进一步分析 对工具链中的可执行文件以及测试用例的编译都进行了分析,并对java2jar进行了修改,保证了其可运行.但是后续的jbc2m ...

  6. UFLDL 教程学习笔记(三)自编码与稀疏性

    UFLDL(Unsupervised Feature Learning and Deep Learning)Tutorial 是由 Stanford 大学的 Andrew Ng 教授及其团队编写的一套 ...

  7. 学习笔记整理——vim,vim文件编码,vim配置文件

    1.vim 安装包 vim-enhanced 2. 移动到行首 shift 6,移动到行尾 shfit + 4. 3. 移动到某行,nG,1G 首行,G 行尾,10G 移动到第十行 4. nx 向后删 ...

  8. XSS学习笔记:XSS Challenges 1-19通关全详解

    前言 学习下XSS 主要是XSS Challenges 平台 共19关 模仿真实xss挖洞的情景,用浏览器中的f12中搜索,找出我们控制的代码所在的位置 思考那些个位置哪个或哪几个位置可以被注入我们想 ...

  9. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

最新文章

  1. 高考计算机如何检索投档,2021年高考平行志愿如何投档?
  2. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
  3. Qt 中pro文件换行注意的问题
  4. 每天工作6小时,月入过万,这个新职业火了
  5. 操作系统大作业模拟实现命令解释器_06 初识shell之系统命令基础
  6. python修改zip文件内容_windows-将zip文件内容提取到Python 2.7中的特定目录
  7. 异构平台对比(GPU FPGA DSP)
  8. Mysql 基础语法
  9. [安全防护]诺顿产品之Symantec Endpoint Protection
  10. 大额支付系统行号编制规则
  11. springboot集成webservice接口
  12. MATLAB连接API接口
  13. 前端通信实现l聊天室
  14. 浅谈公安350兆集群通信网建设
  15. 吉首大学2019年程序设计竞赛(重现赛)A:SARS病毒(找规律 or 推公式+欧拉降幂+快速幂)
  16. C++20 span
  17. Excel 调用百度翻译API进行翻译
  18. 如何编写无法维护的代码
  19. guava的String之Splitter
  20. 什么是单工、半双工和双工通信(最详细)

热门文章

  1. 化工原理各章知识点汇总
  2. 机器学习一定要很优秀才能做嘛?其实我们都可以。
  3. ICLR 2022 | Transformer不比CNN强!Local Attention和动态Depth-wise卷积
  4. 今日arXiv精选 | 31篇EMNLP 2021最新论文
  5. 两个多元正态分布的KL散度、巴氏距离和W距离
  6. java判断字符串有中文_JAVA入门之正则表达式判断字符串包含中文
  7. mysql约束_从零开始学 MySQL - SQL 约束分类
  8. OpenCV——cv2.imread()无法读取中文路径的文件解决方案
  9. 浙江理工大学电信宽带校园网访问添加路由表命令(Windows和Liunx)
  10. JS特效——黑客效果JS代码(摘取)