a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 163|回复: 3

[其他] JAVA技巧:Java编程语言的另一个替代详解

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
当你使用Ruby语法,添加静态类型,并在JVM上运行时,发生了什么?Charles Nutter,JRuby的设计师为我们做了展示:
; ?! o# w( `% W/ J. ^; M    我们很快将有Java 7,支持API的动态调用和改进。我们有很多编程语言可供选择- 一些静态类型,一些是动态类型,...- 这提供了他们自己的独特优势。2 {6 M; H% j' Y4 Z% q+ C1 s  _
    我们甚至发现Java本身的一些“小变化“,比如文字列表和字符串开关。我们有任何受管理的Runtime的最大、最强的生态系统,数以百万计的开发者。: Z1 ]2 Y9 b6 z) W  J
    但是,缺少了什么东西。没有语言看起来能够取代Java本身。或者说,没有可以充当Java替身。& A4 c+ |+ f- q! k) n
    从Java中学习
; `* J# z5 Z) z; P& f    让我们看一看标准,我相信我们必须满足替换Java的标准。下面是我的观点,他们都基于大量的使Java获得成功的指导原则。) J3 n+ x# m2 N9 ?: K% v$ Y, S; e
    同等代码下,性能等同于Java5 z8 @1 Q$ ?" D+ G& h: K
    如果我们使用新语言开始写核心库,以及系统级别的代码,它必须像Java做的那样执行准确。我们当然可以尝试更好的表现,但是“等同Java”绝对是最低限度。
7 D4 u# e9 y- m7 o' O    没有语言强加的Runtime库
: x) s! X4 e6 N% B' T    如果使用当前的替代语言的最大的障碍是它们强加于你它们的“锁链”-Runtime库。没有5,10,甚至20M的Jar文件,你写不出"Hello, world" 。复杂的部署,小配置的应用更复杂。甚至更糟糕的,有些语言带有很大的初始化消耗,在加载他们的Runtime的类文件,和/或初始化Runtime状态时。
- w# I4 Q; N& r7 w; w    不要比Java复杂3 [  Y$ d# w: n9 _2 R; {; n
    Java的成功很大程度归功于它的简单。任何语言试图替代它,都要考虑这一点,当然这并不意味着不能比Java强大。6 A4 [. a& [0 d  p" g( }
    优雅  Y' D: C& L; B
    考虑到所有的积极特征,Java也并不是一个特别美丽的语言。有大量的“仪式“,最简单的程序。类型必须在每个地方声明。少于80个字符根本写不出“Hello,world”,而其他语言可在用20个以下的字符做到。; Q9 p3 j2 V0 A4 v2 A
    JVM库的完美整合
# O& d! ]+ k+ |  o" y. n    取代Java的任何语言必须满足Java的使用案例。这意味着能够定义真正的类,真正的静态方法,真正的数组。从我们的语言到Java,需要被直接调用,使用相同的字节码,并且相比Java编写的同样的调用要更有效率。我们现在使用Java的地方,我们需要使用自己的语言,如果我们不能-我们永远需要堆栈某个地方存在Java。
* r8 ~* s# p0 D" G5 A7 A4 |. u# X    拓展
; i. T5 }/ T6 ~# S1 b% I: u8 t    现在的语言竞争,要看谁能最简单的设计DSL,谁有最简单的扩展点。扩展Java基本上受限于你可以做什么,用注释和注释处理器。而忘记了有一个灵活的语法 - Java看起来像Java。我们假设的语言需要易于扩展,它需要可以很容易地实验新功能。1 {' ~! D& K; B3 {8 ~; j9 k& @
    是否有可能满足所有这些要求?我相信是的,那就是叫做Mirah的语言。
# `$ P0 A. `$ m1 I, \/ Q! {    Mirah 编程语言  m" V# i/ |0 m
    Mirah 满足了我的愿望,执行JRuby,对于非Java开发者,更平易近人。让我们面对现实吧,Java并不是特别难学,但有很多细节需要时间来习惯。它不是一个复杂的语言,但它可以吓跑门外汉。Mirah,我想使语言满足我的标准,让我和其他人替换一直想替换的Java。# W- L7 ^# h3 Z, i& `6 u8 Z
    用代码来解释Mirah更容易理解,看看下面的代码吧!7 [& \! ~1 {" r9 V5 r1 Q
    安装 Mirah  H" v: g; u' Y" Q6 F3 W" Q# ^
    下载最新的zip文件,Mirah Github 下载页面。2 B4 a8 h# w6 r0 g1 V
    你可以在里面找到mirah-complete.jar,一些bin脚本for "mirah" 、"mirahc,",一组案例、说明、协议等。
0 B$ Z5 I: f) V7 r. Y    准备开始1 v9 h9 r$ G" f- C5 c8 k8 O. }; `
    Mirah 有清晰、简单的语法。一些非常美丽,你也会发现它非常接近Ruby。( |% }2 J; T- P2 W
    puts "Hello, world!"我们第一个Mriah程序,利用Mirah命令运行。
' n4 O! C& ^, e! e    ~/projects/mirah_play → mirah -e 'puts "Hello, world!"'
' [9 U) f! j: V6 r/ _    Hello, world!这里我们使用-e flag执行一行脚本,也可以放入文件中。1 ]  g5 D! F! L/ x& Z+ ]
    ~/projects/mirah_play → echo 'puts "Hello, world!"' > hello.mirah
! w+ X- ^- e* v  L9 ]1 i    ~/projects/mirah_play → mirah hello.mirah
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:Java编程语言的另一个替代详解

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();
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:25 | 显示全部楼层

