Java編程語言的另一個替代,編程語言 Mirah

火星人 @ 2014-03-09 , reply:0


當你使用Ruby語法,添加靜態類型,並在JVM上運行時,發生了什麼?Charles Nutter,JRuby的設計師為我們做了展示:
我們很快將有Java 7,支持API的動態調用和改進.我們有很多編程語言可供選擇- 一些靜態類型,一些是動態類型,...- 這提供了他們自己的獨特優勢.
我們甚至發現Java本身的一些「小變化「,比如文字列表和字元串開關.我們有任何受管理的Runtime的最大、最強的生態系統,數以百萬計的開發者.
但是,缺少了什麼東西.沒有語言看起來能夠取代Java本身.或者說,沒有可以充當Java替身.
從Java中學習
讓我們看一看標準,我相信我們滿足替換Java的標準.下面是我的觀點,他們都基於大量的使Java獲得成功的指導原則.
同等代碼下,性能等同於Java
如果我們使用新語言開始寫核心庫,以及系統級別的代碼,它像Java做的那樣執行準確.我們當然可以嘗試更好的表現,但是「等同Java」絕對是最低限度.
沒有語言強加的Runtime庫
如果使用當前的替代語言的最大的障礙是它們強加於你它們的「鎖鏈」-Runtime庫.沒有5,10,甚至20M的Jar文件,你寫不出"Hello, world" .複雜的部署,小配置的應用更複雜.甚至更糟糕的,有些語言帶有很大的初始化消耗,在載入他們的Runtime的類文件,和/或初始化Runtime狀態時.
不要比Java複雜
Java的成功很大程度歸功於它的簡單.任何語言試圖替代它,都要考慮這一點,當然這並不意味著不能比Java強大.
優雅
考慮到所有的積極特徵,Java也並不是一個特別美麗的語言.有大量的「儀式「,最簡單的程序.類型在每個地方聲明.少於80個字元根本寫不出「Hello,world」,而其他語言可在用20個以下的字元做到.
JVM庫的完美整合
取代Java的任何語言滿足Java的使用案例.這意味著能夠定義真正的類,真正的靜態方法,真正的數組.從我們的語言到Java,需要被直接調用,使用相同的位元組碼,並且相比Java編寫的同樣的調用要更有效率.我們現在使用Java的地方,我們需要使用自己的語言,如果我們不能-我們永遠需要堆棧某個地方存在Java.
拓展
現在的語言競爭,要看誰能最簡單的設計DSL,誰有最簡單的擴展點.擴展Java基本上受限於你可以做什麼,用註釋和註釋處理器.而忘記了有一個靈活的語法 - Java看起來像Java.我們假設的語言需要易於擴展,它需要可以很容易地實驗新功能.
是否有可能滿足所有這些要求?我相信是的,那就是叫做Mirah的語言.
Mirah 編程語言
Mirah 滿足了我的願望,執行JRuby,對於非Java開發者,更平易近人.讓我們面對現實吧,Java並不是特別難學,但有很多細節需要時間來習慣.它不是一個複雜的語言,但它可以嚇跑門外漢.Mirah,我想使語言滿足我的標準,讓我和其他人替換一直想替換的Java.


用代碼來解釋Mirah更容易理解,看看下面的代碼吧!
安裝 Mirah
下載最新的zip文件,Mirah Github 下載頁面.
你可以在裡面找到mirah-complete.jar,一些bin腳本for "mirah" 、"mirahc,",一組案例、說明、協議等.
準備開始
Mirah 有清晰、簡單的語法.一些非常美麗,你也會發現它非常接近Ruby.
puts "Hello, world!"我們第一個Mriah程序,利用Mirah命令運行.
~/projects/mirah_play → mirah -e 'puts "Hello, world!"'
Hello, world!這裡我們使用-e flag執行一行腳本,也可以放入文件中.
~/projects/mirah_play → echo 'puts "Hello, world!"' > hello.mirah
~/projects/mirah_play → mirah hello.mirah
Hello, world!當然我提到Mirah也是一個編譯器.在上面的例子,它在執行前快速編譯已有腳本.沒有runtime庫意味著沒有解釋,所有東西在執行前作為JVM字元碼結束.我們使用mirah命令生成類文件:
~/projects/mirah_play → mirahc hello.mirah
~/projects/mirah_play → ls -l Hello.class
-rw-r--h;r-- 1 headius staff 505 Mar 19 18:49 Hello.class
~/projects/mirah_play → java Hello
Hello, world!這個例子可能最重要.不僅是Mirah為一段代碼產生了類文件,類文件完全獨立.最終的java命令不需要jar文件或類路徑.你決定什麼依賴來引入到你的程序.
讓我們瀏覽一下Mirah的基本語法.
基礎語法
Mirah是靜態類型,像Java或Scala一樣,但你僅是觀察也許不知道.這是Mirah採用了一種叫做「local type inference(本地類型推斷)「的技術.簡單來說,通常可以從Mirah的上下文推斷對象,變數和方法調用的類型.像Scala和C#中,您仍然聲明方法參數; Mirah只是在本地範圍內推斷出類型.
讓我們看看在Java中定義一個簡單的方法,並對比Mirah.,是Java:
public static String hello(String name) {
return "Hello, " name "!";
}Mirah如下:
def hello(name:String)
"Hello, #{name}!"
end這裡我們聲明了name變數,作為String.僅是一行代碼是一String,我們知道返回類型一定是String.
如果我們將它放入一個文件,會得到與使用javac同樣的結果.
~/projects/mirah_play → cat HelloJava.java
public class HelloJava {
public static void main(String[] args) {
System.out.println(hello("world"));
}
public static String hello(String name) {
return "Hello, " name "!";
}
}
~/projects/mirah_play → cat hello_mirah.mirah
def hello(name:String)
"Hello, #{name}!"
end
puts hello("world")
~/projects/mirah_play → javac HelloJava.java
~/projects/mirah_play → mirahc hello_mirah.mirah


