熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Loop:緊湊的JVM多核語言

2022-06-13   來源: Java核心技術 

  

  作為一種緊湊簡潔的JVM編程語言Loop很明顯地受到了HaskellSchemeRuby和Erlang的影響而且它也同時嘗試著將函數式語言和面向對象語言的優秀特性實用且一致地整合在一起

  程序會在傳輸到JVM中進行編譯而且會盡可能地優化這樣在解釋執行的時候就不會產生性能損失所有的這一切優化都是為了產生高效的可執行代碼

  Loop的源碼文件結構一般如下

  module declaration  
   import declarations  
   functions & type definitions  
   free expressions 

  下面是一個Loop程序的例子 

  module mymodule  
   require othermod  
   require yetanother  
   class Pair >  
    left:  
    right:  
   main >  
    new Pair()   # 注釋可以放在任何地方  
   #自由表達式必須放在最後  
   print(mymodule is go!

  InfoQ和Loop的創建者Dhanji R Prasanna進行了一次小型的問答互動在這之前有必要對Dhanji做一下介紹他是前Google工程師JAXRS規范的作者之一依賴注入設計模式的作者Manning出版社已經將這本書付梓

  InfoQLoop相比其他的JVM語言來說有何不同?

  Dhanji我不想做一個面面俱到的特性比較不過我覺得若是闡述Loop的設計理念這將能更好地回答你的這個問題Loop是為了讓開發者有一個一致簡單而且快樂的編程經歷所有的特性都是經過精心設計並且設計過程中我非常仔細地考慮了特性之間的交互不僅僅是句法上而且還包括了語義在其他的語言中你可能有很多方法來完成一件事情這已經幾乎成為一種語言的特性但是我覺得多數其他實現都是不需要的在Loop中我嘗試著對如何完成一件事情做出種種限制這樣便能夠保持語言的簡潔和簡單從而得到一個富有魅力的感覺舒適的語法要知道閱讀和編寫代碼應該是一個簡單愉快的過程

  另外一個區別就是Loop源代碼直接編譯成為JVM字節碼但是這個編譯過程是在傳送到JVM的過程中完成也就是說它看起來非常像是一門腳本語言(而且像Lisp一樣是REPL(讀取求值打印循環)式)但是它的性能實際上要比真正的解釋型語言要好我可以讓其他人做基准測試來驗證不過現在看來在我做的簡單測試中Loop的速度非常快我也在啟動優化上花費了很多時間和精力因此它的啟動速度能夠完全達到JVM的極限我可以毫不誇張的說啟動速度這個特性通常被大多數JVM語言給忽略了

  Loop也是緊密地和Java結合在一起在Loop程序中可以很方便地調用Java方法或者使用Java對象ListsSets和Maps都只是javautil的成員但是做了一些擴展(也簡單地擴展了String)這和其他的語言有區別它們是維護了了兩個不同的庫來對Java庫進行擴展

  最後Loop從一開始就內建了對並發的支持而且將不可變和狀態的共享作為不可或缺的特性

  InfoQ你提到了許多Loop的特性都受到了例如HaskellScheme和Ruby這樣的語言的影響你可以簡單介紹一些例子嗎?

  Dhanji當然不過要知道當你說受到影響的時候人們總是趨向於認為直接抄襲並且會仔細地檢查你是不是有什麼地方抄錯了應付這種想法是非常艱難的從我看來直接受到影響的部分是語法尤其是Haskell的模式匹配以及wheredo語句塊Scheme的類型系統模塊TCO(尾調用優化)以及詞法結構(閉包)當然還有Ruby的符號以及自由形式的腳本

  這裡有一個句法結構的典型例子你可以看到Loop是如何受到這些影響的看看函數調用可以以一種後綴的形式來使用

  print()  
   # 可以寫為  
   print() 

  這看起來的確很像是Ruby的函數調用但是事實上這是多態(重載)的函數的簡單使用我發現這種形式能夠增強某些代碼的可讀性尤其是擴展已經存在的Java對象時候當然我們也要權衡這種調用的利弊不過我相信當Loop成熟之時這個特性將會得到大量應用

  更進一步地說Loop也還在函數設計的過程中受到了來自於Haskell和Scheme(尤其是後者)的語義影響一個典型的例子便是從狀態性面向封裝的設計轉為一個無狀態聲明式的設計像SchemeLoop在IO的設計上也並不是非常優秀但是另一方面來看這也加強了並發程序的不可變性這個加強之處很明顯地受到了Haskell哲學的影響

  不僅如此Haskell還影響了如何將聲明式的代碼更易編寫和閱讀上我非常喜歡這個哲學理念代碼應該讀起來像是一個解而不是像一個如何在洗衣房洗衣的說明列表或者說我們應該強調程序做什麼而不是怎麼樣Loop毫無疑問地受到了這種理念的影響

  InfoQ看起來Loop也花費了非常多的精力在並發支持和內建的消息傳遞接口上你可以跟我們解釋一下和其他流行的並發技術Loop的並發支持有什麼不同嗎?

  Dhanji這是一個非常好的問題Erlang有許多非常優秀的地方值得借鑒在Loop中實現並發有兩個主要的方法它們都是Loop原生支持而且如果能夠相互結合使用將會非常強大

  消息驅動通道(對消息傳遞隊列和線程池的面向事件的抽象)

  軟件事務內存(一個用於共享可變狀態的無鎖的原子性的一致性的模式)

  前者將會管理好所有的細節你所面臨的只是一個抽象的概念設置好可以並發執行的輕量級的通道數目然後簡單地放入一堆任務即可當然也可以考慮將這些任務分片然後在各個片內然後串行執行這其實提供了一個非常簡單的方法來創建真正地分片事件隊列因為通道是非常的輕量級你可以很簡單很容易地創建成千上萬的通道然後用來分片執行例如按照用戶名分片每個串行通道各自擁有一小塊永久的內存這將會使得增量式任務處理更加容易

  Loop同樣保證每個線程都是平均分布在這些通道中這個所謂的公平參數是可以配置的所有我現在介紹的特性你現在可以馬上在Loop中找到而且以後每個串行通道將會有一個可以配置的線程池

  我提到了串行通道擁有少量的永久私有內存 另一方面事務內存則是一個更強大的選擇如果你熟悉數據庫的話Loop如何使用這個技術是和數據庫中的並發優化類似我們再也不需要鎖這個概念即便是在寫入的時候這類內存的優化目標便是超高吞吐量的讀操作和無阻塞的寫操作這個已經成為語法的一部分

  update(person) in @person >  
    thisname: personname  
    thisage: personage 

  注意in @personLoop將會在@person片中執行這個事務

  在這個方法中我將會更新@person事務片中的數據this指針指向當前的事務片當函數完成的時候當前事務片將會對其他線程原子可見或者失敗之後當做完全沒有執行過(類似於回滾)其他的線程(即使不在這個事務中)都可以看到一個一致的@person片然後這個片在事務執行的時候會短暫不可見所有的線程在事務完成之後將會馬上看到一個新的對象無鎖無需等待這最激動人心的事情便是讀和寫線程完全無阻塞

  這個特性仍然還是處於Alpha階段我嘗試著搞定這個語義問題但是我真的覺得通道API使得Loop中並行編程變得優美強大而且容易理解

  你也可以在Github上提交你的代碼為Loop做貢獻



From:http://tw.wingwit.com/Article/program/Java/hx/201311/27035.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.