Hello, world!当然我提到Mirah也是一个编译器。在上面的例子,它在执行前快速编译已有脚本。没有runtime库意味着没有解释,所以所有东西在执行前作为JVM字符码结束。我们使用mirah命令生成类文件:# ]4 X: h$ S# s. e0 {( D9 O
~/projects/mirah_play → mirahc hello.mirah6 j. s" D6 N3 z6 i' w1 ]$ l
~/projects/mirah_play → ls -l Hello.class W {* Z- S7 D% L
-rw-r--h;r-- 1 headius staff 505 Mar 19 18:49 Hello.class
1 J& d# X, \9 ]1 I2 W+ l, H ~/projects/mirah_play → java Hello x, Z% G# u7 ^$ Z3 _5 Q
Hello, world!这个例子可能最重要。不仅是Mirah为一段代码产生了类文件,而且类文件完全独立。最终的java命令不需要jar文件或类路径。你决定什么依赖来引入到你的程序。2 g% S% ]& W+ o, x( v. I L/ t4 Y
让我们浏览一下Mirah的基本语法。/ T# F/ D: @; p r" M+ E% h* e
基础语法0 n- g0 v& y) M7 I5 g3 b$ k
Mirah是静态类型,像Java或Scala一样,但你仅是观察也许不知道。这是因为Mirah采用了一种叫做“local type inference(本地类型推断)“的技术。简单来说,通常可以从Mirah的上下文推断对象,变量和方法调用的类型。像Scala和C#中,您仍然必须声明方法参数; Mirah只是在本地范围内推断出类型。- ^. x7 }5 I& s+ b- e2 X
让我们看看在Java中定义一个简单的方法,并对比Mirah。首先,是Java:& _# G* m P0 @7 I" w
public static String hello(String name) {
1 D9 }" s3 p" }* d4 S return "Hello, " + name + "!";$ v) ?: Z( V) }+ M% k w
}Mirah如下:9 {; Y# K( ~$ M* p- K
def hello(name:String)8 h3 [7 B/ Z- Z: f1 m- B
"Hello, #{name}!"
! ]! m; J" T! q: k- ?+ ^; N' ^ end这里我们声明了name变量,作为String。因为仅是一行代码是一String,我们知道返回类型一定是String。
$ T0 e3 S) ^( l+ R 如果我们将它放入一个文件,会得到与使用javac同样的结果。% `) H: {& {" g0 c2 v x1 w9 P
~/projects/mirah_play → cat HelloJava.java0 P' p \9 l: k" N7 i- `2 {' _& `. k4 y
public class HelloJava {, V+ b4 {/ g! i' ]+ J+ e
public static void main(String[] args) {
4 L) E- @- n+ W$ [ System.out.println(hello("world"));
' h; i$ y# \5 S9 s }
$ D/ D, X. c: b5 Z( S1 n9 j! E6 }& n public static String hello(String name) {* k- {: {" C O
return "Hello, " + name + "!";( t/ s6 _; Z1 z& {) d1 r
}
' X% S8 o) G0 B' Z+ [( ]; z( Z }8 r' C e7 L# y; ?. C$ f
~/projects/mirah_play → cat hello_mirah.mirah
8 I; f7 h# g- A def hello(name:String)
2 A) m4 Q5 e: m% R" K( f" d$ g; T "Hello, #{name}!"
4 J4 F, D8 R7 W2 @: V/ w. m end
' t& [4 o/ K5 M- |0 C, ~3 | puts hello("world")' A4 a3 l, t! F9 ^; r$ U
~/projects/mirah_play → javac HelloJava.java
" _" L: f) h$ A, ~ ~/projects/mirah_play → mirahc hello_mirah.mirah8 {# h$ l& I3 P
~/projects/mirah_play → javap HelloJava
: ]; ]! V" r6 p9 F Compiled from "HelloJava.java"- ]: z7 Z+ \2 n
public class HelloJava extends java.lang.Object{
$ E0 p% U7 m6 b7 y6 h$ C7 R8 ~ public HelloJava();
/ p2 {* f9 @ J) w public static void main(java.lang.String[]);+ j, ]% O$ m) m6 ^( j
public static java.lang.String hello(java.lang.String);
4 V* K/ W2 {+ }% A8 J6 \" E! R o }( h, e& P" x* h# |' u$ f
~/projects/mirah_play → javap HelloMirah, o! G8 r7 B5 t1 q6 V5 [; h$ J1 J
Compiled from "hello_mirah.mirah"
& M$ y- a7 `) I+ u2 J public class HelloMirah extends java.lang.Object{9 z! c, I1 _ Y0 \
public static void main(java.lang.String[]);
' E) o: c8 U) c/ ~% T* j public static java.lang.String hello(java.lang.String);
) u% c; U) B5 K/ L+ R9 E public HelloMirah(); |