成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java的另一個對手:Mirah

開發 后端
Mirah 滿足了我的愿望,執行JRuby,對于非Java開發者,更平易近人。讓我們面對現實吧,Java并不是特別難學,但有很多細節需要時間來習慣。它不是一個復雜的語言,但它可以嚇跑門外漢。Mirah,我想使語言滿足我的標準,讓我和其他人替換一直想替換的Java。

當你使用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。

 

  1. puts "Hello, world!" 

我們第一個Mriah程序,利用Mirah命令運行。

 

  1. ~/projects/mirah_play → mirah -e 'puts "Hello, world!"' 
  2. Hello, world! 

 

這里我們使用-e flag執行一行腳本,也可以放入文件中。

 

  1. ~/projects/mirah_play → echo 'puts "Hello, world!"' > hello.mirah  
  2.  
  3. ~/projects/mirah_play → mirah hello.mirah   
  4. Hello, world! 

 

當然我提到Mirah也是一個編譯器。在上面的例子,它在執行前快速編譯已有腳本。沒有runtime庫意味著沒有解釋,所以所有東西在執行前作為JVM字符碼結束。我們使用mirah命令生成類文件:

 

  1. ~/projects/mirah_play → mirahc hello.mirah   
  2.  
  3. ~/projects/mirah_play → ls -l Hello.class   
  4. -rw-r--h;r--  1 headius  staff  505 Mar 19 18:49 Hello.class 
  5.  
  6. ~/projects/mirah_play → java Hello  
  7. Hello, world! 

 

這個例子可能最重要。不僅是Mirah為一段代碼產生了類文件,而且類文件完全獨立。最終的java命令不需要jar文件或類路徑。你決定什么依賴來引入到你的程序。

讓我們瀏覽一下Mirah的基本語法。

基礎語法

Mirah是靜態類型,像Java或Scala一樣,但你僅是觀察也許不知道。這是因為Mirah采用了一種叫做“local type inference(本地類型推斷)“的技術。簡單來說,通常可以從Mirah的上下文推斷對象,變量和方法調用的類型。像Scala和C#中,您仍然必須聲明方法參數; Mirah只是在本地范圍內推斷出類型。