JAVA技巧:Java编程语言的另一个替代详解

}Mirah将脚本顶层作为它的“main”主体,定义的方法转变为同样类的静态方法。这允许你有非常轻型的脚本,很干净,并没有runtime依赖。
7 o2 U" L3 Q0 d& U$ k' ^" g    使用Java库
6 x: I8 R1 [: `4 r2 S- [4 k- w    一个简单的Swing应用
7 a% p. G; N' [( g    import javax.swing.JFrame* o  a0 S& L5 `. j) R
    import javax.swing.JButton
& a% i5 F5 w9 C' j5 R$ ?    class SwingMirah1 d8 N. [" K8 \3 i2 f8 X  R
    def initialize(title:String, w:int, h:int)
  v% j: J6 N/ ]$ N$ D4 d' d: r    @title = title
+ D( k# k; _# u5 A& Z    @width = w4 n4 X1 ^' C0 Y$ V* F  Z
    @height = h2 c$ a  ~# P) |) H. o* A1 r+ A# p1 m
    end3 i* n0 U. w; v: n) E1 D
    def run
) p4 ^' J) ^1 s. ^! W9 H    frame = JFrame.new @title
7 |0 T7 {/ B4 @5 J" q    frame.setSize @width, @height' R1 p" U5 @) b" A$ n
    button = JButton.new "Press me"1 ~. p1 S  w3 `7 l! K) J. X5 s
    frame.add button
; r' G+ x; O! ]" e& T) q    button.addActionListener do |event|8 y2 F) a- P0 G( V" q+ q7 f) |
    JButton(event.getSource).setText "Mirah rocks!"
5 n9 T* O+ p( p6 i! }4 Z% k    end7 h( t, T, g2 v5 c( }
    frame.setVisible true
7 J) A0 ]+ J: B* @9 O9 ^, F& R: i5 s0 D    end
9 I% C% M- W; M, Y8 {; U    end3 m4 H' l. b8 P
    sm = SwingMirah.new("Welcome!", 300, 200)8 E+ l# f  y  e" a( |% R. E) j
    sm.run性能
2 ~6 j& j1 S0 t. I/ A2 M    Mirah与Java的性能对比,使用fibonacci。确实说明两件事:方法调用的性能和整数运算性能- 这都是很难在动态语言进行优化。+ c  y/ o/ A/ Z) o; k
    def fib(a:int):int
; U# ]8 p; R3 W, Q9 x  i; Q    if a < 2
$ U" t: V4 l, ]& X3 Q, P    a! \6 r" e: x& m3 E, C' J2 K
    else
7 g/ C5 Q7 B2 x/ f    fib(a - 1) + fib(a - 2)
* E( c5 R( R5 N6 R- ^    end& ]2 @, H6 ^* @6 F3 M
    end
7 l) l: B8 y$ h    def bench(n:int)
! I; l8 F% ^' d. `    n.times do$ z+ n, k0 }& X5 _' A1 B4 Y
    timeStart = System.currentTimeMillis: }! \1 d, X0 i. g3 F1 n' y
    puts "fib(40): #{fib(40)}\nTotal time: #{System.currentTimeMillis - timeStart}"  k/ S2 H% F% i% d4 C% ?- a
    end+ R4 A" B  K) d$ L9 ~. ]
    end
) Q; c- f1 f# N- Y    bench 3......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:26 | 显示全部楼层