~/projects/mirah_play → javap HelloJava
Compiled from "HelloJava.java"
public class HelloJava extends java.lang.Object{
public HelloJava();
public static void main(java.lang.String[]);
public static java.lang.String hello(java.lang.String);
}
~/projects/mirah_play → javap HelloMirah
Compiled from "hello_mirah.mirah"
public class HelloMirah extends java.lang.Object{
public static void main(java.lang.String[]);
public static java.lang.String hello(java.lang.String);
public HelloMirah();
}Mirah將腳本頂層作為它的「main」主體,定義的方法轉變為同樣類的靜態方法.這允許你有非常輕型的腳本,很乾凈,並沒有runtime依賴.
使用Java庫
一個簡單的Swing應用
import javax.swing.JFrame
import javax.swing.JButton
class SwingMirah
def initialize(title:String, w:int, h:int)
@title = title
@width = w
@height = h
end
def run
frame = JFrame.new @title
frame.setSize @width, @height
button = JButton.new "Press me"
frame.add button
button.addActionListener do |event|
JButton(event.getSource).setText "Mirah rocks!"
end
frame.setVisible true
end
end
sm = SwingMirah.new("Welcome!", 300, 200)
sm.run性能
Mirah與Java的性能對比,使用fibonacci.確實說明兩件事:方法調用的性能和整數運算性能- 這都是很難在動態語言進行優化.
def fib(a:int):int
if a < 2
a
else
fib(a - 1) fib(a - 2)
end
end
def bench(n:int)
n.times do
timeStart = System.currentTimeMillis
puts "fib(40): #{fib(40)}nTotal time: #{System.currentTimeMillis - timeStart}"
end
end
bench 3......
最終調用fib(40),列印結果,使用插補字元串,與Java對比如何呢?
~/projects/mirah_play → java FibJava
fib(40): 102334155
Total time: 883
fib(40): 102334155
Total time: 876
fib(40): 102334155
Total time: 875
~/projects/mirah_play → mirah fib.mirah
fib(40): 102334155
Total time: 882
fib(40): 102334155
Total time: 876
fib(40): 102334155
Total time: 878Mirah與Java的表現完全一致.
更多來自Java的功能
界面定義:
import java.util.List
interface Printer do
def printAll(a:List)
returns void
end
end我們執行這個界面與Java類似,使用implements 關鍵字,然而在Mirah, implements在類的body中.
class MyPrinter
implements Printer
def printAll(a)
a.each {|element| puts element}
end
end
list = ['foo', 'bar', 'baz']
p = Printer(MyPrinter.new)
p.printAll(list)文字列表和地圖使用[] 和{} 語法.


list = [1,2,3,4]
list.each {|x| puts x} # prints "1n2n3n4n"
map = {'foo' => 'bar'}
puts map['foo'] # prints "bar"Mirah,仍然在開發中.但是已經有很多的用戶在使用.在Java兼容性方面考慮很有意義.現在Mirah類似於Java 0.9.. 沒有泛型或枚舉,最小的註釋支持,大多基本語言功能...但是你有一些封閉的支持,更多的文字量,局部類型推斷,等等.我們正在 穩步推進Mirah到1.0版本 ,至少相當於Java 5.我們還將繼續改善Mirah的宏觀體制和元編程能力,同時認真的從其他的語言中吸取最酷的功能.




[火星人 via ] Java編程語言的另一個替代,編程語言 Mirah已經有100次圍觀

http://www.coctec.com/docs/java/show-post-60046.html