讓我們看看在Java中定義一個簡單的方法,并對比Mirah。首先,是Java:

 

  1. public static String hello(String name) {  
  2.   return "Hello, " + name + "!";  

 

Mirah如下:

 

  1. def hello(name:String)  
  2.   "Hello, #{name}!" 
  3. end 

 

這里我們聲明了name變量,作為String。因為僅是一行代碼是一String,我們知道返回類型一定是String。

如果我們將它放入一個文件,會得到與使用javac同樣的結果。

 

  1. ~/projects/mirah_play → cat HelloJava.java   
  2. public class HelloJava {  
  3.     public static void main(String[] args) {  
  4.         System.out.println(hello("world"));  
  5.     }  
  6.  
  7.     public static String hello(String name) {  
  8.         return "Hello, " + name + "!";  
  9.     }  
  10. }  
  11.  
  12. ~/projects/mirah_play → cat hello_mirah.mirah   
  13. def hello(name:String)  
  14.   "Hello, #{name}!" 
  15. end  
  16.  
  17. puts hello("world")  
  18.  
  19. ~/projects/mirah_play → javac HelloJava.java   
  20.  
  21. ~/projects/mirah_play → mirahc hello_mirah.mirah   
  22.  
  23. ~/projects/mirah_play → javap HelloJava  
  24. Compiled from "HelloJava.java" 
  25. public class HelloJava extends java.lang.Object{  
  26.     public HelloJava();  
  27.     public static void main(java.lang.String[]);  
  28.     public static java.lang.String hello(java.lang.String);  
  29. }  
  30.  
  31.  
  32. ~/projects/mirah_play → javap HelloMirah  
  33. Compiled from "hello_mirah.mirah" 
  34. public class HelloMirah extends java.lang.Object{  
  35.     public static void main(java.lang.String[]);  
  36.     public static java.lang.String hello(java.lang.String);  
  37.     public HelloMirah();  

 

Mirah將腳本頂層作為它的“main”主體,定義的方法轉變為同樣類的靜態方法。這允許你有非常輕型的腳本,很干凈,并沒有runtime依賴。

使用Java庫

一個簡單的Swing應用

 

  1. import javax.swing.JFrame  
  2. import javax.swing.JButton  
  3.  
  4. class SwingMirah  
  5.   def initialize(title:String, w:int, h:int)  
  6.     @title = title  
  7.     @width = w  
  8.     @height = h  
  9.   end  
  10.  
  11.   def run  
  12.     frame = JFrame.new @title 
  13.     frame.setSize @width@height 
  14.     button = JButton.new "Press me" 
  15.     frame.add button  
  16.  
  17.     button.addActionListener do |event|  
  18.       JButton(event.getSource).setText "Mirah rocks!" 
  19.     end  
  20.  
  21.     frame.setVisible true 
  22.   end  
  23. end  
  24.  
  25. sm = SwingMirah.new("Welcome!"300200)  
  26. sm.run 

 

性能

Mirah與Java的性能對比,使用fibonacci。確實說明兩件事:方法調用的性能和整數運算性能- 這都是很難在動態語言進行優化。

 

  1. def fib(a:int):int 
  2.   if a < 2 
  3.     a  
  4.   else 
  5.     fib(a - 1) + fib(a - 2)  
  6.   end  
  7. end  
  8.  
  9. def bench(n:int)  
  10.   n.times do 
  11.     timeStart = System.currentTimeMillis  
  12.     puts "fib(40): #{fib(40)}\nTotal time: #{System.currentTimeMillis - timeStart}" 
  13.   end  
  14. end  
  15.  
  16. bench 3 

 

最終調用fib(40),打印結果,使用插補字符串,與Java對比如何呢?

 

  1. ~/projects/mirah_play → java FibJava  
  2. fib(40): 102334155 
  3. Total time: 883 
  4. fib(40): 102334155 
  5. Total time: 876 
  6. fib(40): 102334155 
  7. Total time: 875 
  8.  
  9. ~/projects/mirah_play → mirah fib.mirah  
  10. fib(40): 102334155 
  11. Total time: 882 
  12. fib(40): 102334155 
  13. Total time: 876 
  14. fib(40): 102334155 
  15. Total time: 878 

 

Mirah與Java的表現完全一致。

更多來自Java的功能

界面定義:

 

  1. import java.util.List  
  2.  
  3. interface Printer do 
  4.   def printAll(a:List)  
  5.     returns void 
  6.   end  
  7. end 

 

我們執行這個界面與Java類似,使用implements 關鍵字,然而在Mirah, implements在類的body中。

 

  1. class MyPrinter  
  2.   implements Printer  
  3.   def printAll(a)  
  4.     a.each {|element| puts element}  
  5.   end  
  6. end  
  7.  
  8. list = ['foo''bar''baz']  
  9. p = Printer(MyPrinter.new)  
  10. p.printAll(list) 

 

文字列表和地圖使用[] 和{} 語法。

 

  1. list = [1,2,3,4]  
  2. list.each {|x| puts x} # prints "1\n2\n3\n4\n" 
  3. map = {'foo' => 'bar'}  
  4. puts map['foo'] # prints "bar" 

 

Mirah,仍然在開發中。但是已經有很多的用戶在使用。在Java兼容性方面考慮很有意義。現在Mirah類似于Java 0.9。. 沒有泛型或枚舉,最小的注釋支持,而且大多基本語言功能...但是你有一些封閉的支持,更多的文字量,局部類型推斷,等等。我們正在 穩步推進Mirah到1.0版本 ,至少相當于Java 5。我們還將繼續改善Mirah的宏觀體制和元編程能力,同時認真的從其他的語言中吸取最酷的功能。

責任編輯:金賀 來源: 開源中國社區
相關推薦

2016-12-26 15:23:21

戴爾

2012-01-12 10:09:55

Elementary 思路

2011-11-10 09:46:41

云計算云管理

2021-05-29 07:13:26

微軟Nobelium網絡攻擊

2024-01-15 00:35:23

JavaScript框架HTML

2018-12-05 09:00:46

DevOps持續交付持續集成

2021-06-16 12:03:49

WindowsLinux游戲

2012-03-02 09:22:11

程序員

2011-11-15 10:16:04

Linux操作系統

2011-11-14 09:41:10

Linux Mint

2017-05-26 18:06:47

2009-04-23 09:42:39

FubuMVCASP.NET MVCMVC

2010-07-22 09:12:26

2013-06-28 15:45:52

產品經理

2023-09-19 23:21:48

Python列表

2009-12-11 09:40:40

傲游Chrome OS

2021-04-15 14:56:21

云計算去中心化

2009-08-04 15:18:11

C# Actor

2009-08-14 00:55:21

C#程序編譯

2017-07-03 10:55:08

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产一区二区三区 | 久久亚洲精品久久国产一区二区 | 91高清免费观看 | 国产999在线观看 | 国产精品久久久久久久久免费丝袜 | 免费午夜视频 | 精国产品一区二区三区 | 男插女下体视频 | 免费av一区二区三区 | 成人妇女免费播放久久久 | 成人精品影院 | 精品成人69xx.xyz | 中文字幕成人在线 | 在线观看亚洲精品视频 | av在线免费观看不卡 | 亚洲精品视频二区 | 337p日本欧洲亚洲大胆精蜜臀 | 久久久久国产精品一区 | 色偷偷人人澡人人爽人人模 | 狠狠爱综合网 | 毛片一区二区三区 | 久久天天 | 99视频在线免费观看 | 精品久久久久久久久久久久 | 噜啊噜在线| 久久久久国 | 久久精品亚洲精品国产欧美 | 日韩欧美在线一区二区 | 国产一区中文字幕 | 免费在线观看黄视频 | 一区二区三区视频播放 | 91精品国产一区二区三区蜜臀 | 毛片久久久 | 日韩午夜一区二区三区 | 日日干夜夜操天天操 | 91精品国产综合久久福利软件 | 国产一区二区视频在线 | 粉嫩粉嫩芽的虎白女18在线视频 | 美女131mm久久爽爽免费 | av毛片 | 成年人在线观看 |