JAVA技巧:Java编程语言的另一个替代详解

最终调用fib(40),打印结果,使用插补字符串,与Java对比如何呢?$ x7 K3 B% ^+ q# N6 `6 Q( R
    ~/projects/mirah_play → java FibJava( A* M' Z! H' }4 X6 e& _7 j, ?1 O
    fib(40): 102334155
9 E4 H3 {" s. J% }% r7 N; ]    Total time: 883* t9 C5 ?( A, r4 X1 S8 r
    fib(40): 102334155
! x0 H2 Q: D" u4 Z+ R! i    Total time: 876
% E  R% x0 @: ?* ?    fib(40): 102334155
/ E7 w0 j& I/ v1 m* n/ D: b    Total time: 875
9 a; z, j: O9 E" J  S    ~/projects/mirah_play → mirah fib.mirah
) w6 o: g: G6 p/ A    fib(40): 102334155
. s" s, e6 ~& A3 i7 V1 \4 G    Total time: 882+ z" X0 y0 K" K+ o4 h
    fib(40): 102334155
4 T" |3 t. \6 R    Total time: 876
3 w; y" }" w3 \  p/ m; [& _    fib(40): 102334155* N7 D$ A9 N: |# U
    Total time: 878Mirah与Java的表现完全一致。
, N9 |& P3 n9 V  U6 O    更多来自Java的功能7 l+ X6 Q0 g8 o9 Z7 k$ _
    界面定义:
6 V' Z- a! H8 h  _- s# h    import java.util.List2 W* Z. ^4 M( j- o# c( D- r  @
    interface Printer do
- y. Q% o! ]- A- B0 |% _    def printAll(a:List)
- F1 G& X+ }+ g5 b8 [2 a    returns void
8 U7 U' `$ b2 q* z& L- [" N    end
/ g0 h" \/ q5 P% B    end我们执行这个界面与Java类似,使用implements 关键字,然而在Mirah, implements在类的body中。
2 Y- S. J+ y; }9 ^6 C: Q    class MyPrinter
) ?" G/ |5 F9 P4 L7 ?6 y    implements Printer
6 ?7 L, ^# ?' g# U* E" D    def printAll(a)6 Y1 E" P: f- T$ \6 n
    a.each {|element| puts element}8 P9 c% O( L1 p
    end! G* s5 C2 l# |* x( d- B. O6 ?% F+ z
    end' v8 ?5 _: r$ T8 ~' i7 _
    list = ['foo', 'bar', 'baz']. C7 M( H- V9 n0 j7 U4 [. W
    p = Printer(MyPrinter.new)& y& N% A8 J6 X( ~# i; w% d1 ^) S
    p.printAll(list)文字列表和地图使用[] 和{} 语法。4 K( B* ^) f3 E0 _% w$ x
    list = [1,2,3,4]
$ ?- H2 }( K* O! E8 E    list.each {|x| puts x} # prints "1\n2\n3\n4\n"; V3 C. Q& J1 K( t" A6 @! e3 f
    map = {'foo' => 'bar'}7 J5 q8 `1 C, h; l
    puts map['foo'] # prints "bar"Mirah,仍然在开发中。但是已经有很多的用户在使用。在Java兼容性方面考虑很有意义。现在Mirah类似于Java 0.9。. 没有泛型或枚举,最小的注释支持,而且大多基本语言功能...但是你有一些封闭的支持,更多的文字量,局部类型推断,等等。我们正在 稳步推进Mirah到1.0版本 ,至少相当于Java 5。我们还将继续改善Mirah的宏观体制和元编程能力,同时认真的从其他的语言中吸取最酷的功能。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 05:15 , Processed in 0.219161 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表